VfPutDmaAdapter
VOID __stdcall VfPutDmaAdapter(_DMA_ADAPTER *DmaAdapter){
void(__fastcall *RealDmaOperation)(_DMA_ADAPTER *);
char v3;
_KIRQL v4;
UINT64 Param3;
char v6;
char v7;
int v8;
int v9;
int v10;
int v11;
int v12;
UINT64 v13;
UINT64 v14;
__int64 v15;
_QWORD *v16;
UINT64 v17;
VF_ASSERT_MAX_IRQL((UINT8)DmaAdapter);
RealDmaOperation = (void(__fastcall *)(_DMA_ADAPTER *))ViGetRealDmaOperation((ULONG_PTR)DmaAdapter, 8ui64);
if( RealDmaOperation )
{
v3 = KeAcquireSpinLockRaiseToDpc(&qword_140D49088);
Param3 = ViAdapterList;
v6 = 0;
v7 = v3;
v8 = 0;
while( &ViAdapterList != (UINT64 *)Param3 )
{
if( DmaAdapter == *(_DMA_ADAPTER **)(Param3 + 16) )
{
v8 = _InterlockedDecrement((volatile signed __int32 *)(Param3 + 36));
if( v8 < 0 )
{
ViHalPreprocessOptions(
&unk_140C12D28,
(PSTR)"Driver has attempted to access an adapter(%p) that has already been released.",
0x18ui64,
(UINT64)DmaAdapter,
Param3,
0i64,
v17);
VfReportIssueWithOptions(0xE6ui64, 0x18u, (ULONG_PTR)DmaAdapter, Param3, 0, &unk_140C12D28);
}
ViFlushZeroMapRegisterBaseWcbs((_ADAPTER_INFORMATION *)Param3);
v9 = *(_DWORD *)(Param3 + 180);
v10 = *(_DWORD *)(Param3 + 184);
if( v9 != v10 )
{
ViHalPreprocessOptions(
(UINT64 *)((char *)&qword_140C12D2C + 4),
(PSTR)"Cannot put adapter %p until all adapter channels are freed(%x left).",
8ui64,
(UINT64)DmaAdapter,
(unsigned int)(v9 - v10),
Param3,
v17);
VfReportIssueWithOptions(
0xE6ui64,
8u,
(ULONG_PTR)DmaAdapter,
*(_DWORD *)(Param3 + 180) - *(_DWORD *)(Param3 + 184),
Param3,
(UINT64 *)((char *)&qword_140C12D2C + 4));
}
v11 = *(_DWORD *)(Param3 + 172);
v12 = *(_DWORD *)(Param3 + 176);
if( v11 != v12 )
{
ViHalPreprocessOptions(
&qword_140C12D2C,
(PSTR)"Cannot put adapter %p until all common buffers are freed(%x left).",
7ui64,
(UINT64)DmaAdapter,
(unsigned int)(v11 - v12),
Param3,
v17);
VfReportIssueWithOptions(
0xE6ui64,
7u,
(ULONG_PTR)DmaAdapter,
*(_DWORD *)(Param3 + 172) - *(_DWORD *)(Param3 + 176),
Param3,
&qword_140C12D2C);
}
v13 = *(int *)(Param3 + 160);
if( (_DWORD)v13 )
{
ViHalPreprocessOptions(
&qword_140C12D20,
(PSTR)"Cannot put adapter %p until all map registers are freed(%x left).",
9ui64,
(UINT64)DmaAdapter,
v13,
Param3,
v17);
VfReportIssueWithOptions(
0xE6ui64,
9u,
(ULONG_PTR)DmaAdapter,
*(_DWORD *)(Param3 + 160),
Param3,
&qword_140C12D20);
}
v14 = *(int *)(Param3 + 168);
if( (_DWORD)v14 )
{
ViHalPreprocessOptions(
(UINT64 *)((char *)&qword_140C12D18 + 4),
(PSTR)"Cannot put adapter %p until all scatter gather lists are freed(%x left).",
0xAui64,
(UINT64)DmaAdapter,
v14,
Param3,
v17);
VfReportIssueWithOptions(
0xE6ui64,
0xAu,
(ULONG_PTR)DmaAdapter,
*(_DWORD *)(Param3 + 168),
Param3,
(UINT64 *)((char *)&qword_140C12D18 + 4));
}
if( *(_QWORD *)(Param3 + 24) && !*(_BYTE *)(Param3 + 34) )
{
if( !*(_BYTE *)(Param3 + 35) )
{
Param3 = 0i64;
break;
}
v6 = 1;
if( v8 > 0 )
break;
}
v15 = *(_QWORD *)Param3;
if( *(_QWORD *)(*(_QWORD *)Param3 + 8i64) != Param3 || (v16 = *(_QWORD **)(Param3 + 8), *v16 != Param3) )
__fastfail(3u);
*v16 = v15;
*(_QWORD *)(v15 + 8) = v16;
break;
}
Param3 = *(_QWORD *)Param3;
}
LOBYTE(v4) = v7;
KeReleaseSpinLock(&qword_140D49088, v4);
if( Param3 && !v6 )
ViReleaseDmaAdapter((_ADAPTER_INFORMATION *)Param3);
RealDmaOperation(DmaAdapter);
if( Param3 && v6 && v8 <= 0 )
ViReleaseDmaAdapter((_ADAPTER_INFORMATION *)Param3);
}
}Referenced by:
No references.