ExUuidCreate
NTSTATUS __stdcall ExUuidCreate(_GUID *Uuid){
_ETHREAD *CurrentThread;
NTSTATUS Values;
__int64 v4;
char v5;
int v6;
__int64 v7;
_BYTE *v9;
_BYTE *v10;
UINT64 v11;
char v12;
bool v13;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
Values = 0;
while( 1 )
{
do
{
v4 = ExpUuidCachedValues;
v5 = BYTE5(NlsMbCodePageTag);
*(_DWORD *)Uuid->Data4 = dword_140D2C2E4;
*(_DWORD *)&Uuid->Data4[4] = unk_140D2C2E8;
v6 = _InterlockedDecrement(&dword_140D2C2E0);
}
while( v4 != ExpUuidCachedValues );
if( v6 >= 0 )
{
v7 = v4 - v6;
Uuid->Data1 = v7;
Uuid->Data2 = WORD2(v7);
Uuid->Data3 = HIWORD(v7) & 0xFFF | 0x1000;
if( !v5 )
return 1073872982;
return Values;
}
--CurrentThread->Tcb.KernelApcDisable;
v9 = KeAbPreAcquire(&stru_140CEC740, 0i64, 0i64);
v10 = v9;
if( _interlockedbittestandset64((volatile signed __int32 *)&stru_140CEC740, 0i64) )
ExfAcquirePushLockExclusiveEx(&stru_140CEC740, v9, &stru_140CEC740);
if( v10 )
v10[26] |= 1u;
if( v4 != ExpUuidCachedValues )
{
v13 = (_InterlockedExchangeAdd64(&stru_140CEC740._bf_0, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2;
goto LABEL_17;
}
Values = ExpUuidGetValues((__int64)&ExpUuidCachedValues);
if( Values )
break;
ExpUuidSaveSequenceNumberIf(v11);
v12 = _InterlockedExchangeAdd64(&stru_140CEC740._bf_0, 0xFFFFFFFFFFFFFFFFui64);
if( (v12 & 2) == 0 )
goto LABEL_14;
v13 = (v12 & 4) == 0;
LABEL_17:
if( v13 )
ExfTryToWakePushLock(&stru_140CEC740);
LABEL_14:
KeAbPostRelease(&stru_140CEC740);
KeLeaveCriticalRegionThread(&CurrentThread->Tcb);
}
if( (_InterlockedExchangeAdd64(&stru_140CEC740._bf_0, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock(&stru_140CEC740);
KeAbPostRelease(&stru_140CEC740);
KeLeaveCriticalRegionThread(&CurrentThread->Tcb);
return Values;
}Referenced by:
BiCreateObject
CmpCloneHwProfile
CmpUuidCreate
EtwpStartLogger
IoGetDeviceDirectory
PiDevCfgResolveVariableGenerateGuid
PipGenerateContainerID
SC_ENV::CreateGuid