NtGetMUIRegistryInfo

NTSTATUS __stdcall NtGetMUIRegistryInfo(UINT64 Flags, UINT64 *DataSize, VOID *Data){
  __int64 v5; 
  __int64 v6; 
  int v7; 
  _ETHREAD *CurrentThread; 
  char v9; 
  NTSTATUS v10; 
  unsigned int v12; 
  size_t Length; 
  VOID *Handle; 
  __int128 *p_Object; 
  void *v16; 
  __int64 v17; 
  int v18; 
  int v19; 
  int v20; 
  int v21; 
  NTSTATUS v22; 
  int v23; 
  __int128 Object; 
  __int64 v25; 
  __int128 v26; 
  __int128 v27; 
  __int128 v28; 
  char v29; 

  v26 = 0i64;
  v27 = 0i64;
  v28 = 0i64;
  Object = 0i64;
  v25 = 0i64;
  Handle = 0i64;
  v23 = 0;
  v29 = 0;
  if( !KeGetCurrentThread()->PreviousMode || InitSafeBootMode )
    goto LABEL_46;
  if( !DataSize )
  {
    if( (Flags & 0xA) == 0 )
      goto LABEL_47;
    Length = 0;
    v5 = 0x7FFFFFFF0000i64;
    goto LABEL_11;
  }
  v5 = 0x7FFFFFFF0000i64;
  v6 = 0x7FFFFFFF0000i64;
  if( (unsigned __int64)DataSize < 0x7FFFFFFF0000i64 )
    v6 = (__int64)DataSize;
  Length = *(_DWORD *)v6;
  if( !*(_DWORD *)v6 )
  {
LABEL_11:
    if( Data )
      goto LABEL_47;
    goto LABEL_12;
  }
  if( !Data )
    goto LABEL_47;
LABEL_12:
  v7 = 1;
  if( (_DWORD)Flags )
    v7 = Flags;
  if( (v7 & 0xFFFFFFF4) != 0 )
    goto LABEL_47;
  if( !*(&WheapErrorSourceTable + 128) )
  {
    v10 = MUIInitializeResourceLock((_ERESOURCE **)&WheapErrorSourceTable + 128);
    if( (v10 & 0xC0000000) == -1073741824 )
      goto LABEL_27;
  }
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  --CurrentThread->Tcb.KernelApcDisable;
  ExAcquireResourceExclusiveLite(*(&WheapErrorSourceTable + 128), 1, (INT64)Data);
  v29 = 1;
  if( MUIRegistryInfo == (PVOID)-1i64 )
  {
    if( (v7 & 2) != 0 )
    {
      MUIRegistryInfo = 0i64;
      MUIRegistryInfoSize = 0;
LABEL_45:
      v10 = 0;
      goto LABEL_27;
    }
LABEL_46:
    v10 = -1073741823;
    goto LABEL_27;
  }
  if( (v7 & 1) == 0 )
  {
    if( (v7 & 2) != 0 )
    {
      if( MUIRegistryInfo )
      {
        ExFreePoolWithTag(MUIRegistryInfo, 0);
        MUIRegistryInfo = 0i64;
        MUIRegistryInfoSize = 0;
        if( (v7 & 8) != 0 )
          ++KUSER_SHARED_DATA.LangGenerationCount;
      }
      goto LABEL_45;
    }
    if( (v7 & 8) != 0 )
    {
      v12 = ++KUSER_SHARED_DATA.LangGenerationCount;
      if( MUIRegistryInfo )
        *((_DWORD *)MUIRegistryInfo + 3) = v12;
      goto LABEL_45;
    }
LABEL_47:
    v10 = -1073741811;
    goto LABEL_27;
  }
  v9 = 0;
  if( MUIRegistryInfo )
    goto LABEL_19;
  KeInitializeEvent((INT64)&Object, 1, 0);
  p_Object = &Object;
  v16 = 0i64;
  v17 = 0i64;
  v18 = (unsigned __int16)PsInstallUILanguageId;
  v19 = 0;
  v20 = (unsigned __int16)PsMachineUILanguageId;
  v21 = 0;
  v22 = -1073741823;
  LODWORD(v26) = 48;
  *((_QWORD *)&v26 + 1) = 0i64;
  DWORD2(v27) = 512;
  *(_QWORD *)&v27 = 0i64;
  v28 = 0i64;
  v10 = PsCreateSystemThreadEx(
          (__int64)&Handle,
          0x1FFFFF,
          &v26,
          0i64,
          0i64,
          MUIRegistrySystemRoutine,
          (INT64)&p_Object,
          0i64,
          0i64);
  if( v10 >= 0 )
  {
    ZwClose((_HANDLE)Handle);
    v10 = KeWaitForSingleObject((UINT64)&Object, 0, 0, 0, 0i64);
    if( v10 >= 0 )
    {
      v10 = v22;
      if( v22 < 0 )
      {
LABEL_54:
        MUIRegistryInfo = (PVOID)-1i64;
        MUIRegistryInfoSize = 0;
        goto LABEL_27;
      }
      MUIRegistryInfo = v16;
      MUIRegistryInfoSize = v17;
      if( !HIDWORD(v17) )
        MUIBugCheck(32770i64);
      if( !v19 )
      {
        if( PsUILanguageComitted )
          MUIBugCheck(32769i64);
        MigrateOOBELanguageToInstallationLanguage();
      }
      if( !v21 )
        PsMachineUILanguageId = PsInstallUILanguageId;
    }
  }
  if( v10 < 0 )
    goto LABEL_54;
LABEL_19:
  if( Length )
  {
    if( Length < MUIRegistryInfoSize )
    {
      v10 = -1073741789;
      goto LABEL_23;
    }
    v9 = 1;
  }
  v10 = 0;
LABEL_23:
  if( (unsigned __int64)DataSize < 0x7FFFFFFF0000i64 )
    v5 = (__int64)DataSize;
  *(_DWORD *)v5 = *(_DWORD *)v5;
  *(_DWORD *)DataSize = MUIRegistryInfoSize;
  if( v9 )
  {
    ProbeForWrite((UINT64)Data, Length, 1i64);
    memset(Data, 0i64, Length);
    memmove(Data, MUIRegistryInfo, MUIRegistryInfoSize);
  }
LABEL_27:
  if( v29 )
  {
    ExReleaseResourceLite(*(&WheapErrorSourceTable + 128));
    KeLeaveCriticalRegionThread(KeGetCurrentThread());
  }
  return v10;
}

Referenced by:

No references.