PspIumFreePartitionState

NTSTATUS __stdcall PspIumFreePartitionState(PVOID P){
  INT64 v1; 
  INT64 v2; 
  signed __int64 v4; 
  int v5; 
  __int128 Object; 
  __int64 v8; 

  v8 = 0i64;
  v4 = *((_QWORD *)P + 2);
  Object = 0i64;
  if( v4 )
  {
    DWORD1(Object) = 0;
    v8 = (__int64)&Object + 8;
    *((_QWORD *)&Object + 1) = (char *)&Object + 8;
    LOWORD(Object) = 1;
    BYTE2(Object) = 6;
    if( _InterlockedCompareExchange64((volatile signed __int64 *)P + 2, (signed __int64)&Object, v4) )
      KeWaitForSingleObject((UINT64)&Object, 0, 0, 0, 0i64);
  }
  MmUnlockPages((INT64)P + 96, v1, v2);
  v5 = *((_DWORD *)P + 1);
  if( v5 )
  {
    memmove((VOID *)(*((_QWORD *)P + 20) + 48i64 + 8i64 * *((unsigned int *)P + 39)), (char *)P + 24, 8 * v5);
    *((_DWORD *)P + 39) += *((_DWORD *)P + 1);
  }
  MmFreeSecureKernelPages(*((PMDL *)P + 20));
  HalPutDmaAdapter(*((PADAPTER_OBJECT *)P + 1));
  return(unsigned int)ExFreePoolWithTag(P, 0);
}

Referenced by:

PsDispatchIumService