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

請問在 WinXP 中,有什麼方法對硬碟的 physical sector 進行讀寫呢?

尚未結案
davidsun
初階會員


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

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-10-07 16:58:47 IP:220.130.xxx.xxx 訂閱
Greeting , 
我在使用 DOS 組合語言時,可以用 INT13,21,25,26 等。讀取、寫入硬碟的物理磁區,我這裡所說的是 physical sector , 而不是 logical sector , 在 Win95 中,也是可以利用 VWIN32 做到,但是到了 WinXP ,我爬了很多文,都說 XP 已經不對硬碟的直接讀寫提供支援。

平時我們在 WinXP 中,使用的 CreateFile, PhysicalDriveXX等,然後再使用 ReadFile , WriteFile ,其實都是對 logical sector 進行讀寫 ,請問在 WinXP 中。有什麼方法對 physical sector 進行讀寫呢?

謝謝您。
davidsun
初階會員


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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-10-09 00:51:22 IP:218.211.xxx.xxx 訂閱
我已經找到相關的資料了,隨然還沒有全部實做出來,但是已經可以利用 SMART command 來取得硬碟資料,首先必須先安裝 DDK , 建議使用 Win2003 Server SP1 的 DDK,然後透過下例的方式:


[code cpp]
typedef struct _IDEREGS
{
BYTE bFeaturesReg; // 特徵寄存器(用於SMART 命令)
BYTE bSectorCountReg; // 扇區數目寄存器
BYTE bSectorNumberReg; // 開始扇區寄存器
BYTE bCylLowReg; // 開始柱面低字節寄存器
BYTE bCylHighReg; // 開始柱面高字節寄存器
BYTE bDriveHeadReg; // 驅動器/磁頭寄存器
BYTE bCommandReg; // 指令寄存器
BYTE bReserved; // 保留
} IDEREGS, *PIDEREGS, *LPIDEREGS;

// 從驅動程序返回的狀態
typedef struct _DRIVERSTATUS
{
BYTE bDriverError; // 錯誤碼
BYTE bIDEStatus; // IDE狀態寄存器
BYTE bReserved[2]; // 保留
DWORD dwReserved[2]; // 保留
} DRIVERSTATUS, *PDRIVERSTATUS, *LPDRIVERSTATUS;

// IDE設備IOCTL輸入數據結構
typedef struct _SENDCMDINPARAMS
{
DWORD cBufferSize; // 緩衝區字節數
IDEREGS irDriveRegs; // IDE寄存器组
BYTE bDriveNumber; // 驅動器號
BYTE bReserved[3]; // 保留
DWORD dwReserved[4]; // 保留
BYTE bBuffer[1]; // 輸入緩衝區(此處象徵性地包含1字節)
} SENDCMDINPARAMS, *PSENDCMDINPARAMS, *LPSENDCMDINPARAMS;

// IDE設備IOCTL輸出數據結構
typedef struct _SENDCMDOUTPARAMS
{
DWORD cBufferSize; // 緩衝區字節數
DRIVERSTATUS DriverStatus; // 驅動程序返回狀態
BYTE bBuffer[1]; // 輸入緩衝區(此處象徵性地包含1字節)
} SENDCMDOUTPARAMS, *PSENDCMDOUTPARAMS, *LPSENDCMDOUTPARAMS;


typedef struct
{
IDEREGS IdeReg;
ULONG DataBufferSize;
UCHAR DataBuffer[1];
} ATA_PASS_THROUGH;

