【问题标题】:Getting Windows NT Kernel Object by Name from within a kernel driver从内核驱动程序中按名称获取 Windows NT 内核对象
【发布时间】:2017-08-17 19:47:54
【问题描述】:

我是 Windows 内核编程的新手。我想知道如何转换给定的 NT 内核命名空间(如 \Device\HarddiskVolume1)中的路径到内核对象以供进一步使用,如果可能的话。如果不同对象类型有单独的函数,我只需要硬盘卷的函数。

换句话说,有没有类似的东西:

ObGetObjectByName(wchar_t *name)

我听说有(未记录的)方法可以从用户空间浏览 NT 内核命名空间,例如 WinObj 实用程序使用的方法。我需要的是从内核驱动程序中访问硬盘对象。

【问题讨论】:

  • 对于设备上的打开文件对象,您可以使用IoCreateFile[Ex]NtOpenFileZwOpenFileZwCreateFileNtCreateFile
  • 对于更一般的(不仅是设备),您可以使用ObOpenObjectByName
  • ObReferenceObjectByName 如果您需要指向对象的指针,但不需要句柄

标签: c windows windows-kernel


【解决方案1】:

@RbMm 基本上已经在 cmets 中回答了你的问题,但我还是把它放在这里作为答案。

一般来说,你想要打开一个对象来获取一个句柄或者一个对象指针。取决于对象和上下文的类型会影响你应该怎么做。对于文件,IoCreateFile[Ex]NtOpenFileZwOpenFileZwCreateFileNtCreateFile 是@RbMm 提到的示例,还有FltCreateFile 用于微型过滤器驱动程序。

对于注册表项,您具有ZwCreateKeyZwOpenKey 等函数。通用且未记录的ObOpenObjectByName 可以打开大多数类型的对象,但您确实需要指定对象类型以防止获取指针对一些不符合你期望的事情。有关这些对象类型的更多信息,请参阅 ObOpenObjectPointer

【讨论】:

  • ObOpenObjectByName 可能没有记录,因为它的可选上下文参数需要记录太多的实现细节。为了将创建选项传递给某些类型的解析过程(例如,从 ZwCreateKey 到 Key 解析例程 CmpParseKey),可能需要此参数。 I/O 管理器始终需要它,其上下文是设备解析例程的打开数据包,IopParseDevice - 用于创建选项、处置、共享访问和特定文件类型(无、命名管道、邮槽)和给定文件类型的额外参数。
【解决方案2】:

我最初寻找的是获取一个可以发送 IRP 的设备对象(通过 IoCallDriver())。我发现 IoGetDeviceObjectPointer() 可以满足我的需要,但是它需要通过 IoGetDeviceObjectPointer 引用返回的 FileObject,该引用设置在 IRP 的下一个堆栈位置(由 IoGetNextIrpStackLocation() 返回)(请参阅Using IRPs for I/O on device object returned by IoGetDeviceObjectPointer())。感谢大家的帮助。

【讨论】:

  • 我应该将问题称为从名称获取 Windows 设备对象而不是 Windows 内核对象..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-23
  • 2014-07-03
  • 2014-04-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多