PopBcdRegenerateResumeObject

NTSTATUS __stdcall PopBcdRegenerateResumeObject(
        VOID *StoreHandle,
        VOID *LoaderObjectHandle,
        VOID **ResumeObjectHandleOut){
  PVOID v3; 
  int Element; 
  VOID *v7; 
  VOID *v8; 
  NTSTATUS v9; 
  _UNICODE_STRING *v10; 
  const WCHAR *v11; 
  VOID *v12; 
  VOID *v13; 
  UINT64 DataSize; 
  UINT64 DataSizea; 
  UINT64 DataSizeb; 
  __int128 BufferSizeOut; 
  VOID *ObjectHandle; 
  PVOID P; 
  _BCD_OBJECT_DESCRIPTION Description; 
  GUID v22; 
  _GUID Identifier; 

  LODWORD(BufferSizeOut) = 0;
  v3 = 0i64;
  memset((char *)&BufferSizeOut + 4, 0, 12);
  ObjectHandle = 0i64;
  P = 0i64;
  Description.Version = 1;
  Description.Type = 270532612;
  Identifier = 0i64;
  v22 = 0i64;
  Element = BcdCreateObject(StoreHandle, 0i64, &Description, &ObjectHandle);
  if( Element < 0 )
  {
    v7 = ObjectHandle;
  }
  else
  {
    Element = PopBcdReadElement(
                LoaderObjectHandle,
                0x12000004ui64,
                (VOID **)&BufferSizeOut + 1,
                (UINT64 *)&BufferSizeOut);
    if( Element < 0 )
    {
      v7 = ObjectHandle;
    }
    else
    {
      PopBcdReadElement(LoaderObjectHandle, 0x12000005ui64, &P, (UINT64 *)((char *)&BufferSizeOut + 4));
      v7 = ObjectHandle;
      LODWORD(DataSize) = BufferSizeOut;
      v9 = BcdSetElementDataWithFlags(ObjectHandle, 0x12000004ui64, v8, *((VOID **)&BufferSizeOut + 1), DataSize);
      v3 = P;
      Element = v9;
      if( v9 >= 0 )
      {
        if( !P
          || (LODWORD(DataSizea) = DWORD1(BufferSizeOut),
              Element = BcdSetElementDataWithFlags(v7, 0x12000005ui64, v10, P, DataSizea),
              Element >= 0) )
        {
          Element = PopBcdSetDefaultResumeObjectElements(v7, LoaderObjectHandle, v10, v11);
          if( Element >= 0 )
          {
            LODWORD(DataSizea) = 16;
            v22 = GUID_RESUME_LOADER_SETTINGS_GROUP;
            Element = BcdSetElementDataWithFlags(v7, 0x14000006ui64, v12, &v22, DataSizea);
            if( Element >= 0 )
            {
              Element = BcdQueryObject(v7, 0i64, 0i64, &Identifier);
              if( Element >= 0 )
              {
                LODWORD(DataSizeb) = 16;
                Element = BcdSetElementDataWithFlags(LoaderObjectHandle, 0x23000003ui64, v13, &Identifier, DataSizeb);
                if( Element >= 0 )
                {
                  *ResumeObjectHandleOut = v7;
                  v7 = 0i64;
                }
              }
            }
          }
        }
      }
    }
    if( *((_QWORD *)&BufferSizeOut + 1) )
      ExFreePoolWithTag(*((PVOID *)&BufferSizeOut + 1), 0);
    if( v3 )
      ExFreePoolWithTag(v3, 0);
  }
  if( v7 )
  {
    if( Element < 0 )
      BcdDeleteObject(v7);
    else
      BcdCloseObject(v7);
  }
  return Element;
}

Referenced by:

PopBcdEstablishResumeObject