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 に答える