Windows快捷方式文件格式详解(附代码)
来源:互联网 发布:南威软件集团 编辑:程序博客网 时间:2024/04/29 09:31
作者:Cuick
大家知道通过IShellLink接口可以得到快捷方式的各种属性。具体怎么做,网上有很多文章,这里就不介绍了。现在主要是分析一下快捷方式文件的格式,并且自己写一个解析程序。
为了方便大家理解,解说完每个段后附上一个快捷方式对应部分的事例数据并附内容解说。这里以Windows Media Player在桌面上的快捷方式为例。
一、文件的整体结构
二、文件头
文件头结构,参照下面表格:
1、 正常显示
2、 最小化
3、 最大化40h1 dword热键44h2 dword暂时还不清楚用途值常为0
① 偏移14h开始的标志标示有哪些可选属性,见下表:
② 偏移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。先让我们看一下这个段的头:
如果文件在本地卷,那么文件名为:本地路径信息+附加信息
如果文件在网络卷,那么文件名为:网络卷信息中的共享名+附加信息
紧跟在段头后面的是本地卷信息表(段内偏移为1ch),结构如下:
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...)8h1 dword卷序列号ch1 dword固定长度部分的大小,固定为10h10h可变长度 卷标签
然后是本地路径信息串段内偏移决定于10h的值。
再往后就是网络卷信息表段内偏移决定于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的第六位没有置位,所以此段不存在
十、 附加信息段 具体信息不清楚!!!!!
以上很多资料来自网上,并不是微软文档,所以难免有理解错误的地方,请包含。所附代码只是为了跟踪显示,没有输出,嘿嘿,自己改改看吧!!:)有兴趣可以自己写一个类,分析快捷方式的所有信息。
代码下载:http://download.csdn.net/source/1551935
- Windows快捷方式文件格式详解(附代码)
- Windows快捷方式文件格式详解(附代码)
- Windows快捷方式文件格式解析
- Windows快捷方式文件格式解析
- Windows快捷方式文件格式解析
- Windows快捷方式文件格式解析
- Windows快捷方式文件格式解析
- Windows快捷方式文件格式解析
- Windows快捷方式文件格式解析
- Windows快捷方式文件格式解析
- 【转】快捷方式lnk文件格式详解(英文)
- 【转】 快捷方式lnk文件格式详解(英文)(中文)
- MD5详解(附代码)
- MD5详解(附代码)
- AVL树详解(附c++代码)
- Objective-C属性详解(附代码)
- 哈希表详解(附实现代码)
- windows shell 创建快捷方式和读取快捷方式的代码
- 电容封装
- 五行八字
- javascript笔记
- 模拟地 数字地
- 第一个裸奔程序——跑马灯
- Windows快捷方式文件格式详解(附代码)
- 【转】6410的DVFS和SLEEP
- 我们究竟该看待百度更新?
- html学习笔记
- (转载)Gloomy对Windows内核的分析(介绍)
- TGIFImage 不是控件,如何安装
- 剖析XP系统核心之 ----ntdll.dll
- 使用 Django 和 Python 开发 Web 站点
- 有关windows系统安全的CMD命令大全!