MiSwitchBaseAddress
VOID __stdcall MiSwitchBaseAddress(_CONTROL_AREA *ControlArea, PVOID NewBase, _MMPTE *MappingPte, UINT64 SessionId){
__int64 v4;
_MMPTE *v5;
__int64 v7;
char *v8;
__int64 v9;
__int64 i;
__int64 v11;
__int64 v12;
__int64 *v13;
__int64 v14;
__int64 *v15;
v4 = *(_QWORD *)ControlArea;
v5 = MappingPte;
v7 = *(_QWORD *)(*((_QWORD *)ControlArea + 12) + 32i64);
v8 = (char *)NewBase - *(_QWORD *)(*(_QWORD *)ControlArea + 32i64);
v9 = *(_QWORD *)(v7 + 40);
*(_QWORD *)(v7 + 40) = v8;
*(_QWORD *)(v4 + 32) = NewBase;
**(_QWORD **)(v4 + 56) += *(_QWORD *)(v7 + 40);
for( i = *(_QWORD *)(v7 + 16); i; i = *v13 )
MiApplyBytestreamFixup((__int64)ControlArea, (_QWORD *)(i + 24), v9);
MiWalkEntireImage((ULONG_PTR)ControlArea, (unsigned __int64)v5, 2, SessionId);
*(_QWORD *)(v7 + 40) = &v8[v9];
v12 = *(_QWORD *)(v7 + 16);
if( v12 )
{
v14 = -v9;
do
{
MiApplyBytestreamFixup(v11, (_QWORD *)(v12 + 24), v14);
v12 = *v15;
}
while( v12 );
}
if( (*(_WORD *)(v4 + 12) & 0x2000) != 0 )
{
DbgUnLoadImageSymbolsUnicode(
(UNICODE_STRING *)((*((_QWORD *)ControlArea + 8) & 0xFFFFFFFFFFFFFFF0ui64) + 88),
*(PVOID *)(v4 + 32),
*((_QWORD *)KeGetCurrentThread() + 23));
*(_WORD *)(v4 + 12) &= ~0x2000u;
}
}Referenced by:
MiRelocateImageAgain