IopDeleteFileObjectExtension
VOID __fastcall IopDeleteFileObjectExtension(_UNICODE_STRING *DestinationString, const WCHAR *pszSrc){
_DWORD *v2;
__int64 i;
_QWORD *v5;
_QWORD *v6;
void *v7;
_QWORD *v8;
struct _DMA_ADAPTER *v9;
int v10;
_QWORD *v11;
UINT64 v12;
void *v13;
void *v14;
_QWORD *v15;
void *v16;
_BYTE *v17;
_QWORD *v18;
UINT8 v19;
UINT8 v20;
_QWORD *v21;
_QWORD *v22;
char v23;
v2 = *(_DWORD **)&DestinationString[13].Length;
if( v2 == (_DWORD *)IopRevocationExtension )
return;
for( i = 0i64; i < 9; ++i )
{
v5 = *(_QWORD **)&v2[2 * i + 2];
if( !v5 )
continue;
if( i == 4 )
{
v15 = (_QWORD *)*v5;
while( v15 != v5 )
{
v16 = v15;
v15 = (_QWORD *)*v15;
ExFreePoolWithTag(v16, 0);
}
goto LABEL_22;
}
if( !i )
{
v14 = (void *)v5[1];
if( v14 )
ObDereferenceObjectDeferDelete(v14);
goto LABEL_22;
}
if( i != 5 )
{
switch( i )
{
case 1i64:
v6 = (_QWORD *)v5[2];
while( v6 )
{
v7 = v6;
v6 = (_QWORD *)*v6;
ExFreePoolWithTag(v7, 0);
}
v8 = (_QWORD *)v5[3];
while( v8 )
{
v17 = (_BYTE *)v8[3];
v18 = v8;
v8 = (_QWORD *)*v8;
KeAcquireSpinLockRaiseToDpc(&qword_140C45BF0, (UINT64)pszSrc);
v20 = v19;
v23 = v17[18];
if( v17[16] == 1 )
v17[17] = 1;
else
ExFreePoolWithTag(v17, 0);
KeReleaseSpinLock(&qword_140C45BF0, v20);
if( *((_DWORD *)v18 + 4) )
{
PspAdjustKeepAliveCountProcess((void *)v18[1], -1, (__int64)DestinationString, v23);
HalPutDmaAdapter((PADAPTER_OBJECT)v18[1]);
}
ExFreePoolWithTag(v18, 0);
}
v9 = (struct _DMA_ADAPTER *)v5[1];
if( v9 )
HalPutDmaAdapter(v9);
break;
case 6i64:
ExFreeToNPagedLookasideList((NPAGED_LOOKASIDE_LIST *)IopOplockFoExtLookasideList, v5);
continue;
case 2i64:
v21 = (_QWORD *)v5[5];
if( v21 )
{
do
{
v22 = (_QWORD *)v21[5];
ExFreePoolWithTag(v21, 0);
v21 = v22;
}
while( v22 );
}
break;
case 7i64:
v10 = *((_DWORD *)v5 + 1);
if( (v10 & 1) != 0 )
{
v13 = (void *)v5[1];
*((_DWORD *)v5 + 1) = v10 & 0xFFFFFFFE;
PsReleaseSiloHardReference(v13);
}
v11 = (_QWORD *)v5[1];
v12 = 1884516169i64;
LABEL_29:
ObfDereferenceObjectWithTag(v11, v12);
break;
case 8i64:
v11 = (_QWORD *)*v5;
v12 = 1866886985i64;
goto LABEL_29;
}
LABEL_22:
ExFreePoolWithTag(*(PVOID *)&v2[2 * i + 2], 0);
continue;
}
FsRtlFreeExtraCreateParameter(v5);
}
if( (*v2 & 2) != 0 )
IopCleanupNotifications(*((DRIVER_OBJECT **)DestinationString->Buffer + 1), DestinationString);
ExFreePoolWithTag(v2, 0);
}Referenced by:
IopDeleteFile
IopParseDevice