处理Windows 95的长文件名中断详解_第1页
处理Windows 95的长文件名中断详解_第2页
处理Windows 95的长文件名中断详解_第3页
处理Windows 95的长文件名中断详解_第4页
处理Windows 95的长文件名中断详解_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、处理Windows 95的长文件名中断详解Gold Eagle 很多朋友在DOS环境下写过程序,而且有许多和文件处理有关。众所周知,DOS下的文件名为8.3的格式,而Windows 95开始使用长文件名格式,以前的DOS下的程序只能按8.3格式来处理这些长文件名,读取文件或目录名时还好,最多只是看起来有些不顺眼(都变成PROGRA1、MYPROD3.EXE这样的文件名了),要创建新的目录和文件时就麻烦了,因为以前的DOS下的开发环境(如Tubro C 2.0, Borland C+ 3.1, Turbo Pascal等)没有处理长文件名的函数,所有的长文件名在以前的函数中都被截尾处理了。找了一

2、些资料,发现Windows 95提供了处理长文件名的中断,翻译并整理成文,希望对大家有点帮助。 本文介绍的所有功能都是通过INT 21H来调用的。 Windows 95是通过21H号中断的71H子中断来处理长文件名的,列表如下: AL值 功能 = = 0DH 重置驱动器 39H 创建子目录 3AH 删除子目录 3BH 改变当前目录 41H 删除文件 43H 读取/设置文件属性 47H 得到当前目录 4EH 查找第一个符合条件的文件(findfirst) 4FH 查找下一个符合条件的文件(findnext) 56H 移动(改名)文件 60H TRUENAME 6CH 创建/打开文件 A0H 读取

3、卷信息 A1H 结束文件查找(findfirst/findnext) A6H 读取文件信息 A7H 时间转换 A8H 产生短文件名(8.3格式) A9H 服务器创建/打开文件 AAH 开始/结束SUBST 中断调用后CF置位表示出错(AX存储出错代码),CF清零表示成功 说明: 如果返回出错代码7100H,说明不支持此功能,将调用老式的中断 为与老版本DOS兼容(7.0以前),在调用前先将CF置位以确认在退出 时它被置位 另外还有几个功能是未公开的:AL=A2H,A3H,A4H,A5H,其中AL=A2H的功能已知,与AL=4FH功能类似,这几个功能是Windows内部使用的,在本文就不介绍了。

4、一、重置驱动器 入口:AX = 710DH CX = 0000H 将文件系统缓冲区(buffer)实际写盘,并重置驱动器 0001H 将文件系统缓冲区(buffer)和缓存(cache)实际写盘, 并重置驱动器 0002H 重新挂接DriveSpace卷 DX = 驱动器号(00H = A:,01H = B:,等等) 出口: CF清零 对应老式的调用:AH=0DH二、创建子目录 入口:AX = 7139H DS:DX -> 长目录名(ASCIZ串) 出口:中断调用后CF置位表示出错(AX存储出错代码),CF清零表示成功 对应老式的调用:AH=39H三、删除子目录 入口:AX = 713A

5、H DS:DX -> 要删除的长目录名(ASCIZ串) 出口:中断调用后CF置位表示出错(AX存储出错代码),CF清零表示成功 对应老式的调用:AH=3AH四、改变当前目录 入口:AX = 713BH DS:DX -> 要设为当前目录的长目录名(ASCIZ串) 出口:中断调用后CF置位表示出错(AX存储出错代码),CF清零表示成功 对应老式的调用:AH=3BH五、删除文件 入口:AX = 7141H DS:DX -> 要删除的文件的长文件名(ASCIZ串) SI = 通配符和属性标志 0000H 不支持通配符,搜索属性也被忽略 0001H 支持通配符,只有名字和属性匹配的才删

6、除 CL = 搜索属性 CH = 必匹配(must-match)属性 出口:中断调用后CF置位表示出错(AX存储出错代码),CF清零表示成功 对应老式的调用:AH=41H六、读取/设置文件属性 入口:AX = 7143H DS:DX -> 文件名(ASCIZ串) BL = 00H 读取属性 返回:CX = 文件属性 01H 设置属性 CX = 文件属性 02H 读取压缩文件的物理大小 返回:DX:AX = 文件的实际使用磁盘空间字节数 03H 设置最后写入日期/时间 DI = 新的最后写入日期 CX = 新的最后写入时间 04H 读取最后写入日期/时间 返回:DI = 最后写入日期 CX