// IDE的ID命令返回的數據
// 共512字節(256個WORD),這裡假定義了一些感興趣的項(基本上依據ATA/ATAPI-4)
typedef struct _IDINFO
{
USHORT wGenConfig; // WORD 0: 基本信息字
USHORT wNumCyls; // WORD 1: 柱面数
USHORT wReserved2; // WORD 2: 保留
USHORT wNumHeads; // WORD 3: 磁頭數
USHORT wReserved4; // WORD 4: 保留
USHORT wReserved5; // WORD 5: 保留
USHORT wNumSectorsPerTrack; // WORD 6: 每磁道扇區數
USHORT wVendorUnique[3]; // WORD 7-9: 廠家設定值
CHAR sSerialNumber[20]; // WORD 10-19:序列號
USHORT wBufferType; // WORD 20: 缓衝類型
USHORT wBufferSize; // WORD 21: 缓衝大小
USHORT wECCSize; // WORD 22: ECC校驗大小
CHAR sFirmwareRev[8]; // WORD 23-26: 固件版本
CHAR sModelNumber[40]; // WORD 27-46: 内部型號
USHORT wMoreVendorUnique; // WORD 47: 廠家設定值
USHORT wReserved48; // WORD 48: 保留

struct {
USHORT reserved1:8;
USHORT DMA:1; // 1=支持DMA
USHORT LBA:1; // 1=支持LBA
USHORT DisIORDY:1; // 1=可不使用IORDY
USHORT IORDY:1; // 1=支持IORDY
USHORT SoftReset:1; // 1=需要ATA軟啟動
USHORT Overlap:1; // 1=支持重疊操作
USHORT Queue:1; // 1=支持命令隊列
USHORT InlDMA:1; // 1=支持交叉存取DMA
} wCapabilities; // WORD 49: 一般能力

USHORT wReserved1; // WORD 50: 保留
USHORT wPIOTiming; // WORD 51: PIO時序
USHORT wDMATiming; // WORD 52: DMA時序

struct {
USHORT CHSNumber:1; // 1=WORD 54-58有效
USHORT CycleNumber:1; // 1=WORD 64-70有效
USHORT UnltraDMA:1; // 1=WORD 88有效
USHORT reserved:13;
} wFieldValidity; // WORD 53: 後續字段有效性標誌

USHORT wNumCurCyls; // WORD 54: CHS可尋址的柱面數
USHORT wNumCurHeads; // WORD 55: CHS可尋址的磁頭數
USHORT wNumCurSectorsPerTrack; // WORD 56: CHS可尋址每磁道扇區數
USHORT wCurSectorsLow; // WORD 57: CHS可尋址的扇區數低位字
USHORT wCurSectorsHigh; // WORD 58: CHS可尋址的扇區數高位字

struct {
USHORT CurNumber:8; // 當前一次性可讀寫扇區數
USHORT Multi:1; // 1=已選擇多扇區讀寫
USHORT reserved1:7;
} wMultSectorStuff; // WORD 59: 多扇區讀寫設定
ULONG dwTotalSectors; // WORD 60-61: LBA可尋址的扇區數
USHORT wSingleWordDMA; // WORD 62: 單字節DMA支持能力

struct {
USHORT Mode0:1; // 1=支持模式0 (4.17Mb/s)
USHORT Mode1:1; // 1=支持模式1 (13.3Mb/s)
USHORT Mode2:1; // 1=支持模式2 (16.7Mb/s)
USHORT Reserved1:5;
USHORT Mode0Sel:1; // 1=已選擇模式0
USHORT Mode1Sel:1; // 1=已選擇模式1
USHORT Mode2Sel:1; // 1=已選擇模式2
USHORT Reserved2:5;
} wMultiWordDMA; // WORD 63: 多字節DMA支持能力

struct {
USHORT AdvPOIModes:8; // 支持高级POI模式數
USHORT reserved:8;
} wPIOCapacity; // WORD 64: 高级PIO支持能力

USHORT wMinMultiWordDMACycle; // WORD 65: 多字節DMA傳輸周期的最小值
USHORT wRecMultiWordDMACycle; // WORD 66: 多字節DMA傳輸周期的建議值
USHORT wMinPIONoFlowCycle; // WORD 67: 無流控制時PIO傳輸周期的最小值
USHORT wMinPOIFlowCycle; // WORD 68: 有流控制時PIO傳輸周期的最小值
USHORT wReserved69[11]; // WORD 69-79: 保留

struct {
USHORT Reserved1:1;
USHORT ATA1:1; // 1=支持ATA-1
USHORT ATA2:1; // 1=支持ATA-2
USHORT ATA3:1; // 1=支持ATA-3
USHORT ATA4:1; // 1=支持ATA/ATAPI-4
USHORT ATA5:1; // 1=支持ATA/ATAPI-5
USHORT ATA6:1; // 1=支持ATA/ATAPI-6
USHORT ATA7:1; // 1=支持ATA/ATAPI-7
USHORT ATA8:1; // 1=支持ATA/ATAPI-8
USHORT ATA9:1; // 1=支持ATA/ATAPI-9
USHORT ATA10:1; // 1=支持ATA/ATAPI-10
USHORT ATA11:1; // 1=支持ATA/ATAPI-11
USHORT ATA12:1; // 1=支持ATA/ATAPI-12
USHORT ATA13:1; // 1=支持ATA/ATAPI-13
USHORT ATA14:1; // 1=支持ATA/ATAPI-14
USHORT Reserved2:1;
} wMajorVersion; // WORD 80: 主版本

USHORT wMinorVersion; // WORD 81: 副版本
USHORT wReserved82[6]; // WORD 82-87: 保留

struct {
USHORT Mode0:1; // 1=支持模式0 (16.7Mb/s)
USHORT Mode1:1; // 1=支持模式1 (25Mb/s)
USHORT Mode2:1; // 1=支持模式2 (33Mb/s)
USHORT Mode3:1; // 1=支持模式3 (44Mb/s)
USHORT Mode4:1; // 1=支持模式4 (66Mb/s)
USHORT Mode5:1; // 1=支持模式5 (100Mb/s)
USHORT Mode6:1; // 1=支持模式6 (133Mb/s)
USHORT Mode7:1; // 1=支持模式7 (166Mb/s) ???
USHORT Mode0Sel:1; // 1=已選擇模式0
USHORT Mode1Sel:1; // 1=已選擇模式1
USHORT Mode2Sel:1; // 1=已選擇模式2
USHORT Mode3Sel:1; // 1=已選擇模式3
USHORT Mode4Sel:1; // 1=已選擇模式4
USHORT Mode5Sel:1; // 1=已選擇模式5
USHORT Mode6Sel:1; // 1=已選擇模式6
USHORT Mode7Sel:1; // 1=已選擇模式7
} wUltraDMA; // WORD 88: Ultra DMA支持能力
USHORT wReserved89[167]; // WORD 89-255
} IDINFO, *PIDINFO;

/*
// SCSI驅動所需的輸入輸出共用的結構
typedef struct _SRB_IO_CONTROL
{
ULONG HeaderLength; // 頭長度
UCHAR Signature[8]; // 特徵名稱
ULONG Timeout; // 超時時間
ULONG ControlCode; // 控制碼
ULONG ReturnCode; // 返回碼
ULONG Length; // 缓衝區長度
} SRB_IO_CONTROL, *PSRB_IO_CONTROL;
*/

[/code]

然後使用 CreateFile , DeviceIoControl 兩個 API,配合 DFP_RECEIVE_DRIVE_DATA, IOCTL_IDE_PASS_THROUGH 等方法即可。詳細的功能我還在測試中,但是已經可以取得硬碟裝置的基本資料了。
系統時間:2024-04-25 21:52:23
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!