ntddk.hZwLoadDriver
の関数を使用する必要があります。Windows 8 用の Windows ソフトウェア開発キット (SDK) をインストールしました。すべてのインクルードを設定します ( )。そして、のようなエラーがたくさんあります。SDK のヘッダーと DDK のヘッダーが混在していると思います。これを修正するには?#include <ntddk.h>
type/sruct redefinition
... already has a body
2 に答える
これを行うべきではありません。DDK
ヘッダーはドライバー開発専用であり、アプリケーションのソース コードに含めるべきではありません。ドライバをロードする必要がある場合NtLoadDriver
は、 のユーザー モード バージョンである関数を使用する必要がありますZwLoadDriver
。詳細はこちらとこちらをご覧ください。
また、ここから:
"ユーザー モード アプリケーションは、Ntdll.dll ダイナミック リンク ライブラリのエントリ ポイントを呼び出すことにより、ネイティブ システム サービス ルーチンを使用します。これらのエントリ ポイントは、Nt および Zw ルーチンへの呼び出しを、カーネル モードにトラップされるシステム コールに変換します。これらのエントリ ポイントにアクセスするには、ユーザー モード アプリケーションは、WDK で使用可能な Ntdll.lib ライブラリに静的にリンクします。Ntdll.lib に実装されているルーチンは、実行時に Ntdll.dll のエントリ ポイントに動的にリンクするスタブです。
DDK は、ドライバーの開発にのみ使用する必要があります。ユーザーモードでは水と火で、多くの宣言がSDKヘッダーと重複しています。
ユーザー モードからの NtLoadDriver() の使用は文書化されておらず、宣言を取得するためのヘッダーは使用できず、ntdll.dll で使用できるインポート ライブラリはありません。これはオペレーティング システムのネイティブ API 関数であり、その引数でもレジストリ キーに非標準の形式が使用されています。ネイティブ OS は Win32 API とは大きく異なります。本当にこれを行いたい場合は、独自の宣言を作成し、GetProcAddress() を使用して ntdll.dll のエントリポイントを取得する必要があります。
ただし、ユーザー モード コードからのドライバーの読み込みは、Windows で既に十分にサポートされています。文書化され、サポートされている方法である OpenSCManager + CreateService を使用するのが最適です。サンプル プロジェクトはこちらから入手できます。