IopLiveDumpEstimateMemoryPages
__int64 __fastcall IopLiveDumpEstimateMemoryPages(__int64 a1){
INT64 v1;
__int64 v3;
int v4;
int v5;
int v6;
UINT64 v7;
UINT64 v8;
INT64 MillisecondCounter;
unsigned __int64 v10;
bool v11;
unsigned __int64 v12;
unsigned __int64 v13;
bool v14;
bool v16;
int v17;
unsigned __int64 a1a;
unsigned __int64 a2;
unsigned __int64 a3;
__int64 v21;
__int64 v22;
__int64 v23;
__int64 v24;
__int64 v25;
__int64 v26;
__int64 v27[3];
__int128 v28;
struct _EVENT_DATA_DESCRIPTOR v29;
__int64 *v30;
__int64 v31;
__int64 *v32;
__int64 v33;
__int64 *v34;
__int64 v35;
__int64 *v36;
__int64 v37;
__int64 *v38;
__int64 v39;
__int64 *v40;
__int64 v41;
struct _EVENT_DATA_DESCRIPTOR v42;
char *v43;
__int64 v44;
int *v45;
__int64 v46;
v1 = a1 + 304;
v28 = 0i64;
v3 = *(_QWORD *)&KUSER_SHARED_DATA.InterruptTime.LowPart;
*(_DWORD *)(a1 + 80) |= 1u;
a1a = 0i64;
a2 = 0i64;
a3 = 0i64;
IopLiveDumpCallRemovePagesCallbacks(a1);
v27[0] = (__int64)IopLiveDumpStartMirroringCallback;
v27[1] = (__int64)IopLiveDumpEndMirroringCallback;
v27[2] = (__int64)IopLiveDumpMirrorPhysicalMemoryCallback;
v4 = *(_DWORD *)(a1 + 80);
v5 = (*(_BYTE *)(a1 + 40) & 4) != 0 ? 657 : 593;
DWORD2(v28) = v5;
if( (v4 & 0x20) != 0 )
DWORD2(v28) = v5 | 0x100;
v6 = MmDuplicateMemory((__int64)v27);
if( (*(_DWORD *)(a1 + 80) & 0x80u) != 0 )
*(_QWORD *)(a1 + 464) = (unsigned __int64)(1000i64 * *(_QWORD *)(a1 + 456)) / PerformanceFrequency.QuadPart;
if( v6 < 0 || v6 == 258 )
{
if( (*(_DWORD *)(v1 + 8) & 1) != 0 )
IopLiveDumpUncorralProcessors(v1, 1);
*(_QWORD *)(a1 + 96) = 0i64;
*(_QWORD *)(a1 + 120) = 0i64;
*(_QWORD *)(a1 + 128) = 0i64;
*(_QWORD *)(a1 + 136) = 0i64;
IopLiveDumpTraceMmDuplicateMemoryFailure(a1, (unsigned int)v6);
if( v6 == 258 )
{
*(_DWORD *)(a1 + 80) |= 0x40u;
v6 = -1073740682;
}
}
else
{
v7 = RtlNumberOfSetBitsEx((_RTL_BITMAP_EX *)(a1 + 544));
*(_QWORD *)(a1 + 120) = 0i64;
v8 = v7 + (v7 >> 4);
*(_QWORD *)(a1 + 128) = 0i64;
LODWORD(v7) = *(_DWORD *)(a1 + 44);
*(_QWORD *)(a1 + 96) = v8;
*(_QWORD *)(a1 + 136) = 0i64;
if( (v7 & 1) != 0 )
{
MillisecondCounter = 0i64;
if( (*(_DWORD *)(a1 + 80) & 0x80u) != 0 )
MillisecondCounter = IopLiveDumpGetMillisecondCounter(0);
v6 = HvlCalculateLivedumpSize(&a1a, &a2, &a3);
if( (*(_DWORD *)(a1 + 80) & 0x80u) != 0 )
*(_QWORD *)(a1 + 288) = IopLiveDumpGetMillisecondCounter(0) - MillisecondCounter;
if( v6 < 0 )
{
*(_DWORD *)(a1 + 80) |= 0x10u;
IopLiveDumpTraceQueryHvlDumpSizeFailure(v6);
if( (unsigned int)dword_140C04498 > 5 && tlgKeywordOn((__int64)&dword_140C04498, 0x200000000000i64) )
{
v14 = (*(_DWORD *)(a1 + 80) & 0x10) != 0;
v44 = 1i64;
v16 = v14;
v17 = v6;
v46 = 4i64;
v43 = (char *)&v16;
v45 = &v17;
tlgWriteTransfer_EtwWriteTransfer(
(__int64)&dword_140C04498,
(unsigned __int8 *)byte_140023EAD,
(const GUID *)(a1 + 864),
(const GUID *)(a1 + 848),
4u,
&v42);
}
v6 = 0;
}
else
{
v10 = a2;
v11 = (a2 & 0xFFF) == 0;
*(_QWORD *)(a1 + 120) = (a1a >> 12) + ((a1a & 0xFFF) != 0);
v12 = (v10 >> 12) + !v11;
v13 = a3;
v11 = (a3 & 0xFFF) == 0;
*(_QWORD *)(a1 + 128) = v12;
*(_QWORD *)(a1 + 136) = (v13 >> 12) + !v11;
}
}
}
*(_QWORD *)(a1 + 432) = (*(_QWORD *)&KUSER_SHARED_DATA.InterruptTime.LowPart - v3) / 0x2710ui64;
IopLiveDumpTraceBufferEstimation();
RtlClearAllBitsEx((_RTL_BITMAP_EX *)(a1 + 544));
RtlClearAllBitsEx((_RTL_BITMAP_EX *)(a1 + 600));
RtlClearAllBitsEx((_RTL_BITMAP_EX *)(a1 + 656));
*(_DWORD *)(a1 + 80) &= ~1u;
if( (unsigned int)dword_140C04498 > 5 && tlgKeywordOn((__int64)&dword_140C04498, 0x200000000000i64) )
{
v21 = *(_QWORD *)(a1 + 432);
v30 = &v21;
v22 = *(_QWORD *)(a1 + 440);
v32 = &v22;
v23 = *(_QWORD *)(a1 + 448);
v34 = &v23;
v24 = *(_QWORD *)(a1 + 464);
v36 = &v24;
v25 = *(_QWORD *)(a1 + 472);
v38 = &v25;
v26 = *(_QWORD *)(a1 + 288);
v40 = &v26;
v31 = 8i64;
v33 = 8i64;
v35 = 8i64;
v37 = 8i64;
v39 = 8i64;
v41 = 8i64;
tlgWriteTransfer_EtwWriteTransfer(
(__int64)&dword_140C04498,
(unsigned __int8 *)byte_140023DA1,
(const GUID *)(a1 + 864),
(const GUID *)(a1 + 848),
8u,
&v29);
}
return(unsigned int)v6;
}Referenced by:
IopLiveDumpAllocAndInitResources