處理Windows 95的長檔名中斷詳解 (轉)

worldblog發表於2007-12-10
處理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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章