ライブラリとヘッダー
カーネル モード ドライバーは、Ntoskrnl.exe ダイナミック リンク ライブラリ (DLL) 内の Nt エントリ ポイントと Zw エントリ ポイントを呼び出すことによって、ネイティブ システム サービス ルーチンを使用します。 この DLL には、これらのルーチンの実際の実装が含まれています。 これらのエントリ ポイントにアクセスするために、ドライバーは、Windows ドライバー キット (WDK) で使用できる Ntoskrnl.lib ライブラリに静的にリンクします。 Ntoskrnl.lib に実装されるルーチンは、実行時に Ntoskrnl.exe のエントリ ポイントに動的にリンクするスタブです。
WDK ドキュメントでは、Ntoskrnl.exe の Zw エントリ ポイントの一部について説明していますが、すべてを網羅している訳ではありません。 ドライバーによる呼び出しが可能な Zw ルーチンの説明については、「ZwXxx ルーチン」を参照してください。
文書化されている Zw ルーチンのほとんどは WDK の Wdm.h ヘッダー ファイルで定義されていますが、Ntddk.h や Ntifs.h などの他のヘッダー ファイルで定義されているものがいくつかあります。
通常、ユーザー モード アプリケーションは Nt ルーチンと Zw ルーチンを呼び出しません。 代わりに、アプリケーションは Win32 ルーチン (CreateFile など) を呼び出し、そのルーチンが NtCreateFile や ZwCreateFile などのネイティブ システム サービス ルーチンを呼び出して要求された操作を実行します。 ただし、ユーザー モード アプリケーションは、Win32 ルーチンでサポートされていない操作を実行するために、Nt または Zw ルーチンを直接呼び出す可能性があります。
ユーザー モード アプリケーションは、Ntdll.dll ダイナミック リンク ライブラリのエントリ ポイントを呼び出すことによって、ネイティブ システム サービス ルーチンを使用します。 これらのエントリ ポイントは、Nt および Zw ルーチンへの呼び出しを、カーネル モードにトラップされるシステム呼び出しに変換します。 これらのエントリ ポイントにアクセスするために、ユーザー モード アプリケーションは、WDK で利用可能な Ntdll.lib ライブラリに静的にリンクします。 Ntdll.lib に実装されるルーチンは、実行時に Ntdll.dll のエントリ ポイントに動的にリンクするスタブです。
Windows SDK のドキュメントで、Ntdll.lib の Nt エントリ ポイントの一部 (すべてではありません) について説明しています。 文書化されている Nt ルーチンのほとんどは、Windows SDK の Winternl.h ヘッダー ファイルで定義されています。 このドキュメントでは、Zw エントリ ポイントについてはほとんど触れておらず、Windows SDK のどのヘッダー ファイルにも Zw ルーチンの定義はありません。
いくつかの小さな例外を除いて、Nt ルーチンの Ntdll.dll の各エントリ ポイントには、Zw ルーチンの一致するエントリ ポイントがあります。 WDK と Windows SDK のドキュメントでは、アプリケーション開発者にドキュメント化されていない Nt エントリ ポイントの呼び出しを避けるよう推奨しており、Windows の将来のバージョンでは Ntdll.dll から Zw エントリ ポイントが消える可能性があることを警告しています。 ユーザー モードから Zw ルーチンを呼び出すアプリケーション開発者は、この状況に備える必要があります。
アプリケーションによって呼び出すことができる Nt ルーチンの説明については、「Winternl」、「winternl.h ヘッダー」、および「その他の低レベル クライアント サポート」を参照してください。 Windows SDK ドキュメントの Nt ルーチンの一部のリファレンス ページでは、そのルーチンを「非推奨」として分類し、非推奨の Nt ルーチンの代わりに同等の Win32 ルーチンを使用するようにアドバイスしています。
ユーザー モード アプリケーションは、Ntoskrnl.exe のエントリ ポイントを呼び出すことはできません。また、カーネル モード ドライバーは、Ntdll.dll のエントリ ポイントを呼び出すことができません。