ViReleaseDmaAdapter
VOID __stdcall ViReleaseDmaAdapter(_ADAPTER_INFORMATION *AdapterInformation){
_ADAPTER_OBJECT *Param3;
UINT64 *v2;
unsigned __int8 v4;
VOID **v5;
unsigned __int64 v6;
VOID **v7;
__int64 v8;
UINT64 v9;
ULONG_PTR v10;
UINT64 v11;
Param3 = (_ADAPTER_OBJECT *)*((_QWORD *)AdapterInformation + 2);
v2 = (UINT64 *)(AdapterInformation + 70);
Param3->AdapterObject.DmaHeader.DmaOperations = (_DMA_OPERATIONS *)*((_QWORD *)AdapterInformation + 6);
v4 = KeAcquireSpinLockRaiseToDpc((UINT64 *)AdapterInformation + 35);
v5 = (VOID **)*((_QWORD *)AdapterInformation + 33);
*((_QWORD *)AdapterInformation + 33) = 0i64;
v6 = v4;
KxReleaseSpinLock(v2);
__writecr8(v6);
if( v5 )
{
v7 = v5;
v8 = 32i64;
do
{
if( *v7 )
MmFreeContiguousMemory(*v7);
++v7;
--v8;
}
while( v8 );
ExFreePoolWithTag(v5, 0);
}
HalPutDmaAdapter(Param3);
v10 = v9;
if( AdapterInformation[9] > 0 && v9 && (v9 != 1 || !*((_BYTE *)AdapterInformation + 34)) )
{
ViHalPreprocessOptions(
&unk_140C12D3C,
(PSTR)"Too many outstanding reference counts(%x) for adapter %p",
0x11ui64,
v9,
(UINT64)Param3,
(UINT64)AdapterInformation,
v11);
VfReportIssueWithOptions(0xE6ui64, 0x11u, v10, (ULONG_PTR)Param3, (ULONG_PTR)AdapterInformation, &unk_140C12D3C);
}
ExFreePoolWithTag(AdapterInformation, 0);
}Referenced by:
VfGetDmaAdapter
VfIoDeleteDevice
VfPutDmaAdapter