Windows快捷方式文件格式解析

本文详细解析了Windows快捷方式文件的格式,从文件整体结构到各个字段的具体含义进行了阐述,并提供了实际例子帮助理解。

Windows快捷方式文件格式解析

 

  最近一直作linux项目,很久没来VC知识库了,先向大家问个好!现在拜个晚年不是很晚吧?(不是说有心拜年八月十五也不晚吗!!嘿嘿)

  好了,言归正传。大家知道通过IShellLink接口可以得到快捷方式的各种属性。具体怎么做,网上有很多文章,这里就不介绍了。现在主要是分析一下快捷方式文件的格式,并且自己写一个解析程序。

为了方便大家理解,解说完每个段后附上一个快捷方式对应部分的事例数据并附内容解说。这里以Windows Media Player在桌面上的快捷方式为例。

一、文件的整体结构

二、文件头

文件头结构,参照下面表格:

OffsetSize/TypeDescription
0h 1 dword 值常为0000004CH,为字符"L"
4h 16 bytes GUID
①14h1 dwordFlags,用来标识快捷方式文件中有哪些可选属性,后面有表单独解释每一位的意义。
②18h1 dword目标文件属性,后面解释。
1ch1 qword文件创建时间
24h1 qword 文件修改时间
2ch1 qword 文件最后一次访问时间
34h 1 dword目标文件长度
38h1 dword自定义图标个数,
3ch1 dword目标文件执行时窗口显示方式:

 

1、 正常显示

2、 最小化

3、 最大化

40h1 dword热键
44h2 dword暂时还不清楚用途值常为0

  

① 偏移14h开始的标志标示有哪些可选属性,见下表:

Bit所在位为1时表示
0有shell item id list
1指向文件或文件夹,如果此位为0表示指向其他。
2存在描述字符串
3存在相对路径
4存在工作路径
5存在命令行参数
6存在自定义图标

② 偏移18h开始的目标文件属性:  

Bit 所在位为1时表示
0快捷方式所指目标文件有只读属性
1快捷方式所指目标文件有隐藏属性
2快捷方式所指目标文件是系统文件
3快捷方式所指目标是卷标
4快捷方式所指目标是文件夹
5快捷方式所指目标文件上次存档后被改变过
6快捷方式所指目标文件被加密
7快捷方式所指目标文件属性为一般
8快捷方式所指目标文件为临时
9快捷方式所指目标文件为稀疏文件(sparse file)
10快捷方式所指目标文件有重分析点数据(reparse point)
11快捷方式所指目标文件被压缩
12快捷方式所指目标文件脱机

例:

偏移        数据              解释0000     4c 00 00 00        字符"L"0004     01 14 02 00        快捷方式的GUID。值固定          00 00 00 00          C0 00 00 00          00 00 00 460014     8F 00 00 00       flags。对照表可知                               有shell item id list                               目标是文件                               存在描述字符串                               存在相对路径0018     20 00 00 00       文件属性,具体内容可以查上面的属性说明表001C     40 51 0A 0C       文件创建时间         AD CB C4 010024     C4 D8 A5 91      文件修改时间         AD CB C4 01002C     00 33 16 74        文件最后一次访问时间         F6 C7 C3 010034     00 20 01 00        文件长度0038     00 00 00 00        自定义图标个数003C     01 00 00 00        打开时窗口为normal状态0040     00 00 00 00        热键0044     00 00 00 00        暂时还不清楚用途值常为0         00 00 00 00三、Shell item ID list段

  当文件头中○1的第0位置位时才有。第一个unsigned short integer表示item ID list段的总长度。后面紧跟着SHITEMID结构。SHITEMID的定义如下:

     typedef struct _SHITEMID {          USHORT cb;          BYTE    abID[0];      } SHITEMID, * LPSHITEMID;   cb保存SHITEMID结构的大小。abID是可变长度的对象标识。具体都是什么含义没看明白,可以参阅MSDN。因为item ID list段的开始为这个段的总长度,所以在读取的时候可以把此段跳过不做处理!!:)

例:(文件头段的flags标志显示存在shell item id list段)

偏移        数据              解释004C     9c 00             item ID list总长度(下一段的起始地址为004E+009C=00EA)004E     14 00            第一个item ID的长度0050     1F 50 E0 4F       第一个item ID标示内容         D0 20 EA 3A         69 10 A2 D8         08 00 2B 30         30 9D0062     19 00              第二个item ID的长度0064     23 43 3A 5C        第二个item ID标示内容         00 00 00 00         00 00 00 00         00 00 00 00         00 00 00 00         00 F1 93007B     25 00007D     31 00 00 00         00 00 70 31         47 3B 31 00         50 72 6F 67         72 61 6D 20         46 69 6C 65         73 00 50 52         4F 47 52 41         7E 31 0000A0     2C 0000A2     31 00 00 00         00 00 70 31         47 3B 10 00         57 69 6E 64         6F 77 73 20         4D 65 64 69         61 20 50 6C         61 79 65 72         00 57 49 4E         44 4F 57 7E         32 0000CC     1C 0000CE     32 00 00 20         01 00 95 2F         A1 99 20 00         77 6D 70 6C         61 79 65 72         2E 65 78 65         00 0000E8     00 00                  item ID list段结束四、文件位置信息段

  开始的一个long integer表示此段的总长度,当文件头中○1的第1位没有置位时表示既不是文件也不是文件夹,所以这个信息没有意义,所以总长度为0。先让我们看一下这个段的头:

 

