我读了一篇非常引人入胜的文章,该文章是关于使用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'关键字的情况下声明它,我尝试更改调用约定,我尝试更改包含...我总是最终得到错误“未解析的外部符号...”。
我绝对难过,所以如果有人能提出一些建议,我将不胜感激。感谢。
答案 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
,