7、 = 最后写入时间 05H 设置最后访问日期 DI = 新的最后访问日期 06H 读取最后访问日期 返回:DI = 最后访问日期 07H 设置创建日期/时间 DI = 新的创建日期 CX = 新的创建时间 SI = 百分秒数 08h 读取创建日期/时间 返回:DI = 创建日期 CX = 创建时间 SI = 百分秒数 出口:中断调用后CF置位表示出错(AX存储出错代码),CF清零表示成功 成功时返回值请参看本小节的“入口”部分 对应老式的调用:AH=43H 请参考:附一、附二、附三七、得到当前目录 入口:AX = 7147H DL = 驱动器号 (00H = 当前驱动器,01H = A:,等等

8、) DS:SI -> 用于存储目录名(ASCIZ串)的内存区 出口:中断调用后CF置位表示出错(AX存储出错代码),CF清零表示成功 目录名将存储于DS:SI指向的内存区 说明:返回的目录名不包含驱动器字母、冒号或打头的反斜杠,而且不一 定是长文件名,这个功能返回的是用于改变的此目录的路径,可能 包含长短文件名混合的字符串。 提供的内存区(DS:SI指向的)的最小空间应该由AX=71A0H功能测 定。 对应老式的调用:AH=47H八、查找第一个符合条件的文件 入口:AX = 714EH CL = 允许的属性(位0和位5忽略) CH = 必须的属性 SI = 0000h 使用Windows

9、 95的64位文件时间格式 0001h 使用MS-DOS的日期/时间值,在双字中日期为高位, 时间为低位 DS:DX -> 带通配符的文件名(“*”和“*.*”都区配所有文件) ES:DI -> 用于存储FindData结构的空间 出口:中断调用后CF置位表示出错(AX存储出错代码),CF清零表示成功 成功时返回:AX = filefind handle (用于继续搜索) CX = Unicode转换标志 位0 返回的长文件名含有无法转换的Unicode 字符,被下划线替代 位1 返回的短文件名含有无法转换的Unicode 字符,被下划线替代 说明:这个功能仅当IFSMgr运行时有

10、效,而不是DOS 7.0纯DOS模式 应用程序应在搜索完成后立即调用AX=71A1H功能结束搜索 对应老式的调用:AH=4EH 请参考:附一、附二、附三、附四 九、查找下一个符合条件的文件 入口:AX = 714FH BX = filefind handle(由功能AX=714EH来) SI = 0000h 使用Windows 95的64位文件时间格式 0001h 使用MS-DOS的日期/时间值,在双字中日期为高位, 时间为低位 ES:DI -> 用于存储FindData结构的空间 出口:中断调用后CF置位表示出错(AX存储出错代码),CF清零表示成功 成功时返回:CX = Unicod

11、e转换标志 位0 返回的长文件名含有无法转换的Unicode 字符,被下划线替代 位1 返回的短文件名含有无法转换的Unicode 字符,被下划线替代 说明:这个功能仅当IFSMgr运行时有效,而不是DOS 7.0纯DOS模式 对应老式的调用:AH=4FH 请参考:附二、附三、附四十、移动(改名)文件 入口:AX = 7156H DS:DX -> 旧的文件名(ASCIZ) ES:DI -> 新的文件名(ASCIZ) 出口:中断调用后CF置位表示出错(AX存储出错代码),CF清零表示成功 说明:文件可以改名到不同的目录,但必须是同一驱动器。 对应老式的调用:AH=56H十一、TRUE

12、NAME 入口:AX = 7160H CL = 00H 获取规范路径 01H 获取短文件名 02H 获取规范化长文件名或路径 CH = SUBST扩展标志 00H 返回的路径是不包含SUBST的盘符的真实路径 80H 返回的路径可以包含SUBST的盘符 DS:SI -> 文件或路径名(ASCIZ串),长短均可 ES:DI -> 261字节的存储区用于存放规范路径或长文件名 (CL=00H或02H) 或67字节(可能是128字节)的存储区用于存放短文件名 (CL=00H或02H) 出口:中断调用后CF置位表示出错(AX存储出错代码),CF清零表示成功 出错码:02H 目录中找不到此文

13、件(目录)或仅指定了盘符 03H 无效路径或无效盘符 成功时ES:DI指向的存储区写入了返回的路径或文件名 对应老式的调用:AH=60H十二、创建/打开文件 入口:AX = 716CH BX = 访问模式和共享标志(附五) CX = 属性 DX = 打开模式(附六) DS:SI -> 文件名(ASCIZ串) DI = 别名提示(在短文件名为了消除二义性的数字) 出口:中断调用后CF置位表示出错(AX存储出错代码),CF清零表示成功 成功时:AX = 文件句柄 CX = 0001H 文件被打开 0002H 文件被创建 0003H 文件被替换 对应老式的调用:AH=6CH 请参考:附一,附五

14、,附六 十三、读取卷信息 入口:AX = 71A0H DS:DX -> 根目录名(ASCIZ串),如“C:” ES:DI -> 存储文件系统名的内存区(一般32字节就够了) CX = ES:DI指向内存区的大小 出口:中断调用后CF置位表示出错(AX存储出错代码),CF清零表示成功 成功时:BX = 文件系统标志 CX = 文件名最大长度(通常是255) DX = 路径名最大长度(通常是260) ES:DI指向的内存区被填充为“FAT”、“NTFS”、 “CDFS”等 BUG:Windows 95 SP1中此功能对于CD-ROM会返回DX=0000H 对应老式的调用:无 请参考:附

