Windows 10 バージョン 1703 以降で共有フォルダへのアクセスで Bug Check 0x7F が発生する

適用対象: Windows 10, version 1703Windows 10, version 1709Windows 10, version 1803 詳細

SYMPTOMS


以下のシナリオを考えます。

Windows 10 バージョン 1703 以降の x86 の PC を用意します。

・そこから、Linux の NFS サーバー上の共有フォルダをマウントします。

PC 上から共有フォルダにファイルをコピーします。

・この PC 上に、IRP_MJ_CREATE の Post-operation コールバックで FltGetFileNameInformation() を呼ぶファイルシステムミニフィルタをロードし、上記共有フォルダにアタッチします。

・再度、PC 上から共有フォルダにファイルをコピーします。

 

上記の結果、bugcheck code 0x7F (UNEXPECTED_KERNEL_MODE_TRAP)、つまりカーネルスタックオーバーフローが発生します。

CAUSE


TCP/IP ドライバー (tcpip.sys) の実装が、Windows 10 バージョン 1703 以降で変更され、以下のガイドラインに反した実装となっていたためです。

 

How do I keep my driver from running out of kernel-mode stack?

< https://docs.microsoft.com/en-us/previous-versions/windows/hardware/design/dn613940(v=vs.85) >

 

What should you do?

 

To minimize stack usage in your driver:

・Declare only local variables that are pointers or simple counters.

・Never allocate large structs or other aggregate structures such as C++ classes on the stack.

RESOLUTION/WORKAROUND


Windows 10バージョン 1903 で修正されております。

Windows 10 バージョン 1809 での修正は、以下のサポート技術情報のバージョンに含まれております。

 

  April 2, 2019-KB4490481 (OS Build 17763.404)

  < https://support.microsoft.com/ja-jp/help/4490481 >

MORE INFORMATION


本現象に該当することを確認するには、カーネルデバッガ―で、!stackusage デバッガエクステンションを実行します。以下の実行結果の通り、tcpip!CheckConnectBypass という関数で、0x914 という大きなサイズのスタック領域を消費していることが確認できます。

 

kd> !stackusage

Stack Usage By Function

=================================================================================

 

      Size     Count  Module

0x00000914         1  tcpip!CheckConnectBypass