Esempio n. 1
0
 public static void Check(this ShellLinkHeader obj, List <Exception> errors)
 {
     foreach (var check in allChecks)
     {
         if (check.Check(obj))
         {
             errors.Add(check.Exception);
         }
     }
 }
Esempio n. 2
0
        public static bool Load([NotNull] this ShellLinkHeader obj, BinaryReader reader)
        {
            obj.HeaderSize     = reader.ReadInt32();
            obj.LinkCLSID      = reader.ReadGuid();
            obj.LinkFlags      = (LinkFlags)reader.ReadInt32();
            obj.FileAttributes = (FileAttributes)reader.ReadInt32();
            obj.CreationTime   = reader.ReadDateTime();
            obj.AccessTime     = reader.ReadDateTime();
            obj.WriteTime      = reader.ReadDateTime();
            obj.FileSize       = reader.ReadUInt32();
            obj.IconIndex      = reader.ReadInt32();
            obj.ShowCommand    = (ShowCommand)reader.ReadInt32();
            obj.HotKey         = (HotKeyFlags)reader.ReadInt16();

            obj.Reserved1 = reader.ReadInt16();
            obj.Reserved2 = reader.ReadInt32();
            obj.Reserved3 = reader.ReadInt32();

            return(true);
        }
Esempio n. 3
0
        public static bool Repair(this ShellLinkHeader obj)
        {
            bool complete = true;

            foreach (var check in allChecks)
            {
                if (check.Check(obj))
                {
                    if (check.Fixes?.Length == 1)
                    {
                        check.Fixes[0].Invoke(obj);
                    }
                    else
                    {
                        complete = false;
                    }
                }
            }

            return(complete);
        }
Esempio n. 4
0
 public ShellLinkFile()
 {
     Header          = new ShellLinkHeader();
     ExtraDataBlocks = new List <ExtraDataBlock>();
     ShItemIDs       = new List <ShItemID>();
 }
