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.)
さっぱり訳が分からないよ!
ところが、こんなのがあった
問題が検出されましたおよび Windows コンピューターへの損傷を防ぐためにシャット ダウンされました. 技術情報: *** [停止]: 0X000000C9 (0X0000021F、0XF1958E80、0X87C10F00、0X00000000) 原因 こ |
・ω・ おなじやんか!
というわけで、このバイナリをダウンロードして逆アセンブル
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: // DriverObject->MajorFunction[IRP_MJ_SYSTEM_CONTROL] mov [eax+44h],ecx |
何やってるか解析してみたところ
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; } |
多分こういうことだと思う・ω・
Comments