1. 程式人生 > >【VC】DeviceIoControl 函式 IOCTL 擴充套件控制程式碼。

【VC】DeviceIoControl 函式 IOCTL 擴充套件控制程式碼。

   //  IOCTL commands
#define  DFP_GET_VERSION          0x00074080

#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
#define SMART_GET_VERSION               CTL_CODE(IOCTL_DISK_BASE, 0x0020, METHOD_BUFFERED, FILE_READ_ACCESS)
#define SMART_SEND_DRIVE_COMMAND        CTL_CODE(IOCTL_DISK_BASE, 0x0021, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
#define SMART_RCV_DRIVE_DATA            CTL_CODE(IOCTL_DISK_BASE, 0x0022, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)

// 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; 
typedef struct _GETVERSIONOUTPARAMS
{
   BYTE bVersion;      // Binary driver version.
   BYTE bRevision;     // Binary driver revision.
   BYTE bReserved;     // Not used.
   BYTE bIDEDeviceMap; // Bit map of IDE devices.
   DWORD fCapabilities; // Bit mask of driver capabilities.
   DWORD dwReserved[4]; // For future use.
} GETVERSIONOUTPARAMS, *PGETVERSIONOUTPARAMS, *LPGETVERSIONOUTPARAMS;