IopSymlinkUpdateECP

NTSTATUS __stdcall IopSymlinkUpdateECP(
        PIRP Irp,
        VOID *SymlinkInfoToUpdate,
        UINT16 MountPointLength,
        _UNICODE_STRING *OpenedName,
        UINT16 DeviceNameLength,
        UINT16 Flags){
  _RELATIVE_SYMLINK_INFO *v6; 
  __int64 Length; 
  UINT16 v11; 
  _RELATIVE_SYMLINK_INFO *v12; 
  _RELATIVE_SYMLINK_INFO *i; 
  VOID **PoolWithTag; 
  _RELATIVE_SYMLINK_INFO *v15; 
  UINT16 v16; 
  int v18; 
  VOID *SymlinkInfo; 
  _RELATIVE_SYMLINK_INFO *v20; 
  _RELATIVE_SYMLINK_INFO *v21; 
  struct _ECP_LIST *ExtraCreateParameter; 

  v21 = (_RELATIVE_SYMLINK_INFO *)SymlinkInfoToUpdate;
  v6 = (_RELATIVE_SYMLINK_INFO *)SymlinkInfoToUpdate;
  SymlinkInfo = 0i64;
  ExtraCreateParameter = 0i64;
  IoGetIrpExtraCreateParameter(Irp, &ExtraCreateParameter);
  IopSymlinkGetECP(ExtraCreateParameter, &SymlinkInfo);
  Length = OpenedName->Length;
  v11 = Flags;
  if( v6->OpenedName.MaximumLength >= (unsigned __int16)Length )
  {
    RtlCopyUnicodeString(&v6->OpenedName, OpenedName);
  }
  else
  {
    v12 = (_RELATIVE_SYMLINK_INFO *)SymlinkInfo;
    v20 = 0i64;
    if( SymlinkInfo == v6 )
    {
      IopSymlinkRemoveECP(ExtraCreateParameter, &v21);
      v18 = IopSymlinkAllocateAndAddECP(Irp, &v20, OpenedName->Length);
      if( v18 < 0 )
      {
        FsRtlFreeExtraCreateParameter(v21);
        return v18;
      }
      v6 = v21;
      v15 = v20;
    }
    else
    {
      for( i = (_RELATIVE_SYMLINK_INFO *)*((_QWORD *)SymlinkInfo + 1); i != v6; i = i->InteriorMountPoint )
        v12 = i;
      PoolWithTag = ExAllocatePoolWithTag(1ui64, Length + 32, 1767075657i64);
      v15 = (_RELATIVE_SYMLINK_INFO *)PoolWithTag;
      if( !PoolWithTag )
        return -1073741670;
      v12->InteriorMountPoint = (_RELATIVE_SYMLINK_INFO *)PoolWithTag;
    }
    IopSymlinkInitializeSymlinkInfo(
      v15,
      (unsigned int)OpenedName->Length + 32,
      OpenedName->Buffer,
      OpenedName->Length,
      MountPointLength,
      0i64,
      0,
      0,
      v11,
      v6->InteriorMountPoint);
    if( v6 == v12 )
    {
      v6->InteriorMountPoint = 0i64;
      FsRtlFreeExtraCreateParameter(v6);
    }
    else
    {
      ExFreePoolWithTag(v6, 0x69536F49u);
    }
    v6 = v15;
  }
  v16 = DeviceNameLength;
  v6->Flags = v11;
  v6->DeviceNameLength = v16;
  v6->ExposedNamespaceLength = MountPointLength;
  if( (v6->Flags & 1) == 0 )
    IopSymlinkFreeRelatedMountPointChain(v6);
  return 0;
}

Referenced by:

IopGraftName
IopParseDevice
IopSymlinkApplyToOpenedName
IopSymlinkRememberJunction