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