从用户模式访问Windows Native API

时间:2010-06-20 02:40:17

标签: 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);

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

提前致谢。

2 个答案:

答案 0 :(得分:7)

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

除了调用它的麻烦之外,通常需要注意的是,在下一版本的Windows中,这些原生API函数可能会在没有通知的情况下发生变化。

答案 1 :(得分:2)

我不是使用未记录的API的忠实粉丝,但偶尔你需要做一些Win32 API没有公开的东西。 MSDN上已经记录了一些原生API(可能是由于一段时间后的解决方案)。我通常在NTinternals.net使用引用,虽然它在一段时间内没有更新,但它使用了一个可怕的Java小程序进行导航。可能有一些代码示例,如The Code Project等。