VfPutDmaAdapter
VOID __fastcall VfPutDmaAdapter(_DMA_ADAPTER *DmaAdapter){
void(__fastcall *v2)(_DMA_ADAPTER *);
UINT64 v3;
void(__fastcall *v4)(_DMA_ADAPTER *);
_LIST_ENTRY *Param3;
char v6;
UINT8 v7;
UINT8 v8;
int v9;
int Flink_high;
int Blink;
int Blink_high;
int Flink;
UINT64 Flink_low;
UINT64 Blink_low;
_LIST_ENTRY *v16;
_LIST_ENTRY *v17;
UINT64 v18;
UINT64 v19;
UINT64 v20;
VF_ASSERT_MAX_IRQL((UINT8)DmaAdapter);
LODWORD(v2) = ViGetRealDmaOperation(DmaAdapter, 8ui64);
v4 = v2;
if( v2 )
{
KeAcquireSpinLockRaiseToDpc(&qword_140D49088, v3);
Param3 = ViAdapterList.Flink;
v6 = 0;
v8 = v7;
v9 = 0;
while( &ViAdapterList != Param3 )
{
if( DmaAdapter == (_DMA_ADAPTER *)Param3[1].Flink )
{
v9 = _InterlockedDecrement((volatile signed __int32 *)&Param3[2].Flink + 1);
if( v9 < 0 )
{
ViHalPreprocessOptions(
&byte_140C12D28,
(PSTR)"Driver has attempted to access an adapter(%p) that has already been released.",
0x18ui64,
(UINT64)DmaAdapter,
(UINT64)Param3,
0i64,
v20);
VfReportIssueWithOptions(0xE6ui64, 0x18ui64, (UINT64)DmaAdapter, (UINT64)Param3, 0i64, &byte_140C12D28);
}
ViFlushZeroMapRegisterBaseWcbs((INT64)Param3);
Flink_high = HIDWORD(Param3[11].Flink);
Blink = (int)Param3[11].Blink;
if( Flink_high != Blink )
{
ViHalPreprocessOptions(
&byte_140C12D30,
(PSTR)"Cannot put adapter %p until all adapter channels are freed(%x left).",
8ui64,
(UINT64)DmaAdapter,
(unsigned int)(Flink_high - Blink),
(UINT64)Param3,
v20);
VfReportIssueWithOptions(
0xE6ui64,
8ui64,
(UINT64)DmaAdapter,
(unsigned int)(HIDWORD(Param3[11].Flink) - LODWORD(Param3[11].Blink)),
(UINT64)Param3,
&byte_140C12D30);
}
Blink_high = HIDWORD(Param3[10].Blink);
Flink = (int)Param3[11].Flink;
if( Blink_high != Flink )
{
ViHalPreprocessOptions(
&dword_140C12D2C,
(PSTR)"Cannot put adapter %p until all common buffers are freed(%x left).",
7ui64,
(UINT64)DmaAdapter,
(unsigned int)(Blink_high - Flink),
(UINT64)Param3,
v20);
VfReportIssueWithOptions(
0xE6ui64,
7ui64,
(UINT64)DmaAdapter,
(unsigned int)(HIDWORD(Param3[10].Blink) - LODWORD(Param3[11].Flink)),
(UINT64)Param3,
&dword_140C12D2C);
}
Flink_low = SLODWORD(Param3[10].Flink);
if( (_DWORD)Flink_low )
{
ViHalPreprocessOptions(
&byte_140C12D20,
(PSTR)"Cannot put adapter %p until all map registers are freed(%x left).",
9ui64,
(UINT64)DmaAdapter,
Flink_low,
(UINT64)Param3,
v20);
VfReportIssueWithOptions(
0xE6ui64,
9ui64,
(UINT64)DmaAdapter,
SLODWORD(Param3[10].Flink),
(UINT64)Param3,
&byte_140C12D20);
}
Blink_low = SLODWORD(Param3[10].Blink);
if( (_DWORD)Blink_low )
{
ViHalPreprocessOptions(
&dword_140C12D1C,
(PSTR)"Cannot put adapter %p until all scatter gather lists are freed(%x left).",
0xAui64,
(UINT64)DmaAdapter,
Blink_low,
(UINT64)Param3,
v20);
VfReportIssueWithOptions(
0xE6ui64,
0xAui64,
(UINT64)DmaAdapter,
SLODWORD(Param3[10].Blink),
(UINT64)Param3,
&dword_140C12D1C);
}
if( Param3[1].Blink && !BYTE2(Param3[2].Flink) )
{
if( !BYTE3(Param3[2].Flink) )
{
Param3 = 0i64;
break;
}
v6 = 1;
if( v9 > 0 )
break;
}
v16 = Param3->Flink;
if( Param3->Flink->Blink != Param3 || (v17 = Param3->Blink, v17->Flink != Param3) )
__fastfail(3u);
v17->Flink = v16;
v16->Blink = v17;
break;
}
Param3 = Param3->Flink;
}
KeReleaseSpinLock(&qword_140D49088, v8);
if( Param3 && !v6 )
ViReleaseDmaAdapter((__int64)Param3, v18);
v4(DmaAdapter);
if( Param3 && v6 && v9 <= 0 )
ViReleaseDmaAdapter((__int64)Param3, v19);
}
}Referenced by:
No references.