我是Windows内核编程的新手。我想知道如何转换给定的 NT内核命名空间中的路径(如\ Device \ HarddiskVolume1)到内核对象以供进一步使用,如果可能的话。如果有不同对象类型的单独函数,我只需要硬盘卷的功能。
换句话说,是否有类似的东西:
ObGetObjectByName(wchar_t * name)
我听说有(未记录的)方法可以从用户空间浏览NT内核命名空间,例如WinObj实用程序使用的方法。我需要的是从内核驱动程序中访问硬盘驱动器对象。
答案 0 :(得分:1)
@RbMm已经基本上在评论中回答了你的问题,但我会把它作为答案。
一般来说,您希望打开对象以获取句柄或对象指针。根据对象的类型和上下文将影响您应该如何做到这一点。对于文件,IoCreateFile[Ex]
,NtOpenFile
或ZwOpenFile
,ZwCreateFile
,NtCreateFile
是@RbMm提到的示例,还有FltCreateFile
用于迷你 - 过滤器驱动程序。
对于注册表项,您具有ZwCreateKey
或ZwOpenKey
等功能。通用且未记录的ObOpenObjectByName
可以打开大多数类型的对象,但您确实需要指定对象键入以防止获得指向不会按预期方式运行的事物的指针。有关这些对象类型的其他信息,请参阅ObOpenObjectPointer。
答案 1 :(得分:0)
我最初想要的是获取一个设备对象,我可以将其发送到(通过IoCallDriver())。我发现IoGetDeviceObjectPointer()做了我需要的事情,但是它需要通过IxGetDeviceObjectPointer引用返回的FileObject在IRP下一个堆栈位置设置(由IoGetNextIrpStackLocation()返回)(参见Using IRPs for I/O on device object returned by IoGetDeviceObjectPointer())。感谢大家的帮助。