IopSymlinkInitializeSymlinkInfo

VOID __stdcall IopSymlinkInitializeSymlinkInfo(
        _RELATIVE_SYMLINK_INFO *ToInitialize,
        UINT64 ToInitializeLength,
        WCHAR *FileName,
        UINT16 FileNameLength,
        UINT16 ExposedNamespaceLength,
        WCHAR *RelatedFileName,
        UINT16 RelatedFileNameLength,
        UINT16 DeviceNameLength,
        UINT16 Flags,
        _RELATIVE_SYMLINK_INFO *InteriorMountPoint){
  size_t v11; 
  UINT16 Length; 
  _RELATIVE_SYMLINK_INFO *Buffer; 
  unsigned __int64 v15; 

  v11 = FileNameLength;
  Length = 0;
  ToInitialize->DeviceNameLength = DeviceNameLength;
  Buffer = ToInitialize + 1;
  ToInitialize->ExposedNamespaceLength = ExposedNamespaceLength;
  ToInitialize->OpenedName.MaximumLength = ToInitializeLength - 32;
  ToInitialize->Flags = Flags;
  ToInitialize->InteriorMountPoint = InteriorMountPoint;
  ToInitialize->Reserved = 0;
  ToInitialize->OpenedName.Length = 0;
  ToInitialize->OpenedName.Buffer = &ToInitialize[1].ExposedNamespaceLength;
  if( RelatedFileName )
  {
    memmove(&ToInitialize[1], RelatedFileName, RelatedFileNameLength);
    Buffer = (_RELATIVE_SYMLINK_INFO *)ToInitialize->OpenedName.Buffer;
    v15 = (unsigned __int64)RelatedFileNameLength >> 1;
    Length = RelatedFileNameLength;
    ToInitialize->OpenedName.Length = RelatedFileNameLength;
    if( *((_WORD *)Buffer + v15 - 1) != 92 )
    {
      *(&Buffer->ExposedNamespaceLength + v15) = 92;
      ToInitialize->OpenedName.Length += 2;
      Length = ToInitialize->OpenedName.Length;
      Buffer = (_RELATIVE_SYMLINK_INFO *)ToInitialize->OpenedName.Buffer;
    }
  }
  memmove((char *)Buffer + Length, FileName, v11);
  ToInitialize->OpenedName.Length += v11;
}

Referenced by:

IopGraftName
IopSymlinkCreateECP
IopSymlinkPropagateToExtensionIfNeeded
IopSymlinkRememberJunction
IopSymlinkUpdateECP