精华区 [关闭][返回]

当前位置:网易精华区>>讨论区精华>>编程开发>>● 软件开发>>软件体系结构及资料汇编>>处理Windows 95长文件名的中断详解

主题:处理Windows 95长文件名的中断详解
发信人: goldeagle()
整理人: zelor(2000-03-02 05:27:02), 站内信件
【 以下文字转载自 CLanguage 讨论区 】
【 原文由 金鹰 所发表 】

              处理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]
--
※ 转载:.月光软件站 http://www.moon-soft.com.[FROM: 202.103.182.36]

[关闭][返回]