MiMappedPageWriter

VOID __stdcall MiMappedPageWriter(PVOID StartContext, CHAR a2){
  _ETHREAD *CurrentThread; 
  KPRIORITY v4; 
  VOID **p_Object; 
  int v6; 
  char *v7; 
  __int64 v8; 
  unsigned int v9; 
  unsigned __int64 v10; 
  unsigned __int64 v11; 
  int v12; 
  _MMMOD_WRITER_MDL_ENTRY *ModWriterEntry; 
  unsigned __int32 v14; 
  unsigned int v15; 
  _QWORD *v16; 
  __int64 *v17; 
  __int64 v18; 
  PVOID *v19; 
  VOID *Object; 
  INT64 result[17]; 
  struct _KWAIT_BLOCK WaitBlockArray; 
  memset((INT64)result, 0i64);
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  v4 = KeSetPriorityThread((PKTHREAD)CurrentThread, 18);
  *((_DWORD *)CurrentThread + 325) |= 2u;
  p_Object = &Object;
  v6 = v4;
  v7 = (char *)StartContext + 4408;
  v8 = 16i64;
  do
  {
    *p_Object = v7;
    v7 += 24;
    ++p_Object;
    --v8;
  }
  while( v8 );
  result[15] = (INT64)StartContext + 104;
  result[16] = (INT64)StartContext + 792;
  *((_QWORD *)KeGetCurrentThread() + 152) = 3i64;
LABEL_4:
  v9 = -1;
LABEL_5:
  if( v9 == -1
    || (v10 = *((_QWORD *)StartContext + 936), v11 = *((_QWORD *)StartContext + 950), v10 <= v11)
    || v10 - v11 < 0x10 && !*((_DWORD *)StartContext + 197) )
  {
    KeWaitForMultipleObjects((_BYTE *)0x12, &Object, WaitAny, WrFreePage, 0, 0, 0i64, &WaitBlockArray);
    v9 = v15;
  }
  while( 1 )
  {
    while( 1 )
    {
      v12 = *((_DWORD *)StartContext + 27);
      if( !v12 && v9 < 0x10 && *((_QWORD *)StartContext + 5 * v9 + 434) == 0xFFFFFFFFFi64 )
        goto LABEL_4;
      if( *((_QWORD *)StartContext + 936) == *((_QWORD *)StartContext + 950) )
        break;
      if( (unsigned __int64)*((unsigned int *)StartContext + 156) >= *((_QWORD *)StartContext + 77) )
        ModWriterEntry = 0i64;
      else
        ModWriterEntry = (_MMMOD_WRITER_MDL_ENTRY *)MiAllocateModWriterEntry((__int64)StartContext, 16i64, 1);
      if( ModWriterEntry )
      {
        memset((INT64)ModWriterEntry, 0i64);
        *(_QWORD *)ModWriterEntry = 97i64;
        *((_QWORD *)ModWriterEntry + 24) = StartContext;
      }
      else
      {
        --*((_WORD *)CurrentThread + 243);
        v16 = (char *)StartContext + 632;
        v17 = (__int64 *)*((_QWORD *)StartContext + 79);
        if( v17 == (__int64 *)((char *)StartContext + 632) )
        {
          *((_BYTE *)StartContext + 672) = 1;
        }
        else
        {
          ModWriterEntry = (_MMMOD_WRITER_MDL_ENTRY *)*((_QWORD *)StartContext + 79);
          if( (_QWORD *)v17[1] != v16 )
            goto LABEL_41;
          v18 = *v17;
          if( *(_MMMOD_WRITER_MDL_ENTRY **)(v18 + 8) != ModWriterEntry )
            goto LABEL_41;
          *v16 = v18;
          *(_QWORD *)(v18 + 8) = v16;
        }
        KiLeaveGuardedRegionUnsafe((__int64)CurrentThread);
      }
      if( ModWriterEntry )
      {
        v14 = _InterlockedIncrement((volatile signed __int32 *)StartContext + 156);
        if( v14 > *((_DWORD *)StartContext + 157) )
          *((_DWORD *)StartContext + 157) = v14;
        *((_QWORD *)ModWriterEntry + 25) = 0i64;
        if( !(unsigned int)MiGatherMappedPages((__int64)StartContext, v9, (__int64)ModWriterEntry) )
        {
          _InterlockedAdd((volatile signed __int32 *)StartContext + 156, 0xFFFFFFFF);
          if( (*((_DWORD *)ModWriterEntry + 10) & 1) != 0 )
          {
            --*((_WORD *)CurrentThread + 243);
            v19 = (PVOID *)*((_QWORD *)StartContext + 80);
            if( *v19 != (char *)StartContext + 632 )
LABEL_41:
              __fastfail(3u);
            *((_QWORD *)ModWriterEntry + 1) = v19;
            *(_QWORD *)ModWriterEntry = (char *)StartContext + 632;
            *v19 = ModWriterEntry;
            *((_QWORD *)StartContext + 80) = ModWriterEntry;
            KiLeaveGuardedRegionUnsafe((__int64)CurrentThread);
          }
          else
          {
            MiFreeModWriterEntry(ModWriterEntry, 1ui64);
          }
        }
        goto LABEL_5;
      }
      KeWaitForGate((char *)StartContext + 648, 19);
    }
    if( !v12 )
      goto LABEL_4;
    if( !*((_DWORD *)StartContext + 156) )
      break;
    do
      KeDelayExecutionThread(0, 0, (PLARGE_INTEGER)&MiShortTime);
    while( *((_DWORD *)StartContext + 156) );
  }
  MiDeleteMappedMdls((_MI_PARTITION *)StartContext);
  KeSetActualBasePriorityThread((__int64)CurrentThread, v6);
}

Referenced by:

No references.