Merhdadの回答に対するコメントとしてこれを残すつもりでしたが、長すぎました...
Mehrdad の答えは 100% 正確です。また、少し誤解を招きます。「Using Nt and Zw...」の記事にリンクされている「PreviousMode」の記事では、Mehrdad がより詳細に説明しています。言い換え: Nt API 呼び出しと Zw API 呼び出しの主な違いは、Zw 呼び出しがシステム コール ディスパッチャーを経由することですが、ドライバーの場合、Nt 呼び出しは API への直接呼び出しです。
ドライバーが Zw API を呼び出すとき、システム コール ディスパッチャーを実行することの唯一の実際の効果は、KeGetPreviousMode() を UserMode ではなく KernelMode に設定することです (明らかに、ユーザー モード コードでは、Zw と Nt の形式は同じです)。さまざまなシステム コールが ExGetPreviousMode が KernelMode であることを確認すると、アクセス チェックをバイパスします (ドライバーは何でもできるため)。
ドライバーが API の NT 形式を呼び出す場合、アクセス チェックが原因で失敗する可能性があります。
具体的な例: ドライバーが NtCreateFile を呼び出す場合、NtCreateFile は SeAccessCheck() を呼び出して、ドライバーを呼び出したアプリケーションがファイルを作成する権限を持っているかどうかを確認します。同じドライバーが ZwCreateFile を呼び出した場合、NtCreateFile API 呼び出しは SeAccessCheck を呼び出しません。これは、ExGetPreviousMode が KernelMode を返したため、ドライバーがファイルにアクセスできると見なされるためです。
ドライバーの作成者は、セキュリティに大きな影響を与える可能性があるため、2 つの違いを理解することが重要です...