【VC】DeviceIoControl 函式 IOCTL 擴充套件控制程式碼。
阿新 • • 發佈:2019-02-17
// 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;