読者です 読者をやめる 読者になる 読者になる

64-bit <-> WOW64へのハンドル値の受け渡し

Win32 64-bit

コマンドライン引数でハンドル値を渡すという愚行以外、特に見るべき部分のないコード。

 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の人の発言だからといって信用してよいのかどうか。それが問題だ。