私はx86(32ビット)用にコンパイルされたC++プログラムを持っています。カーネルモードドライバを呼び出しています。ドライバは、両方が動作しているOSのワードサイズのためにコンパイルされます。ターゲットオペレーティングシステムは、32または64ビット(私の場合はウィンドウ)です。C++で実行時にオペレーティングシステムの語長を調べる方法は?
私の問題は、OSコールによって必要とされるので、ドライバが返すポインタのサイズを決定することです。
HANDLE device = OpenDevice();
HANDLE packageReceivedEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
bool result = DeviceIoControl(
device,
IOCTL_CODE,
&packageReceivedEvent, //for signaling
sizeof(HANDLE), //TODO does not work for 64 bit
nullptr,
0,
&recvBytes,
nullptr);
定義が標準winbase.hとWINNT.Hから来る:システムが32ビットのワードサイズを持っていた場合
ユーザーモードプログラムの次の呼び出しは、働いていました。
sizeof(int)
のようなコンパイル時のソリューションは使用できません。これは、ユーザーモードプログラムだけに関係するもので、ドライバのコンパイルには依存しません。
おそらくDeviceIoControl
のnInBufferSize
を予想される最高のワードサイズに設定すれば十分でしょうが、より良い解決策がありますか?
が、これは実際に問題になる場合、あなたがチェックしましたか?通常、OSはスマートなので、ポインタを使用するために膨大な量のボイラープレートコードを必要とせず、32ビットプログラムの場合は有効な32ビットポインタを、使用している場合は有効な64ビットポインタを与えます64ビットプログラム。 – nwp
64ビットシステムでプログラムの64ビットバージョンを使用します。それは一種のデフォルトです。 32ビット版のプログラムでは、32ビット版のプログラムを使用します。それらはまれです。 –
"32ビットコンパイラ"とはどういう意味ですか?コンパイラは、実行可能ファイルを生成する実行可能ファイルです。Windowsの実行可能ファイルは32ビットと64ビットにできるため、4つの理論上の組み合わせがあり、64ビットの実行可能ファイルを生成する64ビットのコンパイラだけが「32ビットコンパイラ」であるとはっきりとは分かりません。 – MSalters