MiSectionCreated

_MI_CONTROL_AREA_WAIT_BLOCK *__stdcall MiSectionCreated(
        _FILE_OBJECT *File,
        _CONTROL_AREA *ControlArea,
        _MMPFN *ImageHeaderPage){
  INT64 *p_ControlAreaLock; 
  _MMPFN *bf_0; 
  _CONTROL_AREA *v6; 
  unsigned __int64 v7; 
  _SECTION_OBJECT_POINTERS *SectionObjectPointer; 
  _QWORD *ImageSectionObject; 
  INT64 *v10; 
  _SECTION_OBJECT_POINTERS *v11; 
  __int64 v13; 
  unsigned int NumberOfMappedViews_high; 
  unsigned int v15; 
  UINT64 *v16; 
  unsigned __int64 v17; 
  INT64 v18; 
  UINT64 v19; 
  _MMPFN *PfnDb; 
  _MMPFN *v21; 
  _MMPFN *v22; 
  __int16 v23; 
  bool v24; 
  _MI_CONTROL_AREA_WAIT_BLOCK *v25; 
  unsigned int v26; 
  unsigned int v27; 
  int v28; 
  char SpinCount[12]; 
  __int64 v30; 
  _MI_CONTROL_AREA_WAIT_BLOCK *v31; 
  _MMPFN *v33; 
  UINT8 PageIrql; 

  v33 = ImageHeaderPage;
  p_ControlAreaLock = (INT64 *)&ControlArea->ControlAreaLock;
  PageIrql = 0;
  bf_0 = ImageHeaderPage;
  v6 = ControlArea;
  v7 = (unsigned __int8)ExAcquireSpinLockExclusive((INT64 *)&ControlArea->ControlAreaLock);
  if( ((__int64)KeGetCurrentThread()[1].Queue & 0x40) != 0 )
    v6->u.LongFlags |= 0x200u;
  SectionObjectPointer = File->SectionObjectPointer;
  if( (v6->u.LongFlags & 0x20) != 0 )
  {
    ImageSectionObject = SectionObjectPointer->ImageSectionObject;
    v10 = ImageSectionObject + 9;
    ExAcquireSpinLockExclusiveAtDpcLevel(ImageSectionObject + 9);
    v25 = (_MI_CONTROL_AREA_WAIT_BLOCK *)ImageSectionObject[10];
    v31 = 0i64;
    v6->WaitList = v25;
  }
  else
  {
    ImageSectionObject = SectionObjectPointer->DataSectionObject;
    v10 = ImageSectionObject + 9;
    ExAcquireSpinLockExclusiveAtDpcLevel(ImageSectionObject + 9);
    v31 = (_MI_CONTROL_AREA_WAIT_BLOCK *)ImageSectionObject[10];
  }
  v6->FilePointer.Value = ImageSectionObject[8];
  ExAcquireSpinLockExclusiveAtDpcLevel(&SpinLock);
  v11 = File->SectionObjectPointer;
  if( (v6->u.LongFlags & 0x20) != 0 )
  {
    v11->ImageSectionObject = v6;
    ExReleaseSpinLockExclusiveFromDpcLevel(&SpinLock);
    ExReleaseSpinLockExclusiveFromDpcLevel(v10);
    ExReleaseSpinLockExclusiveFromDpcLevel(p_ControlAreaLock);
    __writecr8(v7);
    v13 = *(_QWORD *)v6[1].gap8;
    NumberOfMappedViews_high = HIDWORD(v6[1].NumberOfMappedViews);
    v30 = v13;
    v26 = NumberOfMappedViews_high;
    while( 1 )
    {
      if( !bf_0 )
        return v31;
      if( (bf_0->PteLong & 0x40000) != 0 )
        goto LABEL_29;
      MmUnmapLockedPages((VOID *)bf_0->u2._bf_0, (_MDL *)bf_0);
      v16 = (UINT64 *)&bf_0[1];
      v17 = 0i64;
      v27 = *((_DWORD *)&bf_0->3 + 4);
      v15 = v27;
      v28 = LODWORD(bf_0->u4._bf_0) >> 12;
      v18 = v13 + 8i64 * v27;
      PageIrql = 17;
      *(_QWORD *)&SpinCount[4] = 0i64;
      if( !v28 )
        goto LABEL_29;
      do
      {
        v19 = *v16;
        PfnDb = MmGetPfnDb();
        v21 = &PfnDb[*v16];
        if( v15 < NumberOfMappedViews_high )
        {
          if( (v18 & 0xFFFFFFFFFFFFF000ui64) != v17 )
          {
            if( v17 )
              MiUnlockProtoPoolPage(*(ULONG_PTR *)&SpinCount[4], PageIrql);
            while( 1 )
            {
              *(_QWORD *)&SpinCount[4] = MiLockProtoPoolPage((_MMPTE *)v18, &PageIrql);
              if( *(_QWORD *)&SpinCount[4] )
                break;
              MmAccessFault(2ui64, (PVOID)v18, 0, 0i64);
            }
            v6 = ControlArea;
            v17 = v18 & 0xFFFFFFFFFFFFF000ui64;
          }
          v22 = MiLockLeafPage((_MMPTE *)v18, 0i64);
          v23 = MI_READ_PTE_LOCK_FREE(v18);
          if( v22 )
          {
            _InterlockedAnd64(&v22->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
          }
          else if( (v23 & 0x400) != 0 )
          {
            *(_DWORD *)SpinCount = 0;
            while( _interlockedbittestandset64((volatile signed __int32 *)&v21->u2, 0x3Fui64) )
            {
              do
                KeYieldProcessorEx((UINT64 *)SpinCount);
              while( v21->u2._bf_0 < 0 );
            }
            MiInitializeTransitionPfn(v19, (_MMPTE *)v18);
            _InterlockedAnd64(&v21->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
            if( (*(_DWORD *)(&v21->3 + 1) & 0x400i64) != 0 )
              MiReferenceControlAreaPfn(v6, 0i64, 1ui64);
            goto LABEL_24;
          }
          MiReturnPfnReferenceCount(v21);
          *v16 = -1i64;
LABEL_24:
          NumberOfMappedViews_high = v26;
          goto LABEL_25;
        }
        MiReturnPfnReferenceCount(&PfnDb[*v16]);
        *v16 = -1i64;
LABEL_25:
        v18 += 8i64;
        v15 = v27 + 1;
        ++v16;
        v24 = v28-- == 1;
        ++v27;
      }
      while( !v24 );
      bf_0 = v33;
      if( v17 )
        MiUnlockProtoPoolPage(*(ULONG_PTR *)&SpinCount[4], PageIrql);
      v13 = v30;
LABEL_29:
      bf_0 = (_MMPFN *)bf_0->u1.$976DF529DAC3D73085C9E386D94B91E6::$E228DCF3D8940E384DBC5EFCA756D8B6::_bf_0;
      v33 = bf_0;
    }
  }
  v11->DataSectionObject = v6;
  ExReleaseSpinLockExclusiveFromDpcLevel(&SpinLock);
  ExReleaseSpinLockExclusiveFromDpcLevel(v10);
  v6->u.LongFlags &= ~2u;
  ExReleaseSpinLockExclusiveFromDpcLevel(p_ControlAreaLock);
  __writecr8(v7);
  KeAbPostRelease(v11);
  return v31;
}

Referenced by:

No references.