KeBugCheck
カーネル関数です。つまり、作成しようとしているアプリケーションのように、ユーザー モード コードから呼び出すことはできません。
また、ユーザー モード コードはシステム全体をダウンさせることは想定されていないため、この関数にはユーザー モード ラッパーも提供されていません。
これを行うには、独自のカーネル モード ドライバーを作成する必要があります。開始するには、 Windows Driver Development Kit (DDK)をダウンロードします。その場合、関数宣言はパブリックヘッダーにあり、ファイルから自動的にリンクされるため、全体LoadLibrary
とダンスの必要はありません.GetProcAddress
Ntddk.h
Ntoskrnl.lib
あなたがここで抱えている問題に関しては、 をLoadLibrary
返すERROR_MOD_NOT_FOUND
ことで、それは無関係です。あなたが持っているコードは間違っています。明示的なキャストからLPCWSTR
、コンパイラをシャットダウンするために実行する必要があることは明らかです。
Unicode アプリケーションをコンパイルしているため、 への呼び出しLoadLibrary
は自動的に に解決されLoadLibraryW
、タイプ のワイド (Unicode) 文字列を受け入れますLPCWSTR
。狭い文字列リテラルを渡そうとしているため、型の不一致エラーが発生します。キャストを挿入したことを除いて、それはあなたがそれよりもよく知っているので、コンパイラに黙るように効果的に伝えます。あなたがしないことを除いて。コンパイラに耳を傾ける必要があります。多くのバグからあなたを救うことができます。
修正は簡単です。コードから余分なキャストをすべて削除し、代わりにワイド文字列リテラルを使用します。(GetProcAddress
ただし、関数はユニークです。Unicode 用にコンパイルしているかどうかに関係なく、常に狭い文字列が必要です。)
HMODULE bcLib = LoadLibrary(L"ntoskrnl.exe");
void* fnc = (void*)GetProcAddress(bcLib, "KeBugCheck");
もちろん、これを修正したら、私の答えの最初の部分を見たいと思うでしょう。