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.