public static void Check(this ShellLinkHeader obj, List <Exception> errors) { foreach (var check in allChecks) { if (check.Check(obj)) { errors.Add(check.Exception); } } }
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); }
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); }
public ShellLinkFile() { Header = new ShellLinkHeader(); ExtraDataBlocks = new List <ExtraDataBlock>(); ShItemIDs = new List <ShItemID>(); }
/// <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); }
public ShellLinkHeaderHandler(ShellLinkHeader item) { Item = item; }