Rubyで遊んだ日々の記録。あくまで著者視点の私的な記録なので、正確さを求めないように。
Rubyと関係ない話題にはその旨注記しているはず。なので、一見関係無いように見える話題もどこかで関係あるのかもしれません。または、注記の書き忘れかもしれません...
_ 結局遅れて出たらしい([ruby-dev:33947], [ruby-dev:33951])。
例によってtar.gzのみミラーしてある。
_ 以下は最近の(ということは確認してないけどだいたいXP以降の)Windowsの話。なおRubyとはたぶん全然関係ない。
_ Windowsでは、システムワイドの環境変数を変更した場合、各ウィンドウにWM_SETTINGCHANGE
が通知される。というか、しないといけないことになっている。
ここで「システムワイドの環境変数」と言っているのは、コントロールパネルのシステムの中で設定する「ユーザの環境変数」と「システム環境変数」という奴である。
システムワイドなのに「ユーザの環境変数」も含むのかよ、という突っ込みが入りそうだが、ここではその反対語が「プロセスの環境変数」なのだと理解されたい。
_ シェル(Explorer)はこのWM_SETTINGCHANGE
を受け取って、自分が持ってる環境変数領域を再生成して、以降子プロセスを起動する際に新しい環境変数領域を渡している。
シェルにこの機能があるため、システムワイドの環境変数を変更してもシェルからプロセスを起動する分には再起動なしでそのプロセスに新しい環境変数を反映できる。すばらしい。
_ さて、この再生成に相当する処理を自前でやるのはとてもとても大変である。
システム環境変数はHKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment
に、ユーザ環境変数はHKCU\Environment
にそれぞれあるが、これから自力で環境変数領域を再構築するのは相当めんどくさい。
また、このどちらにも格納されていない、システムが用意する環境変数(一例としてはCOMPUTERNAME
)などがあるので、こういうのも全部知っていないと、シェルと同じ環境変数領域を作って子プロセスに渡すことはできない。
_ しかし、シェルができるということは、実はそれをやるAPIがあるんじゃねーの? と思うのは自然な発想である。
というわけで、shell32.libにはBOOL RegenerateUserEnvironment(WCHAR**, BOOL);
というAPIがある。
... あるにはあるのだが、非公開、いやexportされてるから非公開って変だな、つまりドキュメントが存在しない。SDKのヘッダファイルにも入っていない。
ま、とりあえず第1引数にポインタのポインタを渡して第2引数にTRUE
を渡すと、うまくいけば第1引数に現時点の環境変数領域が入って、戻り値でTRUE
が返される。失敗するとたぶんFALSE
なんだろう。
なお、第2引数の意味はよくわかんないので、実はなんかいろいろ動作を変えられるのかもしれない。
また、自信はないが、第1引数に入ったポインタはFreeEnvironmentVariable()
で解放すればいいのだと思われる。
_ (追記)
その後実験してみたが、第2引数がTRUE
なら自身の環境も同時に更新され、FALSE
なら自身の環境はそのままらしい。
_ \
をパス区切りで使うプラットフォームおよびファイルシステムに大文字小文字の区別のないプラットフォームでのWEBrickの脆弱性が公開されている。
... てゆーかもろWindows。
_ とりあえず、1.8.5-p115と1.8.6-p114のミラーはいつも通り用意した。
mswin32版バイナリは後ほど。
1.9は注意喚起のみでバイナリは用意しない予定。
被捕捉アンテナ類
[Ant]
[Antenna-Julia]
[Rabbit's Antenna]
[Ruby hotlinks]