MiDbgCopyMemoryTarget
VOID __stdcall MiDbgCopyMemoryTarget(_KDPC *Dpc, PVOID DeferredContext, PVOID SystemArgument1, PVOID SystemArgument2){
signed __int32 v7;
unsigned int v8;
int v9;
int v10;
VOID *v11;
__int64 i;
INT64 *v13;
__int64 v14;
UINT64 v15;
NTSTATUS SystemRegionType;
INT64 v17;
_KTBFLUSH_TYPE v18;
UINT64 v19;
UINT64 v20;
NTSTATUS v21;
signed __int32 v22;
unsigned int v23;
UINT64 v24;
__int64 v25[2];
__int128 v26;
UINT64 SpinCount;
LODWORD(SpinCount) = 0;
*(_OWORD *)v25 = 0i64;
v26 = 0i64;
v7 = _InterlockedDecrement((volatile signed __int32 *)SystemArgument2);
v8 = ~v7 & 0x80000000;
if( (v7 & 0x7FFFFFFF) != 0 )
{
while( (*(_DWORD *)SystemArgument2 & 0x80000000) != v8 )
KeYieldProcessorEx(&SpinCount);
goto LABEL_25;
}
v9 = v8 | *((_DWORD *)SystemArgument2 + 1);
v10 = 0;
*(_DWORD *)SystemArgument2 = v9;
v11 = *(VOID **)DeferredContext;
MiFillPteHierarchy(*(_QWORD *)DeferredContext, (UINT64 *)v25);
for( i = 3i64; ; --i )
{
v13 = (INT64 *)v25[i];
LODWORD(v14) = MI_READ_PTE_LOCK_FREE((INT64)v13);
if( (v14 & 1) == 0 )
break;
if( (v14 & 0x80u) != 0i64 || !i )
goto LABEL_8;
}
v10 = -1073741819;
LABEL_8:
if( (v14 & 1) != 0 )
{
if( (*((_DWORD *)DeferredContext + 6) & 1) != 0 )
{
if( (v14 & 0x800) == 0 )
{
v10 = -1073741819;
goto LABEL_24;
}
if( (v14 & 0x42) == 0 )
{
MiWriteValidPteNewProtection(v13, v14 | 0x42);
LODWORD(v15) = MiGetLeafVa((UINT64)v11);
SystemRegionType = MiGetSystemRegionType(v15);
v17 = 2i64;
if( SystemRegionType == 1 )
{
v18 = FlushSession;
}
else if( SystemRegionType == 2 )
{
v18 = FlushUser;
v17 = 0i64;
}
else
{
v18 = FlushKernel;
}
KeFlushSingleTb((UINT64)v11, v18, v17);
}
}
if( v10 >= 0 )
{
v19 = *((unsigned int *)DeferredContext + 5);
v20 = *((unsigned int *)DeferredContext + 4);
if( (*((_DWORD *)DeferredContext + 6) & 1) != 0 )
MiCopyToUntrustedMemory(v11, *((VOID **)DeferredContext + 1), v20, v19);
else
v21 = MiCopyFromUntrustedMemory(*((VOID **)DeferredContext + 1), v11, v20, v19);
v10 = v21;
}
}
LABEL_24:
*((_DWORD *)DeferredContext + 7) = v10;
LABEL_25:
v22 = _InterlockedDecrement((volatile signed __int32 *)SystemArgument2);
v23 = ~v22 & 0x80000000;
if( (v22 & 0x7FFFFFFF) != 0 )
{
LODWORD(v24) = 0;
while( (*(_DWORD *)SystemArgument2 & 0x80000000) != v23 )
KeYieldProcessorEx(&v24);
}
else
{
*(_DWORD *)SystemArgument2 = v23 | *((_DWORD *)SystemArgument2 + 1);
}
_InterlockedDecrement((volatile signed __int32 *)SystemArgument1);
}Referenced by:
No references.