IoPropagateIrpExtensionEx
NTSTATUS __stdcall IoPropagateIrpExtensionEx(IRP *SourceIrp, IRP *TargetIrp, INT64 TrackedOffset, UINT64 Flags){
__int64 v4;
char v5;
__int64 v9;
__int64 v10;
unsigned int v11;
__int64 v12;
__int64 v13;
__int64 v14;
CHAR *v16;
CHAR *IrpExtension;
CHAR *v18;
__int64 v19;
__int64 v20;
void(__fastcall *v21)(__int64, __int64, INT64);
__int64 v22;
INT64 v23;
INT64 v24;
CHAR *v25;
v4 = *((_QWORD *)SourceIrp + 25);
v5 = Flags;
if( !v4 )
return 0;
if( *((char *)SourceIrp + 71) < 0 )
{
if( (Flags & 1) != 0 )
*((_DWORD *)IopAllocateIrpExtension((INT64)TargetIrp, 2i64) + 1) = v4;
return 0;
}
if( (Flags & 2) != 0 && *((char *)SourceIrp + 71) >= 0 && (*(_BYTE *)(v4 + 2) & 1) != 0 )
{
IrpExtension = IopAllocateIrpExtension((INT64)TargetIrp, 0i64);
if( !IrpExtension )
return -1073741670;
*(_OWORD *)(IrpExtension + 24) = *(_OWORD *)(v4 + 24);
}
if( (v5 & 1) != 0 )
{
v9 = *((_QWORD *)SourceIrp + 25);
if( *((char *)SourceIrp + 71) < 0 || v9 && (*(_BYTE *)(v9 + 2) & 4) != 0 )
*((_DWORD *)IopAllocateIrpExtension((INT64)TargetIrp, 2i64) + 1) = *(_DWORD *)(v4 + 4);
}
if( (v5 & 4) != 0 )
{
v10 = *((_QWORD *)SourceIrp + 25);
if( *((char *)SourceIrp + 71) >= 0 && v10 && (*(_BYTE *)(v10 + 2) & 0x20) != 0 )
{
v18 = IopAllocateIrpExtension((INT64)TargetIrp, 5i64);
if( !v18 )
return -1073741670;
*((_QWORD *)v18 + 6) = TrackedOffset + *(_QWORD *)(v4 + 48);
v19 = *(_QWORD *)(v4 + 40);
*((_QWORD *)v18 + 5) = v19;
v20 = *(_QWORD *)(v4 + 40);
v21 = *(void(__fastcall **)(__int64, __int64, INT64))(v20 + 8);
if( v21 )
v21(v20, v19, TrackedOffset);
}
}
v11 = 1;
if( (v5 & 8) != 0 )
{
v12 = *((_QWORD *)SourceIrp + 25);
if( *((char *)SourceIrp + 71) >= 0 && v12 && (*(_BYTE *)(v12 + 2) & 0x40) != 0 )
IopSetDiskIoAttributionExtension(TargetIrp, *(_QWORD *)(v4 + 16));
}
if( (v5 & 0x10) == 0 )
goto LABEL_23;
v13 = *((_QWORD *)SourceIrp + 25);
if( *((char *)SourceIrp + 71) < 0 || !v13 || *(char *)(v13 + 2) >= 0 )
goto LABEL_23;
v22 = *(_QWORD *)(v4 + 48);
if( !v22 || (v11 = *(_DWORD *)(v22 + 16) << 9) != 0 )
{
v23 = TrackedOffset % v11;
v24 = TrackedOffset / v11;
if( !v23 )
{
v25 = IopAllocateIrpExtension((INT64)TargetIrp, 7i64);
if( v25 )
{
*(_OWORD *)(v25 + 40) = *(_OWORD *)(v4 + 40);
*((_QWORD *)v25 + 5) += v24;
LABEL_23:
if( (v5 & 0x20) == 0 )
return 0;
v14 = *((_QWORD *)SourceIrp + 25);
if( *((char *)SourceIrp + 71) < 0 || !v14 || (*(_WORD *)(v14 + 2) & 0x100) == 0 )
return 0;
v16 = IopAllocateIrpExtension((INT64)TargetIrp, 8i64);
if( v16 )
{
*((_QWORD *)v16 + 7) = *(_QWORD *)(v4 + 56);
return 0;
}
}
return -1073741670;
}
}
return -1073741811;
}Referenced by:
IoPropagateIrpExtension