使用 DeviceIoControl 透過 IOCTL_DISK_GET_DRIVE_GEOMETRY取得磁碟大小的問題 |
答題得分者是:aftcast
|
davidsun
初階會員 發表:57 回覆:71 積分:25 註冊:2002-04-14 發送簡訊給我 |
Greeting
我使用 DeviceIoControl 透過 IOCTL_DISK_GET_DRIVE_GEOMETRY ,可以得知磁碟的 Cylinders (A) MediaType TracksPerCylinder (B) SectorsPerTrack (C) BytesPerSector (D) 所以磁碟的總容量是 A * B * C * D (Bytes) ,但是這樣還是不對,因為會有剩餘的 sector 數目的問題,例如剩下 1000 個 sector , 因為這些 sector 不足 1 個 Cylinders ,所以正確的容量應該是 A * B * C * D (剩餘 Sectors * D ) Bytes 才對,問題是我要如何得知剩餘的 sectors 數目呢? 我使用 WinHEX 的時候,看到他可以顯示此資訊 ( Surplus sectors at end ) , 所以我覺得應該是可以才對。還請各位賜教。 謝謝您。 PS : 請不要使用 GetDiskFreeSpaceEx 這類的 API,因為磁碟沒有製作任何的格式 (FAT, FAT32, NTFS) ,所以這些API 就不能用 |
davidsun
初階會員 發表:57 回覆:71 積分:25 註冊:2002-04-14 發送簡訊給我 |
|
aftcast
站務副站長 發表:81 回覆:1485 積分:1763 註冊:2002-11-21 發送簡訊給我 |
對於你的project我覺得很感興趣,目的是什麼? ^_^
對於你的述訴我覺得觀念上好像有些小問題。 就尚未格式化前,總容量是A*B*C*D沒錯。而你覺得有錯? Surplus sectors at end這個觀念應該是用在當格式化後,因windows系列都是採cluster的關念來處理檔案系統,比如說1cluster=4kb=8sectors 的ntfs結構。當一個track的sector數若不是8的倍數時,就不會不足一個cluster,於是就不會被系統所用到。而這些sectors就是Surplus sectors at end。 然而要注意的是不同的file system與hd大小,會有不同的cluster size。不一定都是8sectors。於是計算上就要去了解該logical volume的cluster是多少sectors。 該使用什麼api來計算你想要知道的答案,我目前也不清楚。但觀念上有助於找答案。有時間我也去找找再和你討論!
------
蕭沖 --All ideas are worthless unless implemented-- C++ Builder Delphi Taiwan G+ 社群 http://bit.ly/cbtaiwan |
davidsun
初階會員 發表:57 回覆:71 積分:25 註冊:2002-04-14 發送簡訊給我 |
我的 Project 是要對 NAMD Flash 做測試,因為我們在做 Flash Control Card 的 Firmware, 要測試 FW 是否可以正常運作。電腦在開機的時候, BIOS 會送出 AT 指令,如果 FW 正常運作,則應該回應 BIOS 的詢問,BISO 才才能知道這張卡的存在。只要 BISO 知道,那這張卡有沒有格式化 (FAT , FAT32 , NTFS ) 就不重要了,因為格式化,是為了作業系統的檔案系統而用的。 BISO 會知道這張卡的相關資訊,例如 Cylinders等...
因為 Flash Card 的 AT 指令都是以 sector 為單位,所以我們要測試 FW 是否正常,就以 Sector 為單位來做讀寫測試 (SLC, MLC 會不一樣)。從 sector 0 開始,一直到最後,很明顯的, Flash 記憶體上的內容都是我們寫的測試資料,通常都是寫入 0x55, 0xaa , 0x00 , 0x01....(因為要方便邏輯分析儀來分析使用) ,因此 OS (WinXP, Vista.)就不可能認得這張卡 ( 但是 BISO 認得 ) , 所以我才說一般的 API 是不能用的。 這個問題我已經解決了,就是使用我第二篇所說的方法即可。 PS : 在 NAMD Falsh 中,規格會是 有 X 個 Block , 每個 Block 有 Y 個 Sector , 每個 Sectos 絕對都是 512Bytes, 所以總容量會是 X * Y * 512 |
davidsun
初階會員 發表:57 回覆:71 積分:25 註冊:2002-04-14 發送簡訊給我 |
謝謝您的指正,我剛剛去爬文,硬碟的空間計算方式如同您所說,就是 A*B*C*D , 但是 NAMD Flash 就不是如此了,例如 K9G4G 這顆 NAMD Flash , 規格是
2048 Block * 512 Sectos = 1048576 Sector (這顆 Flash 的總 Sectors ) 如果設定是 Cylinders = 65 , TracksPerCylinder = 255 SectorsPerTrack = 63 則 Total sectos = 1044255 還剩下 4351 個 sector , 所以在 NAMD Flash 上 Surplus sectors at end 就產生了 ===================引 用 aftcast 文 章=================== 對於你的project我覺得很感興趣,目的是什麼? ^_^ 對於你的述訴我覺得觀念上好像有些小問題。 就尚未格式化前,總容量是A*B*C*D沒錯。而你覺得有錯? Surplus sectors at end這個觀念應該是用在當格式化後,因windows系列都是採cluster的關念來處理檔案系統,比如說1cluster=4kb=8sectors 的ntfs結構。當一個track的sector數若不是8的倍數時,就不會不足一個cluster,於是就不會被系統所用到。而這些sectors就是Surplus sectors at end。 然而要注意的是不同的file system與hd大小,會有不同的cluster size。不一定都是8sectors。於是計算上就要去了解該logical volume的cluster是多少sectors。 該使用什麼api來計算你想要知道的答案,我目前也不清楚。但觀念上有助於找答案。有時間我也去找找再和你討論! |
aftcast
站務副站長 發表:81 回覆:1485 積分:1763 註冊:2002-11-21 發送簡訊給我 |
謝謝你的解說,我也學到一些nand flash的知識!
剛突然了解你說的問題與我開始認知的不一樣,是我想偏了。你的問題在討論物理上sectors map CHS (類似LBA MAP CHS)的相關議題。而我確把它想成在file system(格式化後)的問題。 這是二個不同但又類似的問題。當所有的blocks要map至老式的chs結構時,會有剩下sectors無能定位的情形。 而我一直把你講的"剩下的sectors"當作是files system因為最後不滿一個cluster時所剩下的sectors。 都是"剩下的sectors",但你是指物理上mapping chs所產生的剩餘。我指的是file system上不足一個cluster所剩下的sectors。 不過,這二個觀念都很重要就是! PS你的程式碼都寫的很漂亮,值的讚許!
------
蕭沖 --All ideas are worthless unless implemented-- C++ Builder Delphi Taiwan G+ 社群 http://bit.ly/cbtaiwan |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |