Доступ к Windows Native API из пользовательского режима - PullRequest
2 голосов
/ 20 июня 2010

Мне очень любопытно, что 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);

Как этот код можно изменить для работы в пользовательском режиме? Я работаю на С ++, как вы, вероятно, догадались по этому вопросу.

Заранее спасибо.

Ответы [ 2 ]

7 голосов
/ 20 июня 2010

NtCreateFile () уже является функцией пользовательского режима.Версия драйвера - ZwCreateFile ().Фактически задокументировано , объявление доступно в заголовочном файле winternl.h SDK.Однако чего не хватает, так это библиотеки импорта для ntdll.dll, вы должны использовать LoadLibrary и GetProcAddress, чтобы получить точку входа для функции.

Кроме проблемы вызова, обычное предостережение заключается в том, что эти собственные функции APIможет измениться без уведомления в следующей версии Windows.

2 голосов
/ 20 июня 2010

Я не большой поклонник использования недокументированных API, но иногда вам нужно делать что-то, что не доступно Win32 API.Некоторые из собственных API были задокументированы на MSDN (вероятно, из-за урегулирования некоторое время назад).Я обычно использую ссылку на NTinternals.net , хотя она давно не обновлялась и использует ужасный Java-апплет для навигации.Вероятно, есть несколько примеров кода в таких местах, как The Code Project и др.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...