ExpFreeAsid

VOID __stdcall ExpFreeAsid(UINT64 AsidToFree){
  unsigned int v1; 
  _EPROCESS *Process; 
  _QWORD *v3; 
  int v5; 
  _KLOCK_QUEUE_HANDLE LockHandle; 

  v1 = AsidToFree;
  memset(&LockHandle, 0, sizeof(LockHandle));
  Process = KeGetCurrentThread()->ApcState.Process;
  KeAcquireInStackQueuedSpinLock((PKSPIN_LOCK)&WheapDeferredInternalLogsEventLock + 291, &LockHandle);
  v3 = (_QWORD *)(*(&WheapDeferredInternalLogsEventLock + 290) + 16i64 * v1);
  if( v3[1]-- == 1i64 )
  {
    *v3 = 0i64;
    v5 = 1;
    --*(&WheapDeferredInternalLogsEventLock + 578);
  }
  else
  {
    v3[1] |= 0x8000000000000000ui64;
    v5 = 0;
  }
  KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
  __writecr8(LockHandle.OldIrql);
  if( v5 == 1 )
    HalPutDmaAdapter((PADAPTER_OBJECT)Process);
}

Referenced by:

ExFreeSvmAsid
ExpAssignPasid