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