С помощью следующего кода я теперь могу открыть вторую клавиатуру, но...
/*
* Form the Device Name and symbolic name
*/
RtlInitUnicodeString(&devNameFlt, L"\\Device\\KeyboardClass0");
RtlInitUnicodeString(&devName, L"\\Device\\MultikeyboardCnt");
status = IoCreateDevice(pDriverObject, sizeof(DEVICE_EXTENSION),
&devName,
FILE_DEVICE_KEYBOARD,
SYNCHRONIZE,
FALSE,
&pDevObj);
if (!NT_SUCCESS(status))
{
DbgPrint("%s, IoCreateDevice failed:0x%0x\n", __FUNCTION__, status);
return status;
}
HANDLE hFile;
OBJECT_ATTRIBUTES oa = { sizeof(oa), 0, 0, OBJ_CASE_INSENSITIVE };
oa.ObjectName = &devNameFlt;
IO_STATUS_BLOCK iosb;
status = IoCreateFile(&hFile, SYNCHRONIZE, &oa, &iosb, 0, 0, FILE_SHARE_VALID_FLAGS, FILE_OPEN,
0, 0, 0, CreateFileTypeNone, 0, IO_ATTACH_DEVICE);
if (!NT_SUCCESS(status))
{
DbgPrint("%s, IoCreateFile failed to call:0x%0x\n", __FUNCTION__, status);
return status;
}
/* Get File Object */
PFILE_OBJECT LocalFileObject;
status = ObReferenceObjectByHandle(hFile,
0,
*IoFileObjectType,
KernelMode,
(PVOID*)&LocalFileObject,
NULL);
pLBKdev = IoGetRelatedDeviceObject(LocalFileObject);
DbgPrint("%s at IoCreateFile ok\n", __FUNCTION__);
ObReferenceObject(pLBKdev);
/*
* Retrieve device extension pointer from device object
*/
pDevExt = (PDEVICE_EXTENSION)pLBKdev->DeviceExtension;
status = IoAttachDeviceToDeviceStackSafe(pDevObj, pLBKdev, &pDevExt->kbdDevice);
if (status != STATUS_SUCCESS) {
DbgPrint("IoGetDeviceObjectPointer failed with error = 0x%0x\n", status);
goto cleanup_failure;
}
pDevObj->Flags |= DO_BUFFERED_IO;
pDevObj->Flags &= ~DO_DEVICE_INITIALIZING;
/*
* Create the symbolic link name, this is not mandatory
* but can be helpful for user mode apps to communicate
*/
status = IoCreateSymbolicLink(&symLinkNameFlt, &devNameFlt);
if (!NT_SUCCESS(status)) {
// if it fails now, must delete Device object
DbgPrint("IoCreateSymbolicLink failed with error = 0x%0x\n", status);
goto cleanup_failure;
}
но подпрограмма DispatchRead падает, если я набираю клавишу на клавиатуре.
person
makurisan
schedule
12.01.2018
status
возвращаются вамIoAttachDevice
. во многих случаяхIoAttachDevice
может выйти из строя из-за флагаDO_EXCLUSIVE
на устройстве, когда оно уже открыто. нужно использоватьIoCreateFile
с параметрамиIO_ATTACH_DEVICE
+IoAttachDeviceToDeviceStackSafe
. и сомневаюсь, что вы используете действительно драйвер kmdf - person RbMm   schedule 11.01.2018IoCreateFile
сIO_ATTACH_DEVICE
опциями - person RbMm   schedule 11.01.2018\Device\KeyboardClassX
имена для открытых устройств. нужно открыть нижнее устройство по имени интерфейса -IoRegisterPlugPlayNotification
сEventCategoryDeviceInterfaceChange
наGUID_CLASS_KEYBOARD
. и получил имя устройства наGUID_DEVICE_INTERFACE_ARRIVAL
- person RbMm   schedule 11.01.2018IoAttachDeviceToDeviceStackSafe
, возвращенный дескриптор файла, который вам нужно преобразовать в файловый объект (ObReferenceObjectByHandle
), а затем в устройство -IoGetRelatedDevice
. и используйте имя интерфейса вместо\Device\KeyboardClassX
- person RbMm   schedule 11.01.2018"HID\\VID_046A&PID_010D&MI_00\\7&48EAABC&0&0000"
? ты жестко это запрограммировал? конечно должна быть ошибкаSTATUS_OBJECT_PATH_SYNTAX_BAD
- правильно - вам нужна ссылка на интерфейс от обратного вызоваIoRegisterPlugPlayNotification
- person RbMm   schedule 11.01.2018