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