XXX_IOControlへの呼び出しの終了後にWindows CEデバイスドライバーの呼び出し元メモリをマップする方法
-
05-07-2019 - |
質問
Windows CEデバイスドライバーにioctlを実装しています。これは、DeviceIoControlのアプリケーション呼び出しによって開始された非同期I / Oを実行するために、アプリケーションメモリの大きなチャンクへのポインターを受け取ります。
MapCallerPtr()を使用する場合、XXX_IOControl関数が戻ると、ポインターはマップ解除されます。ポインタがISTで使用されると、マップされなくなり、クラッシュにつながります。
XXX_IOControlの呼び出しの終わりを超えてポインターをマップする最良の方法は何ですか?アプリケーションは、ドライバーが終了したという指示をドライバーから受け取るまで、メモリーが有効なままであることを保証します。
これはWindows CE 5.0にあります。
解決
自分の質問に答える:
XXX_IOControlで、MapPtrToProcess()を使用してポインターをマップし、GetCurrentPermissions()を使用してスレッドのアクセス許可を保存します。マップされたポインターを使用するスレッドで、GetCurrentPermissions()から保存された戻り値を使用してSetProcPermissions()を呼び出し、ポインターを逆参照し、終了したらスレッドのアクセス許可を復元します。
DWORD saved_perms = SetProcPermissions(caller_perms);
... Do stuff ...
SetProcPermissions(saved_perms);
所属していません StackOverflow