SmKmKeyGenNewKey

NTSTATUS __stdcall SmKmKeyGenNewKey(PVOID BugCheckParameter2, PVOID Src, UINT32 cbBuffer){
  __int64 v3; 
  __int64 v4; 
  char *v7; 
  char *v8; 
  int v9; 
  char *v10; 
  NTSTATUS v11; 
  _ETHREAD *CurrentThread; 
  __int64 v13; 
  _QWORD *v14; 
  __int64 v15; 
  VOID *v16; 
  _WORD *v17; 
  __int64 v18; 
  _UNICODE_STRING ValueName[3]; 
  VOID *KeyHandleOut; 

  v3 = cbBuffer;
  KeyHandleOut = 0i64;
  v4 = -1i64;
  ValueName[0] = 0i64;
  do
    ++v4;
  while( *((_WORD *)Src + v4) );
  LODWORD(v7) = SSHSupportAllocateNonPaged(cbBuffer + 42 + 2 * v4, 0x474B6D73u);
  v8 = v7;
  if( !v7 )
    return -1073741670;
  memset(v7, 0i64, v3 + 42 + 2 * v4);
  *((_QWORD *)v8 + 3) = v8 + 40;
  v10 = &v8[v3 + 40];
  *((_DWORD *)v8 + 8) = v3;
  *((_QWORD *)v8 + 2) = v10;
  memmove(v10, Src, 2 * v4);
  if( !*((_QWORD *)BugCheckParameter2 + 4) )
    goto LABEL_8;
  v11 = SmKmKeyGenLoadKey((_UNICODE_STRING *)((char *)BugCheckParameter2 + 24), (_SMKM_KEY_ENTRY *)v8, &KeyHandleOut);
  v9 = v11;
  if( v11 >= 0 )
  {
LABEL_9:
    CurrentThread = (_ETHREAD *)KeGetCurrentThread();
    --CurrentThread->Tcb.KernelApcDisable;
    ExAcquirePushLockExclusiveEx((_EX_PUSH_LOCK *)BugCheckParameter2, 0i64);
    if( !SmKmKeyGenKeyFind((__int64)BugCheckParameter2, (unsigned __int16 *)Src) )
    {
      v14 = (char *)BugCheckParameter2 + 8;
      v15 = *((_QWORD *)BugCheckParameter2 + 1);
      if( *(PVOID *)(v15 + 8) != (char *)BugCheckParameter2 + 8 )
        __fastfail(3u);
      v16 = KeyHandleOut;
      *(_QWORD *)v8 = v15;
      *((_QWORD *)v8 + 1) = v14;
      *(_QWORD *)(v15 + 8) = v8;
      *v14 = v8;
      if( v16 )
      {
        if( *((_QWORD *)v8 + 2) )
        {
          v17 = (_WORD *)*((_QWORD *)v8 + 2);
          v13 = 0x7FFFi64;
          do
          {
            if( !*v17 )
              break;
            ++v17;
            --v13;
          }
          while( v13 );
          v18 = (0x7FFF - v13) & ((unsigned __int128)-(__int128)(unsigned __int64)v13 >> 64);
          if( v13 )
          {
            ValueName[0].Buffer = (wchar_t *)*((_QWORD *)v8 + 2);
            ValueName[0].Length = 2 * v18;
            ValueName[0].MaximumLength = 2 * v18 + 2;
          }
        }
        ZwDeleteValueKey(v16, ValueName, (_OBJECT_TYPE *)v13);
      }
      v8 = 0i64;
    }
    if( (_InterlockedExchangeAdd64((volatile signed __int64 *)BugCheckParameter2, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
      ExfTryToWakePushLock((_EX_PUSH_LOCK *)BugCheckParameter2);
    KeAbPostRelease(BugCheckParameter2);
    KeLeaveCriticalRegion();
    v9 = 0;
    goto LABEL_24;
  }
  if( v11 == -1073741772 )
  {
LABEL_8:
    v9 = SmCrGenRandom(*((INT8 **)v8 + 3), (unsigned int)v3);
    if( v9 >= 0 )
      goto LABEL_9;
  }
LABEL_24:
  if( KeyHandleOut )
    ZwClose((_HANDLE)KeyHandleOut);
  if( v8 )
    CmSiFreeMemory((PPRIVILEGE_SET)v8);
  return v9;
}

Referenced by:

SmKmKeyGenGenerate