仮面's profile宇宙仮面の C# 研究室.Live SpacePhotosBlogListsMore ![]() | Help |
|
May 25 Codeseek 勉強会のWinRing0の資料をアップしました。第40回codeseek勉強会 「宇宙仮面のWinRing0」 (共催:tk-engineering、こみゅぷらす、eパウダ~、.Net/C# Group) 開催日:2009年5月19日(火) 19:00~21:00 18:55に6F受付集合 場所:マイクロソフト社新宿オフィス6F会議室 募集締め切り:2009年5月16(土)23時59分59秒 20名まで 参加費無料 May 19 削除できなくなった Gadget を強制的に削除するいろいろ悪さをしていて、Gadget が消せなくなった場合の対処方法 w
なお、この場合、サイドバーの設定がすべてリセットされます。 May 18 XML Web Service の呼び出しCPUの温度を取得する際、WebClient を使用した、非同期呼び出し。 なお、Silverlight 3 Beta では、linq がサポートされていないので動かない。 /////////// WebClient client = new WebClient(); string request = "<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\"> <soap:Body><CPUTemperatureStringResponse xmlns=\"http://tempuri.org/\"> <CPUTemperatureStringResult>float</CPUTemperatureStringResult> </CPUTemperatureStringResponse></soap:Body></soap:Envelope>"; client.Headers.Add(HttpRequestHeader.ContentType, "text/xml"); client.Headers.Add("SOAPAction", "http://tempuri.org/CPUTemperature"); client.UploadStringCompleted += delegate(Object sender2, UploadStringCompletedEventArgs ev) XDocument xmlHeadlines = XDocument.Parse(ev.Result); string temp = headlines.First().Value; TextBox1.Text = temp; client.UploadStringAsync(new Uri("http://localhost/SystemTemperature/Temperature.asmx"), request); May 06 CPUの温度取得に関するメモ6WinRing0 を利用した Web Service のビルド環境の構築まとめ (Vista 32bit版)
CPUの温度取得に関するメモ5Web Service から OpenLibSys を呼び出すと、InitializeOls(); を呼ぶところでOLS_DLL_DRIVER_NOT_FOUND エラーになってしまう。 この原因は、WinRing0.sys を Visual Studio のデバッグ環境で、Web Service から呼び出すときに、OlsDll.cpp の Initialize()関数の中で、ドライバーを呼び出すときのパスが、 “C:\Program Files\Common Files\Microsoft Shared\DevServer\9.0\WinRing0.sys” になってしまうためであることが判明した。暫定で、その場所に WinRing0.sys をコピーして先に進んでみる。 次に、Web Service をローカルの IIS に発行してみると、ドライバーを呼び出すときのパスが今度は、 “c:\windows\system32\inetsrv\WinRing0.sys” になってしまい、ドライバーを探しに行ってエラーになってしまう。そこに、WinRing0.sys をコピーすることで、Web Service から OpenLibSys を呼び出せるようになった。 はまったメモ: WinRing0が LoadLibrary で呼ばれていて、Web Service からデバッグできないので、ビルド環境を作って、メッセージを埋め込んでデバッグするしかなかった。もう少しいい方法があるのかな・・・ そこで、WinRin0\dll をビルドしてたら、DEF ファイルが外出しになっていて、リンカオプションに def ファイルを追加する必要があった。 /DEF:"C:\Users\uchukamen\Desktop\WinRing0_1_3_0\source\dll\OlsApi.def" そこで、fprintf (stderr でと思ったが、出力先がないので、エラーを出せない。イベントログも面倒なので、とりあえず、ファイルにエラーメッセージを書き出した。 やっぱりワナがあった w ここまでくれば、あとは OpenLibSys も気にせず、管理者モードに移行する必要もなく、簡単にアプリができる。ただ、OpenLibSys 強力な分、セキュリティ上注意が必要。 ASP.NET で偽装する温度計を Web Service にしてなんてことを考えて、Administrator 権限が必要な OpenLibSys を Web Service 化するには、偽装しなければならない。その他、きっとはまるだろうと思いつつ、やっぱり引っかかりますね。 Web.config で <configuration> と追加して、実行すると、 '/' アプリケーションでサーバー エラーが発生しました。 構成にエラーがあります。説明: この要求を処理するために必要な構成ファイルの処理中にエラーが発生しました。以下のエラーの詳細を確認し、構成ファイルに変更を加えてください。 というエラーが発生。Vista では、Administrator アカウントが無効になっているので、 [管理ツール] → [ローカル セキュリティ ポリシー] これを有効にしてみた。すると、このエラーは、無事解決。 しかし、InitializeOls(); を呼ぶところで引っかかっている。サービス側なので、デバッグが厄介だな・・・ この原因は、WinRing0.sys を Visual Studio のデバッグ環境で、Web Service から呼び出すときに、OlsDll.cpp の Initialize()関数の中で、ドライバーを呼び出すときにディレクトリが、 “C:\Program Files\Common Files\Microsoft Shared\DevServer\9.0\WinRing0.sys” になってしまい、OLS_DLL_DRIVER_NOT_FOUND エラーになってしまう。暫定で、その場所に WinRing0.sys をコピーして先に進んでみる。 次に、Web Service をローカルの IIS に発行してみると、こんどは “c:\windows\system32\inetsrv\WinRing0.sys” を探しに行ってエラーになる。そこに、WinRing0.sys をコピーすることで、Web Service から OpenLibSys を呼び出せるようになった。 May 05 あれ? Vista IIS 7 で Web Service が動かない・・・温度計をWeb Serviceにしてしまおうかと思って、久々にWeb Service を作って、ローカルの Vista に発行してみたら、 「IIS 7.0 でホストされている Web サイトにアクセスすると、エラー メッセージ:"HTTP エラー 500.19-内部サーバー エラー"」 というエラーで Web Service が動かない。 http://support.microsoft.com/kb/942055/ja に対処方法が書かれていたので、その通りにしてみたが症状は変わらず。 あれれ? ということで、いろいろ調べていたら、[コントロール パネル] → [プログラムと機能] → [Windows の機能を有効化または無効化] → [アプリケーション開発機能] の ASP.NET のチェックがされていなかった。 VISTA を入れて、Visual Studio 2008 を標準インストールしただけで特に何もしていないはずなので、標準インストールでは ASP.NETは ON にならないのかな? このチェックを入れたら、無事動いた。 Windows Vista IIS で ASP.NET を動かすための設定は、 http://msdn.microsoft.com/ja-jp/library/aa964620.aspx に書かれています。エラーメッセージからサポートオンラインの情報を引いたのだけれど、その情報に惑わされてしまった。というわけで、またはまりそうなので、一応メモっておこう。CPUの温度取得に関するメモ4Intel® 64 and IA-32 Architectures Software Developer’s Manual によると、今使用中の ASUS P5LD2-V + Pentium 4 D では、MSR から CPU の温度が取れないことが判明した。 で、http://kariunten.homeip.net/programming/winring0.html にマザーボードのI/Oコントローラからデータを取得する方法が載っていたので、OpenLibSys で試してみた。 ASUS P5LD2-Vのマニュアルを調べてみると、コントローラは W83627EHF だったので、そのマニュアル http://www.winbond-usa.com/products/winbond_products/pdfs/PCIC/W83627EHF_W83627EHG.pdf を調べてみた。それによると、このチップには温度センサーが3つ搭載されている。ただし、マザーボード上で使用されているのは、CPUTIN Temperature、SYSTIN Temperature の2つのみで、AUXTIN Temperatureは使用されていない模様。 このコントローラーからデータを取得するには、IO ポートからデータを取得すればよい。 取得する方法は、0x295 ポートにレジスタを指定、0x296 ポートからデータを取得するという手順。 ただし、バンクが 0, 1, 2, 3, 4 とあり、0x50 以上のレジスターにアクセスするには、バンクを切り替える必要がある。バンクの切り替え方法は、0x4E ポートの下位3ビットで指定する。 CPUTIN (CPUの温度)は、 バンク1、0x50 レジスタにハイビット(温度 ℃) バンク1、0x51 レジスタにロービット(温度 7ビット目が立っていれば +0.5℃) となっているので、次のようなコードになる。 //======================================= // バンク1 Console.WriteLine("CPUTIN Temperature Low : ...." + lo.ToString("X") + "\r\n"); float CPUTIN = hi + ((lo & 0x80) != 0 ? 0.5f : 0); Console.WriteLine("CPUTIN Temperature: ...." + CPUTIN.ToString() + "\r\n"); 同様に、SYSTIN (マザーボードの温度)は、バンク0、0x27 レジスタなので、 //======================================= // バンク0 を指定 Console.WriteLine ("SYSTIN Temperature: ...." + hi.ToString() + "\r\n"); なお、SYSTINでは、0.5℃単位の測定はできない仕様になっている。 結果は次の通り。 [CPUTIN Temperature] [SYSTIN Temperature] 下は、ASUS のおまけアプリの Probe II のデータ おおおおっ、ちゃんと取れるじゃないですか。OpenLibSys 偉大だ。 というか、Core2にアップしてしまえば、MSRで取れるので、こんなことしないですむんだけどなぁ・・・ というか、こんなハード固有の実装させないように頑張ってよ >> MS というか、温度を気にしないといけないような CPU 勘弁してよ >> Intel, AMD CPUの温度取得に関するメモ3MSR(Model Specific Register) 0x19C Bits [22:16] で温度が取得できることは確認できたが、このセンサーの値は、Tjmax への相対値であることがマニュアルに書かれている。しかし、そのTjmaxの値をMSRから取得する方法がマニュアルに書かれていない。 いろいろ探していたらば、 http://software.intel.com/en-us/forums/deleted-posts/topic/51574/page/1/ で、MSR 0xEE で取得が可能なようだが、undocumented だそうだ。ちょっと古い資料なので、85度か100度と書かれている。 http://www.xtremesystems.org/forums/showthread.php?t=179044&page=23 によると、0xEE の bit:30 で、0=100 1=85 といううわさもある。 一方、Q6600 では、95度らしいという書き込みもある。 http://www.xtremesystems.org/forums/showthread.php?t=179044&page=27 Atom の場合、20度室温で 0x19C Bits [22:16] から88前後が返されているので、100度にしても合わない。 http://download.intel.com/design/processor/datashts/320032.pdf によると、a catastrophic processor temperature of 125°C (maximum), or if the THERMTRIP# MSR 0xEE で取得してみると、 000000EE: 00000000 02F90002 となり、仕様が分からない。 http://www.bugtrack.almico.com/view.php?id=1150 によると、 if bit 30 of MSR(0x00EE) is 1 then こんな情報もある。 それにしても、xtremesystems.org のスレッドがものすごいことになっているのには、驚いた。 いずれにしても、インテルが仕様をはっきり書いていない(NDAを結ばないともらえないらしい)のが悪いということがよくわかった。 May 04 CPUの温度取得に関するメモ2石坂さん、渋木さんに教えていただいたサイドバーガジェットを Windows 7 Beta on Atom N280で動かしてみました。こんな感じ。 原理はデバイスドライバーで、Ring0のカーネルモードに移行して、そこでアセンブラでRDMSRにより、Model Specific Register を叩いて、直接モードスペシフィックレジスターからデータを読み取っていますね。そのためのライブラリがOpenLibSysから提供されている。なるほど、それなら早いはずだ。それにしても、OpenLibSysを作った人は偉いなぁ・・・とひとしきり感動しました。 なお、Vista on Pentium4 Dでは、温度が取得できない。orz。MSR的には、0x19C の 22:16 で同じ仕様に見えるんだけど、どこか細かいところで違うのかな・・・ なお、MSRは、文字通りモデル固有のレジスタであるため、プロセッサのモデルごとに仕様が異なっている。Intel のIntel® 64 and IA-32 Architectures Software Developer’s Manual Volume 3Bによると、Core2、Atom、P4 and Xeon、Core Solor and Core Duo、Pentium M、P6、Pentiumとファミリーごとに説明が分かれています。 |
|
|