IoPropagateIrpExtensionEx
NTSTATUS __stdcall IoPropagateIrpExtensionEx(_IRP *SourceIrp, _IRP *TargetIrp, INT64 TrackedOffset, UINT64 Flags){
char *IrpExtension;
char v5;
_BYTE *v9;
_BYTE *v10;
unsigned int v11;
_BYTE *v12;
char *v13;
_WORD *v14;
_IOP_IRP_EXTENSION *v16;
_IOP_IRP_EXTENSION *v17;
_IOP_IRP_EXTENSION *v18;
_LARGE_INTEGER v19;
__int64 v20;
void(__fastcall *v21)(__int64, _LARGE_INTEGER, INT64);
__int64 v22;
INT64 v23;
INT64 v24;
_IOP_IRP_EXTENSION *v25;
IrpExtension = (char *)SourceIrp->Tail.IrpExtension;
v5 = Flags;
if( !IrpExtension )
return 0;
if( (SourceIrp->AllocationFlags & 0x80u) != 0 )
{
if( (Flags & 1) != 0 )
*(_DWORD *)IopAllocateIrpExtension(TargetIrp, IopGenericType)->GenericExtension = (_DWORD)IrpExtension;
return 0;
}
if( (Flags & 2) != 0 && (SourceIrp->AllocationFlags & 0x80u) == 0 && (IrpExtension[2] & 1) != 0 )
{
v17 = IopAllocateIrpExtension(TargetIrp, IopActivityIdType);
if( !v17 )
return -1073741670;
v17->ActivityId = *(_GUID *)(IrpExtension + 24);
}
if( (v5 & 1) != 0 )
{
v9 = SourceIrp->Tail.IrpExtension;
if( (SourceIrp->AllocationFlags & 0x80u) != 0 || v9 && (v9[2] & 4) != 0 )
*(_DWORD *)IopAllocateIrpExtension(TargetIrp, IopGenericType)->GenericExtension = *((_DWORD *)IrpExtension + 1);
}
if( (v5 & 4) != 0 )
{
v10 = SourceIrp->Tail.IrpExtension;
if( (SourceIrp->AllocationFlags & 0x80u) == 0 && v10 && (v10[2] & 0x20) != 0 )
{
v18 = IopAllocateIrpExtension(TargetIrp, IopFsTrackOffsetType);
if( !v18 )
return -1073741670;
v18->FsTrackedOffset = TrackedOffset + *((_QWORD *)IrpExtension + 6);
v19 = *(_LARGE_INTEGER *)(IrpExtension + 40);
v18->Timestamp = v19;
v20 = *((_QWORD *)IrpExtension + 5);
v21 = *(void(__fastcall **)(__int64, _LARGE_INTEGER, INT64))(v20 + 8);
if( v21 )
((void(__fastcall *)(_QWORD, _QWORD, _QWORD))v21)(v20, (_LARGE_INTEGER)v19.QuadPart, TrackedOffset);
}
}
v11 = 1;
if( (v5 & 8) != 0 )
{
v12 = SourceIrp->Tail.IrpExtension;
if( (SourceIrp->AllocationFlags & 0x80u) == 0 && v12 && (v12[2] & 0x40) != 0 )
IopSetDiskIoAttributionExtension(TargetIrp, *((_QWORD *)IrpExtension + 2));
}
if( (v5 & 0x10) == 0 )
goto LABEL_23;
v13 = (char *)SourceIrp->Tail.IrpExtension;
if( (SourceIrp->AllocationFlags & 0x80u) != 0 || !v13 || v13[2] >= 0 )
goto LABEL_23;
v22 = *((_QWORD *)IrpExtension + 6);
if( !v22 || (v11 = *(_DWORD *)(v22 + 16) << 9) != 0 )
{
v23 = TrackedOffset % v11;
v24 = TrackedOffset / v11;
if( !v23 )
{
v25 = IopAllocateIrpExtension(TargetIrp, IopMaximumIrpExtensionType);
if( v25 )
{
v25->40 = *($78EAB139C288AA2C77DC0247288A3425 *)(IrpExtension + 40);
v25->Timestamp.QuadPart += v24;
LABEL_23:
if( (v5 & 0x20) == 0 )
return 0;
v14 = SourceIrp->Tail.IrpExtension;
if( (SourceIrp->AllocationFlags & 0x80u) != 0 || !v14 || (v14[1] & 0x100) == 0 )
return 0;
v16 = IopAllocateIrpExtension(TargetIrp, (_IRP_EXTENSION_TYPE)8);
if( v16 )
{
v16->DriverFlags.Value = *((_QWORD *)IrpExtension + 7);
return 0;
}
}
return -1073741670;
}
}
return -1073741811;
}Referenced by:
IoPropagateIrpExtension