VfIrpDatabaseEntryInsertAndLock
LIST_ENTRY *__fastcall VfIrpDatabaseEntryInsertAndLock(UINT64 a1, INT64 a2, INT64 a3){
_QWORD *v4;
__int64 v6;
_QWORD *v7;
__int64 v8;
LIST_ENTRY *result;
INT64 OldIrql;
OldIrql = a2;
v4 = (_QWORD *)(a3 + 32);
*(_QWORD *)a3 = a1;
LOBYTE(OldIrql) = 0;
*(_QWORD *)(a3 + 8) = 0i64;
*(_QWORD *)(a3 + 24) = 1i64;
*(_DWORD *)(a3 + 20) = 1;
*(_QWORD *)(a3 + 48) = ViPacketNotificationCallback;
*(_QWORD *)(a3 + 40) = a3 + 32;
*(_QWORD *)(a3 + 32) = a3 + 32;
ViIrpDatabaseAcquireLockExclusive((UINT8 *)&OldIrql);
v6 = 16i64 * (unsigned __int8)(-125 * (a1 >> 12));
v7 = (_QWORD *)(v6 + ViIrpDatabase);
v8 = *(_QWORD *)(v6 + ViIrpDatabase);
if( *(_QWORD *)(v8 + 8) != v6 + ViIrpDatabase )
__fastfail(3u);
v4[1] = v7;
*v4 = v8;
*(_QWORD *)(v8 + 8) = v4;
*v7 = v4;
VfUtilAddressRangeAdd((UINT64 *)(v6 + ViIrpDatabaseAddressRanges), a1, 208i64);
ViIrpDatabaseReleaseLockExclusive(OldIrql);
result = (LIST_ENTRY *)VfIrpDatabaseEntryFindAndLock(a1);
_InterlockedDecrement((volatile signed __int32 *)(a3 + 20));
--*(_DWORD *)(a3 + 24);
return result;
}Referenced by:
VfPacketCreateAndLock