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