2

我读过一篇非常有趣的文章,是关于使用 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'关键字的情况下声明它,我尝试更改调用约定,我尝试更改包含...我总是以错误“未解析的外部符号...”结束。

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

4

3 回答 3

1

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

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

于 2010-02-19T03:27:43.360 回答
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;
}
于 2010-02-19T07:26:14.603 回答
0

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

在路径中有 MSVC 工具的命令提示符处

link /dump /exports ???.dll

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

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

于 2010-02-19T03:23:21.403 回答