⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 do_diskdlg.h

📁 用于查看FAT表
💻 H
字号:
// Do_DiskDlg.h : header file
//

#if !defined(AFX_DO_DISKDLG_H__DFF66353_14C4_4A69_94DB_B6D5A89E381C__INCLUDED_)
#define AFX_DO_DISKDLG_H__DFF66353_14C4_4A69_94DB_B6D5A89E381C__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include  "Edata.h"
/////////////////////////////////////////////////////////////////////////////
// CDo_DiskDlg dialog
#include <winioctl.h>

// 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);
CString MakeIdeInfo(int nDrive, int nType, IDINFO *pIdInfo);
struct DISK_INF{
   char    d;               ;   //分区
   DWORD   secTotal         ;   //总扇区数
   long    resSec           ;   //保留扇区数
   long    secPerCylin      ;   //每磁道扇区数
   long    secPerCluster    ;   //每簇扇区数
   long    bytePerSector;       //每扇区字节数
   long    FATSecnum        ;   //Fat扇区个数
   long    FDTstart         ;   //FDT开始簇
};
class CDo_DiskDlg : public CDialog
{
// Construction
public:
	CDo_DiskDlg(CWnd* pParent = NULL);	// standard constructor
    BYTE  *cBuf;
	IDINFO IdInfo;
	CString inf;
	CFont font;
	char *pinf;     //显示数据到信息框
	DISK_INF  disk_inf; 
// Dialog Data
	//{{AFX_DATA(CDo_DiskDlg)
	enum { IDD = IDD_DO_DISK_DIALOG };
	CEdit	m_EData;
	CComboBox	m_CDriver;
	DWORD	m_ELogic;
	CString	m_ESearch;
	//}}AFX_DATA

	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CDo_DiskDlg)
	protected:
	virtual void DoDataExchange(CDataExchange* pDX);	// DDX/DDV support
	//}}AFX_VIRTUAL

// Implementation
protected:
	HICON m_hIcon;

	// Generated message map functions
	//{{AFX_MSG(CDo_DiskDlg)
	virtual BOOL OnInitDialog();
	afx_msg void OnPaint();
	afx_msg HCURSOR OnQueryDragIcon();
	afx_msg void OnChangeEData();
	afx_msg void OnChangeEDiskInfo();
	afx_msg void OnSize(UINT nType, int cx, int cy);
	afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);
	afx_msg void OnBboot();
	afx_msg void OnBmbr();
	afx_msg void OnBfat1();
	afx_msg void OnBfdt();
	afx_msg void OnChangeELogical();
	afx_msg void OnBLup();
	afx_msg void OnBLdown();
	afx_msg void OnBSearch();
	afx_msg void OnChangeESearch();
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()
private:
	void EnumDiskInfo();
	void ShowData(int secNum,DWORD num);
	BOOL ReadSectors(BYTE bDrive, DWORD dwStartSector, LPBYTE lpSectBuff);
	BOOL WriteSectors(BYTE bDrive, DWORD dwStartSector,  LPBYTE lpSectBuff);

};

//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_DO_DISKDLG_H__DFF66353_14C4_4A69_94DB_B6D5A89E381C__INCLUDED_)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -