XXX_IOControlへの呼び出しの終了後にWindows CEデバイスドライバーの呼び出し元メモリをマップする方法

StackOverflow https://stackoverflow.com/questions/173596

  •  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);
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top