MmDuplicateMemory
NTSTATUS __stdcall MmDuplicateMemory(_MM_MIRROR_DISPATCH *MirrorDispatch){
_MM_MIRROR_DISPATCH v1;
unsigned __int8 CurrentIrql;
unsigned __int8 v4;
NTSTATUS result;
int v6;
_ETHREAD *CurrentThread;
INT16 v8;
INT64 v9;
int v10;
int v11;
unsigned __int8 v12;
int v13;
INT64 v14[2];
__int64 v15;
__int64 v16;
v1 = MirrorDispatch[8];
v16 = 0i64;
v15 = 0i64;
CurrentIrql = 17;
v4 = 17;
*(_OWORD *)v14 = 0i64;
LODWORD(v14[1]) = v1;
if( (v1 & 1) != 0 && (v1 & 0x404) != 0 )
return -1073741811;
if( (v1 & 8) != 0 )
{
v1 &= 0xFFFFFBFA;
LODWORD(v14[1]) = v1;
}
if( (v1 & 0x400) != 0 && (v1 & 4) != 0
|| (v1 & 0xC0) != 0 && ((v1 & 0xFFFFFC2E) != 0 || (v1 & 0x11) != 17 || (v1 & 0x40) != 0 && (v1 & 0x80u) != 0) )
{
return -1073741811;
}
if( (v1 & 0xA) == 0 )
CcNotifyWriteBehind((UINT64)MirrorDispatch);
v14[0] = (INT64)MirrorDispatch;
v6 = 0;
HIDWORD(v14[1]) = 8;
BYTE4(v15) = 0;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
result = KeWaitForSingleObject(
(UINT64)&stru_140C4DB30 + 2272,
18,
0,
0,
(unsigned __int64)&v16 & -(__int64)((v14[1] & 0x200) != 0));
if( result >= 0 )
{
if( result == 258 )
return 258;
if( (MiFlags & 4) == 0 )
MmLockPagableSectionByHandle(ExPageLockHandle);
--CurrentThread->Tcb.SpecialApcDisable;
ExAcquirePushLockExclusiveEx((_EX_PUSH_LOCK *)&stru_140C4DB30 + 259, 0i64);
MiLockDynamicMemoryExclusive(&Irp, CurrentThread);
_InterlockedIncrement((_DWORD *)&stru_140C4DB30 + 1082);
if( !MiUpdateMirrorBitmaps() )
{
v10 = -1073741670;
LABEL_49:
*(&stru_140C4DB30 + 567) = 0;
if( BYTE4(v15) == 1 )
_InterlockedAdd((_DWORD *)&stru_140C4DB30 + 983, 0xFFFFFFFF);
if( *(&stru_140C4DB30 + 291) )
*(&stru_140C4DB30 + 291) = 0i64;
if( CurrentIrql != 17 )
{
if( v4 != 17 )
MiUnlockAllMemoryLists(v9, v8);
__writecr8(CurrentIrql);
}
if( v6 == 1 )
{
*(&stru_140C4DB30 + 290) = HIDWORD(v14[1]);
ExQueueWorkItem((PWORK_QUEUE_ITEM)((char *)&stru_140C4DB30 + 2296), HyperCriticalWorkQueue);
}
else
{
_InterlockedAdd((_DWORD *)&stru_140C4DB30 + 1082, 0xFFFFFFFF);
KeSetEvent((PRKEVENT)((char *)&stru_140C4DB30 + 2272), 0, 0);
}
MiUnlockDynamicMemoryExclusive(&Irp, CurrentThread);
if( (_InterlockedExchangeAdd64((_QWORD *)&stru_140C4DB30 + 259, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock((_EX_PUSH_LOCK *)&stru_140C4DB30 + 259);
KeAbPostRelease((char *)&stru_140C4DB30 + 2072);
KiLeaveGuardedRegionUnsafe((__int64)CurrentThread);
if( (MiFlags & 4) == 0 )
MmUnlockPagableImageSection(ExPageLockHandle);
return v10;
}
MiActOnMirrorBitmap((_RTL_BITMAP_EX *)&stru_140C4DB30 + 147, MiMirrorBitmapSetAllBits);
v11 = 1;
LODWORD(v15) = 0;
if( (v14[1] & 1) != 0 )
{
LODWORD(v15) = 3;
LABEL_30:
v11 = 0;
LABEL_31:
v10 = (*(__int64(**)(void))MirrorDispatch)();
if( v10 < 0 )
goto LABEL_48;
*(&stru_140C4DB30 + 567) = 1;
v10 = MiMirrorBrownPhase((INT64)v14);
if( v10 < 0 )
goto LABEL_48;
if( (v14[1] & 2) == 0 && BYTE4(v15) == 1 )
{
_InterlockedAdd((_DWORD *)&stru_140C4DB30 + 983, 0xFFFFFFFF);
BYTE4(v15) = 0;
}
CurrentIrql = KeGetCurrentIrql();
v10 = (*((__int64(__fastcall **)(_QWORD))MirrorDispatch + 1))(0i64);
if( v10 < 0 )
goto LABEL_48;
v4 = KeGetCurrentIrql();
if( *((_QWORD *)MirrorDispatch + 3) )
MiActOnMirrorBitmap((_RTL_BITMAP_EX *)&stru_140C4DB30 + 146, MiMirrorBitmapSetAllBits);
if( v4 < 2u )
{
v12 = KeGetCurrentIrql();
__writecr8(2ui64);
v4 = v12;
}
MiLockAllMemoryLists();
*(&stru_140C4DB30 + 291) = CurrentThread;
if( BYTE4(v15) == 1 )
{
_InterlockedAdd((_DWORD *)&stru_140C4DB30 + 983, 0xFFFFFFFF);
BYTE4(v15) = 0;
}
*(&stru_140C4DB30 + 567) = 2;
v10 = MiMirrorBlackPhase((INT64)v14);
if( v10 < 0
|| (v10 = MiMirrorVerify((INT64)MirrorDispatch), v10 < 0)
|| (v13 = (*((__int64(__fastcall **)(__int64))MirrorDispatch + 1))(1i64),
*(&stru_140C4DB30 + 291) = 0i64,
v10 = v13,
v13 != 1073742484)
|| v11 )
{
LABEL_48:
v6 = 0;
}
else
{
v10 = 0;
MiResumeFromHibernate(HIDWORD(v14[1]));
v6 = 1;
}
goto LABEL_49;
}
if( (v14[1] & 0x400) == 0 )
{
if( (v14[1] & 4) != 0 )
{
HIDWORD(v14[1]) = 7;
LABEL_29:
LODWORD(v15) = 2;
goto LABEL_30;
}
if( (v14[1] & 8) == 0 )
goto LABEL_31;
}
HIDWORD(v14[1]) = 0;
goto LABEL_29;
}
return result;
}Referenced by:
IopLiveDumpCaptureMemoryPages
IopLiveDumpEstimateMemoryPages
MmCreateMirror
PnprInitiateReplaceOperation
PopTransitionToSleep