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