Natural Software

KinectなどのDepthセンサーを中心に活動しています。最近はHoloLensになりました。

FltReadFileの制限事項について

Windowsのドライバ開発のためのIFS(Installable File System) KitのAPIであるFltReadFileについて。

IFSの情報が日本にはほとんどなくて開発がかなり大変。
とりあえずハマりそうでかつ情報がない部分を小出しにしようかなと。


情報収集はドライバ全体に言えることだと思うけど日本語のサイトは期待しないほうがいいですね。
圧倒的に量が少ない。

参考にしてるサイトといえばOSR Online
ここのMLに入ってメールをThunderbirdで溜め込んでGoole Desktopで検索。
これ最強(笑)


今回ハマって情報が手元以外にまったくなかった事例を。


ファイルシステムフィルタドライバを開発していてNTFS.sysでBSOD(Bugcheck 0x24)が発生した。
WinDbgで追うと、どうもFltReadFile()で落ちてるらしい。

Googleで調べてもまったく出てこない。


ここでGoole Desktopの登場ですよ(笑)

ちょいちょいと検索するとドンピシャなのが出てきた。


どうも FltReadFile() の中で呼ばれている NtfsAcquirePagingResourceShared() で pFCBHeader->PagingIoResource のNULLチェックをしてるらしい。
で、そこで引っかかってるとの事。

あとは PagingIoResource で調べていくと、PagingIoResource を持っているのは FSRTL_COMMON_FCB_HEADERという構造体で、このデータ自体は FsContext にポインタとして格納されているらしい。


ということで、FltReadFile() の前に

FSRTL_COMMON_FCB_HEADER *fcbHeader = (FSRTL_COMMON_FCB_HEADER *)fileObject->FsContext;
if ( fcbHeader->PagingIoResource == 0 ) {
    return;
}

FltReadFile( ... );

と入れたら落ちなくなった。


これはMLに入ってなかったら絶対分からなかった。。。

ホント有難いよ。