ExpFreeAsid
VOID __stdcall ExpFreeAsid(UINT64 AsidToFree){
int v1;
struct _DMA_ADAPTER *v2;
UINT8 *v3;
int v5;
struct _KLOCK_QUEUE_HANDLE LockHandle;
v1 = AsidToFree;
memset(&LockHandle, 0, sizeof(LockHandle));
v2 = (struct _DMA_ADAPTER *)*((_QWORD *)KeGetCurrentThread() + 23);
KeAcquireInStackQueuedSpinLock(&qword_140C166D8, &LockHandle);
v3 = &qword_140C166D0[16 * v1];
if( (*((_QWORD *)v3 + 1))-- == 1i64 )
{
*(_QWORD *)v3 = 0i64;
v5 = 1;
--dword_140C166C8;
}
else
{
*((_QWORD *)v3 + 1) |= 0x8000000000000000ui64;
v5 = 0;
}
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
__writecr8(LockHandle.OldIrql);
if( v5 == 1 )
HalPutDmaAdapter(v2);
}Referenced by:
ExFreeSvmAsid
ExpAssignPasid