BapdpRegisterFwUpdateResults

VOID __fastcall BapdpRegisterFwUpdateResults(_QWORD *a1, UINT64 a2, WCHAR a3){
  unsigned int v4; 
  const _GUID *v5; 
  WCHAR v6; 
  NTSTATUS v7; 
  WCHAR v8; 
  WCHAR v9; 
  HANDLE v10; 
  UINT64 DataSize; 
  UINT64 DataSizea; 
  UINT64 DataSizeb; 
  struct _UNICODE_STRING DestinationString; 
  struct _UNICODE_STRING GuidString; 
  struct _OBJECT_ATTRIBUTES ObjectAttributes; 
  UINT64 Disposition; 
  HANDLE Handle; 
  void *KeyHandle; 
  LODWORD(Disposition) = 0;
  *(&ObjectAttributes.Length + 1) = 0;
  *(&ObjectAttributes.Attributes + 1) = 0;
  KeyHandle = 0i64;
  Handle = 0i64;
  GuidString = 0i64;
  DestinationString = 0i64;
  if( a1 && (_DWORD)a2 && *a1 && (unsigned int)a2 >= (unsigned __int64)(24i64 * *a1 + 8) )
  {
    RtlInitUnicodeString(
      &DestinationString,
      L"\\REGISTRY\\MACHINE\\SYSTEM\\CurrentControlSet\\Control\\FirmwareResources",
      a3);
    ObjectAttributes.RootDirectory = 0i64;
    ObjectAttributes.ObjectName = &DestinationString;
    ObjectAttributes.Length = 48;
    ObjectAttributes.Attributes = 576;
    *(_OWORD *)&ObjectAttributes.SecurityDescriptor = 0i64;
    if( ZwOpenKey(&KeyHandle, 0x20019u, &ObjectAttributes) >= 0 )
    {
      v4 = 0;
      v5 = (const _GUID *)(a1 + 1);
      if( *a1 )
      {
        while( (int)RtlStringFromGUID(v5, &GuidString) >= 0 )
        {
          RtlInitUnicodeString(&DestinationString, GuidString.Buffer, v6);
          ObjectAttributes.RootDirectory = KeyHandle;
          ObjectAttributes.Length = 48;
          ObjectAttributes.ObjectName = &DestinationString;
          ObjectAttributes.Attributes = 576;
          LODWORD(DataSize) = 0;
          *(_OWORD *)&ObjectAttributes.SecurityDescriptor = 0i64;
          v7 = ZwCreateKey(&Handle, 0x20019ui64, &ObjectAttributes, 0i64, 0i64, DataSize, &Disposition);
          RtlFreeAnsiString(&GuidString);
          if( v7 < 0 )
            break;
          RtlInitUnicodeString(&DestinationString, L"LastAttemptVersion", v8);
          LODWORD(DataSizea) = 4;
          ZwSetValueKey(Handle, &DestinationString, 0i64, 4ui64, (PVOID)&v5[1], DataSizea);
          RtlInitUnicodeString(&DestinationString, L"LastAttemptStatus", v9);
          LODWORD(DataSizeb) = 4;
          ZwSetValueKey(Handle, &DestinationString, 0i64, 4ui64, &v5[1].Data2, DataSizeb);
          ZwClose(Handle);
          ++v4;
          v10 = 0i64;
          v5 = (const _GUID *)((char *)v5 + 24);
          Handle = 0i64;
          if( (unsigned __int64)v4 >= *a1 )
            goto LABEL_12;
        }
      }
    }
    v10 = Handle;
LABEL_12:
    if( v10 )
      ZwClose(v10);
    if( KeyHandle )
      ZwClose(KeyHandle);
  }
}

Referenced by:

BapdpProcessFwUpdateResults