从用户模式访问Windows Native API

ace*_*ace 2 c++ windows api nt-native-api

我对Windows Native API很好奇.我一直在网上搜索,但未能找到从用户模式调用Native 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);
Run Code Online (Sandbox Code Playgroud)

如何修改此代码以在用户模式下运行?我正在用c ++工作,你可能已经猜到了这一点.

提前致谢.

Han*_*ant 7

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

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