處理Windows 95的長檔名中斷詳解 (轉)
處理Windows 95的長檔名中斷詳解 (轉)[@more@]處理 95的長名中斷詳解
很多朋友在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執行時有效,而不是D7.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指向的記憶體區被填充為“”、“NTFS”、
“CDFS”等
: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 -> Q格式檔案時間
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、發一封空郵件到 sml-geprogram-subscribe@mylist.soim.com
2、回覆您收到的一封確認信
與我聯絡,請E至:goldeagle@cmmail.com
或:pengyin@yeah
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位)
說明:在檔案開啟時,檔案標識和卷的序列號一起唯一標識了一個檔案,這
個標識在系統重啟或檔案第一次開啟時可能改變。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-990729/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- tar不能處理長檔名
- 批處理中的for詳解(轉載)
- windows的各種副檔名詳解Windows
- 批處理中的for詳解
- 處理檔名內含有特殊字元的檔案 (轉)字元
- SHELL技巧:處理檔名中的那些空格
- windows批處理之五-for語句中的檔名擷取Windows
- 中斷和中斷處理程式
- 詳解Bash命令列處理(轉)命令列
- Windows系統檔案詳解(轉)Windows
- Windows XP登錄檔詳解(轉)Windows
- 演示中斷處理的例項(例項六)(轉)
- linux核心分析筆記----中斷和中斷處理程式【轉】Linux筆記
- 【Python】模擬windows檔名排序(自動處理檔名中有數字型別排序)PythonWindows排序型別
- 批量處理檔名稱(上)
- P處理 批量更改檔名
- Windows批處理檔案Windows
- 在Visual Basic中終止Windows 95 (轉)Windows
- windows自帶刪除forfiles命令批處理詳解Windows
- 檔案下載檔名亂碼處理
- UNIX的檔案處理(轉)
- Nucleus中斷處理過程!!!!
- 處理器Cortex的名詞解釋
- Windows系統中鮮為人知啟動檔案詳解(轉)Windows
- Linux核心模組程式設計--中斷處理程式(轉)Linux程式設計
- 中斷機制和中斷描述符表、中斷和異常的處理
- DG歸檔日誌斷檔時間過長如何處理(DG全庫恢復)
- PHP-如何處理檔名亂碼PHP
- Linux核心實現中斷和中斷處理(一)Linux
- Linux 中斷處理淺析Linux
- Linux 中斷處理原理分析Linux
- 詳解AI開發中的資料預處理(清洗)AI
- Linux 核心中斷和中斷處理(1)Linux
- windows刪除檔案的批處理操作Windows
- Linux檔名小寫的好處(轉)Linux
- AD模數轉換(ADC)在音訊處理中的詳細深度講解音訊
- Spring MVC檔案請求處理詳解:MultipartResolverSpringMVC
- Python處理pdf檔案庫 - PyPDF2詳解Python