少し前にWinXP SP2のネタを書いたが、ドライバ屋にとってSP2になって変わったところの一つが判明。
「OSによるメモリプールの監視強化」がそれで、確保したメモリプールをオーバーランして使用していた場合に、その領域をExFreePool()すると、この時点でWindowsがプールのチェックを行ってメモリプールが不正に使用されたということで、BAD_POOL_HEADER例外を発生させブルースクリーンとなる。
ネットで「XP SP2 BAD_POOL_HEADER」で検索してみると、今までの市販製品のドライバがSP2をインストール後にこのエラーを吐いて動かなくなったという事例がけっこう出ている。つまり、それだけメモリ管理にバグが残っているドライバが市販品にくっついて出回っているということ。
SP1までだと仮にメモリをオーバーランしてもそれがノンページドメモリの場合はおそらくメモリリークとなるだけでエラーにはならないと思う(もちろんバグなんだけど)。ページドメモリの場合はPageFault例外になるから気づくかな…。
これは実際にバグの箇所が特定しにくい上に(あくまでExFreePool()時に例外が発生するので、スタックトレースがその場所ズバリを指さない場合がある)、コードの作りによっては再現性もまちまちだろうから追っかけるのはちょっと面倒。DriverVerifierでSpecialPoolとPoolTrackingのチェックをさせながら実際にドライバを動作させてBugCheckが発生しないかテストしていくのが地道だけど王道かと。
ちなみに、このネタ元はOsrOnlineの記事。
コメント