Пример #1
0
        public static ShellLinkFile CreateAbsolute(string target)
        {
            var result = new ShellLinkFile();

            var targetInfo = SetFileSystemInfo(result, target);

            result.Header.ShowCommand = ShowCommand.Normal;

            result.RelativePath     = targetInfo.FullName;
            result.WorkingDirectory = targetInfo is FileInfo ? (targetInfo as FileInfo).DirectoryName : targetInfo.FullName;

            return(result);
        }
Пример #2
0
        public static ShellLinkFile Load(string filename)
        {
            var result = new ShellLinkFile();

            using (var stream = new FileStream(filename, FileMode.Open))
            {
                using (var binaryReader = new BinaryReader(stream))
                {
                    var reader = new ShellLinkFileHandler(result);
                    reader.ReadFrom(binaryReader);
                    return(result);
                }
            }
        }
Пример #3
0
        public static ShellLinkFile CreateRelative(string baseDirectory, string relativeTarget)
        {
            if (Path.IsPathRooted(relativeTarget))
            {
                throw new ArgumentException("Target must be relative to base directory !!!");
            }

            var result = new ShellLinkFile();

            SetFileSystemInfo(result, Path.Combine(baseDirectory, relativeTarget));
            result.Header.ShowCommand = ShowCommand.Normal;

            result.RelativePath     = relativeTarget;
            result.WorkingDirectory = ".";

            return(result);
        }
Пример #4
0
        public static FileSystemInfo SetFileSystemInfo(ShellLinkFile slf, string target)
        {
            var targetInfo = Directory.Exists(target) ? (FileSystemInfo) new DirectoryInfo(target) : new FileInfo(target);

            if (targetInfo.Exists)
            {
                slf.Header.FileAttributes = targetInfo.Attributes;
                slf.Header.AccessTime     = targetInfo.LastAccessTime;
                slf.Header.CreationTime   = targetInfo.CreationTime;
                slf.Header.WriteTime      = targetInfo.LastWriteTime;
                if (targetInfo is FileInfo)
                {
                    slf.Header.FileSize = Convert.ToInt32((targetInfo as FileInfo).Length);
                }
            }
            return(targetInfo);
        }
Пример #5
0
        public static FileSystemInfo SetFileSystemInfo(ShellLinkFile slf, string target)
        {
            FileSystemInfo targetInfo;
            if (Directory.Exists(target))
            {
                targetInfo = new DirectoryInfo(target);
            }
            else
            {
                targetInfo = new FileInfo(target);
            }

            if (targetInfo.Exists)
            {
                slf.Header.FileAttributes = targetInfo.Attributes;
                slf.Header.AccessTime = targetInfo.LastAccessTime;
                slf.Header.CreationTime = targetInfo.CreationTime;
                slf.Header.WriteTime = targetInfo.LastWriteTime;
                if (targetInfo is FileInfo)
                {
                    slf.Header.FileSize = Convert.ToInt32((targetInfo as FileInfo).Length);
                }
            }
            return targetInfo;
        }
Пример #6
0
        /// <summary>
        /// 
        /// </summary>
        /// <param name="filename"></param>
        /// <returns></returns>
        public static List<ShellLinkFile> LoadJumpList(string filename)
        {
            List<ShellLinkFile> results = new List<ShellLinkFile>();
            using (FileStream stream = new FileStream(filename, FileMode.Open, FileAccess.Read))
            using (BinaryReader binaryReader = new BinaryReader(stream))
            {
                bool process = true;
                do
                {
                    // Seek until we get to a valid looking LNK header
                    bool search = true;
                    do
                    {
                        if (binaryReader.BaseStream.Position + 4 > binaryReader.BaseStream.Length)
                        {
                            return results;
                        }

                        byte[] data = new byte[4];

                        binaryReader.Read(data, 0, 4);

                        int ret = BitConverter.ToInt32(data, 0);
                        if (ret != 76) // Default LNK header length
                        {
                            continue;
                        }

                        if (binaryReader.BaseStream.Position + 16 > binaryReader.BaseStream.Length)
                        {
                            return results;
                        }

                        // Check the LNK file GUID e.g. {00021401-0000-0000-00C0-000000000046} or {01h,14h,02h,00h,00h,00h,00h,00h,C0h,00h,00h,00h,00h,00h,46h}
                        data = new byte[16];
                        binaryReader.Read(data, 0, 16);

                        if (ArraysEqual(data, LNK_GUID) == true)
                        {
                            binaryReader.BaseStream.Seek(-20, SeekOrigin.Current);

                            ShellLinkFile result = new ShellLinkFile();
                            ShellLinkFileHandler reader = new ShellLinkFileHandler(result);
                            reader.ReadFrom(binaryReader);

                            if (result.Header.CreationTime != DateTime.MinValue &
                                result.Header.AccessTime != DateTime.MinValue &
                                result.Header.WriteTime != DateTime.MinValue &
                                result.Header.CreationTime != ShellLinkFile.WindowsEpoch &
                                result.Header.AccessTime != ShellLinkFile.WindowsEpoch &
                                result.Header.WriteTime != ShellLinkFile.WindowsEpoch)
                            {
                                results.Add(result);
                                break;
                            }
                        }

                        // If we get this far then we have read 20 bytes, so lets go back 19 bytes and start again
                        binaryReader.BaseStream.Seek(-19, SeekOrigin.Current);
                    }
                    while (search == true);
                }
                while (process == true);

                return results;
            }
        }
Пример #7
0
 public static ShellLinkFile Load(byte[] data)
 {
     ShellLinkFile result = new ShellLinkFile();
     using (BinaryReader binaryReader = new BinaryReader(new MemoryStream(data)))
     {
         ShellLinkFileHandler reader = new ShellLinkFileHandler(result);
         reader.ReadFrom(binaryReader);
         return result;
     }
 }
Пример #8
0
 public static ShellLinkFile Load(string filename)
 {
     ShellLinkFile result = new ShellLinkFile();
     using (FileStream stream = new FileStream(filename, FileMode.Open))
     {
         using (BinaryReader binaryReader = new BinaryReader(stream))
         {
             ShellLinkFileHandler reader = new ShellLinkFileHandler(result);
             reader.ReadFrom(binaryReader);
             return result;
         }
     }
 }
Пример #9
0
        public static ShellLinkFile CreateRelative(string baseDirectory, string relativeTarget)
        {
            if (Path.IsPathRooted(relativeTarget))
            {
                throw new ArgumentException("Target must be relative to base directory !!!");
            }

            ShellLinkFile result = new ShellLinkFile();

            SetFileSystemInfo(result, Path.Combine(baseDirectory, relativeTarget));
            result.Header.ShowCommand = ShowCommand.Normal;

            result.RelativePath = relativeTarget;
            result.WorkingDirectory = ".";

            return result;
        }
Пример #10
0
        public static ShellLinkFile CreateAbsolute(string target)
        {
            ShellLinkFile result = new ShellLinkFile();

            FileSystemInfo targetInfo = SetFileSystemInfo(result, target);
            result.Header.ShowCommand = ShowCommand.Normal;

            result.RelativePath = targetInfo.FullName;
            if (targetInfo is FileInfo)
            {
                result.WorkingDirectory = (targetInfo as FileInfo).DirectoryName;
            }
            else
            {
                result.WorkingDirectory = targetInfo.FullName;
            }

            return result;
        }