1

私は Windows CE デバイス ドライバーに ioctl を実装しています。これは、アプリケーション メモリの大きなチャンクへのポインターを取得して、DeviceIoControl へのアプリケーション呼び出しを通じて開始された非同期 I/O を実行します。

MapCallerPtr() を使用する場合、XXX_IOControl 関数が戻ると、ポインターはマップ解除されます。ポインターが IST で使用されると、マップされなくなり、クラッシュが発生します。

XXX_IOControl への呼び出しの最後を超えてポインターをマップする最良の方法は何ですか? アプリケーションは、ドライバーがメモリの処理を終了したという通知をドライバーから受け取るまで、メモリが有効なままであることを保証します。

これは Windows CE 5.0 上にあります。

4

1 に答える 1

1

私自身の質問に答える:

XXX_IOControl で、MapPtrToProcess() を使用してポインターをマップし、GetCurrentPermissions() を使用してスレッドのアクセス許可を保存します。マップされたポインターを使用するスレッドで、GetCurrentPermissions() からの保存された戻り値を使用して SetProcPermissions() を呼び出し、ポインターを逆参照し、終了したらスレッドのアクセス許可を復元します。

DWORD saved_perms = SetProcPermissions(caller_perms);
... Do stuff ...
SetProcPermissions(saved_perms);
于 2008-10-06T09:06:49.597 に答える