ツムラ_メモ

大失敗を繰り返す。

system64じゃないんだ。

上記のhostsファイルを編集した時。
よく考えたら64bit環境だけど、ここのhostsでいいのかなぁ?
と思い、フォルダ内を見渡してみると、SysWOW64という見慣れないフォルダが。

x64で本格化する64ビットWindowsの時代(3)
http://itpro.nikkeibp.co.jp/article/COLUMN/20051121/224935/
次に,64ビットWindows上で既存の32ビット・アプリケーションを動作させるWOW64について説明する。WOW64の動作を理解するためには,32ビットWindowsの基本的なアーキテクチャに対する知識が必要なので,まずはこれについて簡単に説明する。
 32ビットWindows上では,user32.dll,gdi32.dll,kernel32.dll,ntdll.dllといったシステムDLLがユーザー・モードで動作する。例えばgdi32.dllはGUI操作のときに呼び出され,プロセスに関する処理をしたときはkernel32.dllが呼び出される。それらのDLLは,カーネル・モードでの処理(システム・コール)に移行するときに,win32k.sysやntoskrnl.exeを呼び出す(図12[拡大表示])。

 このような仕組みは,64ビットWindowsでも,64ビット・アプリケーションに関しては全く同じである。gdi32.dllなど同名のシステム・ファイルがある。ファイル名には「32」と付けられているが,64ビット・プログラムである。

 一方,32ビット・アプリケーションを動かすために,64ビットWindowsも32ビットWindowsと同じ32ビットのシステム・ファイルを備えている。ちなみにこれらは64ビット用とは別に,%windir%\SysWOW64フォルダに格納されている。

 ただし,64ビットWindowsには,32ビットのカーネル・モード・システム・モジュール(win32k.sysや ntoskrnl.exe)がない。64ビットWindowsでは,WOW64が32ビットのカーネル・モード・システム・モジュールの代わりを担っているのである(図12b)。

なるほど〜。
つまり、32ってついてるけど、中身は64bitのプログラムで、SysWOW64が64bit環境で32bitアプリケーションを動かすための仕組みなのか。

 WOW64.dllは,32ビット・モジュールからのシステム・コール(本来32ビットのntoskrnl.exeなどにされるべき呼び出し)を横取りし,64ビットのntoskrnl.exeを呼び出す。同様に,WOW64win.dllは,32ビット・モジュールからのwin32k.sysへの呼び出しを横取りし,64ビットのwin32k.sysを呼び出す。

 このとき,32ビットDLLがシステム・コールするためにスタックに積んだ引数を抽出し,64ビット用に変換した上で64ビット・システム・コールを発行する。その際,32ビットの構造体(複数のデータをひとまとまりにしたもの)があれば,64ビットの構造体に変換する。その内容は,ポインタ型データの大きさを32ビット(4バイト)から64ビット(8バイト)に変換すること,アラインメント(データの区切れ目)を調整することである。32ビット構造体のアラインメントは4バイトである。例えば,1バイト・データがあれば,その後ろにダミー・データが3バイト付けられる。これに対して64ビット構造体のアラインメントは8バイトになる。

 ちなみに,int型(符号付き整数を扱うデータ型)などのデータ型は,互換性を重視して,32ビットWindowsと大きさが同じになっている。つまり,64ビットWindowsでも,int型の大きさは32ビットである。

 一方,仮想アドレス空間については,32ビット・プロセスの4Gバイトの空間を,64ビット・プロセスの16Tバイト(のうちのユーザー領域8Tバイト)にマップし直す。それほどパフォーマンス低下を引き起こす原因にはならないはずだ。

 これらの仕組みから,先に64ビットWindowsも32ビットWindowsと同じ32ビットのシステムDLLを備えていると説明したが,全く同じではないDLLが存在することに気が付くだろう。それは,システム・コールを行う kernel32.dll,ntdll.dll,user32.dll,imm32.dll,gdi32.dll,rpcrt4.dllである。「WOW64.dllが32ビット・モジュールのシステム・コールを横取りする」と説明したが,実際には横取りしているわけではない。64ビット Windowsが備えるこれらの32ビット版DLLは,システム・コール時にWOW64cpu.dllを呼び出すよう変更されている。呼び出された WOW64cpu.dllは,CPUの動作モードを64ビット・モードに切り替え,WOW64.dllを呼び出す処理を担っている。

そういう仕組みだったんですねぇー。

 そこで64ビットWindows(WOW64)は,32ビット・アプリケーションが,例えばC:\WINDOWS\system32にアクセスすると,C:\WINDOWS\SysWOW64にリダイレクトする(図14[拡大表示])。 WOW64によるリダイレクトは,Wow64EnableWow64FsRedirection APIで制御可能だ。このAPIは,真または偽を表すbool型の引数を1つ取り,TRUE(真)を指定するとリダイレクトが有効に,FALSE(偽)を指定すると無効になる(標準でリダイレクト有効)。なお,WOW64のシステム・フォルダ名は,GetSystemWow64Directory APIによって取得できる。

32bitのテキストエディタでsystem32にアクセスできない理由がやっと判った。