NtAllocateUuids

NTSTATUS __fastcall NtAllocateUuids(UINT64 a1, UINT64 a2, UINT64 a3, UINT64 a4){
  UINT64 v8; 
  UINT64 v9; 
  UINT64 v10; 
  UINT64 v11; 
  _ETHREAD *v12; 
  _BYTE *v13; 
  _BYTE *v14; 
  UINT64 v15; 
  int v16; 
  char v17; 
  char v18; 
  UINT64 Range; 
  _LARGE_INTEGER Time; 
  _ETHREAD *CurrentThread; 

  Time.QuadPart = 0i64;
  Range = 0i64;
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  if( CurrentThread->Tcb.PreviousMode )
  {
    if( (a1 & 3) != 0 )
      goto LABEL_14;
    v8 = 0x7FFFFFFF0000i64;
    v9 = 0x7FFFFFFF0000i64;
    if( a1 < 0x7FFFFFFF0000i64 )
      v9 = a1;
    *(_BYTE *)v9 = *(_BYTE *)v9;
    *(_BYTE *)(v9 + 7) = *(_BYTE *)(v9 + 7);
    if( (a2 & 3) != 0 )
      goto LABEL_14;
    v10 = 0x7FFFFFFF0000i64;
    if( a2 < 0x7FFFFFFF0000i64 )
      v10 = a2;
    *(_DWORD *)v10 = *(_DWORD *)v10;
    if( (a3 & 3) != 0 )
LABEL_14:
      ExRaiseDatatypeMisalignment();
    v11 = 0x7FFFFFFF0000i64;
    if( a3 < 0x7FFFFFFF0000i64 )
      v11 = a3;
    *(_DWORD *)v11 = *(_DWORD *)v11;
    if( a4 < 0x7FFFFFFF0000i64 )
      v8 = a4;
    *(_BYTE *)v8 = *(_BYTE *)v8;
    *(_BYTE *)(v8 + 5) = *(_BYTE *)(v8 + 5);
  }
  v12 = (_ETHREAD *)KeGetCurrentThread();
  --v12->Tcb.KernelApcDisable;
  v13 = KeAbPreAcquire(&stru_140CEC740, 0i64, 0i64);
  v14 = v13;
  if( _interlockedbittestandset64((volatile signed __int32 *)&stru_140CEC740, 0i64) )
    ExfAcquirePushLockExclusiveEx(&stru_140CEC740, v13, &stru_140CEC740);
  if( v14 )
    v14[26] |= 1u;
  v16 = ExpAllocateUuids(&Time, &Range, (UINT64 *)((char *)&Range + 4));
  if( v16 < 0 )
  {
    if( (_InterlockedExchangeAdd64(&stru_140CEC740._bf_0, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
      ExfTryToWakePushLock(&stru_140CEC740);
    KeAbPostRelease(&stru_140CEC740);
    KeLeaveCriticalRegionThread(&v12->Tcb);
    return v16;
  }
  else
  {
    ExpUuidSaveSequenceNumberIf(v15);
    v17 = BYTE5(NlsMbCodePageTag);
    v18 = _InterlockedExchangeAdd64(&stru_140CEC740._bf_0, 0xFFFFFFFFFFFFFFFFui64);
    if( (v18 & 2) != 0 && (v18 & 4) == 0 )
      ExfTryToWakePushLock(&stru_140CEC740);
    KeAbPostRelease(&stru_140CEC740);
    KeLeaveCriticalRegionThread(&v12->Tcb);
    *(_LARGE_INTEGER *)a1 = Time;
    *(_DWORD *)a2 = Range;
    *(_DWORD *)a3 = HIDWORD(Range);
    *(_DWORD *)a4 = *(int *)((char *)&dword_140D2C2E4 + 2);
    *(_WORD *)(a4 + 4) = word_140D2C2EA;
    return v17 == 0 ? 0x40020056 : 0;
  }
}

Referenced by:

No references.