CcWaitForUninitializeCacheMap

VOID __stdcall CcWaitForUninitializeCacheMap(FILE_OBJECT *FileObject){
  char v2; 
  unsigned __int64 v3; 
  INT64 Partition; 
  char v5; 
  _SECTION_OBJECT_POINTERS *SectionObjectPointer; 
  _SHARED_CACHE_MAP *SharedCacheMap; 
  WORK_QUEUE_TYPE v8; 
  PVOID v9; 
  WORK_QUEUE_TYPE v10; 
  void *v11; 
  unsigned int Flags; 
  unsigned int v13; 
  unsigned __int64 WriteBehindWorkQueueEntry; 
  __int64 v15; 
  _QWORD *v16; 
  _QWORD *v17; 
  _QWORD *v18; 
  unsigned __int64 v19; 
  KLOCK_QUEUE_HANDLE v20; 
  _CACHE_UNINITIALIZE_EVENT *UninitializeEvent; 
  __int16 Object; 
  char v23; 
  char v24; 
  int v25; 
  __int64 v26[2]; 
  struct _IO_WORKITEM v27; 
  char v29; 
  union _LARGE_INTEGER Timeout; 
  _ETHREAD *CurrentThread; 
  UninitializeEvent = 0i64;
  v24 = 0;
  v29 = 0;
  v2 = 0;
  v3 = 0i64;
  memset(&v20, 0, sizeof(v20));
  memset(&v27, 0, 64);
  Partition = 0i64;
  v5 = 0;
  if( FileObject->SectionObjectPointer->SharedCacheMap )
  {
    Object = 0;
    v23 = 6;
    v25 = 0;
    v26[1] = (__int64)v26;
    v26[0] = (__int64)v26;
    KeAcquireInStackQueuedSpinLock(&CcMasterLock, (KLOCK_QUEUE_HANDLE *)&v27.WorkItem.Parameter);
    SectionObjectPointer = FileObject->SectionObjectPointer;
    SharedCacheMap = (_SHARED_CACHE_MAP *)SectionObjectPointer->SharedCacheMap;
    if( SharedCacheMap )
    {
      Partition = CcGetPartition((_QWORD *)SectionObjectPointer->SharedCacheMap);
      v20.LockQueue.Lock = (unsigned __int64 *volatile)(Partition + 128);
      v20.LockQueue.Next = 0i64;
      KxAcquireQueuedSpinLock((PIO_WORKITEM)&v20, (PIO_WORKITEM_ROUTINE)(Partition + 128), v8, v9);
      v5 = 1;
      if( SharedCacheMap->PrivateList.Flink == &SharedCacheMap->PrivateList )
      {
        Flags = SharedCacheMap->Flags;
        if( (Flags & 0x100) == 0 )
        {
          v29 = 1;
          SharedCacheMap->Flags = Flags | 0x10000;
          UninitializeEvent = SharedCacheMap->UninitializeEvent;
          SharedCacheMap->UninitializeEvent = (_CACHE_UNINITIALIZE_EVENT *)((char *)&UninitializeEvent + 1);
          v13 = SharedCacheMap->Flags;
          if( (v13 & 0x20) != 0 )
          {
            if( SharedCacheMap->WriteBehindWorkQueueEntry )
            {
              v27.WorkItem.List.Blink = (_LIST_ENTRY *)(Partition + 192);
              v27.WorkItem.List.Flink = 0i64;
              KxAcquireQueuedSpinLock(&v27, (PIO_WORKITEM_ROUTINE)(Partition + 192), v10, v11);
              WriteBehindWorkQueueEntry = (unsigned __int64)SharedCacheMap->WriteBehindWorkQueueEntry;
              if( WriteBehindWorkQueueEntry )
              {
                v3 = WriteBehindWorkQueueEntry & 0xFFFFFFFFFFFFFFFEui64;
                v15 = *(_QWORD *)(WriteBehindWorkQueueEntry & 0xFFFFFFFFFFFFFFFEui64);
                v16 = *(_QWORD **)((WriteBehindWorkQueueEntry & 0xFFFFFFFFFFFFFFFEui64) + 8);
                if( *(_QWORD *)(v15 + 8) != v3 || *v16 != v3 )
                  __fastfail(3u);
                *v16 = v15;
                *(_QWORD *)(v15 + 8) = v16;
                *(_QWORD *)(v3 + 8) = 0i64;
                *(_QWORD *)v3 = 0i64;
                SharedCacheMap->WriteBehindWorkQueueEntry = 0i64;
                v2 = 1;
              }
              KeReleaseInStackQueuedSpinLockFromDpcLevel((_KLOCK_QUEUE_HANDLE *)&v27);
            }
          }
          else
          {
            SharedCacheMap->Flags = v13 | 0x20;
            v2 = 1;
          }
        }
      }
    }
    if( v5 )
      KeReleaseInStackQueuedSpinLockFromDpcLevel(&v20);
    KeReleaseInStackQueuedSpinLockFromDpcLevel((_KLOCK_QUEUE_HANDLE *)&v27.WorkItem.Parameter);
    __writecr8(LOBYTE(v27.IoObject));
    if( v2 )
    {
      CurrentThread = (_ETHREAD *)KeGetCurrentThread();
      --*((_WORD *)CurrentThread + 242);
      v27.WorkOnBehalfThread = (_ETHREAD *)v3;
      CcWriteBehind(SharedCacheMap, (_IO_STATUS_BLOCK *)&v27.Context);
      KeLeaveCriticalRegion();
    }
    if( v3 )
      CcFreeWorkQueueEntry(v3);
    if( v29 )
    {
      Timeout.QuadPart = -6000000000i64;
      if( KeWaitForSingleObject(&Object, Executive, 0, 0, &Timeout) == 258 )
      {
        KeAcquireInStackQueuedSpinLock((UINT64 *)(Partition + 128), &v20);
        v17 = FileObject->SectionObjectPointer->SharedCacheMap;
        if( v17 )
        {
          v18 = v17 + 34;
          v19 = v17[34];
          if( v19 )
          {
            while( (_CACHE_UNINITIALIZE_EVENT **)v19 != (_CACHE_UNINITIALIZE_EVENT **)((char *)&UninitializeEvent + 1) )
            {
              v18 = (_QWORD *)(v19 & 0xFFFFFFFFFFFFFFFEui64);
              v19 = *(_QWORD *)(v19 & 0xFFFFFFFFFFFFFFFEui64);
              if( !v19 )
                goto LABEL_30;
            }
            *v18 = UninitializeEvent;
          }
LABEL_30:
          *((_DWORD *)v17 + 38) &= ~0x10000u;
          KeReleaseInStackQueuedSpinLockFromDpcLevel(&v20);
          __writecr8(v20.OldIrql);
        }
        else
        {
          KeReleaseInStackQueuedSpinLockFromDpcLevel(&v20);
          __writecr8(v20.OldIrql);
          KeWaitForSingleObject(&Object, Executive, 0, 0, 0i64);
        }
      }
    }
  }
}

Referenced by:

MiCreateImageOrDataSection