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; 
  NTSTATUS v16; 
  UINT64 NewLength; 
  UINT64 MaxLength; 
  Buffer = FileObject->FileName.Buffer;
  PoolWithTag = ExAllocatePoolWithTag(PagedPool, SymlinkInfo->OpenedName.Length, 0x63466F49ui64);
  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((UINT8 *)OutBuffer, (UINT8 *)SymlinkInfo->OpenedName.Buffer, SymlinkInfo->DeviceNameLength);
  memmove(
    (UINT8 *)PoolWithTag,
    (UINT8 *)SymlinkInfo->OpenedName.Buffer + SymlinkInfo->DeviceNameLength,
    SymlinkInfo->OpenedName.Length - (unsigned __int64)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(NewLength) = SymlinkInfo->DeviceNameLength >> 1;
  v16 = IopReplaceSymlinkPath(
          OutBuffer,
          (unsigned int)NewLength,
          FileObject,
          ReparseBuffer,
          NewLength,
          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