PopBcdSetDefaultResumeObjectElements

NTSTATUS __stdcall PopBcdSetDefaultResumeObjectElements(
        VOID *ResumeObjectHandle,
        VOID *LoaderObjectHandle,
        _UNICODE_STRING *HiberfileDeviceName,
        const WCHAR *HiberfilePath){
  _BYTE *v6; 
  VOID **PoolWithTag; 
  int Element; 
  VOID *v9; 
  VOID *v10; 
  VOID *v11; 
  NTSTATUS v12; 
  WORD *v13; 
  const wchar_t *v14; 
  __int64 v15; 
  __int64 v16; 
  __int64 v17; 
  __int64 v18; 
  VOID *v19; 
  VOID *v20; 
  VOID *v21; 
  int v22; 
  VOID *v23; 
  char v24; 
  UINT64 *DataSizea; 
  UINT64 *DataSizeaa; 
  UINT64 *DataSizeab; 
  __int16 v29[2]; 
  UINT64 v30; 
  char BufferSizeOut[12]; 
  VOID *BufferOut; 
  NTSTATUS ElementDataWithFlags; 
  NTSTATUS v34; 
  NTSTATUS v35; 
  __int64 DataSize[2]; 
  _UNICODE_STRING *v37; 
  const WCHAR *v38; 

  v38 = HiberfilePath;
  v37 = HiberfileDeviceName;
  LOWORD(v38) = 0;
  LOWORD(v37) = 0;
  DataSize[0] = 0i64;
  v29[0] = 0;
  BufferOut = 0i64;
  memset(BufferSizeOut, 0, sizeof(BufferSizeOut));
  v6 = 0i64;
  PoolWithTag = 0i64;
  HIDWORD(v30) = 0;
  Element = PopBcdReadElement(LoaderObjectHandle, 0x11000001ui64, &BufferOut, (UINT64 *)BufferSizeOut);
  if( Element >= 0 )
  {
    Element = PopBcdReadElement(
                LoaderObjectHandle,
                0x12000002ui64,
                (VOID **)&BufferSizeOut[4],
                (UINT64 *)((char *)&v30 + 4));
    if( Element < 0 )
    {
      v6 = *(_BYTE **)&BufferSizeOut[4];
    }
    else
    {
      HIDWORD(v30) = 8;
      ElementDataWithFlags = BcdGetElementDataWithFlags(
                               LoaderObjectHandle,
                               0x15000052ui64,
                               v9,
                               DataSize,
                               (UINT64 *)((char *)&v30 + 4));
      LODWORD(v30) = 2;
      v34 = BcdGetElementDataWithFlags(LoaderObjectHandle, 0x16000054ui64, v10, &v37, &v30);
      LODWORD(v30) = 2;
      v12 = BcdGetElementDataWithFlags(LoaderObjectHandle, 0x16000046ui64, v11, v29, &v30);
      v6 = *(_BYTE **)&BufferSizeOut[4];
      v35 = v12;
      v13 = wcsrchr(*(WORD **)&BufferSizeOut[4], 92);
      if( v13 )
      {
        v14 = L"winresume.efi";
        if( *(&ExBootDevicesRemovedEvent + 276) != 2 )
          v14 = L"winresume.exe";
        v15 = -1i64;
        v16 = ((char *)v13 - v6 + 2) >> 1;
        v17 = -1i64;
        do
          ++v17;
        while( v14[v17] );
        *(_DWORD *)&BufferSizeOut[4] = 2 * (v16 + v17) + 2;
        PoolWithTag = ExAllocatePoolWithTag(1ui64, *(unsigned int *)&BufferSizeOut[4], 1684226640i64);
        if( PoolWithTag )
        {
          v18 = 2i64 * (unsigned int)v16;
          memmove(PoolWithTag, v6, v18);
          do
            ++v15;
          while( v14[v15] );
          memmove((char *)PoolWithTag + v18, v14, 2 * v15 + 2);
          LODWORD(DataSizea) = *(_DWORD *)BufferSizeOut;
          Element = BcdSetElementDataWithFlags(ResumeObjectHandle, 0x11000001ui64, v19, BufferOut, (UINT64)DataSizea);
          if( Element >= 0 )
          {
            LODWORD(DataSizeaa) = *(_DWORD *)&BufferSizeOut[4];
            Element = BcdSetElementDataWithFlags(
                        ResumeObjectHandle,
                        0x12000002ui64,
                        v20,
                        PoolWithTag,
                        (UINT64)DataSizeaa);
            if( Element >= 0 )
            {
              if( ElementDataWithFlags >= 0 )
              {
                LODWORD(DataSizeab) = HIDWORD(v30);
                BcdSetElementDataWithFlags(ResumeObjectHandle, 0x15000052ui64, v21, DataSize, (UINT64)DataSizeab);
              }
              v22 = v30;
              if( v34 >= 0 )
              {
                LODWORD(DataSizeab) = v30;
                BcdSetElementDataWithFlags(ResumeObjectHandle, 0x16000054ui64, v21, &v37, (UINT64)DataSizeab);
              }
              if( v35 >= 0 )
              {
                LODWORD(DataSizeab) = v22;
                BcdSetElementDataWithFlags(ResumeObjectHandle, 0x16000046ui64, v21, v29, (UINT64)DataSizeab);
              }
              Element = PopBcdSetupResumeObject(ResumeObjectHandle);
              if( Element >= 0 )
              {
                v24 = (char)v38;
                LODWORD(DataSizeab) = 2;
                if( (_BYTE)KdDebuggerEnabled )
                  v24 = 1;
                LOBYTE(v38) = v24;
                Element = BcdSetElementDataWithFlags(ResumeObjectHandle, 0x26000006ui64, v23, &v38, (UINT64)DataSizeab);
                if( Element >= 0 )
                  Element = 0;
              }
            }
          }
        }
        else
        {
          Element = -1073741670;
        }
      }
      else
      {
        Element = -1073741788;
      }
    }
  }
  if( BufferOut )
    ExFreePoolWithTag(BufferOut, 0);
  if( v6 )
    ExFreePoolWithTag(v6, 0);
  if( PoolWithTag )
    ExFreePoolWithTag(PoolWithTag, 0);
  return Element;
}

Referenced by:

PopBcdEstablishResumeObject
PopBcdRegenerateResumeObject