2017-12-04 32 views
0

スキャッタ/ギャザ機能のないPCIバスマスタデバイス用のドライバではIoGetDmaAdapter()がコールされますが、0xFFFFFFFFC0000005 Access Violationでは失敗します。これにより、BSODが発生します。ドライバがI/O DMAアダプタを取得できません

は、ここで私はそれを設定方法は次のとおりです。ここで

RtlZeroMemory(&deviceDescription, sizeof(DEVICE_DESCRIPTION)); 
deviceDescription.Master = TRUE; // this is a bus-master device without scatter/gather ability 
deviceDescription.Dma32BitAddresses = TRUE; // this device is unable to perform 64-bit addressing 
deviceDescription.InterfaceType = InterfaceTypeUndefined; 

KdBreakPoint(); 

deviceDescription.Version = DEVICE_DESCRIPTION_VERSION2; 
IoGetDmaAdapter(deviceObject, &deviceDescription, &fakeRegs); 

は私のWindowsカーネルのデバッグセッションです:Guard_Dispatch_iCall_NOPでクラッシュする前に

MyDriver!AllocateHardWareResource+0x313: 
fffff803`319626a3 488b8424e8000000 mov  rax,qword ptr [rsp+0E8h] 
MyDriver!AllocateHardWareResource+0x324: 
fffff803`319626b4 488d442478  lea  rax,[rsp+78h] 
MyDriver!AllocateHardWareResource+0x34d: 
fffff803`319626dd 8b442450  mov  eax,dword ptr [rsp+50h] 
MyDriver!AllocateHardWareResource+0x358: 
fffff803`319626e8 c684248900000001 mov  byte ptr [rsp+89h],1 
MyDriver!AllocateHardWareResource+0x360: 
fffff803`319626f0 c784248000000002000000 mov dword ptr [rsp+80h],2 
MyDriver!AllocateHardWareResource+0x36b: 
fffff803`319626fb 4c8d44244c  lea  r8,[rsp+4Ch] 
KDTARGET: Refreshing KD connection 
KDTARGET: Refreshing KD connection 

*** Fatal System Error: 0x0000007e 
         (0xFFFFFFFFC0000005,0x0000000000000000,0xFFFF9400DE25D4B8,0xFFFF9400DE25CCF0) 

WARNING: This break is not a step/trace completion. 
The last command has been cleared to prevent 
accidental continuation of this unrelated event. 
Check the event, location and thread before resuming. 
Break instruction exception - code 80000003 (first chance) 

A fatal system error has occurred. 

、私は次の呼び出しスタックを参照してください。

HalpGetCacheCoherency + 6D 
HalGetAdapterV2 + A8 
IoGetDmaAdapter + C0 
IoGetDmaAdapter + C0 
IoGetDmaAdapter + C0 
My Call-Site 

私は、物理デバイスオブジェクトが私の広告にもともと提供されていたものと同じアドレスを持っていることを確認しましたdデバイスハンドラ。

"申し訳ありませんが、私はできません"と尋ねるには、Windows Kernel I/O Manager

答えて

0

私のドライバがIoGetDmaAdapter()を呼び出すと、ドライバはIRP_MN_QUERY_INTERFACE経由でGUID_BUS_INTERFACE_STANDARDとGUID_DMA_CACHE_COHERENCY_INTERFACEの2つのインターフェイスクエリを受け取ります。

GUID_DMA_CACHE_COHERENCY_INTERFACEは、Windows 10に新しいか、サーバー2016

GUID_DMA_CACHE_COHERENCY_INTERFACEクエリは、通常、スタック内の次のドライバに渡す必要があります。私は間違いを犯してステータスを成功に設定しましたが、それだけを残すべきでした。

+0

GUID_DMA_CACHE_COHERENCY_INTERFACEクエリは通常、スタック内の次のドライバに渡されます。私は間違いを犯してステータスを成功に設定しましたが、それだけを残すべきでした。 https://docs.microsoft.com/en-us/windows-hardware/drivers/kernel/irp-mn-query-interface – GregC

関連する問題