OffsetSize/TypeDescription
0h1 dword 此段的总长度
4h1 dword 头结构长度,固定为1ch
8h 1 dwordFlags指示文件在哪些卷有效,这里只用到低两位,第一位置位表示本地卷有效,反之无效。第二位置位表示网络卷有效,反之无效。
ch 1 dword本地卷信息表的偏移(固定1ch)
10h1 dword本地路径信息的偏移
14h1 dword网络卷信息表的偏移
18h1 dword 附加信息的偏移

如果文件在本地卷,那么文件名为:本地路径信息+附加信息

如果文件在网络卷,那么文件名为:网络卷信息中的共享名+附加信息

紧跟在段头后面的是本地卷信息表(段内偏移为1ch),结构如下:

OffsetSize/TypeDescription
0h1 dword本地卷信息表的长度
4h1 dword卷类型:

 

0 Unknown

1 No root directory

2 Removable (Floppy, Zip, etc..)

3 Fixed (Hard disk)

4 Remote (Network drive)

5 CD-ROM

6 Ram drive (Shortcuts to stuff on a ram drive, now that''s smart...)

8h 1 dword卷序列号
ch 1 dword固定长度部分的大小,固定为10h
10h 可变长度卷标签

然后是本地路径信息串段内偏移决定于10h的值。

再往后就是网络卷信息表段内偏移决定于14h的值。结构如下:

OffsetSize/TypeDescription
0h1 dword 网络卷信息表的长度
4h1 dword 固定为2h
8h 1 dword固定长度部分的大小,固定为14h
ch1 dword 固定为0h
10h 1 dword 固定为20000h
14h 可变长度网络共享名

最后是附加信息串段内偏移决定于18h的值 例:

偏移        数据              解释段头00EA     67 00 00 00      文件位置信息段总长度00EE     1C 00 00 00      段头长度,固定为1ch00F2     01 00 00 00      本地卷00F6     1C 00 00 00      本地卷信息表的段内偏移00FA     33 00 00 00      本地路径信息的偏移00FE     00 00 00 00      网络卷信息表的偏移0102     66 00 00 00      附加信息的偏移本地卷信息表

0106     17 00 00 00      表长度010A     03 00 00 00      Fixed (Hard disk)010E     AD C9 B2 F0      卷序列号0112     10 00 00 00      固定为10h0116     73 79 73 74      卷标"system"         65 6D 00本地路径信息串

011D     43 3A 5C 50   C:/Program Files/Windows Media Player/wmplayer.exe         72 6F 67 72         61 6D 20 46         69 6C 65 73         5C 57 69 6E         64 6F 77 73         20 4D 65 64         69 61 20 50         6C 61 79 65         72 5C 77 6D         70 6C 61 79         65 72 2E 65         78 65 00  网络卷信息表 因为段头里flags指示仅为本地卷,并且网络卷信息表的偏移值为零。所以不存在网络卷信息表。

|

附加信息串

0150     00五、描述字符段

  当文件头中○1的第2位置位时才有。开始的一个unsigned short int表示描述字符串的长度(描述字符为Unicode字符,所以字节数需乘以2,可以使用API函数WideCharToMultiByte将其转换成ANSI字符)。后面为内容。例:

偏移        数据              解释0151     20 00          描述字符长度0153     AD 64 3E 65         70 65 57 5B         92 5A 53 4F         0C FF 05 53         EC 62 F3 97         50 4E 01 30         C6 89 91 98         01 30 43 00         44 00 20 00         8C 54 20 00         49 00 6E 00         74 00 65 00         72 00 6E 00         65 00 74 00         20 00 35 75         F0 53 02 30  转换成ANSI字符为"播放数字媒体,包括音乐、视频、CD 和 Internet 电台。

六、相对路径段

  当文件头中○1的第3位置位时才有。同描述字符段一样开始的一个unsigned short int表示相对路径字符串的长度。后面为内容。 例:

偏移        数据              解释0193     38 00          相对路径字符长度0195     2E 00 2E 00         5C 00 2E 00         2E 00 5C 00         2E 00 2E 00         5C 00 50 00         72 00 6F 00         67 00 72 00         61 00 6D 00         20 00 46 00         69 00 6C 00         65 00 73 00         5C 00 57 00         69 00 6E 00         64 00 6F 00         77 00 73 00         20 00 4D 00         65 00 64 00         69 00 61 00         20 00 50 00         6C 00 61 00         79 00 65 00         72 00 5C 00         77 00 6D 00         70 00 6C 00         61 00 79 00         65 00 72 00         2E 00 65 00         78 00 65 00

转换成ANSI字符为"../../../Program Files/Windows Media Player/wmplayer.exe"

七、工作目录段 同上。

例:因为文件头中○1flags的第四位没有置位,所以此段不存在

八、 命令行段 同上。

例:因为文件头中○1flags的第五位没有置位,所以此段不存在

九、图标文件段 同上。

例:因为文件头中○1flags的第六位没有置位,所以此段不存在

十、 附加信息段 具体信息不清楚!!!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值