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

📄 int13.hpp

📁 命令行方式的硬盘工具 可以在dos和nt下运行。 需要djgpp和vs7.0以上
💻 HPP
字号:
/*

Extended int 13h (128Gb) v0.7.1write by 鐎涙瑥鐤傚?
5-29-2002

0.7.2		9-27-2004
0.7.3		9-29-2004

*/

#ifndef _INT13_H
#define _INT13_H

#ifdef _WIN32

#ifndef _INC_WINDOWS
#include <windows.h>
#endif

#ifndef _WINIOCTL_
#include <Winioctl.h>
#endif

#endif //_WIN32

#ifndef __commcpp_h
#include "commcpp.hpp"
#endif

#ifndef _INCLUDE_SLIB_ERROR_HPP_INCLUDE
#include "slib_error.hpp"
#endif

namespace SLib {

const int   c_iMAX_DISKS                            =8;
const unsigned int      c_uBYTES_PER_SECTOR         =512;
const DWORD c_INT13_MAX_DJ_NSECTORS         =126;
const DWORD c_INT13_MAX_NSECTORS            =126;
const WORD c_wCINT13_DISK_READ				=0X4200;
const WORD c_wCINT13_DISK_WRITE 			=0X4300;
const WORD c_wCINT13_DISK_RESET				=0X4100;
const WORD c_wCINT13_DISK_GET_EXT_INFO      =0X4800;
const DWORD c_dwCINT13_MAX_DOS_BUF			=64*1024;

#ifdef __DJGPP__

#ifndef __dj_include_sys_movedata_h_
#include <sys/movedata.h>
#endif


#ifndef __dj_include_go32_h_
#include <go32.h>
#endif

#endif

////#pragma pack(push)
#pragma pack(1)

typedef struct _DISK_EX_INT13_INFO
{
    WORD ExBufferSize;
    WORD ExFlags;
    DWORD ExCylinders;
    DWORD ExHeads;
    DWORD ExSectorsPerTrack;
    DWORD64 ExSectorsPerDrive;
    WORD ExSectorSize;
    WORD ExOffset;
	WORD ExSegment;
	WORD Unknown1;
	DWORD Unknown2;
	char IdeName[13];
	WORD Port;
	BYTE Unknown3[21];
	WORD Unknown4;
	
	_DISK_EX_INT13_INFO(void)
	{
		memset(this, 0, sizeof(_DISK_EX_INT13_INFO));
		ExBufferSize = sizeof(_DISK_EX_INT13_INFO);
	};

} DISK_EX_INT13_INFO, *PDISK_EX_INT13_INFO;

typedef struct tagHardDiskInfo
{
    WORD wTotalLogicalCyls;
    BYTE byLogicalHeads;
    BYTE bySignedByte;
    BYTE byPhySectsPerTrack;
    WORD unused0;
    BYTE unused1;
    BYTE byContrlCode;
    WORD wTotalPhyCyls;
    BYTE byTotalPhyHeads;
    WORD unused2;
    BYTE byLogicalSectsPerTrack;
    BYTE byCheckByte;
}PHY_HARD_INFO,*PPHY_HARD_INFO;


typedef struct tagInt13AddrPackage
{
    BYTE bySize;			//current = 0x10
    BYTE unused1;			//alreads = 0
    WORD wnSectors;
    WORD wBufOffset;
    WORD wBufSeg;
    DWORD64 ddwStartSector;//64 bits
    tagInt13AddrPackage(void)
    {
        bySize=sizeof(tagInt13AddrPackage);
        unused1=0;
    };
}INT13_ADDR_PACKAGE,*PINT13_ADDR_PACKAGE;

typedef struct tagInt13XAddrPackage
{
	DWORD StartSector;
	WORD  nSectos;
	DWORD pBuf;
}INT13X_ADDR_PACKAGE,*PINT13_XADDR_PACKAGE;

class CInt13 
{
public:

    CInt13(    CSError *pError);
    CInt13(unsigned int dqPhyDiskNumber,CSError *pError);               //dqPhyDiskNumber: 0x80 =第一个硬盘 0x81=第二个硬盘
    virtual ~CInt13();
    string GetPhyDiskParameter(void);
    BOOL SetPhyDiskNumber(unsigned int dqPhyDiskNumber);  //dqPhyDiskNumber: 0x80 =第一个硬盘 0x81=第二个硬盘
    //刷新硬盘
    int RefreshHd(void);
    //return: 非零成功,=0失败,用GetLastError取得错误
    BOOL ReadSector( IN DWORD64 u64StartSectorNumber,IN DWORD dqnSectors,OUT void *pBuf);
    //return: 非零成功,=0失败,用GetLastError取得错误
    BOOL WriteSector( IN DWORD64 u64StartSectorNumber,IN DWORD dqnSectors,IN void *pBuf);
	int GetActiveDisk(void){return m_iDiskNumber;};

protected:
    CSError *m_pError;
    int		m_iTotalHD;
    int     m_iDiskNumber;
    //DWORD    m_dwErrCode;
    int Init(void);
    void CloseHD(void);
    int DetectPhyDisk(void);              //return: 物理磁盘个数

#ifdef _WIN32


typedef struct {
  unsigned long size;
  unsigned long pm_offset;
  unsigned short pm_selector;
  unsigned short rm_offset;
  unsigned short rm_segment;
} _go32_dpmi_seginfo;

	HANDLE					m_hPhysicalDrive[c_iMAX_DISKS];
    DISK_GEOMETRY			*m_pDiskGeometry[c_iMAX_DISKS];
//    DISK_PARTITION_INFO *m_pDiskPartitionInfo[c_iMAX_DISKS];
//    DISK_DETECTION_INFO *m_pDiskDetectionInfo[c_iMAX_DISKS];
    void GetDiskParameter(HANDLE diskHandle,int diskNumber);
#endif // _WIN32

#ifdef __DJGPP__   
	INT13X_ADDR_PACKAGE		m_Int13XAddrPackage;
	INT13_ADDR_PACKAGE		m_Int13AddrPackage;
	_go32_dpmi_seginfo m_DosBuf;	
	_go32_dpmi_seginfo m_DosSegDpmiInfo;
	WORD CallInt13(WORD function,DWORD64 startSector,WORD nsectors,void *pbuf);
	WORD GetExtInfo(DISK_EX_INT13_INFO *pbuf);
    //int WorkOnce(PINT13IOBUFF pin);

#endif //__DJGPP__

	PHY_HARD_INFO       m_PhyHardInfo[c_iMAX_DISKS];
    DISK_EX_INT13_INFO   m_LogicalHardInfo[c_iMAX_DISKS];
    // 取得上次操作的错误代码
//    DWORD GetLastError(void);
};

////#pragma pack(pop)

}; // namespace SLib {

#endif //_INT13_H

⌨️ 快捷键说明

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