IopSymlinkUpdateECP

INT64 __fastcall IopSymlinkUpdateECP(IRP *a1, VOID *a2, INT16 a3, const UNICODE_STRING *a4, INT16 a5, INT16 a6){
  _RELATIVE_SYMLINK_INFO *v6; 
  UNICODE_STRING *v10; 
  __int64 Length; 
  INT16 v12; 
  _RELATIVE_SYMLINK_INFO *v13; 
  _RELATIVE_SYMLINK_INFO *i; 
  _RELATIVE_SYMLINK_INFO *PoolWithTag; 
  _RELATIVE_SYMLINK_INFO *v16; 
  INT16 v17; 
  int v19; 
  _RELATIVE_SYMLINK_INFO *SymlinkInfo; 
  PVOID v21; 
  PVOID EcpContext; 
  struct _ECP_LIST *ExtraCreateParameter; 
  EcpContext = a2;
  v6 = (_RELATIVE_SYMLINK_INFO *)a2;
  SymlinkInfo = 0i64;
  ExtraCreateParameter = 0i64;
  IoGetIrpExtraCreateParameter(a1, &ExtraCreateParameter);
  IopSymlinkGetECP(ExtraCreateParameter, &SymlinkInfo);
  Length = a4->Length;
  v12 = a6;
  if( v6->OpenedName.MaximumLength >= (unsigned __int16)Length )
  {
    RtlCopyUnicodeString(&v6->OpenedName, (UNICODE_STRING *)a4, v10);
  }
  else
  {
    v13 = SymlinkInfo;
    v21 = 0i64;
    if( SymlinkInfo == v6 )
    {
      IopSymlinkRemoveECP(ExtraCreateParameter, (_RELATIVE_SYMLINK_INFO **)&EcpContext);
      v19 = IopSymlinkAllocateAndAddECP(a1, &v21, a4->Length);
      if( v19 < 0 )
      {
        FsRtlFreeExtraCreateParameter(EcpContext);
        return(unsigned int)v19;
      }
      v6 = (_RELATIVE_SYMLINK_INFO *)EcpContext;
      v16 = (_RELATIVE_SYMLINK_INFO *)v21;
    }
    else
    {
      for( i = SymlinkInfo->InteriorMountPoint; i != v6; i = i->InteriorMountPoint )
        v13 = i;
      PoolWithTag = (_RELATIVE_SYMLINK_INFO *)ExAllocatePoolWithTag(PagedPool, Length + 32, 0x69536F49ui64);
      v16 = PoolWithTag;
      if( !PoolWithTag )
        return 3221225626i64;
      v13->InteriorMountPoint = PoolWithTag;
    }
    IopSymlinkInitializeSymlinkInfo(
      (INT64)v16,
      a4->Length + 32,
      a4->Buffer,
      a4->Length,
      a3,
      0i64,
      0,
      0,
      v12,
      (INT64)v6->InteriorMountPoint);
    if( v6 == v13 )
    {
      v6->InteriorMountPoint = 0i64;
      FsRtlFreeExtraCreateParameter(v6);
    }
    else
    {
      ExFreePoolWithTag(v6, 0x69536F49u);
    }
    v6 = v16;
  }
  v17 = a5;
  v6->Flags = v12;
  v6->DeviceNameLength = v17;
  v6->ExposedNamespaceLength = a3;
  if( (v6->Flags & 1) == 0 )
    IopSymlinkFreeRelatedMountPointChain((INT64)v6);
  return 0i64;
}

Referenced by:

IopGraftName
IopParseDevice
IopSymlinkApplyToOpenedName
IopSymlinkRememberJunction