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