2011-01-22 22 views
7

ネイティブAPIでMicrosoftは、各API呼び出しの2つのバージョンをエクスポートします.1つはZwで始まり、もう1つはNtで始まります。 ZwCreateThreadおよびNtCreateThread。WindowsネイティブAPI:いつ、なぜZwとNtプレフィックス付きのAPI呼び出しを使用するのですか?

私の質問は、これらの2つのバージョンの呼び出しの違いと、いつ、なぜ、ZwまたはNtを排他的に使うべきかということです。 私の理解によれば、Zwバージョンは、呼び出し元がカーネルモードにあることを保証しますが、Ntはそうではありません。

ZwとNtの接頭辞/略語の具体的な意味についても疑問に思っていますか? NtはおそらくNT(新技術)Windowsファミリまたはネイティブ(おそらくない)を指していると思いますか? Zwに関しては、何かのために立っていますか?

答えて

8

Using Nt and Zw Versions of the Native System Services Routinesを参照してください。

カーネルモードドライバは、ネイティブシステムサービスルーチンのZwバージョンを呼び出して、パラメータが信頼できるカーネルモードのソースから来たものであることをルーチンに通知します。この場合、ルーチンは最初に検証することなくパラメータを安全に使用できると仮定します。しかし、パラメータがユーザモードソースまたはカーネルモードソースのいずれかである場合、ドライバはNtバージョンのルーチンを呼び出し、呼び出し側スレッドの履歴に基づいて、ユーザが発生したパラメータモードまたはカーネルモード。

ネイティブシステムサービスルーチンは、受け取るパラメータについてさらに前提を定めています。ルーチンがカーネルモードドライバによって割り当てられたバッファへのポインタを受け取った場合、ルーチンはバッファがシステムメモリに割り当てられているものとみなし、ユーザモードメモリには割り当てられていないものとみなします。ルーチンがユーザーモードのアプリケーションによって開かれたハンドルを受け取った場合、ルーチンはカーネルモードのハンドルテーブルではなく、ユーザーモードのハンドルテーブル内のハンドルを探します。

また、Zwは何も意味しません。 What Does the Zw Prefix Mean?

Windowsネイティブシステムサービスルーチンの名前は、接頭辞NtとZwで始まります。 Nt接頭辞はWindows NTの省略形ですが、Zw接頭辞は意味を持ちません。 Zwは、他のAPIとのネーミングの競合を避けるために部分的に選択されました。また、今後必要になるかもしれない有用な2文字の接頭辞を使用しないように部分的には選択されました。

+2

...おもしろ重要です - 私たちは望んでいませんでした基づいて重要なAPIのためのAPIのプレフィックスを選択しました将来重要なものに使用できる接頭辞を使用することができます。 –

+0

@Blank:うーん、それは面白いですが、もう一度、私はよりよい選択肢を考えることができません。 :\ – Mehrdad

8

私はMerhdadの答えにコメントとしてこれを残すつもりだったが、それはあまりにも長くなった...

Mehrdadの答えは100%正確です。それはやや誤解を招くこともあります。 "Using Nt and Zw ..."という記事にリンクされている "PreviousMode"の記事Mehrdadが詳しく説明しています。 NtとZw API呼び出しの主な違いは、Zw呼び出しがシステムコールディスパッチャを経由することですが、の場合は、Nt呼び出しはAPIへの直接呼び出しです。

ドライバがZw APIを呼び出すとき、システムコールディスパッチャを実行する唯一の実際の効果は、UserModeの代わりにKeGetPreviousMode()をKernelModeに設定することです(明らかにユーザモードコード、ZwとNtの形式は同じです) 。さまざまなシステムコールでExGetPreviousModeがKernelModeであることがわかると、ドライバはアクセスチェックをバイパスします(ドライバは何でもできるので)。

ドライバがNTフォームのAPIを呼び出すと、アクセスチェックのためにドライバが失敗する可能性があります。

具体的な例:ドライバがNtCreateFileを呼び出すと、NtCreateFileはSeAccessCheck()を呼び出して、ドライバを呼び出したアプリケーションにファイルを作成する権限があるかどうかを確認します。同じドライバがZwCreateFileを呼び出すと、NtCreateFile API呼び出しはExGetPreviousModeがKernelModeを返したためSeAccessCheckを呼び出さないため、ドライバはファイルにアクセスできるとみなされます。

それはセキュリティのために深い意味を持つことができるので、ドライバの作者は二つの違いを理解することが

関連する問題