www.pudn.com > IdeDiskInfo.zip > GetIdeDiskInfo.h


 
#if !defined(GET_IDE_DISK_INFO_H__) 
#define GET_IDE_DISK_INFO_H__ 
 
#if _MSC_VER > 1000 
#pragma once 
#endif // _MSC_VER > 1000 
 
#include  
 
// IOCTL控制码 
//#define  DFP_SEND_DRIVE_COMMAND   0x0007c084 
#define  DFP_SEND_DRIVE_COMMAND   CTL_CODE(IOCTL_DISK_BASE, 0x0021, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) 
//#define  DFP_RECEIVE_DRIVE_DATA   0x0007c088 
#define  DFP_RECEIVE_DRIVE_DATA   CTL_CODE(IOCTL_DISK_BASE, 0x0022, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) 
 
#define  FILE_DEVICE_SCSI         0x0000001b 
#define  IOCTL_SCSI_MINIPORT_IDENTIFY  ((FILE_DEVICE_SCSI << 16) + 0x0501) 
#define  IOCTL_SCSI_MINIPORT 0x0004D008		//  see NTDDSCSI.H for definition 
 
// ATA/ATAPI指令 
#define  IDE_ATA_IDENTIFY			 0xEC   //  ATA的ID指令(IDENTIFY DEVICE) 
 
// IDE命令寄存器 
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; 
 
// IDE的ID命令返回的数据 
// 共512字节(256个WORD),这里仅定义了一些感兴趣的项 
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; 
 
// 函数 
HANDLE OpenDevice(LPCTSTR filename); 
BOOL IdentifyDevice(HANDLE hDevice, PIDINFO pIdInfo); 
BOOL IdentifyDeviceAsScsi(HANDLE hDevice, int nDrive, PIDINFO pIdInfo); 
BOOL GetPhysicalDriveInfoInNT(int nDrive, PIDINFO pIdInfo); 
BOOL GetIdeDriveAsScsiInfoInNT(int nDrive, PIDINFO pIdInfo); 
 
#endif // !defined(GET_IDE_DISK_INFO_H__)