首页 > 未分类 > Windows快捷方式文件格式解析

Windows快捷方式文件格式解析

2009年10月30日 岩岩魂   访问量: 554 发表评论 阅读评论

源码下载

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

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

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

  一、文件的整体结构

Windows快捷方式文件格式解析(图一)

  二、文件头

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

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

  1、 正常显示

  2、 最小化

  3、 最大化

40h 1 dword 热键
44h 2 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 46
0014  8F 00 00 00   flags。对照表可知
               有shell item id list
               目标是文件
               存在描述字符串
               存在相对路径
0018  20 00 00 00   文件属性,具体内容可以查上面的属性说明表
001C  40 51 0A 0C   文件创建时间
    AD CB C4 01
0024  C4 D8 A5 91   文件修改时间
    AD CB C4 01
002C  00 33 16 74    文件最后一次访问时间
    F6 C7 C3 01
0034  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 9D
0062  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 93
007B  25 00
007D  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 00
00A0  2C 00
00A2  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 00
00CC  1C 00
00CE  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 00
00E8  00 00         item ID list段结束
四、文件位置信息段

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

  

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

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

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

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

Offset Size/Type Description
0h 1 dword 本地卷信息表的长度
4h 1 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的值。结构如下:

Offset Size/Type Description
0h 1 dword 网络卷信息表的长度
4h 1 dword 固定为2h
8h 1 dword 固定长度部分的大小,固定为14h
ch 1 dword 固定为0h
10h 1 dword 固定为20000h
14h 可变长度 网络共享名

  最后是附加信息串段内偏移决定于18h的值 例: 偏移    数据       解释
段头
00EA  67 00 00 00   文件位置信息段总长度
00EE  1C 00 00 00   段头长度,固定为1ch
00F2  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   固定为10h
0116  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的第六位没有置位,所以此段不存在

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

  以上很多资料来自网上,并不是微软文档,所以难免有理解错误的地方,请包含。所附代码只是为了跟踪显示,没有输出,嘿嘿,自己改改看吧!!:)有兴趣可以自己写一个类,分析快捷方式的所有信息。

无相关文章。

分类: 未分类 标签:
  1. 本文目前尚无任何评论.
  1. 本文目前尚无任何 trackbacks 和 pingbacks.