📄 int13.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 + -