Beispiel #1
0
int CEnumerator::AddDevice(HDEVINFO DeviceInfoSet, PSP_DEVINFO_DATA DeviceInfoData, PSP_DEVICE_INTERFACE_DETAIL_DATA DeviceInterfaceDetailData, int a5)
{
	wchar_t FullDevPath[MAX_PATH];
	wcscpy_s(FullDevPath, MAX_PATH, (const wchar_t *)DeviceInterfaceDetailData->DevicePath);
	wcscat_s(FullDevPath, MAX_PATH, L"\\DJAPI");
	HANDLE hDevObject = CreateFileW(FullDevPath, GENERIC_WRITE | GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, 0);
	int res = hDevObject != (HANDLE)-1;
	if(res)
	{
		HIDD_ATTRIBUTES Attributes;
		res = m_pfnHidD_GetAttributes(hDevObject, &Attributes);
		if(res == 1)
		{
			res = OnAddDevice(DeviceInfoData->DevInst, hDevObject, DeviceInterfaceDetailData->DevicePath, &Attributes, a5);
		}
	}
	if(!res)
	{
		CloseHandle(hDevObject);
	}
	return 1;
}
NTSTATUS DriverEntry(
	IN PDRIVER_OBJECT  DriverObject, 
	IN PUNICODE_STRING RegistryPath
)
{
	unsigned int i;
	NTSTATUS Status;
	
	DbgPrint("DriverEntry: start\n");
/*
	for (i = 0; i < IRP_MJ_MAXIMUM_FUNCTION; ++i) 
	{
		DriverObject->MajorFunction[i] = OnUnhandledRequest;
	}
*/

	Status = OnAddDevice(DriverObject, NULL);

	if(NT_SUCCESS(Status))
	{
		InputDisabled = FALSE;
		DriverOpened = FALSE;
		WaitTimeout.QuadPart = -300000000;
		
		KeInitializeSpinLock(&KbrdQueueLock);
		InitializeListHead(&KbrdQueue);
		KbrdQueueSize = KBRD_QUEUE_SIZE;
		KbrdQueueCount = 0;
		KeInitializeEvent(&KbrdEvent, SynchronizationEvent, FALSE);

		
		KeInitializeSpinLock(&MouseQueueLock);
		InitializeListHead(&MouseQueue);
		MouseQueueSize = MOUSE_QUEUE_SIZE;
		MouseQueueCount = 0;
		KeInitializeEvent(&MouseEvent, SynchronizationEvent, FALSE);

		MouseBufferSize = MOUSE_BUFFER_SIZE;
		MouseBufferCount = 0;
		MouseRelX = 0;
		MouseRelY = 0;
		MouseButtons = 0;
		MouseFirstPacket = TRUE;


		DriverObject->MajorFunction[IRP_MJ_READ]		   = OnReadRequest;
		DriverObject->MajorFunction[IRP_MJ_CREATE]         = OnCreateRequest;
		DriverObject->MajorFunction[IRP_MJ_CLOSE]          = OnCloseRequest;
		DriverObject->MajorFunction[IRP_MJ_FLUSH_BUFFERS]  =
		DriverObject->MajorFunction[IRP_MJ_CLEANUP]        = OnUnhandledRequest;
		DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = OnControlRequest;

//		DriverObject->DriverStartIo = OnStartIo;

		if(LowerKbrdDeviceObject->CurrentIrp)
		{
			DbgPrint("Cancelling previous request........\n");
			IoCancelIrp(LowerKbrdDeviceObject->CurrentIrp);
		}
	}

//	DriverObject->DriverUnload = UnloadDriver;

	return Status;
}