SmKmKeyGenGenerate
NTSTATUS __fastcall SmKmKeyGenGenerate(VOID *Lock, PVOID Src, VOID *a3, size_t Size){
_ETHREAD *CurrentThread;
_PRIVILEGE_SET *v9;
_PRIVILEGE_SET *v10;
int v11;
while( 1 )
{
while( 1 )
{
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--CurrentThread->Tcb.KernelApcDisable;
ExAcquirePushLockSharedEx((_EX_PUSH_LOCK *)Lock, 0i64);
v9 = (_PRIVILEGE_SET *)SmKmKeyGenKeyFind((__int64)Lock, (unsigned __int16 *)Src);
v10 = v9;
if( v9 )
break;
if( _InterlockedCompareExchange64((volatile signed __int64 *)Lock, 0i64, 17i64) != 17 )
ExfReleasePushLockShared((_EX_PUSH_LOCK *)Lock);
KeAbPostRelease(Lock);
KeLeaveCriticalRegion();
v11 = SmKmKeyGenNewKey(Lock, Src, Size);
if( v11 < 0 )
return v11;
}
if( v9[1].Privilege[0].Luid.HighPart == Size )
break;
if( _InterlockedCompareExchange64((volatile signed __int64 *)Lock, 0i64, 17i64) != 17 )
ExfReleasePushLockShared((_EX_PUSH_LOCK *)Lock);
KeAbPostRelease(Lock);
KeLeaveCriticalRegion();
SmKmKeyGenKeyDelete(Lock, v10);
}
memmove(a3, *(const VOID **)&v9[1].Control, Size);
v11 = 0;
if( _InterlockedCompareExchange64((volatile signed __int64 *)Lock, 0i64, 17i64) != 17 )
ExfReleasePushLockShared((_EX_PUSH_LOCK *)Lock);
KeAbPostRelease(Lock);
KeLeaveCriticalRegion();
return v11;
}Referenced by:
SmcStoreCreate