发信人: goldeagle() 
整理人: skyice(1999-11-26 13:52:46), 站内信件
 | 
 
 
               处理Windows 95的长文件名中断详解
                                  -- Gold Eagle
 
     很多朋友在DOS环境下写过程序,而且有许多和文件处理有关。众所周知,
  DOS下的文件名为8.3的格式,而Windows 95开始使用长文件名格式,以前的
 DOS下的程序只能按8.3格式来处理这些长文件名,读取文件或目录名时还好,
 最多只是看起来有些不顺眼(都变成PROGRA~1、MYPROD~3.EXE这样的文件名
 了),要创建新的目录和文件时就麻烦了,因为以前的DOS下的开发环境(如
 Tubro C 2.0, Borland C++ 3.1, Turbo Pascal等)没有处理长文件名的
 函数,所有的长文件名在以前的函数中都被截尾处理了。找了一些资料,发现
 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    读取卷信息 
       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内部使用的,在本文就
 不介绍了。
 
 一、重置驱动器
 
     入口: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 = 713AH
           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 支持通配符,只有名字和属性匹配的才删除
           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 = 最后写入时间
                05H 设置最后访问日期
                    DI = 新的最后访问日期
                06H 读取最后访问日期
                    返回:DI = 最后访问日期
                07H 设置创建日期/时间
                    DI = 新的创建日期
                    CX = 新的创建时间
                    SI = 百分秒数
                08h 读取创建日期/时间
                    返回:DI = 创建日期
                          CX = 创建时间
                          SI = 百分秒数
     出口:中断调用后CF置位表示出错(AX存储出错代码),CF清零表示成功
           成功时返回值请参看本小节的“入口”部分
     对应老式的调用:AH=43H
     请参考:附一、附二、附三
 
 七、得到当前目录
 
     入口:AX = 7147H
           DL = 驱动器号 (00H = 当前驱动器,01H = A:,等等)
           DS:SI -> 用于存储目录名(ASCIZ串)的内存区
     出口:中断调用后CF置位表示出错(AX存储出错代码),CF清零表示成功
           目录名将存储于DS:SI指向的内存区
     说明:返回的目录名不包含驱动器字母、冒号或打头的反斜杠,而且不一
           定是长文件名,这个功能返回的是用于改变的此目录的路径,可能
           包含长短文件名混合的字符串。
           提供的内存区(DS:SI指向的)的最小空间应该由AX=71A0H功能测
           定。
     对应老式的调用:AH=47H
 
 八、查找第一个符合条件的文件
 
     入口:AX = 714EH
           CL = 允许的属性(位0和位5忽略)
           CH = 必须的属性
           SI = 0000h 使用Windows 95的64位文件时间格式
                0001h 使用MS-DOS的日期/时间值,在双字中日期为高位,
                      时间为低位
           DS:DX -> 带通配符的文件名(“*”和“*.*”都区配所有文件)
           ES:DI -> 用于存储FindData结构的空间
     出口:中断调用后CF置位表示出错(AX存储出错代码),CF清零表示成功
           成功时返回:AX = filefind handle (用于继续搜索)
                       CX = Unicode转换标志
                            位0 返回的长文件名含有无法转换的Unicode
                                字符,被下划线替代
                            位1 返回的短文件名含有无法转换的Unicode
                                字符,被下划线替代
     说明:这个功能仅当IFSMgr运行时有效,而不是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 = Unicode转换标志
                            位0 返回的长文件名含有无法转换的Unicode
                                字符,被下划线替代
                            位1 返回的短文件名含有无法转换的Unicode
                                字符,被下划线替代
     说明:这个功能仅当IFSMgr运行时有效,而不是DOS 7.0纯DOS模式
     对应老式的调用:AH=4FH
     请参考:附二、附三、附四
 
 十、移动(改名)文件
 
     入口:AX = 7156H
           DS:DX -> 旧的文件名(ASCIZ)
 	  ES:DI -> 新的文件名(ASCIZ)
     出口:中断调用后CF置位表示出错(AX存储出错代码),CF清零表示成功
     说明:文件可以改名到不同的目录,但必须是同一驱动器。
     对应老式的调用:AH=56H
 
 十一、TRUENAME
 
     入口: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 目录中找不到此文件(目录)或仅指定了盘符
                   03H 无效路径或无效盘符
           成功时ES:DI指向的存储区写入了返回的路径或文件名
     对应老式的调用:AH=60H
 
 十二、创建/打开文件
 
     入口:AX = 716CH
           BX = 访问模式和共享标志(附五)
           CX = 属性
           DX = 打开模式(附六)
           DS:SI -> 文件名(ASCIZ串)
           DI = 别名提示(在短文件名为了消除二义性的数字)
     出口:中断调用后CF置位表示出错(AX存储出错代码),CF清零表示成功
           成功时:AX = 文件句柄
                   CX = 0001H 文件被打开
                        0002H 文件被创建
                        0003H 文件被替换
     对应老式的调用:AH=6CH
     请参考:附一,附五,附六
    
 十三、读取卷信息
 
     入口: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
     对应老式的调用:无
     请参考:附七
 
 十四、结束文件查找
 
     入口: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指向的内存区被写入文件信息
     对应老式的调用:无
     请参考:附八
 
 十六、时间转换
 
     入口: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之间失败
     对应老式的调用:无
     请参考:附八
 
 十七、产生短文件名(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 = 访问模式和共享标志(附五)
           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
                02H 查询SUBST
                    DS:DX指向的内存区用于输出
           BL = 驱动器号 (00H=默认,01H=A:,等等)
           DS:DX -> 与驱动器关联的路径名(ASCIZ串)
     出口:中断调用后CF置位表示出错(AX存储出错代码),CF清零表示成功
     说明:只有BH=00H时BL才可为00H
     对应老式的调用:无
 
 二十、最后说明
 
     本文的原始资料来源于Ralf Brown's Interrupt List(英文版),这
 个中断大全包含的内容相当丰富,实在是一份很好的编程参考资料。
     由于本人水平有限,加上时间匆忙,翻译和整理得不是很好,不尽人意之
 处,请多多包含。若有不正确的地方,请指正。
     大家可以将本文随意传播,以服务于更多朋友,但敬请各位传播本文时务
 必保持其完整性,多谢了。
     过些时间我可能会写一些应用这些中断调用的例程,作为对本文的补充,
 完成后,会通过邮件列表geprogram(金鹰的程序员天地)发布,有兴趣的朋
 友可以加入此邮件列表,方法是:
     1、发一封空邮件到 [email protected]
     2、回复您收到的一封确认信
 
     与我联系,请Email至:[email protected]
                      或:[email protected]
 
     Gold Eagle
  Nov.26,1999 于广东东莞
 
 
 附一:文件属性各位的意义:
 
     位   描述
    ====  =================================
    7-8   保留(在Novell Netware中被使用)
      6   未使用
      5   存档(A)
      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   文件访问模式
          000 只读
          001 只写
          010 读写
          100 只读,且不改变文件的最后访问时间
    6-4   文件共享模式
      7   不继承标志
      8   不缓存数据(需要所有的读写精确到物理扇区)
      9   不压缩文件,即使此卷通常对文件进行压缩
     10   使用DI中指定的数字作为别名的尾部数字
  12-11	 未使用??? (0)
     13   打开文件时产生严重错误返回错误码而不调用INT 24H
     14   每次写操作均提交(commit)文件
 
 附六、Windows 95长文件名文件打开模式
 
     位   描述
    ====  =================================
      0   打开文件(如果文件不存在则失败)
      1   如果文件存在则清除(如果文件不存在则失败)
      4   如果文件不存在则创建新文件(如果文件存在则失败)
      
    说明:位0和位1不可同时设置
 
 附七、长文件名卷信息标志
 
     位   描述
    ====  =================================
      0   搜索时区分大小写
      1   目录中保存了大小写信息
      2   在文件和目录名中使用Unicode字符
   3-13   保留(0)
     14   支持DOS长文件名功能
     15   卷被压缩
 
 附八、Windows 95文件信息结构
 
   偏移  长度    描述
   ====  ======  ============================
    00H  DWORD   文件属性
    04H  QWORD   创建时间 (0 = 不支持)
    0CH  QWORD   最后访问时间 (0 = 不支持)
    14H  QWORD   最后写入时间
    1CH  DWORD   卷的序列号
    20H  DWORD   文件长度(高32位)
    24H  DWORD   文件长度(低32位)
    28H  DWORD   文件的链接(link)数
    2CH  DWORD   唯一文件标识(高32位)
    30H  DWORD   唯一文件标识(低32位)
 
   说明:在文件打开时,文件标识和卷的序列号一起唯一标识了一个文件,这
         个标识在系统重启或文件第一次打开时可能改变。
 
 ===========================全 文 完=============================
  -- 行侠仗义吾本性,展翅翱翔天地间
 请加入我创建的邮件列表“金鹰的程序员天地”:
 (发一封空邮件到 [email protected],
 再回复一封确认信就可以了)
  ※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: 202.103.182.36]
  | 
 
 
 |