ZWOpenFile と NtOpenFile はどちらも nt dll の機能です。ZwOpenFile は NtopenFile と同じように実装されています。しかし、ZWopenFile が nt dll 関数に含まれている理由がわかりません。違いを教えてください。
3 に答える
通常、カーネルドライバはZwXxx()
関数のみを使用する必要があります。
ユーザーモードから呼び出された場合、ZwXxx()
とNtXxx()
関数はまったく同じです。ntdll.dllの同じコードに解決されます。
カーネルモードドライバーから呼び出されると、Zwxxx()
バリアントは、カーネルによって使用されるフラグが設定され、リクエスターモード(呼び出し元のモードを示すことになっているもの)がカーネルモードであることを示します。カーネルドライバーがバリアントを呼び出す場合、NtXxx()
リクエスターモードは明示的に設定されていないため、そのままになり、この時点までの呼び出しスタックで発生した内容に応じて、ユーザーモードまたはカーネルモードを示す場合があります。
リクエスターモードフラグがユーザーモードに設定されている場合、カーネルはパラメーターを検証しますが、これは正しいことではない可能性があります(特に、カーネルドライバーがカーネルモードバッファーを通過している場合、検証は失敗します)。カーネルモードに設定され、カーネルは暗黙的にパラメータを信頼します。
したがって、これらのAPI名を使用するためのルールは、一般的に次のようになります。カーネルドライバーを作成している場合は、ZwXxx()
バージョンを呼び出します(特別な状況を扱っていて、何をしているのか、その理由がわかっている場合を除く)。ユーザーモードコンポーネントを作成している場合は、どのセットを呼び出すかは関係ありません。
私の知る限り、MicrosoftNtXxx()
はユーザーモードで使用するためのドキュメントのみを文書化しています(対応する関数と同等のユーザーモードであることを示していますZwXxx()
)。
これはMSDN に記載されています。
カーネル モード ドライバーは、ネイティブ システム サービス ルーチンの Zw バージョンを呼び出して、パラメーターが信頼できるカーネル モード ソースからのものであることをルーチンに通知します。この場合、ルーチンは、最初にパラメーターを検証しなくてもパラメーターを安全に使用できると想定します。ただし、パラメーターがユーザー モード ソースまたはカーネル モード ソースのいずれかからのものである可能性がある場合、ドライバーは代わりにルーチンの Nt バージョンを呼び出します。モードまたはカーネル モード。ルーチンがユーザー モード パラメーターとカーネル モード パラメーターを区別する方法の詳細については、「PreviousMode 」を参照してください。
基本的には、パラメーターの検証方法に関連しています。
OPまたは他の誰かが全体像を把握できるようにするために、すでに言われていることの例を挙げます。
ユーザー モードからの NtXxx 呼び出しは、(ユーザー モードからの) 信頼性の低いデータをより特権的なレイヤー (カーネル モード) に渡す結果となります。そのため、バッファーに有効なユーザー モード アドレスがあり、渡されるハンドルが有効なユーザー モード ハンドルであることが期待されます。
ドライバーが同等の ZwXxx ではなく NtXxx api を呼び出す場合、有効なユーザー モード引数が渡されていることを確認する必要があります。つまり、カーネル モード アドレス (有効であっても) とカーネル モード ハンドル (OBJ_KERNEL_HANDLE を参照) を渡すことはできません。
既に述べたように、API に相当する ZwXxx は、呼び出し先が呼び出し元と同じ特権レベルにあるため、そのようなパラメーターの検証をスキップする必要があることを (要求者レベルで) 明示的に示します。
これは、明白なことを超えて行きたい人のための良い出発点へのリンクです, https://www.osronline.com/article.cfm?id=257 .