VfIrpLogUnlockDatabase
VOID __stdcall VfIrpLogUnlockDatabase(UINT64 SiloNumber){
__int64 v1;
unsigned __int64 v2;
_QWORD **v3;
_QWORD *v4;
PADAPTER_OBJECT *v5;
PADAPTER_OBJECT v6;
PADAPTER_OBJECT **v7;
v1 = 3i64 * (unsigned int)SiloNumber;
*(_DWORD *)(ViIrpLogDatabase + 24i64 * (unsigned int)SiloNumber) = 0;
v2 = (unsigned __int8)KeAcquireSpinLockRaiseToDpc(&ViIrpLogDatabaseLock);
v3 = (_QWORD **)(ViIrpLogDatabase + 8 * (v1 + 1));
v4 = *v3;
while( v4 != v3 )
{
v5 = (PADAPTER_OBJECT *)(v4 - 1);
v4 = (_QWORD *)*v4;
if( ((_DWORD)v5[3] & 4) != 0 )
{
HalPutDmaAdapter(*v5);
v6 = v5[1];
v7 = (PADAPTER_OBJECT **)v5[2];
if( (PADAPTER_OBJECT *)v6->AdapterObject.DmaHeader.DmaOperations != v5 + 1 || *v7 != v5 + 1 )
__fastfail(3u);
*v7 = (PADAPTER_OBJECT *)v6;
v6->AdapterObject.DmaHeader.DmaOperations = (_DMA_OPERATIONS *)v7;
ExFreePoolWithTag(v5, 0);
}
}
KxReleaseSpinLock(&ViIrpLogDatabaseLock);
__writecr8(v2);
}Referenced by:
ViDdiDispatchWmiQueryAllData