ExpUpdateProductSuiteTypeInRegistry

VOID __stdcall ExpUpdateProductSuiteTypeInRegistry(PVOID KeyHandle){
  VOID *v1; 
  unsigned int v2; 
  WCHAR v3; 
  WCHAR v4; 
  __int64 v5; 
  __int64 v6; 
  int v7; 
  NTSTATUS v8; 
  WCHAR v9; 
  INT64 *v10; 
  __int64 v11; 
  unsigned int v12; 
  NTSTATUS v13; 
  const WCHAR *v14; 
  __int64 v15; 
  unsigned int v16; 
  __int64 v17; 
  unsigned int v18; 
  __int64 v19; 
  unsigned int v20; 
  __int64 v21; 
  unsigned int v22; 
  __int64 v23; 
  unsigned int v24; 
  __int64 v25; 
  unsigned int v26; 
  __int64 v27; 
  unsigned int v28; 
  __int64 v29; 
  unsigned int v30; 
  __int64 v31; 
  unsigned int v32; 
  __int64 v33; 
  unsigned int v34; 
  __int64 v35; 
  unsigned int v36; 
  __int64 v37; 
  unsigned int v38; 
  __int64 v39; 
  unsigned int v40; 
  unsigned int v41; 
  UINT64 v42; 
  struct _UNICODE_STRING Data; 
  struct _UNICODE_STRING DestinationString_8; 
  UINT8 result[768]; 
  v1 = ExpProductTypeKey;
  v2 = 758;
  DestinationString_8 = 0i64;
  Data = 0i64;
  memset((INT64)result, 0i64);
  if( ExpSetupModeDetected )
    return;
  RtlInitUnicodeString(&DestinationString_8, L"ProductType", v3);
  v5 = -1i64;
  if( KUSER_SHARED_DATA.NtProductType == NtProductLanManNt )
  {
    v14 = L"LanmanNT";
  }
  else
  {
    if( KUSER_SHARED_DATA.NtProductType != NtProductServer )
    {
      RtlInitUnicodeString(&Data, L"WinNT", v4);
      v6 = -1i64;
      do
        ++v6;
      while( aWinnt_0[v6] );
      v7 = 2 * v6 + 2;
      goto LABEL_7;
    }
    v14 = L"ServerNT";
  }
  RtlInitUnicodeString(&Data, v14, v4);
  v7 = 18;
LABEL_7:
  LODWORD(v42) = v7;
  v8 = NtSetValueKey(v1, &DestinationString_8, 0i64, 1ui64, Data.Buffer, v42);
  if( v8 < 0 )
    KeBugCheckEx(0x9Au, 0x11ui64, (unsigned int)v8, 1ui64, 0i64);
  RtlInitUnicodeString(&DestinationString_8, L"ProductSuite", v9);
  v10 = (INT64 *)result;
  if( ExVerifySuite(SmallBusiness) )
  {
    v15 = -1i64;
    do
      ++v15;
    while( aSmallBusiness[v15] );
    v16 = 2 * v15 + 2;
    if( v16 < 0x2F6 )
    {
      memmove(result, (UINT8 *)L"Small Business", v16);
      v10 = (INT64 *)&result[v16];
      v2 = 758 - v16;
    }
  }
  if( ExVerifySuite(Enterprise) )
  {
    v17 = -1i64;
    do
      ++v17;
    while( aEnterprise[v17] );
    v18 = 2 * v17 + 2;
    if( v2 > v18 )
    {
      memmove((UINT8 *)v10, (UINT8 *)L"Enterprise", v18);
      v10 = (INT64 *)((char *)v10 + v18);
      v2 -= v18;
    }
  }
  if( ExVerifySuite(BackOffice) )
  {
    v19 = -1i64;
    do
      ++v19;
    while( aBackoffice[v19] );
    v20 = 2 * v19 + 2;
    if( v2 > v20 )
    {
      memmove((UINT8 *)v10, (UINT8 *)L"BackOffice", v20);
      v10 = (INT64 *)((char *)v10 + v20);
      v2 -= v20;
    }
  }
  if( ExVerifySuite(CommunicationServer) )
  {
    v21 = -1i64;
    do
      ++v21;
    while( aCommunications[v21] );
    v22 = 2 * v21 + 2;
    if( v2 > v22 )
    {
      memmove((UINT8 *)v10, (UINT8 *)L"CommunicationServer", v22);
      v10 = (INT64 *)((char *)v10 + v22);
      v2 -= v22;
    }
  }
  if( ExVerifySuite(TerminalServer) )
  {
    v11 = -1i64;
    do
      ++v11;
    while( aTerminalServer_0[v11] );
    v12 = 2 * v11 + 2;
    if( v2 > v12 )
    {
      memmove((UINT8 *)v10, (UINT8 *)L"Terminal Server", v12);
      v10 = (INT64 *)((char *)v10 + v12);
      v2 -= v12;
    }
  }
  if( ExVerifySuite(SmallBusinessRestricted) )
  {
    v23 = -1i64;
    do
      ++v23;
    while( aSmallBusinessR[v23] );
    v24 = 2 * v23 + 2;
    if( v2 > v24 )
    {
      memmove((UINT8 *)v10, (UINT8 *)L"Small Business(Restricted)", v24);
      v10 = (INT64 *)((char *)v10 + v24);
      v2 -= v24;
    }
  }
  if( ExVerifySuite(EmbeddedNT) )
  {
    v25 = -1i64;
    do
      ++v25;
    while( aEmbeddednt[v25] );
    v26 = 2 * v25 + 2;
    if( v2 > v26 )
    {
      memmove((UINT8 *)v10, (UINT8 *)L"EmbeddedNT", v26);
      v10 = (INT64 *)((char *)v10 + v26);
      v2 -= v26;
    }
  }
  if( ExVerifySuite(DataCenter) )
  {
    v27 = -1i64;
    do
      ++v27;
    while( aDatacenter[v27] );
    v28 = 2 * v27 + 2;
    if( v2 > v28 )
    {
      memmove((UINT8 *)v10, (UINT8 *)L"DataCenter", v28);
      v10 = (INT64 *)((char *)v10 + v28);
      v2 -= v28;
    }
  }
  if( ExVerifySuite(Personal) )
  {
    v29 = -1i64;
    do
      ++v29;
    while( aPersonal[v29] );
    v30 = 2 * v29 + 2;
    if( v2 > v30 )
    {
      memmove((UINT8 *)v10, (UINT8 *)L"Personal", v30);
      v10 = (INT64 *)((char *)v10 + v30);
      v2 -= v30;
    }
  }
  if( ExVerifySuite(Blade) )
  {
    v31 = -1i64;
    do
      ++v31;
    while( aBlade[v31] );
    v32 = 2 * v31 + 2;
    if( v2 > v32 )
    {
      memmove((UINT8 *)v10, (UINT8 *)L"Blade", v32);
      v10 = (INT64 *)((char *)v10 + v32);
      v2 -= v32;
    }
  }
  if( ExVerifySuite(EmbeddedRestricted) )
  {
    v33 = -1i64;
    do
      ++v33;
    while( aEmbeddedRestri[v33] );
    v34 = 2 * v33 + 2;
    if( v2 > v34 )
    {
      memmove((UINT8 *)v10, (UINT8 *)L"Embedded(Restricted)", v34);
      v10 = (INT64 *)((char *)v10 + v34);
      v2 -= v34;
    }
  }
  if( ExVerifySuite(SecurityAppliance) )
  {
    v35 = -1i64;
    do
      ++v35;
    while( aSecurityApplia[v35] );
    v36 = 2 * v35 + 2;
    if( v2 > v36 )
    {
      memmove((UINT8 *)v10, (UINT8 *)L"Security Appliance", v36);
      v10 = (INT64 *)((char *)v10 + v36);
      v2 -= v36;
    }
  }
  if( ExVerifySuite(StorageServer) )
  {
    v37 = -1i64;
    do
      ++v37;
    while( aStorageServer[v37] );
    v38 = 2 * v37 + 2;
    if( v2 > v38 )
    {
      memmove((UINT8 *)v10, (UINT8 *)L"Storage Server", v38);
      v10 = (INT64 *)((char *)v10 + v38);
      v2 -= v38;
    }
  }
  if( ExVerifySuite(ComputeServer) )
  {
    v39 = -1i64;
    do
      ++v39;
    while( aComputeServer[v39] );
    v40 = 2 * v39 + 2;
    if( v2 > v40 )
    {
      memmove((UINT8 *)v10, (UINT8 *)L"Compute Server", v40);
      v10 = (INT64 *)((char *)v10 + v40);
      v2 -= v40;
    }
  }
  if( ExVerifySuite(PhoneNT) )
  {
    do
      ++v5;
    while( aPhonent[v5] );
    v41 = 2 * v5 + 2;
    if( v2 > v41 )
    {
      memmove((UINT8 *)v10, (UINT8 *)L"PhoneNT", v41);
      v2 -= v41;
    }
  }
  LODWORD(v42) = 760 - v2;
  v13 = NtSetValueKey(v1, &DestinationString_8, 0i64, 7ui64, result, v42);
  if( v13 < 0 )
    KeBugCheckEx(0x9Au, 0x11ui64, (unsigned int)v13, 2ui64, 0i64);
}

Referenced by:

ExpWatchProductTypeInitialization