CcWaitForUninitializeCacheMap

VOID __stdcall CcWaitForUninitializeCacheMap(_FILE_OBJECT *FileObject){
  char v2; 
  unsigned __int64 v3; 
  UINT64 *Partition; 
  char v5; 
  _SECTION_OBJECT_POINTERS *SectionObjectPointer; 
  _DWORD *SharedCacheMap; 
  int v8; 
  int v9; 
  __int64 v10; 
  __int64 v11; 
  _QWORD *v12; 
  _QWORD *v13; 
  _QWORD *v14; 
  unsigned __int64 v15; 
  _KLOCK_QUEUE_HANDLE LockQueue; 
  __int64 v17; 
  __int16 Object; 
  char v19; 
  char v20; 
  int v21; 
  __int64 v22[2]; 
  _KLOCK_QUEUE_HANDLE v23; 
  _KLOCK_QUEUE_HANDLE LockHandle; 
  _IO_STATUS_BLOCK IoStatus; 
  char v27; 
  _LARGE_INTEGER v28; 
  _ETHREAD *CurrentThread; 

  v17 = 0i64;
  v20 = 0;
  v27 = 0;
  v2 = 0;
  v3 = 0i64;
  IoStatus = 0i64;
  memset(&LockHandle, 0, sizeof(LockHandle));
  memset(&LockQueue, 0, sizeof(LockQueue));
  memset(&v23, 0, sizeof(v23));
  Partition = 0i64;
  v5 = 0;
  if( FileObject->SectionObjectPointer->SharedCacheMap )
  {
    Object = 0;
    v19 = 6;
    v21 = 0;
    v22[1] = (__int64)v22;
    v22[0] = (__int64)v22;
    KeAcquireInStackQueuedSpinLock((PKSPIN_LOCK)&WheapErrorSourceTable + 189, &LockHandle);
    SectionObjectPointer = FileObject->SectionObjectPointer;
    SharedCacheMap = SectionObjectPointer->SharedCacheMap;
    if( SharedCacheMap )
    {
      Partition = (UINT64 *)CcGetPartition((_QWORD *)SectionObjectPointer->SharedCacheMap);
      LockQueue.LockQueue.Lock = Partition + 16;
      LockQueue.LockQueue.Next = 0i64;
      KxAcquireQueuedSpinLock(&LockQueue.LockQueue, Partition + 16);
      v5 = 1;
      if( *((_DWORD **)SharedCacheMap + 28) == SharedCacheMap + 56 )
      {
        v8 = SharedCacheMap[38];
        if( (v8 & 0x100) == 0 )
        {
          v27 = 1;
          SharedCacheMap[38] = v8 | 0x10000;
          v17 = *((_QWORD *)SharedCacheMap + 34);
          *((_QWORD *)SharedCacheMap + 34) = (char *)&v17 + 1;
          v9 = SharedCacheMap[38];
          if( (v9 & 0x20) != 0 )
          {
            if( *((_QWORD *)SharedCacheMap + 62) )
            {
              v23.LockQueue.Lock = Partition + 24;
              v23.LockQueue.Next = 0i64;
              KxAcquireQueuedSpinLock(&v23.LockQueue, Partition + 24);
              v10 = *((_QWORD *)SharedCacheMap + 62);
              if( v10 )
              {
                v3 = v10 & 0xFFFFFFFFFFFFFFFEui64;
                v11 = *(_QWORD *)(v10 & 0xFFFFFFFFFFFFFFFEui64);
                v12 = *(_QWORD **)((v10 & 0xFFFFFFFFFFFFFFFEui64) + 8);
                if( *(_QWORD *)(v11 + 8) != v3 || *v12 != v3 )
                  __fastfail(3u);
                *v12 = v11;
                *(_QWORD *)(v11 + 8) = v12;
                *(_QWORD *)(v3 + 8) = 0i64;
                *(_QWORD *)v3 = 0i64;
                *((_QWORD *)SharedCacheMap + 62) = 0i64;
                v2 = 1;
              }
              KeReleaseInStackQueuedSpinLockFromDpcLevel(&v23);
            }
          }
          else
          {
            SharedCacheMap[38] = v9 | 0x20;
            v2 = 1;
          }
        }
      }
    }
    if( v5 )
      KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockQueue);
    KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
    __writecr8(LockHandle.OldIrql);
    if( v2 )
    {
      CurrentThread = (_ETHREAD *)KeGetCurrentThread();
      --CurrentThread->Tcb.KernelApcDisable;
      IoStatus.Information = v3;
      CcWriteBehind((_SHARED_CACHE_MAP *)SharedCacheMap, &IoStatus);
      KeLeaveCriticalRegion();
    }
    if( v3 )
      CcFreeWorkQueueEntry((_WORK_QUEUE_ENTRY *)v3);
    if( v27 )
    {
      v28.QuadPart = -6000000000i64;
      if( KeWaitForSingleObject((UINT64)&Object, 0, 0, 0, (INT64)&v28) == 258 )
      {
        KeAcquireInStackQueuedSpinLock(Partition + 16, &LockQueue);
        v13 = FileObject->SectionObjectPointer->SharedCacheMap;
        if( v13 )
        {
          v14 = v13 + 34;
          v15 = v13[34];
          if( v15 )
          {
            while( (__int64 *)v15 != (__int64 *)((char *)&v17 + 1) )
            {
              v14 = (_QWORD *)(v15 & 0xFFFFFFFFFFFFFFFEui64);
              v15 = *(_QWORD *)(v15 & 0xFFFFFFFFFFFFFFFEui64);
              if( !v15 )
                goto LABEL_30;
            }
            *v14 = v17;
          }
LABEL_30:
          *((_DWORD *)v13 + 38) &= ~0x10000u;
          KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockQueue);
          __writecr8(LockQueue.OldIrql);
        }
        else
        {
          KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockQueue);
          __writecr8(LockQueue.OldIrql);
          KeWaitForSingleObject((UINT64)&Object, 0, 0, 0, 0i64);
        }
      }
    }
  }
}

Referenced by:

MiCreateImageOrDataSection