Windows XP の 0x0000000A ストップエラー対応

今更ながらに Windows XP が起動しなくなったので何とかして欲しい。との依頼を受けて見てみることに。パソコンは NEC PC-LL550BD の windows XP メモリー 768MB のパソコン。

立ち上げるとあるところまで進んで自動的に再起動がかかりセーフモード選択画面になるという症状。
よくよく見てみると一瞬ブルーバックの表示が出て再起動しているようだ。
とりあえず F8 で自動再起動をやめて起動してみることに。やっぱり出ていたブルースクリーン。エラーメッセージはこれ。

IRQL_NOT_LESS_OR_EQUAL
0x0000000A(0xFFFFFFE8, 0x00000002, 0x00000001, 0x804DB044)

Microsoft のサポートページ によると、このエラーは、プロセスの IRQL が高すぎる状態で、ページング可能なメモリに対するカーネル モードでのアクセスが行われたこときに発生するらしく、一般的にドライバーが不適切なメモリ アドレスを使用している場合に発生。もしくは、互換性のないデバイス ドライバーか、ハードウェアの問題、および互換性のないソフトウェアが原因となっている可能性もある。と書いてあった。ということは今回はデバイスに関する問題かな。

とりあえず疑うはメモリー。
Linux のディスクに含まれている memtest86+ でテストしてみることにした。1週しかしてないけど結果は真っ赤にはならなかった。ということはメモリーは除外。

思い当たるところは Flash Player の更新インストール中に止まったらしく電源切ったら不安定になったということらしいので、Flash Player を入れ直したり、更新履歴を見ると JAVA の更新もあったのでこれも入れ直したりとしてみたけどダメだった。
とりあえず、原因の起こる前までシステムの復元してみた。直った?
何回か再起動してみたけど再現しなかった。よしよし。とこの日は作業を終えた。
次の日、念のためもう一度起動してみると…止まったorz なんで~?

で、やっぱりハードウェアかデバイスドライバがやられたのかなと次の調査に 0x0000000A に続くパラメータの意味は

  • parameter1 – 不適切な参照が行われたアドレス。
  • parameter2 – そのメモリのアクセスに必要な IRQL。
  • parameter3 – アクセスの種類。0 は読み取り操作、1 は書き込み操作です。
  • parameter4 – parameter1 のメモリを参照した命令のアドレス。

ということらしい。
そうすると、0x804DB044 にある何かが、0xFFFFFFE8 に対してIRQL(0x00000002)を超えたレベルでの書き込み(0x00000001) を行おうとしたということになるのかな。この解釈であってるかな。
まあ、不正な参照を行おうとした命令のアドレス 0x804DB044 ってこれを含むデバイスってことで良いのかなと調べてみると 「PCIバス」が該当。対象が広いなぁ。

とりあえず絞り込むために、起動時に読み込もうとしたドライバを確認しようと ntbtlog.txt を見てみたのだけどストップする時とセーフモードで違いが出ない。あれ?…もしかしてストップした時のログを再起動がかかって起動したときのセーフモードが上書きしてるのか。ダメじゃん。

で、このアドレスを使うドライバはとメモリーマップ見ようと思ったけどツールが起動しないorz
といろいろやっていたらまた起動するようになった。不安定だ。たぶん明日も再現しそうだ。

確率的にネットワークアダプタが怪しいよという情報もあったけど、アドレス範囲違うし、問題出てるアドレス範囲の根本「PCIバス」をいっそのこと入れ直してみよう。と大胆な行動にでることにした。

「PCIバス」のドライバを削除して、再起動。いっぱい!マークがついてる~。っと、デバイスの更新ポチッとしたらドカドカっとドライバのインストールが始まった。すべて終わってもう一度再起動。エラーストップもなくなりたぶん直っただろうと作業終了。

次の日、再現はしなくなった。たぶん PCI に関わるドライバだったんだろうと思われるけどがっつりやっちゃったので正確な原因は不明。Flash Player の更新ってことだからもしかしたらビデオドライバかもしれない。
とりあえず持ち主に引き渡して終了。問題でなければ良いが…。

