全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:3912
推到 Plurk!
推到 Facebook!

使用 DeviceIoControl 透過 IOCTL_DISK_GET_DRIVE_GEOMETRY取得磁碟大小的問題

答題得分者是:aftcast
davidsun
初階會員


發表:57
回覆:71
積分:25
註冊:2002-04-14

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-09-25 16:11:31 IP:220.130.xxx.xxx 訂閱
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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-09-25 16:39:39 IP:220.130.xxx.xxx 訂閱
我找到一點線索了,

透過 IOCTL_DISK_GET_DRIVE_GEOMETRY_EX 來得到 DISK_GEOMETRY_EX,DISK_GEOMETRY_EX結構中有
LARGE_INTEGER  DiskSize;
應該可以得到總空間,如此可以反推算出剩餘的 sector 數目。

現在去試試看,如果真得可行,在PO出來
aftcast
站務副站長


發表:81
回覆:1485
積分:1763
註冊:2002-11-21

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-09-25 18:40:02 IP:60.248.xxx.xxx 訂閱
對於你的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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2008-09-25 21:35:38 IP:218.211.xxx.xxx 訂閱
我的 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 重新編輯於 2008-09-25 21:40:02, 註解 無‧
davidsun 重新編輯於 2008-09-25 23:04:21, 註解 無‧
davidsun
初階會員


發表:57
回覆:71
積分:25
註冊:2002-04-14

發送簡訊給我
#5 引用回覆 回覆 發表時間:2008-09-25 23:17:22 IP:218.211.xxx.xxx 訂閱
謝謝您的指正,我剛剛去爬文,硬碟的空間計算方式如同您所說,就是 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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2008-09-26 18:39:21 IP:60.248.xxx.xxx 訂閱
謝謝你的解說,我也學到一些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
編輯記錄
aftcast 重新編輯於 2008-09-26 19:45:02, 註解 無‧
aftcast 重新編輯於 2008-09-26 19:49:44, 註解 無‧
aftcast 重新編輯於 2008-09-26 20:01:08, 註解 無‧
系統時間:2024-04-25 8:24:52
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!