IopFreeIrpExtension
void __fastcall IopFreeIrpExtension(__int64 a1, int a2, char a3){
char v3;
__int64 v4;
char v5;
int v7;
v3 = *(_BYTE *)(a1 + 71);
v4 = *(_QWORD *)(a1 + 200);
v5 = a3;
if( v3 < 0 )
{
*(_QWORD *)(a1 + 200) = 0i64;
*(_BYTE *)(a1 + 71) = v3 & 0x7F;
}
else if( v4 )
{
if( a2 == -1 )
{
if( IopIrpHasExtensionType((IRP *)a1, 5ui64) )
*(_QWORD *)(v4 + 40) = 0i64;
*(_WORD *)(v4 + 2) = 0;
LOWORD(v7) = 0;
}
else
{
v7 = *(unsigned __int16 *)(v4 + 2) & ~(1 << a2);
*(_WORD *)(v4 + 2) = v7;
if( a2 == 5 )
*(_QWORD *)(v4 + 40) = 0i64;
}
if( !(_WORD)v7 && (*(_BYTE *)(a1 + 71) & 0x40) != 0 )
{
if( v5 )
{
ExFreePoolWithTag((PVOID)v4, 0x58707249u);
*(_BYTE *)(a1 + 71) &= ~0x40u;
*(_QWORD *)(a1 + 200) = 0i64;
}
}
}
}Referenced by:
IoCleanupIrp
IoClearAdapterCryptoEngineExtension
IoClearFsTrackOffsetState
IoSetActivityIdIrp
IopCompleteRequest
IopFreeIrp
IopPerfCompleteRequest
IopfCompleteRequest