从内核驱动程序中按名称获取 Windows NT 内核对象

Getting Windows NT Kernel Object by Name from within a kernel driver

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

换句话说,有没有像这样的东西:

ObGetObjectByName(wchar_t *名称)

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

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

一般来说,你想要打开对象是为了得到句柄或者对象指针。根据对象的类型和上下文将影响您应该如何处理。对于文件,IoCreateFile[Ex]NtOpenFileZwOpenFileZwCreateFileNtCreateFile是@RbMm提到的例子,还有FltCreateFile for mini -过滤驱动程序。

对于注册表项,您有 ZwCreateKeyZwOpenKey 等函数。通用且未记录的 ObOpenObjectByName 可以打开大多数类型的对象,但您确实需要指定对象类型,以防止获得指向不会按您预期的方式运行的对象的指针。有关这些对象类型的一些其他信息,请参阅 ObOpenObjectPointer

我最初寻找的是获得一个设备对象,我可以将 IRP 发送到该设备对象(通过 IoCallDriver())。我发现 IoGetDeviceObjectPointer() 可以满足我的需要,但是它需要通过 IoGetDeviceObjectPointer 的引用返回的 FileObject 设置在 IRP 的下一个堆栈位置(由 IoGetNextIrpStackLocation() 返回)(参见 )。感谢大家的帮助。