15、七十四、结束文件查找 入口:AX = 71A1H BX = filefind handle (从功能AX=714EH来) 出口:中断调用后CF置位表示出错(AX存储出错代码),CF清零表示成功 说明:由功能AX=714EH开始文件搜索后必须调用此功能来释放filefind hadle 这个功能仅当IFSMgr运行时有效,而不是DOS 7.0纯DOS模式 对应老式的调用:无十五、读取文件信息 入口:AX = 71A6H BX = 文件名柄 DS:DX -> 用于存储文件信息的内存区 CF置位 出口:中断调用后CF置位表示出错(AX存储出错代码),CF清零表示成功 成功时DS:DX指向的内存

16、区被写入文件信息 对应老式的调用:无 请参考:附八十六、时间转换 入口:AX = 71A7H DS:SI -> QWORD格式文件时间 BL = 00H 文件时间到DOS时间 返回:CX = DOS时间 DX = DOS日期 BH = 百分秒数 01H DOS时间到文件时间 CX = DOS时间 DX = DOS日期 BH = 百分秒数 返回:DS:SI指向的内存区被填充 出口:中断调用后CF置位表示出错(AX存储出错代码),CF清零表示成功 成功时的其余返回数据请看“入口”部分 说明:BL=00H时,如果文件时间不在01/01/1980和12/31/2107之间失败 对应老式的调用:无

17、 请参考:附八十七、产生短文件名(8.3格式) 入口:AX = 71A8H DS:SI -> 长文件名(ASCIZ串),允许不带路径 ES:DI -> 用于存储短文件名(ASCIZ串)的内存区 DH = 短文件名格式 00H 11字符/FCB文件名格式 01H DOS 8.3 DL = 字符集 位7-4:短文件名的字符集 位3-0:长文件名的字符集 00h Windows ANSI 01h 当前的OEM字符集 02h Unicode 出口:中断调用后CF置位表示出错(AX存储出错代码),CF清零表示成功 对应老式的调用:无十八、服务器创建/打开文件 入口:AX = 71A9H BX

18、 = 访问模式和共享标志(附五) CX = 属性 DX = 打开模式(附六) DS:SI -> 文件名(ASCIZ串) DI = 别名提示(在短文件名为了消除二义性的数字) 出口:中断调用后CF置位表示出错(AX存储出错代码),CF清零表示成功 成功时:AX = 全局文件句柄 CX = 0001H 文件被打开 0002H 文件被创建 0003H 文件被替换 说明:仅用于实模式服务器 对应老式的调用:无 请参考:附一,附五,附六十九、开始/结束SUBST 入口:AX = 71AAH BH = 00H 开始SUBST DS:DX指向的内存区用于输入 01H 结束SUBST 不用指定DS:DX

19、 02H 查询SUBST DS:DX指向的内存区用于输出 BL = 驱动器号 (00H=默认,01H=A:,等等) DS:DX -> 与驱动器关联的路径名(ASCIZ串) 出口:中断调用后CF置位表示出错(AX存储出错代码),CF清零表示成功 说明:只有BH=00H时BL才可为00H 对应老式的调用:无二十、最后说明 本文的原始资料来源于Ralf Brown's Interrupt List(英文版),这个中断大全包含的内容相当丰富,实在是一份很好的编程参考资料。 由于本人水平有限,加上时间匆忙,翻译和整理得不是很好,不尽人意之处,请多多包含。若有不正确的地方,请指正。 大家可以

20、将本文随意传播,以服务于更多朋友,但敬请各位传播本文时务必保持其完整性,多谢了。 过些时间我可能会写一些应用这些中断调用的例程,作为对本文的补充,完成后,会通过邮件列表geprogram(金鹰的程序员天地)发布,有兴趣的朋友可以加入此邮件列表,方法是: 1、发一封空邮件到 sml-geprogram-subscribe 2、回复您收到的一封确认信 与我联系,请Email至:goldeagle 或:pengyin Gold EagleNov.26,1999 于广东东莞附一:文件属性各位的意义: 位 描述 = = 7-8 保留(在Novell Netware中被使用) 6 未使用 5 存档(A)

21、4 目录(D) 3 卷标 2 系统(S) 1 隐藏(H) 0 只读(R)附二:文件日期格式 位 描述 = = 15-9 年份减去1980 8-5 月 4-0 日附三:文件时间格式 位 描述 = = 15-11 小时(0-23) 10-5 分 4-0 秒/2附四:Windows 95长文件名FindData结构 偏移 长度 描述 = = = 00H DWORD 文件属性位0-6为标准文件属性位8:临时文件 04H QWORD 文件创建时间(从1/1/1601开始的100ns数) 0CH QWORD 最后访问时间 14H QWORD 最后修改时间 1CH DWORD 文件长度(高32位) 20H DWORD 文件长度(高32位) 24H 8 BYTEs 保留 (apparently unused) 2CH 260 BYTEs 长文件名(ASCIZ串) 130H 14 BYTEs 用于向后兼容的短文件名(ASCIZ串) 说明:在Windows95B中,如果目录结构中不包含长文件名信息,则返回的短 文件名为空。由于这个原因,请使用长文件(偏移量2CH)。附五、Windows 95的访问/共享模式 位 描述 = = 2-0 文

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论