因此,我有一个PCIe kmd驱动程序,我希望能够从我的鼠标或键盘甚至其他PCIe设备读取HW_ID。我已经达到以下几点:
PWSTR symbolicLinkList;
status = IoGetDeviceInterfaces(&GUID_DEVINTERFACE_KEYBOARD, NULL, 0, &symbolicLinkList);
if (!NT_SUCCESS(status)) {
KDPRINT(("IoGetDeviceInterfaces failed %x\n", status));
}
UNICODE_STRING uszName;
PDEVICE_OBJECT pci_do;
PFILE_OBJECT pci_fo;
RtlInitUnicodeString(&uszName, symbolicLinkList);
KDPRINT(("Symbolic Name '%S'\n", uszName.Buffer));
status = IoGetDeviceObjectPointer(&uszName, FILE_READ_DATA, &pci_fo, &pci_do);
if (STATUS_SUCCESS != status) {
KDPRINT(("IoGetDeviceObjectPointer failed %x\n", status));
return STATUS_SUCCESS;
}
WCHAR deviceID[512];
ULONG dataLen;
status = IoGetDeviceProperty(pci_do, DevicePropertyHardwareID, sizeof(deviceID), deviceID, &dataLen);
if (STATUS_SUCCESS != status) {
VKDPRINT(("IoGetDeviceObjectPointer failed %x\n", status));
return STATUS_SUCCESS;
}
但是它似乎总是在代码=
下失败 //
// MessageId: STATUS_OBJECT_PATH_SYNTAX_BAD
//
// MessageText:
//
// Object Path Component was not a directory object.
#define STATUS_OBJECT_PATH_SYNTAX_BAD ((NTSTATUS)0xC000003BL)
我什至尝试使用我从代理经理那里获得的PDO名称进行操作。鼠标/键盘的属性->详细信息->物理设备对象名称。以我的键盘为例:
WCHAR objstr[] = L"\\Device\\00000050";
RtlInitUnicodeString(&uszName, objstr);
status = IoGetDeviceObjectPointer(&uszName, GENERIC_ALL, &pci_fo, &pci_do);
但是失败仍然存在,除了这次我得到以下错误:
// MessageId: STATUS_SHARING_VIOLATION
//
// MessageText:
//
// A file cannot be opened because the share access flags are
incompatible.
//
#define STATUS_SHARING_VIOLATION ((NTSTATUS)0xC0000043L)
我在做什么错?我知道如果没有过滤器驱动程序就无法访问另一台设备的配置空间,但是应该能够读取简单的ID或类值,对吧?