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