54 ByteBuffer bb = ByteBuffer.wrap(
content);
55 bb.order(ByteOrder.LITTLE_ENDIAN);
56 int header = bb.getInt();
57 ByteBuffer linkClassIdentifier = bb.get(
new byte[16]);
58 int linkFlags = bb.getInt();
59 int fileAttributes = bb.getInt();
60 long crtime = bb.getLong();
61 long atime = bb.getLong();
62 long mtime = bb.getLong();
63 int fileSize = bb.getInt();
64 int iconIndex = bb.getInt();
65 int showCommand = bb.getInt();
66 short hotkey = bb.getShort();
68 List<String> linkTargetIdList =
new ArrayList<>();
69 if ((linkFlags & LnkEnums.LinkFlags.HasLinkTargetIDList.getFlag())
70 == LnkEnums.LinkFlags.HasLinkTargetIDList.getFlag()) {
71 int idListSize = bb.getShort();
73 List<byte[]> linkTargetIdListBytes =
new ArrayList<>();
75 short itemIdSize = bb.getShort();
76 if (itemIdSize == 0) {
80 byte[] theArray =
new byte[itemIdSize - 2];
82 linkTargetIdListBytes.add(theArray);
83 bytesRead += itemIdSize;
87 boolean hasUnicodeLocalBaseAndCommonSuffixOffset =
false;
88 String localBasePath =
null;
89 String commonPathSuffix =
null;
90 String localBasePathUnicode =
null;
91 String commonPathSuffixUnicode =
null;
92 int driveSerialNumber = -1;
94 String volumeLabel =
null;
95 int commonNetworkRelativeLinkFlags = -1;
97 boolean unicodeNetAndDeviceName =
false;
98 String netName =
null;
99 String netNameUnicode =
null;
100 String deviceName =
null;
101 String deviceNameUnicode =
null;
103 if ((linkFlags & LnkEnums.LinkFlags.HasLinkInfo.getFlag())
104 == LnkEnums.LinkFlags.HasLinkInfo.getFlag()) {
105 int startOfLinkInfo = bb.position();
106 int linkInfoSize = bb.getInt();
107 int linkInfoHeaderSize = bb.getInt();
108 hasUnicodeLocalBaseAndCommonSuffixOffset = linkInfoHeaderSize >= 0x24;
109 int linkInfoFlags = bb.getInt();
110 int volumeIdOffset = bb.getInt();
111 int localBasePathOffset = bb.getInt();
112 int commonNetworkRelativeLinkOffset = bb.getInt();
113 int commonPathSuffixOffset = bb.getInt();
114 int localBasePathOffsetUnicode = 0;
115 int commonPathSuffixOffsetUnicode = 0;
116 if (hasUnicodeLocalBaseAndCommonSuffixOffset) {
117 localBasePathOffsetUnicode = bb.getInt();
118 commonPathSuffixOffsetUnicode = bb.getInt();
120 if ((linkInfoFlags & LnkEnums.LinkInfoFlags.VolumeIDAndLocalBasePath.getFlag())
121 == LnkEnums.LinkInfoFlags.VolumeIDAndLocalBasePath.getFlag()) {
122 bb.position(startOfLinkInfo + volumeIdOffset);
123 int volumeIdSize = bb.getInt();
125 driveSerialNumber = bb.getInt();
126 int volumeLabelOffset = bb.getInt();
127 if (volumeLabelOffset != 0x14) {
128 volumeLabel =
parseString(startOfLinkInfo + volumeIdOffset + volumeLabelOffset,
false, volumeIdSize - 0x10);
130 int volumeLabelOffsetUnicode = bb.getInt();
131 volumeLabel =
parseString(startOfLinkInfo + volumeIdOffset + volumeLabelOffsetUnicode,
false, volumeIdSize - 0x14);
135 if ((linkInfoFlags & LnkEnums.LinkInfoFlags.CommonNetworkRelativeLinkAndPathSuffix.getFlag())
136 == LnkEnums.LinkInfoFlags.CommonNetworkRelativeLinkAndPathSuffix.getFlag()) {
137 bb.position(startOfLinkInfo + commonNetworkRelativeLinkOffset);
138 int commonNetworkRelativeLinkSize = bb.getInt();
139 commonNetworkRelativeLinkFlags = bb.getInt();
140 int netNameOffset = bb.getInt();
141 unicodeNetAndDeviceName = netNameOffset > 0x14;
142 int deviceNameOffset = bb.getInt();
143 int netType = bb.getInt();
144 int netNameOffsetUnicode = 0;
145 int deviceNameOffsetUnicode = 0;
146 if (unicodeNetAndDeviceName) {
147 netNameOffsetUnicode = bb.getInt();
148 deviceNameOffsetUnicode = bb.getInt();
150 netName =
parseNetName(startOfLinkInfo + commonNetworkRelativeLinkOffset + netNameOffset,
false);
151 if (unicodeNetAndDeviceName) {
152 netNameUnicode =
parseNetName(startOfLinkInfo + commonNetworkRelativeLinkOffset + netNameOffsetUnicode,
true);
154 if ((commonNetworkRelativeLinkFlags & LnkEnums.CommonNetworkRelativeLinkFlags.ValidNetType.getFlag())
155 == LnkEnums.CommonNetworkRelativeLinkFlags.ValidNetType.getFlag()) {
158 if ((commonNetworkRelativeLinkFlags & LnkEnums.CommonNetworkRelativeLinkFlags.ValidDevice.getFlag())
159 == LnkEnums.CommonNetworkRelativeLinkFlags.ValidDevice.getFlag()) {
160 deviceName =
parseDeviceName(startOfLinkInfo + commonNetworkRelativeLinkOffset + deviceNameOffset,
false);
161 if (unicodeNetAndDeviceName) {
162 deviceNameUnicode =
parseDeviceName(startOfLinkInfo + commonNetworkRelativeLinkOffset + deviceNameOffsetUnicode,
true);
167 if (((linkInfoFlags & LnkEnums.LinkInfoFlags.VolumeIDAndLocalBasePath.getFlag())
168 == LnkEnums.LinkInfoFlags.VolumeIDAndLocalBasePath.getFlag())
169 && hasUnicodeLocalBaseAndCommonSuffixOffset) {
170 localBasePathUnicode =
parseLocalBasePath(startOfLinkInfo + localBasePathOffsetUnicode,
true);
171 commonPathSuffixUnicode =
parseCommonPathSuffix(startOfLinkInfo + commonPathSuffixOffsetUnicode,
true);
174 bb.position(startOfLinkInfo + linkInfoSize);
177 if ((linkFlags & LnkEnums.LinkFlags.HasName.getFlag())
178 == LnkEnums.LinkFlags.HasName.getFlag()) {
181 String relativePath =
null;
182 if ((linkFlags & LnkEnums.LinkFlags.HasRelativePath.getFlag())
183 == LnkEnums.LinkFlags.HasRelativePath.getFlag()) {
186 String workingDir =
null;
187 if ((linkFlags & LnkEnums.LinkFlags.HasWorkingDir.getFlag())
188 == LnkEnums.LinkFlags.HasWorkingDir.getFlag()) {
191 String arguments =
null;
192 if ((linkFlags & LnkEnums.LinkFlags.HasArguments.getFlag())
193 == LnkEnums.LinkFlags.HasArguments.getFlag()) {
196 String iconLocation =
null;
197 if ((linkFlags & LnkEnums.LinkFlags.HasIconLocation.getFlag())
198 == LnkEnums.LinkFlags.HasIconLocation.getFlag()) {
202 return new JLNK(header, linkClassIdentifier.array(), linkFlags, fileAttributes,
203 crtime, atime, mtime, fileSize, iconIndex, showCommand, hotkey,
205 hasUnicodeLocalBaseAndCommonSuffixOffset, localBasePath,
206 commonPathSuffix, localBasePathUnicode, commonPathSuffixUnicode,
207 name, relativePath, workingDir, arguments, iconLocation, driveSerialNumber,
208 driveType, volumeLabel, commonNetworkRelativeLinkFlags,
209 networkProviderType, unicodeNetAndDeviceName, netName, netNameUnicode,
210 deviceName, deviceNameUnicode);
211 }
catch (Exception e) {