IopSymlinkApplyToOpenedName

NTSTATUS __stdcall IopSymlinkApplyToOpenedName(
        _FILE_OBJECT *FileObject,
        _RELATIVE_SYMLINK_INFO *SymlinkInfo,
        _REPARSE_DATA_BUFFER *ReparseBuffer,
        _IRP *Irp,
        PWCHAR OutBuffer,
        UINT64 OutBufferLength){
  wchar_t *Buffer; 
  VOID **PoolWithTag; 
  _UNICODE_STRING *p_FileName; 
  unsigned int Length; 
  unsigned __int16 v15; 
  int v16; 
  UINT64 PathStart; 
  UINT64 MaxLength; 

  Buffer = FileObject->FileName.Buffer;
  PoolWithTag = ExAllocatePoolWithTag(1ui64, SymlinkInfo->OpenedName.Length, 1665560393i64);
  if( !PoolWithTag )
    return -1073741670;
  p_FileName = &FileObject->FileName;
  Length = FileObject->FileName.Length;
  if( Length > 2 && FileObject->FileName.Buffer[((unsigned __int64)FileObject->FileName.Length >> 1) - 1] == 92 )
  {
    if( ReparseBuffer->Reserved < 2u )
    {
      ExFreePoolWithTag(PoolWithTag, 0);
      return -1073741811;
    }
    p_FileName->Length = Length - 2;
    ReparseBuffer->Reserved -= 2;
  }
  memmove(OutBuffer, SymlinkInfo->OpenedName.Buffer, SymlinkInfo->DeviceNameLength);
  memmove(
    PoolWithTag,
    (char *)SymlinkInfo->OpenedName.Buffer + SymlinkInfo->DeviceNameLength,
    SymlinkInfo->OpenedName.Length - SymlinkInfo->DeviceNameLength);
  FileObject->FileName.Buffer = (wchar_t *)PoolWithTag;
  v15 = SymlinkInfo->OpenedName.Length - SymlinkInfo->DeviceNameLength;
  FileObject->FileName.MaximumLength = v15;
  p_FileName->Length = v15;
  ExFreePoolWithTag(Buffer, 0);
  LODWORD(MaxLength) = OutBufferLength;
  LODWORD(PathStart) = SymlinkInfo->DeviceNameLength >> 1;
  v16 = IopReplaceSymlinkPath(
          OutBuffer,
          (unsigned int)PathStart,
          FileObject,
          ReparseBuffer,
          PathStart,
          SymlinkInfo->DeviceNameLength,
          MaxLength);
  if( v16 >= 0 )
    return IopSymlinkUpdateECP(
             Irp,
             SymlinkInfo,
             0,
             p_FileName,
             SymlinkInfo->DeviceNameLength,
             SymlinkInfo->Flags & 0xFFFE);
  ExFreePoolWithTag(OutBuffer, 0);
  return v16;
}

Referenced by:

IopGraftName