有人熟悉未记录的ObjectByName windows内核函数吗?

有人熟悉未记录的ObjectByName windows内核函数吗?,windows,driver,drivers,wdk,Windows,Driver,Drivers,Wdk,我读了一篇非常有趣的文章,这篇文章是关于使用wdk编程驱动程序的,其中一个函数名为ObReferenceObjectByName。这个功能让我很头疼。第一个不好的地方是它没有被微软记录下来。第二件事是文章中使用的语言是C++,我想把我的代码保存在普通的.c中。我知道大多数时候这不应该是个问题,但我没有——我的生活——能够想出如何包含这个函数。 本文中的代码类似于: extern "C"{ #include <ntifs.h> NTSYSAPI NTSTATUS NTAPI

我读了一篇非常有趣的文章,这篇文章是关于使用wdk编程驱动程序的,其中一个函数名为ObReferenceObjectByName。这个功能让我很头疼。第一个不好的地方是它没有被微软记录下来。第二件事是文章中使用的语言是C++,我想把我的代码保存在普通的.c中。我知道大多数时候这不应该是个问题,但我没有——我的生活——能够想出如何包含这个函数。 本文中的代码类似于:

extern "C"{

 #include <ntifs.h>


 NTSYSAPI NTSTATUS NTAPI ObReferenceObjectByName(PUNICODE_STRING ObjectName,

         ULONG Attributes,

         PACCESS_STATE AccessState,

         ACCESS_MASK DesiredAccess,

         POBJECT_TYPE ObjectType,

         KPROCESSOR_MODE AccessMode,

         PVOID ParseContext OPTIONAL,

         PVOID* Object);
}
extern“C”{
#包括
NTSYSAPI NTSTATUS NTAPI对象引用ByName(PUNICODE\u字符串对象名称,
乌龙属性,
PACCESS_状态访问状态,
需要访问的访问屏蔽,
POBJECT_TYPE ObjectType,
KPROCESSOR_模式访问模式,
PVOID ParseContext可选,
PVOID*对象);
}
我已经试着复制了好几个小时了。我尝试在没有'extern'关键字的情况下声明它,我尝试更改调用约定,我尝试更改包含。。。我总是以错误“未解析的外部符号…”结束


我完全被难倒了,所以如果有人能给我一些建议,我将不胜感激。谢谢。

我不知道这个API,但我可以给你一个技巧,帮助你诊断问题

在路径中包含MSVC工具的命令提示下

link /dump /exports ???.dll
其中???.dll是您期望此函数的dll。这将为您提供导出符号名称的完整列表,并告诉您两件事。1) 符号在那里吗?2)它的装饰是否与您尝试的原型相同

对于32位内核,应该期望调用
_ObReferenceObjectByName@64

您不会阅读并试图创建自己的键盘记录器,是吗


无论如何,不要使用它,而是调用ZwCreateFile,然后调用ObReferenceObjectByHandle。

这里是一个编译并生成的测试C代码,没有任何问题:

#include <ntddk.h>

NTSYSAPI NTSTATUS NTAPI ObReferenceObjectByName(
    PUNICODE_STRING ObjectName,
    ULONG Attributes,
    PACCESS_STATE AccessState,
    ACCESS_MASK DesiredAccess,
    POBJECT_TYPE ObjectType,
    KPROCESSOR_MODE AccessMode,
    PVOID ParseContext OPTIONAL,
    PVOID* Object
    );

NTSTATUS DriverEntry(
    IN PDRIVER_OBJECT  DriverObject,
    IN PUNICODE_STRING RegistryPath
    )
{
    ObReferenceObjectByName(0, 0, 0, 0, 0, 0, 0, 0);

    return STATUS_SUCCESS;
}
#包括
NTSYSAPI NTSTATUS NTAPI对象引用对象名称(
PUNICODE_字符串ObjectName,
乌龙属性,
PACCESS_状态访问状态,
需要访问的访问屏蔽,
POBJECT_TYPE ObjectType,
KPROCESSOR_模式访问模式,
PVOID ParseContext可选,
PVOID*对象
);
新界北(
在PDU对象驱动对象中,
在PUNICODE_字符串注册表路径中
)
{
ObReferenceObjectByName(0,0,0,0,0,0,0,0);
返回状态\成功;
}

这是我读的文章,但我的最终目标不是一个键盘记录器。我只是觉得很有趣,你可以改变驱动程序的主要功能。感谢您的建议。我怀疑这在Vista/Win7中不起作用,而且这样做肯定不安全,因为您无法正确保证在更改期间不会发送IOs,但出于信息目的,我想这是不安全的。如果您使用的是原子函数(InterlockedExchangePointer),则是安全的。替换本身是安全的,但是如果你在钩子里做了一些不寻常的事情,事情就会变得非常复杂,因为你不能保证钩子的IRP_MJ_READ的IRP是由你的IRP_MJ_CREATE处理的,例如,因为会有一个小窗口,你无法完成对调度表的覆盖。