MiMappedPageWriter

VOID __stdcall MiMappedPageWriter(VOID *StartContext){
  _ETHREAD *CurrentThread; 
  KPRIORITY v3; 
  VOID **v4; 
  unsigned int v5; 
  char *v6; 
  __int64 v7; 
  unsigned int v8; 
  unsigned __int64 v9; 
  unsigned __int64 v10; 
  int v11; 
  _MMMOD_WRITER_MDL_ENTRY *ModWriterEntry; 
  CHAR v13; 
  unsigned __int32 v14; 
  _QWORD *v15; 
  __int64 *v16; 
  __int64 v17; 
  VOID **v18; 
  VOID *Object[18]; 
  _KWAIT_BLOCK WaitBlockArray; 

  memset(&Object[1], 0i64, 0x88u);
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  v3 = KeSetPriorityThread(&CurrentThread->Tcb, 18);
  CurrentThread->SameThreadPassiveFlags |= 2u;
  v4 = Object;
  v5 = v3;
  v6 = (char *)StartContext + 4408;
  v7 = 16i64;
  do
  {
    *v4 = v6;
    v6 += 24;
    ++v4;
    --v7;
  }
  while( v7 );
  Object[16] = (char *)StartContext + 104;
  Object[17] = (char *)StartContext + 792;
  KeGetCurrentThread()[1].TrapFrame = (_KTRAP_FRAME *)3;
LABEL_4:
  v8 = -1;
LABEL_5:
  if( v8 == -1
    || (v9 = *((_QWORD *)StartContext + 936), v10 = *((_QWORD *)StartContext + 950), v9 <= v10)
    || v9 - v10 < 0x10 && !*((_DWORD *)StartContext + 197) )
  {
    v8 = KeWaitForMultipleObjects(0x12ui64, Object, WaitAny, WrFreePage, 0, 0, 0i64, &WaitBlockArray);
  }
  while( 1 )
  {
    while( 1 )
    {
      v11 = *((_DWORD *)StartContext + 27);
      if( !v11 && v8 < 0x10 && *((_QWORD *)StartContext + 5 * v8 + 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 = MiAllocateModWriterEntry((_MI_PARTITION *)StartContext, 0x10ui64, 1ui64);
      if( ModWriterEntry )
      {
        memset(ModWriterEntry, 0i64, sizeof(_MMMOD_WRITER_MDL_ENTRY));
        ModWriterEntry->Links.Flink = (_LIST_ENTRY *)97;
        ModWriterEntry->Partition = (_MI_PARTITION *)StartContext;
      }
      else
      {
        --CurrentThread->Tcb.SpecialApcDisable;
        v15 = (char *)StartContext + 632;
        v16 = (__int64 *)*((_QWORD *)StartContext + 79);
        if( v16 == (__int64 *)((char *)StartContext + 632) )
        {
          *((_BYTE *)StartContext + 672) = 1;
        }
        else
        {
          ModWriterEntry = (_MMMOD_WRITER_MDL_ENTRY *)*((_QWORD *)StartContext + 79);
          if( (_QWORD *)v16[1] != v15 )
            goto LABEL_41;
          v17 = *v16;
          if( *(_MMMOD_WRITER_MDL_ENTRY **)(v17 + 8) != ModWriterEntry )
            goto LABEL_41;
          *v15 = v17;
          *(_QWORD *)(v17 + 8) = v15;
        }
        KiLeaveGuardedRegionUnsafe((__int64)CurrentThread);
      }
      if( ModWriterEntry )
      {
        v14 = _InterlockedIncrement((volatile signed __int32 *)StartContext + 156);
        if( v14 > *((_DWORD *)StartContext + 157) )
          *((_DWORD *)StartContext + 157) = v14;
        ModWriterEntry->PointerMdl = 0i64;
        if( !MiGatherMappedPages((_MI_PARTITION *)StartContext, v8, ModWriterEntry) )
        {
          _InterlockedAdd((volatile signed __int32 *)StartContext + 156, 0xFFFFFFFF);
          if( (*(_DWORD *)&ModWriterEntry->u1 & 1) != 0 )
          {
            --CurrentThread->Tcb.SpecialApcDisable;
            v18 = (VOID **)*((_QWORD *)StartContext + 80);
            if( *v18 != (char *)StartContext + 632 )
LABEL_41:
              __fastfail(3u);
            ModWriterEntry->Links.Blink = (_LIST_ENTRY *)v18;
            ModWriterEntry->Links.Flink = (_LIST_ENTRY *)((char *)StartContext + 632);
            *v18 = ModWriterEntry;
            *((_QWORD *)StartContext + 80) = ModWriterEntry;
            KiLeaveGuardedRegionUnsafe((__int64)CurrentThread);
          }
          else
          {
            MiFreeModWriterEntry(ModWriterEntry, 1ui64);
          }
        }
        goto LABEL_5;
      }
      KeWaitForGate((_KGATE *)((char *)StartContext + 648), WrPageOut, v13);
    }
    if( !v11 )
      goto LABEL_4;
    if( !*((_DWORD *)StartContext + 156) )
      break;
    do
      KeDelayExecutionThread(0, 0, (_LARGE_INTEGER *)&Interval);
    while( *((_DWORD *)StartContext + 156) );
  }
  MiDeleteMappedMdls((_MI_PARTITION *)StartContext);
  KeSetActualBasePriorityThread(&CurrentThread->Tcb, v5);
}

Referenced by:

No references.