CcDeleteSharedCacheMap
VOID __fastcall CcDeleteSharedCacheMap(
CHAR *P,
KLOCK_QUEUE_HANDLE *LockHandle,
KLOCK_QUEUE_HANDLE *a3,
INT64 a4,
FILE_OBJECT *FileObject){
int v5;
INT64 Partition;
__int64 v10;
CHAR **v11;
__int64 v12;
CHAR **v13;
SINGLE_LIST_ENTRY *v14;
SINGLE_LIST_ENTRY *v15;
struct _DMA_ADAPTER *v16;
UINT64 v17;
struct _DMA_ADAPTER *v18;
__int64 v19;
CHAR *v20;
CHAR *v21;
CHAR *v22;
unsigned __int64 v23;
__int64 v24;
v5 = a4;
Partition = CcGetPartition(P);
if( _InterlockedIncrement64((volatile signed __int64 *)(Partition + 968)) <= 1 )
__fastfail(0xEu);
v10 = *((_QWORD *)P + 17);
v11 = (CHAR **)*((_QWORD *)P + 18);
if( *(CHAR **)(v10 + 8) != P + 136 || *v11 != P + 136 )
goto LABEL_38;
*v11 = (CHAR *)v10;
*(_QWORD *)(v10 + 8) = v11;
if( (*((_DWORD *)P + 38) & 0x3000000) == 0 )
goto LABEL_8;
v12 = *((_QWORD *)P + 15);
v13 = (CHAR **)*((_QWORD *)P + 16);
if( *(CHAR **)(v12 + 8) != P + 120 || *v13 != P + 120 )
LABEL_38:
__fastfail(3u);
*v13 = (CHAR *)v12;
*(_QWORD *)(v12 + 8) = v13;
LABEL_8:
*(_QWORD *)(*(_QWORD *)((*((_QWORD *)P + 12) & 0xFFFFFFFFFFFFFFF0ui64) + 0x28) + 8i64) = 0i64;
*((_DWORD *)P + 38) |= 0x80020u;
if( LockHandle )
{
++CcSectionDeletionSequencePhase1;
}
else if( !*(_BYTE *)(Partition + 966) )
{
KeBugCheckEx(0x34u, 0xE53ui64, 0xFFFFFFFFC0000420ui64, 0i64, 0i64);
}
KeReleaseInStackQueuedSpinLockFromDpcLevel(a3);
__writecr8(a3->OldIrql);
if( LockHandle )
{
KeReleaseInStackQueuedSpinLockFromDpcLevel(LockHandle);
__writecr8(LockHandle->OldIrql);
}
if( *((CHAR **)P + 2) != P + 16 )
CcDeleteBcbs((INT64)P);
CcUnmapAndPurge((INT64)P, *((_QWORD *)P + 1) >= 0x100000i64);
if( v5 )
{
FsRtlReleaseFile(FileObject);
CcDereferenceSharedCacheMapFileObject((INT64)P, (UINT64)FileObject);
}
v16 = (struct _DMA_ADAPTER *)*((_QWORD *)P + 21);
if( v16 )
{
HalPutDmaAdapter(v16);
*((_QWORD *)P + 21) = 0i64;
}
if( *((_QWORD *)P + 20) )
CcDeleteMbcb((SINGLE_LIST_ENTRY *)P, v14, v15);
CcUninitializeVolumeCacheMap(*((PVOID *)P + 63));
v18 = (struct _DMA_ADAPTER *)ObFastReplaceObject((_EX_FAST_REF *)P + 12, 0i64, v17);
HalPutDmaAdapter(v18);
v19 = *((_QWORD *)P + 34);
if( v19 )
{
do
{
v23 = v19 & 0xFFFFFFFFFFFFFFFEui64;
v24 = *(_QWORD *)v23;
KeSetEvent((PRKEVENT)(v23 + 8), 0);
v19 = v24;
}
while( v24 );
}
if( LockHandle )
{
KeAcquireInStackQueuedSpinLock(&CcMasterLock, LockHandle);
++CcSectionDeletionSequencePhase2;
KeReleaseInStackQueuedSpinLockFromDpcLevel(LockHandle);
__writecr8(LockHandle->OldIrql);
}
v20 = (CHAR *)*((_QWORD *)P + 11);
if( v20 != P + 56 && v20 )
ExFreePoolWithTag(v20, 0);
v21 = (CHAR *)*((_QWORD *)P + 22);
if( v21 && v21 != P + 344 )
ExFreePoolWithTag(v21, 0);
v22 = (CHAR *)*((_QWORD *)P + 23);
if( v22 && v22 != P + 344 )
ExFreePoolWithTag(v22, 0);
CcDereferencePartition(Partition);
ExFreePoolWithTag(P, 0);
}Referenced by:
CcDeleteSectionsForPartition
CcInitializeCacheMapEx
CcUninitializeCacheMap
CcWriteBehindInternal