64-bit <-> WOW64へのハンドル値の受け渡し
コマンドライン引数でハンドル値を渡すという愚行以外、特に見るべき部分のないコード。
HANDLE hEvent = CreateEventW(NULL, FALSE, FALSE, NULL); SetHandleInformation(hEvent , HANDLE_FLAG_INHERIT, HANDLE_FLAG_INHERIT); TCHAR cmdline[MAX_PATH]; swprintf_s(cmdline, MAX_PATH, L"otherprog %u", (unsigned int)hEvent ); if(CreateProcessW(NULL, cmdline, ...)) { WaitForSingleObject(hEvent, INFINITE); ... }
そして、それを受け取る側。
int wmain(int argc, wchar_t* argv[]) { unsigned int u; swscanf_s(argv[1], L"%u", &u); HANDLE hEvent = (HANDLE)u; SetEvent(hEvent); CloseHandle(hEvent); }
単に起動された側のコードからイベントオブジェクトにシグナルを送るというきわめて簡単なコード。問題は、このコードが、WOW64<->64-bitの間でも問題ないのかどうか。一応、ハンドルの中身はカーネルオブジェクトのインデックスであることは公知の事実ではあるのだけれども、将来、変更はないのか。
Re: Passing HANDLEs from WOW64 to x64 kernel
によれば問題はないらしい。MSFTの人の発言だからといって信用してよいのかどうか。それが問題だ。