是否有人熟悉未记录的ObReferenceObjectByName windows内核函数?

时间:2010-02-19 03:09:07

标签: windows driver drivers wdk

我读了一篇非常引人入胜的文章,该文章是关于使用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'关键字的情况下声明它,我尝试更改调用约定,我尝试更改包含...我总是最终得到错误“未解析的外部符号...”。

我绝对难过,所以如果有人能提出一些建议,我将不胜感激。感谢。

3 个答案:

答案 0 :(得分:1)

您不会阅读http://www.codeproject.com/KB/recipes/keystroke-hook.aspx并尝试创建自己的键盘记录器吗?

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

答案 1 :(得分:1)

这是一个没有问题的编译和构建的测试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;
}

答案 2 :(得分:0)

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

在路径

中具有MSVC工具的命令提示符下
link /dump /exports ???.dll

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

对于32位内核,您应该期望将其称为_ObReferenceObjectByName@64