IopFreeIrpExtension
VOID __stdcall IopFreeIrpExtension(_IRP *Irp, _IRP_EXTENSION_TYPE Type, UINT8 FreeMemory){
signed __int8 AllocationFlags;
_QWORD *IrpExtension;
UINT8 v5;
int v7;
AllocationFlags = Irp->AllocationFlags;
IrpExtension = Irp->Tail.IrpExtension;
v5 = FreeMemory;
if( AllocationFlags < 0 )
{
Irp->Tail.IrpExtension = 0i64;
Irp->AllocationFlags = AllocationFlags & 0x7F;
}
else if( IrpExtension )
{
if( Type == IopAllExtensions )
{
if( IopIrpHasExtensionType(Irp, 5ui64) )
IrpExtension[5] = 0i64;
*((_WORD *)IrpExtension + 1) = 0;
LOWORD(v7) = 0;
}
else
{
v7 = *((unsigned __int16 *)IrpExtension + 1) & ~(1 << Type);
*((_WORD *)IrpExtension + 1) = v7;
if( Type == IopFsTrackOffsetType )
IrpExtension[5] = 0i64;
}
if( !(_WORD)v7 && (Irp->AllocationFlags & 0x40) != 0 )
{
if( v5 )
{
ExFreePoolWithTag(IrpExtension, 0x58707249u);
Irp->AllocationFlags &= ~0x40u;
Irp->Tail.IrpExtension = 0i64;
}
}
}
}Referenced by:
IoCleanupIrp
IoClearAdapterCryptoEngineExtension
IoClearFsTrackOffsetState
IoSetActivityIdIrp
IopCompleteRequest
IopFreeIrp
IopPerfCompleteRequest
IopfCompleteRequest