使用64ビットから32ビットの応用
質問
私はWindowsアプリケーションを実行して32ビットがその他の制限の制御)。しかし、私のアプリケーション電話アクセスドライバーできる32ビットまたは64ビットによってシステムです。
とは認められていないため、ドライバによDeviceIoControl()呼び出しを交換のデータ構造を宣言を含むファイルです。データ構造を含む分野として宣言された"DWORD_PTR"(インクルードファイルになっ制御)。
私の問題が議論されているようである64ビットのシステム、ドライバの構造を含む64ビット整数がDWORD_PTR宣言)しかし、私の32ビットプログラムはそのDWORD_PTRとして32ビット整数です。次にそってデータのミスマッチの私のプログラムのバージョンのデータ構造のドライバーされている。
DeviceIoControl()終了ッ失敗とERROR_INSUFFICIENT_BUFFERのデータ領域に渡されるシステム呼び出しすぎなります。ることを確認しましたーねこのエラーが発生していただくためには64ビット版構造体をドライバーです。
において醜いオプションの散らかっていたとします。そして、もうひとつの場合でもすぐにう方に。
【解決
- を宣言する新しいコピーの共同構造実64ビットのデータ分野(__int64)
- 動的にチェックOSの建築(32/64)
- 利用の32ビットまたは64ビット版構造のDeviceIoControl()に発信します。
欠点:
- いを明示的に64ビットのコピーの構造宣言です。である、世界に向けて発信する。
私は他のソリューションが変化すもの 常に なの維持の一部のコピー構造を定義(例えば、IDLのためCOMサーバのオプション)。
編集:これはマイクロソフトドライバで使用することはありませんIoIs32bitsProcess(irp)!
解決
あなたは、構造体の32ビットと64ビットの両方のバージョンを維持し、デバイスドライバIoIs32BitProcess(irp)
ハンドラでDEVICE_CONTROL
機能によって特別な処理を実装し、必要な時に64ビットの構造に変換します。これはそれを行うための一般的な方法です。
ここではそれについてのドキュメントの良い量は、MSDNである。
あなたは後述するので、あなたは、ドライバのソースコードを制御することはできません、私はあなたが64ビットに32ビットのための独自のバリアントを維持し、OSのアーキテクチャをチェックする正しいものを送信することをお勧めします。構造体宣言は、ドライバーのために適切に行われていないように見えます。
他のヒント
あなたは常に64ビットの定義を使用していることをこのような構造のDEFSとヘッダーを含むときに#defineを操作する方法はありますか? (つまり、可能であれば)それは私には最良の選択肢のように思える。
ない場合は、、私は自分自身のコードでは、64ビットの構造をシャドウしたい - だけに注意するstrucutureデフではなく、点在if32bit / if64bitの原料の束があり、そのように - もっと思われますバグの発生しやすいです。おそらく、あなたのような何かを行うことができます:
_ASSERT(sizeof(myStruct) == sizeof(64bitStruct))
あなたのアプリケーションの開始時に、あなたが今までに新しいヘッダを得れば、あなたのアプリケーションの最初の実行は、あなたが同期する必要があることを思い出させます。