Доступ к Windows 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 ответа
NtCreateFile() уже является функцией пользовательского режима. Версия драйвера - ZwCreateFile(). Фактически это задокументировано, объявление доступно в заголовочном файле winternl.h SDK. Однако чего не хватает, так это библиотеки импорта для ntdll.dll, вы должны использовать LoadLibrary и GetProcAddress, чтобы получить точку входа для функции.
Помимо проблемы с его вызовом, обычное предостережение заключается в том, что эти функции нативного API могут изменяться без уведомления в следующей версии Windows.
Я не большой поклонник использования недокументированных API, но иногда вам нужно делать что-то, что не доступно Win32 API. Некоторые из собственных API были задокументированы на MSDN (вероятно, из-за урегулирования некоторое время назад). Я обычно использую ссылку на NTinternals.net, хотя она давно не обновлялась и использует ужасный Java-апплет для навигации. Вероятно, есть несколько примеров кода в таких местах, как The Code Project et al.