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; }