CmLogMcUpdateStatus

__int64 __fastcall CmLogMcUpdateStatus(UINT64 Value, __int64 a2){
  unsigned int v3; 
  INT64 v4; 
  int v5; 
  INT64 v6; 
  INT64 v7; 
  VOID *Data; 
  VOID *Dataa; 
  VOID *Datab; 
  VOID *Datac; 
  INT64 DataSize; 
  INT64 DataSizea; 
  INT64 DataSizeb; 
  UINT64 DataSizec; 
  UINT64 DataSized; 
  UINT64 DataSizee; 
  UINT64 DataSizef; 
  UINT64 DataSizeg; 
  INT64 v21; 
  INT64 v22; 
  INT64 v23; 
  INT64 v24; 
  INT64 v25; 
  INT64 v26; 
  VOID *Handle; 
  _UNICODE_STRING ValueName; 
  VOID *KeyHandle; 
  UINT64 v30; 
  _OBJECT_ATTRIBUTES ObjectAttributes; 
  _UNICODE_STRING v32; 
  _STRING DestinationString; 
  _CONFIGURATION_COMPONENT_DATA a1; 
  CHAR String[16]; 
  char v36; 

  v3 = Value;
  DestinationString = 0i64;
  memset(&a1, 0i64, sizeof(a1));
  *(_QWORD *)&ObjectAttributes.Length = 48i64;
  *(_QWORD *)&ObjectAttributes.Attributes = 576i64;
  Handle = (VOID *)-1i64;
  ObjectAttributes.ObjectName = &CmRegistryMachineHardwareDescriptionSystemName;
  v30 = -1i64;
  KeyHandle = (VOID *)-1i64;
  ObjectAttributes.RootDirectory = 0i64;
  v32 = 0i64;
  ValueName = 0i64;
  *(_OWORD *)&ObjectAttributes.SecurityDescriptor = 0i64;
  v5 = ZwOpenKey(&KeyHandle, 0x20019ui64, &ObjectAttributes, v4, (INT64)Data, DataSize, v21, v24);
  if( v5 >= 0 )
  {
    ObjectAttributes.RootDirectory = KeyHandle;
    ObjectAttributes.Length = 48;
    ObjectAttributes.ObjectName = &CmTypeName + 1;
    ObjectAttributes.Attributes = 576;
    *(_OWORD *)&ObjectAttributes.SecurityDescriptor = 0i64;
    v5 = ZwOpenKey((VOID **)&v30, 0x20019ui64, &ObjectAttributes, v6, (INT64)Dataa, DataSizea, v22, v25);
    if( v5 >= 0 )
    {
      RtlIntegerToChar(v3, 0xAui64, 0xCu, String);
      RtlInitAnsiString(&DestinationString, String);
      *(_DWORD *)&v32.Length = 1572864;
      v32.Buffer = (wchar_t *)&v36;
      RtlAnsiStringToUnicodeString(&v32, &DestinationString, 0);
      ObjectAttributes.RootDirectory = (void *)v30;
      ObjectAttributes.Length = 48;
      ObjectAttributes.ObjectName = &v32;
      ObjectAttributes.Attributes = 576;
      *(_OWORD *)&ObjectAttributes.SecurityDescriptor = 0i64;
      if( ZwOpenKey(&Handle, 0x2001Fui64, &ObjectAttributes, v7, (INT64)Datab, DataSizeb, v23, v26) >= 0 )
        goto LABEL_7;
      CmpConfigurationData = ExAllocatePoolWithTag(1ui64, (unsigned int)CmpConfigurationAreaSize, 538987843i64);
      if( !CmpConfigurationData )
      {
        v5 = -1073741670;
        goto LABEL_12;
      }
      LODWORD(Datac) = -1;
      a1.ComponentEntry.Class = ProcessorClass;
      a1.ComponentEntry.Type = CentralProcessor;
      a1.ComponentEntry.Key = v3;
      v5 = CmpInitializeRegistryNode(
             &a1,
             KeyHandle,
             &Handle,
             InterfaceTypeUndefined,
             (UINT64)Datac,
             (UINT16 *)CmpDeviceIndexTable);
      ExFreePoolWithTag(CmpConfigurationData, 0);
      CmpConfigurationData = 0i64;
      if( v5 >= 0 )
      {
LABEL_7:
        RtlInitUnicodeString(&ValueName, L"Update Revision");
        LODWORD(DataSizec) = 8;
        v5 = ZwSetValueKey(Handle, &ValueName, 0i64, 3ui64, (VOID *)(a2 + 8), DataSizec);
        if( v5 >= 0 )
        {
          RtlInitUnicodeString(&ValueName, L"Previous Update Revision");
          LODWORD(DataSized) = 8;
          v5 = ZwSetValueKey(Handle, &ValueName, 0i64, 3ui64, (VOID *)(a2 + 16), DataSized);
          if( v5 >= 0 )
          {
            RtlInitUnicodeString(&ValueName, L"Update Status");
            LODWORD(DataSizee) = 4;
            v5 = ZwSetValueKey(Handle, &ValueName, 0i64, 4ui64, (VOID *)(a2 + 4), DataSizee);
            if( v5 >= 0 )
            {
              RtlInitUnicodeString(&ValueName, L"Platform Specific Field 1");
              LODWORD(DataSizef) = 4;
              v5 = ZwSetValueKey(Handle, &ValueName, 0i64, 4ui64, (VOID *)(a2 + 24), DataSizef);
              if( v5 >= 0 )
              {
                RtlInitUnicodeString(&ValueName, L"Platform Specific Field 2");
                LODWORD(DataSizeg) = 4;
                v5 = ZwSetValueKey(Handle, &ValueName, 0i64, 3ui64, (VOID *)(a2 + 28), DataSizeg);
              }
            }
          }
        }
      }
    }
  }
LABEL_12:
  if( Handle != (VOID *)-1i64 )
    ZwClose((_HANDLE)Handle);
  if( v30 != -1i64 )
    ZwClose(v30);
  if( KeyHandle != (VOID *)-1i64 )
    ZwClose((_HANDLE)KeyHandle);
  return(unsigned int)v5;
}

Referenced by:

HvlpLogMicrocodeUpdateStatus