2

我对 Windows Native API 很好奇。我一直在网上搜索,但未能找到从用户模式调用本机 API 函数的示例。我相信我已经基本掌握了这意味着什么——具体来说,我必须在我的程序中定义常量和原生 API 函数,并使用 GetProcAddress 在 ntdll.dll 中找到该函数,然后调用该函数。

这是正确的,任何人都可以引导我朝着正确的方向前进吗?示例代码会让我很开心,因为我绝对找不到。

我在这里遇到了这段代码(http://www.eggheadcafe.com/software/aspnet/31520494/native-application--ntc.aspx),但在我看来,它打算在内核模式下运行:

NTSTATUS    ntStatus = STATUS_SUCCESS;
UNICODE_STRING   szPath  = {0};
OBJECT_ATTRIBUTES   Attr  = {0};
IO_STATUS_BLOCK   IoStatusBlock = {0};
HANDLE     hBeep  = 0;

RtlInitUnicodeString(&szPath, L"\\??\\C:\\A.TXT");
InitializeObjectAttributes(&Attr, &szPath, 0, NULL, NULL);

ntStatus = NtCreateFile(&hBeep, GENERIC_READ, &Attr, &IoStatusBlock, NULL,
0, FILE_SHARE_READ, FILE_OPEN, 0, NULL, 0);

if (hBeep != NULL)
{
NtClose(ntStatus);

如何修改此代码以在用户模式下运行?我正在使用 c++,正如您可能已经推测到的那样。

提前致谢。

4

2 回答 2

7

NtCreateFile() 已经是一个用户模式函数。驱动程序版本是 ZwCreateFile()。事实上,它已记录在案,声明可在 winternl.h SDK 头文件中找到。然而缺少的是 ntdll.dll 的导入库,您必须使用 LoadLibrary 和 GetProcAddress 来获取函数的入口点。

除了调用它的麻烦之外,通常需要注意的是,这些原生 API 函数可能会在下一版本的 Windows 中更改,恕不另行通知。

于 2010-06-20T17:34:25.003 回答
2

我不太喜欢使用未记录的 API,但有时您需要做一些 Win32 API 未公开的事情。一些本机 API 已记录在 MSDN 上(可能是由于不久前的解决)。我通常使用NTinternals.net上的参考资料,虽然它已经有一段时间没有更新了,而且它使用了一个糟糕的 Java 小程序进行导航。在 The Code Project 等地方可能有一些代码示例。

于 2010-06-20T14:03:51.660 回答