同時期に、これとは別でパソコンがたちあがらな~いと言われ見てみたらこちらはバッテリ切れ。ボタン電池が切れてたので毎回BIOSの初期設定してよ画面が出て止まるとまあ簡単なことでした。こちらは電池交換にて対応。

頼られるのは良いことだけど、便利屋さんですねぇ。

AE-PICPGM2 のUSBシリアル改造

入手しました。
先日秋月電子通商の web カタログで見つけた小型USB-RS232C変換基板の AE-FT234X。ホントに小さい。
wpid-dsc_0418.jpg

これを秋月電子通商で売ってる AE-PICPGM2 に搭載してしまおうという改造計画を実行しました。
wpid-dsc_0415.jpg

まあ、改造と言ってもコネクタ外して基板をのせるだけなんですが…。
まずはシリアルコネクタを外します。基板に切り込みが入ってるのは自作 RS232C ケーブルのD-SUBコネクタカバーが干渉したため削ってあるだけで今回の改造とは関係ないです。
wpid-dsc_0416.jpg
AE-FT234X で使うのは4つの端子のうち RxD,TxD,GND の3端子を使い、+5V はフリーにしてあります。USB バスパワーで給電も考えたのですが安全を見てやめておきました。
接続は RS232C の2,3,4番端子を使いました。マジックでR,Tと書いてある端子です。この並びだと FT234X の基板を裏返して接続したらちょうど良い感じになるので。あとは、RS232C の 4,5番をブリッジして 4番を GND にする。
次にピンヘッダを立てるわけですが、この並びだと FT234X の +5V がちょうど RS232C の GND になってしまうのでここはつなげず 2,3,4 番にピンヘッダをさして接続します。ピンヘッダをカットするのがイヤだったので1,2,3,4 端子にピンヘッダを付けてます。パターンの改造はこんな感じです。
wpid-dsc_0427.jpg

RS232C のインターフェイスデバイス ADM3202 がついていたのですがこれは外して代わりにジャンパを入れてます。外さないとうまく動きませんでした。
写真は実験の為ホチキスの針でジャンパしてますが裏面を半田付けした方が良いと思います。
※ファームウェアのパラメータ設定で ADM3202 を付けていても動いたので最終的に元に戻しました。

改造は以上です。たいしたことはしてませんが…。完成基板はこんな感じ。
wpid-dsc_0419.jpg
横から見るとこんな感じ。
wpid-dsc_0420.jpg

FT234X はピンヘッダだけで固定されているので、パテか樹脂系の接着剤のようなものでコネクタあたりを固定した方が安心だと思います。

今回2台改造しました。
一応通信テストは成功でした。しかし個体差があるようで1台は通信できるのですがもう一台は通信できずという状態に。
症状は、FT234X を交換するとどちらも通信できる。但しメインIC AE-PGM877 を交換してもダメな方はどちらを付けてもダメだった。そうこうしているうちにどちらも通信できる状態に。なんか不思議な状態になってます。
違いといえば不安定な方は TxD が 3.2V 前後、安定してる方は 3.3V なので TxD の電圧が関係しているのではと思われますが FT234X を交換してどちらも動作。メインICを交換して動作しないというところからそれだけではないのかもしれません。不明です。

まあ、どちらにせよこれで 改良 AE-PICPGM2 の完成です。

で、これ書きながら、なぜ動作不安定なの? ADM3202 を外さないとうまく動かないの?ということをいろいろ考えながら調べてみると、この IC って NOT なんですね。
ということは、FT234X のファームウェアで反転動作すれば問題ないのではと考えて試してみました。

ファームウェアのパラメータ設定は FTDI 社のファーム設定ソフトを使って修正することができます。
[Hardware Specific] => [Invert RS232 Signals] の Invert TXD , Invert RXD にチェックを入れて書き込みを行います。そのあと、一度USBを抜き差ししたら設定が反映されて動作が反転が有効になります。
外した ADM3202 を元に戻して実験してみるとうまく動きました。実際こちらの方が安定するんじゃないかと思います。
スクリーンショット 2014-12-12 11.53.53