PopBcdSetDefaultResumeObjectElements

INT64 __stdcall PopBcdSetDefaultResumeObjectElements(
        PVOID ResumeObjectHandle,
        PVOID LoaderObjectHandle,
        _UNICODE_STRING *HiberfileDeviceName,
        const WCHAR *HiberfilePath){
  UINT8 *v6; 
  UINT8 *PoolWithTag; 
  int Element; 
  UINT64 v9; 
  UINT64 v10; 
  UINT64 v11; 
  int v12; 
  WCHAR *v13; 
  UINT8 *v14; 
  __int64 v15; 
  __int64 v16; 
  __int64 v17; 
  UINT64 v18; 
  UINT64 v19; 
  UINT64 v20; 
  UNICODE_STRING *v21; 
  WCHAR *v22; 
  int v23; 
  UINT64 v24; 
  char v25; 
  UINT64 DataSize; 
  UINT64 DataSizea; 
  UINT64 DataSizeb; 
  __int16 v30[2]; 
  UINT64 v31; 
  char BufferSizeOut[12]; 
  PVOID P; 
  int ElementDataWithFlags; 
  int v35; 
  int v36; 
  __int128 Data; 
  _UNICODE_STRING *v38; 
  const WCHAR *v39; 
  v39 = HiberfilePath;
  v38 = HiberfileDeviceName;
  LOWORD(v39) = 0;
  LOWORD(v38) = 0;
  *(_QWORD *)&Data = 0i64;
  v30[0] = 0;
  P = 0i64;
  memset(BufferSizeOut, 0, sizeof(BufferSizeOut));
  v6 = 0i64;
  PoolWithTag = 0i64;
  HIDWORD(v31) = 0;
  Element = PopBcdReadElement(LoaderObjectHandle, 0x11000001ui64, &P, (UINT64 *)BufferSizeOut);
  if( Element >= 0 )
  {
    Element = PopBcdReadElement(
                LoaderObjectHandle,
                0x12000002ui64,
                (PVOID *)&BufferSizeOut[4],
                (UINT64 *)((char *)&v31 + 4));
    if( Element < 0 )
    {
      v6 = *(UINT8 **)&BufferSizeOut[4];
    }
    else
    {
      HIDWORD(v31) = 8;
      ElementDataWithFlags = BcdGetElementDataWithFlags(
                               LoaderObjectHandle,
                               0x15000052ui64,
                               v9,
                               &Data,
                               (UINT64 *)((char *)&v31 + 4));
      LODWORD(v31) = 2;
      v35 = BcdGetElementDataWithFlags(LoaderObjectHandle, 0x16000054ui64, v10, &v38, &v31);
      LODWORD(v31) = 2;
      v12 = BcdGetElementDataWithFlags(LoaderObjectHandle, 0x16000046ui64, v11, v30, &v31);
      v6 = *(UINT8 **)&BufferSizeOut[4];
      v36 = v12;
      v13 = wcsrchr(*(const WCHAR **)&BufferSizeOut[4], 0x5Cu);
      if( v13 )
      {
        v14 = (UINT8 *)L"winresume.efi";
        if( dword_140C19650 != 2 )
          v14 = (UINT8 *)L"winresume.exe";
        v15 = -1i64;
        v16 = ((char *)v13 - (char *)v6 + 2) >> 1;
        v17 = -1i64;
        do
          ++v17;
        while( *(_WORD *)&v14[2 * v17] );
        *(_DWORD *)&BufferSizeOut[4] = 2 * (v16 + v17) + 2;
        PoolWithTag = (UINT8 *)ExAllocatePoolWithTag(PagedPool, *(unsigned int *)&BufferSizeOut[4], 0x64634250ui64);
        if( PoolWithTag )
        {
          v18 = 2i64 * (unsigned int)v16;
          memmove(PoolWithTag, v6, v18);
          do
            ++v15;
          while( *(_WORD *)&v14[2 * v15] );
          memmove(&PoolWithTag[v18], v14, 2 * v15 + 2);
          LODWORD(DataSize) = *(_DWORD *)BufferSizeOut;
          Element = BcdSetElementDataWithFlags(ResumeObjectHandle, 0x11000001ui64, v19, P, DataSize);
          if( Element >= 0 )
          {
            LODWORD(DataSizea) = *(_DWORD *)&BufferSizeOut[4];
            Element = BcdSetElementDataWithFlags(ResumeObjectHandle, 0x12000002ui64, v20, PoolWithTag, DataSizea);
            if( Element >= 0 )
            {
              if( ElementDataWithFlags >= 0 )
              {
                LODWORD(DataSizeb) = HIDWORD(v31);
                BcdSetElementDataWithFlags(ResumeObjectHandle, 0x15000052ui64, (UINT64)v22, &Data, DataSizeb);
              }
              v23 = v31;
              if( v35 >= 0 )
              {
                LODWORD(DataSizeb) = v31;
                BcdSetElementDataWithFlags(ResumeObjectHandle, 0x16000054ui64, (UINT64)v22, &v38, DataSizeb);
              }
              if( v36 >= 0 )
              {
                LODWORD(DataSizeb) = v23;
                BcdSetElementDataWithFlags(ResumeObjectHandle, 0x16000046ui64, (UINT64)v22, v30, DataSizeb);
              }
              Element = PopBcdSetupResumeObject(ResumeObjectHandle, v21, v22);
              if( Element >= 0 )
              {
                v25 = (char)v39;
                LODWORD(DataSizeb) = 2;
                if( (_BYTE)KdDebuggerEnabled )
                  v25 = 1;
                LOBYTE(v39) = v25;
                Element = BcdSetElementDataWithFlags(ResumeObjectHandle, 0x26000006ui64, v24, &v39, DataSizeb);
                if( Element >= 0 )
                  Element = 0;
              }
            }
          }
        }
        else
        {
          Element = -1073741670;
        }
      }
      else
      {
        Element = -1073741788;
      }
    }
  }
  if( P )
    ExFreePoolWithTag(P, 0);
  if( v6 )
    ExFreePoolWithTag(v6, 0);
  if( PoolWithTag )
    ExFreePoolWithTag(PoolWithTag, 0);
  return(unsigned int)Element;
}

Referenced by:

PopBcdEstablishResumeObject
PopBcdRegenerateResumeObject