64bitに移植したドライバをHCK下にインストールするとBSoDになる件

Windows Hardware Certification Kit (HCK)
Windows の 64bit ドライバの認証をするための検証ツールとして、 HCKを使わねばならないのですが、これをインストールするとそれまで動作していた 64bit ドライバが BSoDで死ぬ現象が発生して悩まされていました。

Error は DRIVER_VERIFIER_IOMANAGER_VIOLATION 0xc9 / 0x23e

0x23E
Non-fatal error
A driver has marked an IRP pending but didn't return STATUS_PENDING. (IRP specified.)

さっぱり訳が分からないよ!



ところが、こんなのがあった

Serscan.sys
ドライバーは、Windows Server 2003 Service Pack 2
を実行しているコンピューターに読み込み、デバイスを接続すると、エラー メッセージ:":: 0x000000c9
DRIVER_VERIFIER_IOMANAGER_VIOLATION 停止"

問題が検出されましたおよび Windows コンピューターへの損傷を防ぐためにシャット ダウンされました.
技術情報:

*** [停止]: 0X000000C9 (0X0000021F、0XF1958E80、0X87C10F00、0X00000000)
DRIVER_VERIFIER_IOMANAGER_VIOLATION
この問題は、ドライバーの検証ユーティリティの電源を入れたときに発生します。

原因


の問題を発生、DriverEntry 関数では、Serscan.sys ドライバーは、ドライバーの検証ユーティリティがオンになっている
IRP_MJ_SYSTEM_CONTROL I/O 要求パケット (IRP) のディスパッチ ルーチン内に入っていません。

・ω・ おなじやんか!

というわけで、このバイナリをダウンロードして逆アセンブル

 EntryPoint:
          mov    edi,edi
          push    ebp
          mov    ebp,esp
          mov    eax,[L00013008]
          test    eax,eax
          mov    ecx,0000BB40h
          jz     L0001507F
          cmp    eax,ecx
          jnz    L000150A2
 L0001507F:
          mov    edx,[ntoskrnl.exe!KeTickCount]
          mov    eax,L00013008
          shr    eax,08h
          xor    eax,[edx]
          and    eax,0000FFFFh
          mov    [L00013008],eax
          jnz    L000150A2
          mov    eax,ecx
          mov    [L00013008],eax
 L000150A2:
          not    eax
          mov    [L00013004],eax
          pop    ebp
          jmp    L00015006

 L00015006:
          mov    edi,edi
          push    ebp
          mov    ebp,esp
          mov    eax,[ebp+08h]
          mov    ecx,[eax+18h]
          mov    dword ptr [ecx+04h],L00014006
          mov    ecx,L00011440
          mov    dword ptr [eax+34h],L000111FC
          mov    dword ptr [eax+38h],L0001151E
          mov    dword ptr [eax+40h],L00011562
          mov    dword ptr [eax+70h],L000144E6
          mov    dword ptr [eax+000000A4h],L00014180
          mov    dword ptr [eax+00000090h],L0001446C

// DriverObject->MajorFunction[IRP_MJ_SYSTEM_CONTROL]
                       ,
Usb_DispatchSysCtrl
          mov    dword ptr [eax+00000094h],L000114E6

          mov    [eax+44h],ecx
          mov    [eax+48h],ecx
          xor    eax,eax
          pop    ebp
          retn    0008h
;
 L000114E6:
          mov    edi,edi
          push    ebp
          mov    ebp,esp
          mov    edx,[ebp+0Ch]
          mov    eax,[ebp+08h]
          push    ebx
          mov    ebx,[eax+28h]
          push    esi
          mov    esi,[edx+60h]
          push    edi
          lea    eax,[esi-24h]
          push    00000007h
          pop    ecx
          mov    edi,eax
          rep movsd
          mov    byte ptr [eax+03h],00h
          mov    ecx,[ebx+08h]
          call    [ntoskrnl.exe!IofCallDriver]
          pop    edi
          pop    esi
          pop    ebx
          pop    ebp
          retn    0008h

何やってるか解析してみたところ

NTSTATUS
Usb_DispatchSysCtrl(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP           Irp
    ){
    NTSTATUS ntStatus;
    PDEVICE_EXTENSION deviceExtension = (PDEVICE_EXTENSION) DeviceObject->DeviceExtension;
    IoCopyCurrentIrpStackLocationToNext(Irp);
    ntStatus = IoCallDriver(deviceExtension->TopOfStackDeviceObject, Irp);
    return ntStatus;
}

多分こういうことだと思う・ω・

おすすめ

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です