private void _read() { _flags = new LinkInfoFlags(m_io, this, m_root); _ofsVolumeId = m_io.ReadU4le(); _ofsLocalBasePath = m_io.ReadU4le(); _ofsCommonNetRelLink = m_io.ReadU4le(); _ofsCommonPathSuffix = m_io.ReadU4le(); if (!(M_Io.IsEof)) { _ofsLocalBasePathUnicode = m_io.ReadU4le(); } if (!(M_Io.IsEof)) { _ofsCommonPathSuffixUnicode = m_io.ReadU4le(); } }
/// <summary> /// Create a LinkInfo from a given byte array /// </summary> /// <param name="ba">The byte array</param> /// <returns>A LinkInfo object</returns> public static LinkInfo FromByteArray(byte[] ba) { LinkInfo LinkInfo = new LinkInfo(); if (ba.Length < 0x1C) { throw new ArgumentException(String.Format("Size of the LinkInfo Structure is less than 28 ({0})", ba.Length)); } UInt32 LinkInfoSize = BitConverter.ToUInt32(ba, 0); if (LinkInfoSize > ba.Length) { throw new ArgumentException(String.Format("The LinkInfoSize is {0} is incorrect (expected {1})", LinkInfoSize, ba.Length)); } UInt32 LinkInfoHeaderSize = BitConverter.ToUInt32(ba, 4); if (LinkInfoHeaderSize < 0x1C) { throw new ArgumentException(String.Format("The LinkInfoHeaderSize is {0} is incorrect)", LinkInfoHeaderSize)); } LinkInfoFlags LinkInfoFlags = (LinkInfoFlags)BitConverter.ToUInt32(ba, 8); // TODO: check offsets UInt32 VolumeIDOffset = BitConverter.ToUInt32(ba, 12); UInt32 LocalBasePathOffset = BitConverter.ToUInt32(ba, 16); UInt32 CommonNetworkRelativeLinkOffset = BitConverter.ToUInt32(ba, 20); UInt32 CommonPathSuffixOffset = BitConverter.ToUInt32(ba, 24); UInt32 LocalBasePathOffsetUnicode = 0; UInt32 CommonPathSuffixOffsetUnicode = 0; if (LinkInfoHeaderSize > 0x1C) { if ((LinkInfoFlags & LinkInfoFlags.VolumeIDAndLocalBasePath) != 0) { LocalBasePathOffsetUnicode = BitConverter.ToUInt32(ba, 28); } if ((LinkInfoFlags & LinkInfoFlags.CommonNetworkRelativeLinkAndPathSuffix) != 0) { CommonPathSuffixOffsetUnicode = BitConverter.ToUInt32(ba, 32); } } byte[] tmp; if ((LinkInfoFlags & LinkInfoFlags.VolumeIDAndLocalBasePath) != 0) { tmp = ba.Skip((int)VolumeIDOffset).ToArray(); LinkInfo.VolumeID = VolumeID.FromByteArray(tmp); tmp = ba.Skip((int)LocalBasePathOffset).ToArray(); LinkInfo.LocalBasePath = Encoding.Default.GetString(tmp.Take(Array.IndexOf(tmp, (byte)0x00) + 1).ToArray()).TrimEnd(new char[] { (char)0 }); } if ((LinkInfoFlags & LinkInfoFlags.CommonNetworkRelativeLinkAndPathSuffix) != 0) { tmp = ba.Skip((int)CommonNetworkRelativeLinkOffset).ToArray(); LinkInfo.CommonNetworkRelativeLink = CommonNetworkRelativeLink.FromByteArray(tmp); tmp = ba.Skip((int)CommonPathSuffixOffset).ToArray(); LinkInfo.CommonPathSuffix = Encoding.Default.GetString(tmp.Take(Array.IndexOf(tmp, (byte)0x00) + 1).ToArray()).TrimEnd(new char[] { (char)0 }); } if (LinkInfoHeaderSize >= 0x24) { if ((LinkInfoFlags & LinkInfoFlags.VolumeIDAndLocalBasePath) != 0) { int Index = 0; tmp = ba.Skip((int)LocalBasePathOffsetUnicode).ToArray(); for (int i = 0; i < tmp.Length - 1; i++) { if (tmp[i] == 0x00 && tmp[i + 1] == 0x00) { Index = i; break; } } LinkInfo.LocalBasePathUnicode = Encoding.Unicode.GetString(tmp.Take(Index + 1).ToArray()).TrimEnd(new char[] { (char)0 }); } if ((LinkInfoFlags & LinkInfoFlags.CommonNetworkRelativeLinkAndPathSuffix) != 0) { int Index = 0; tmp = ba.Skip((int)CommonPathSuffixOffsetUnicode).ToArray(); for (int i = 0; i < tmp.Length - 1; i++) { if (tmp[i] == 0x00 && tmp[i + 1] == 0x00) { Index = i; break; } } LinkInfo.CommonPathSuffixUnicode = Encoding.Unicode.GetString(tmp.Take(Index + 1).ToArray()).TrimEnd(new char[] { (char)0 }); } } return(LinkInfo); }