如何使用Windows内核驱动程序从其他设备/驱动程序读取信息?

问题描述

因此,我有一个PCIe kmd驱动程序,我希望能够从我的鼠标或键盘甚至其他PCIe设备读取HW_ID。我已经达到以下几点:

PWSTR symbolicLinkList;
status = IoGetDeviceInterfaces(&GUID_DEVINTERFACE_KEYBOARD,NULL,&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_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或类值,对吧?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...