Esempio n. 5
0
        /// <summary>
        /// Create a ShellLing from a given byte array
        /// </summary>
        /// <param name="ba">The byte array</param>
        /// <returns>A Shortcut object</returns>
        public static new Shortcut FromByteArray(byte[] ba)
        {
            Shortcut lnk = new Shortcut();

            #region SHELL_LINK_HEADER
            ShellLinkHeader Header     = ShellLinkHeader.FromByteArray(ba);
            UInt32          HeaderSize = BitConverter.ToUInt32(ba, 0);
            Boolean         IsUnicode  = (Header.LinkFlags & LinkFlags.IsUnicode) != 0;
            lnk.LinkFlags      = Header.LinkFlags;
            lnk.FileAttributes = Header.FileAttributes;
            lnk.CreationTime   = Header.CreationTime;
            lnk.AccessTime     = Header.AccessTime;
            lnk.WriteTime      = Header.WriteTime;
            lnk.FileSize       = Header.FileSize;
            lnk.IconIndex      = Header.IconIndex;
            lnk.ShowCommand    = Header.ShowCommand;
            lnk.HotKey         = Header.HotKey;
            ba = ba.Skip((int)HeaderSize).ToArray();
            #endregion // SHELL_LINK_HEADER

            #region LINKTARGET_IDLIST
            if ((Header.LinkFlags & LinkFlags.HasLinkTargetIDList) != 0)
            {
                lnk.LinkTargetIDList = LinkTargetIDList.FromByteArray(ba);
                UInt16 IDListSize = BitConverter.ToUInt16(ba, 0);
                ba = ba.Skip(IDListSize + 2).ToArray();
            }
            #endregion // LINKTARGET_IDLIST

            #region LINKINFO
            if ((Header.LinkFlags & LinkFlags.HasLinkInfo) != 0)
            {
                lnk.LinkInfo = LinkInfo.FromByteArray(ba);
                UInt32 LinkInfoSize = BitConverter.ToUInt32(ba, 0);
                ba = ba.Skip((int)LinkInfoSize).ToArray();
            }
            #endregion // LINKINFO

            #region STRING_DATA
            if ((Header.LinkFlags & LinkFlags.HasName) != 0)
            {
                if (lnk.StringData == null)
                {
                    lnk.StringData = new StringData(IsUnicode);
                }

                UInt16 CountCharacters = BitConverter.ToUInt16(ba, 0);
                if (IsUnicode)
                {
                    lnk.StringData.NameString = Encoding.Unicode.GetString(ba.Skip(2).Take(CountCharacters * 2).ToArray()).TrimEnd(new char[] { (char)0 });
                    ba = ba.Skip(CountCharacters * 2 + 2).ToArray();
                }
                else
                {
                    lnk.StringData.NameString = Encoding.Default.GetString(ba.Skip(2).Take(CountCharacters).ToArray()).TrimEnd(new char[] { (char)0 });
                    ba = ba.Skip(CountCharacters + 2).ToArray();
                }
            }

            if ((Header.LinkFlags & LinkFlags.HasRelativePath) != 0)
            {
                if (lnk.StringData == null)
                {
                    lnk.StringData = new StringData(IsUnicode);
                }

                UInt16 CountCharacters = BitConverter.ToUInt16(ba, 0);
                if (IsUnicode)
                {
                    lnk.StringData.RelativePath = Encoding.Unicode.GetString(ba.Skip(2).Take(CountCharacters * 2).ToArray()).TrimEnd(new char[] { (char)0 });
                    ba = ba.Skip(CountCharacters * 2 + 2).ToArray();
                }
                else
                {
                    lnk.StringData.RelativePath = Encoding.Default.GetString(ba.Skip(2).Take(CountCharacters).ToArray()).TrimEnd(new char[] { (char)0 });
                    ba = ba.Skip(CountCharacters + 2).ToArray();
                }
            }

            if ((Header.LinkFlags & LinkFlags.HasWorkingDir) != 0)
            {
                if (lnk.StringData == null)
                {
                    lnk.StringData = new StringData(IsUnicode);
                }

                UInt16 CountCharacters = BitConverter.ToUInt16(ba, 0);
                if (IsUnicode)
                {
                    lnk.StringData.WorkingDir = Encoding.Unicode.GetString(ba.Skip(2).Take(CountCharacters * 2).ToArray()).TrimEnd(new char[] { (char)0 });
                    ba = ba.Skip(CountCharacters * 2 + 2).ToArray();
                }
                else
                {
                    lnk.StringData.WorkingDir = Encoding.Default.GetString(ba.Skip(2).Take(CountCharacters).ToArray()).TrimEnd(new char[] { (char)0 });
                    ba = ba.Skip(CountCharacters + 2).ToArray();
                }
            }

            if ((Header.LinkFlags & LinkFlags.HasArguments) != 0)
            {
                if (lnk.StringData == null)
                {
                    lnk.StringData = new StringData(IsUnicode);
                }

                UInt16 CountCharacters = BitConverter.ToUInt16(ba, 0);
                if (IsUnicode)
                {
                    lnk.StringData.CommandLineArguments = Encoding.Unicode.GetString(ba.Skip(2).Take(CountCharacters * 2).ToArray()).TrimEnd(new char[] { (char)0 });
                    ba = ba.Skip(CountCharacters * 2 + 2).ToArray();
                }
                else
                {
                    lnk.StringData.CommandLineArguments = Encoding.Default.GetString(ba.Skip(2).Take(CountCharacters).ToArray()).TrimEnd(new char[] { (char)0 });
                    ba = ba.Skip(CountCharacters + 2).ToArray();
                }
            }

            if ((Header.LinkFlags & LinkFlags.HasIconLocation) != 0)
            {
                if (lnk.StringData == null)
                {
                    lnk.StringData = new StringData(IsUnicode);
                }

                UInt16 CountCharacters = BitConverter.ToUInt16(ba, 0);
                if (IsUnicode)
                {
                    lnk.StringData.IconLocation = Encoding.Unicode.GetString(ba.Skip(2).Take(CountCharacters * 2).ToArray()).TrimEnd(new char[] { (char)0 });
                    ba = ba.Skip(CountCharacters * 2 + 2).ToArray();
                }
                else
                {
                    lnk.StringData.IconLocation = Encoding.Default.GetString(ba.Skip(2).Take(CountCharacters).ToArray()).TrimEnd(new char[] { (char)0 });
                    ba = ba.Skip(CountCharacters + 2).ToArray();
                }
            }
            #endregion // STRING_DATA

            #region EXTRA_DATA
            if (ba.Length >= 4)
            {
                lnk.ExtraData = ExtraData.FromByteArray(ba);
            }
            #endregion // EXTRA_DATA

            return(lnk);
        }
Esempio n. 6
0
 public ShellLinkHeaderHandler(ShellLinkHeader item)
 {
     Item = item;
 }