PopBuildMemoryImageHeader
INT64 __fastcall PopBuildMemoryImageHeader(_POP_HIBER_CONTEXT *HiberContext, UINT64 Phase){
PO_MEMORY_IMAGE *MemoryImage;
_MDL *LoaderMdl;
unsigned __int64 BitlockerKeyPFN;
_MDL *BootLoaderLogMdl;
unsigned __int64 v7;
_MDL *FirmwareRuntimeInformationMdl;
_POP_HIBER_CONTEXT *Flink;
_POP_HIBER_CONTEXT *v10;
unsigned __int64 v11;
unsigned int *Pages;
unsigned int *v13;
unsigned __int64 *BitlockerKeyPfns;
__int64 v16;
unsigned __int64 *v17;
__int64 v18;
unsigned __int64 v19;
UINT8 *v20;
UINT64 Tag;
UINT64 Taga;
if( !(_DWORD)Phase )
{
MemoryImage = HiberContext->MemoryImage;
LODWORD(Tag) = 1735223629;
PoSetHiberRange(HiberContext, 2ui64, MemoryImage, 0x3E0ui64, Tag);
memset((INT64)MemoryImage, 0i64);
MemoryImage->PageSize = 4096;
MemoryImage->LengthSelf = 992;
MemoryImage->PageSelf = (unsigned __int64)MmGetPhysicalAddress(MemoryImage).QuadPart >> 12;
MemoryImage->SystemTime.QuadPart = *(_QWORD *)&KUSER_SHARED_DATA.SystemTime.LowPart;
MemoryImage->InterruptTime = *(_QWORD *)&KUSER_SHARED_DATA.InterruptTime.LowPart;
MemoryImage->HiberVa = qword_140C23470;
MemoryImage->NoHiberPtes = 10;
MemoryImage->FeatureFlags = KeFeatureBits;
MemoryImage->ImageType = (unsigned __int16)KeProcessorArchitecture;
MemoryImage->HiberFlags = HiberContext->HiberFlags;
MemoryImage->HiberSimulateFlags = -54;
MemoryImage->Hiberboot = byte_140C23480;
MemoryImage->HighestPhysicalPage = MmGetHighestPhysicalPage(0i64);
MemoryImage->SecureLaunched = PopSecureLaunched;
MemoryImage->SecureBoot = HiberContext->SecureBoot;
LoaderMdl = HiberContext->LoaderMdl;
if( LoaderMdl )
MemoryImage->NoFreePages = LoaderMdl->ByteCount >> 12;
BitlockerKeyPFN = HiberContext->BitlockerKeyPFN;
if( BitlockerKeyPFN )
{
BitlockerKeyPfns = MemoryImage->BitlockerKeyPfns;
v16 = 3i64;
MemoryImage->BitlockerKeyPfns[0] = BitlockerKeyPFN;
v17 = &MemoryImage->BitlockerKeyPfns[1];
do
{
v18 = *BitlockerKeyPfns++;
*v17++ = v18 + 1;
--v16;
}
while( v16 );
}
MemoryImage->RestoreProcessorStateRoutine = 0i64;
BootLoaderLogMdl = HiberContext->BootLoaderLogMdl;
if( BootLoaderLogMdl )
{
v7 = (unsigned __int64)BootLoaderLogMdl->ByteCount >> 12;
memmove((UINT8 *)MemoryImage->BootLoaderLogPages, (UINT8 *)&BootLoaderLogMdl[1], 8 * v7);
}
else
{
LODWORD(v7) = 0;
}
MemoryImage->NoBootLoaderLogPages = v7;
FirmwareRuntimeInformationMdl = HiberContext->FirmwareRuntimeInformationMdl;
if( FirmwareRuntimeInformationMdl )
{
v19 = (FirmwareRuntimeInformationMdl->ByteCount >> 12) + ((FirmwareRuntimeInformationMdl->ByteCount & 0xFFF) != 0);
if( v19 > 1 )
v19 = 1i64;
v20 = (UINT8 *)&FirmwareRuntimeInformationMdl[1];
memmove((UINT8 *)MemoryImage->FirmwareRuntimeInformation, v20, 8 * v19);
for( MemoryImage->FirmwareRuntimeInformationPages = v19; v19; --v19 )
{
LODWORD(Taga) = 1682794822;
PoSetHiberRange(HiberContext, 0xC000ui64, *(VOID **)v20, 1ui64, Taga);
v20 += 8;
}
}
else
{
MemoryImage->FirmwareRuntimeInformationPages = 0;
}
Flink = (_POP_HIBER_CONTEXT *)HiberContext->ClonedRanges.Flink;
while( Flink != (_POP_HIBER_CONTEXT *)&HiberContext->ClonedRanges )
{
v10 = Flink;
Flink = *(_POP_HIBER_CONTEXT **)&Flink->Reset;
v11 = (unsigned __int64)((v10->DiscardMap.SizeOfBitMap - v10->HvCaptureCompletedBarrier) << 12) >> 12;
Pages = (unsigned int *)PopAllocatePages(v11);
v13 = Pages;
if( Pages )
{
LODWORD(Taga) = 1131179886;
PoSetHiberRange(HiberContext, 0x8000ui64, Pages, v11 << 12, Taga);
}
else
{
HiberContext->Status = -1073741670;
}
v10->DiscardMap.Buffer = v13;
if( !v13 )
return 3221225626i64;
}
MemoryImage->HardwareSignature = HiberContext->HardwareConfigurationSignature;
MemoryImage->SkipMemoryMapValidation = PopHiberSkipMemoryMapValidation;
}
return(unsigned int)HiberContext->Status;
}Referenced by:
PopEndMirroring