📄 int13.cpp
字号:
diskInfo.Data
*/
//diskInfo.Geometry.BytesPerSector;
}
#endif //_WIN32
int CInt13::Init(void)
{
m_iTotalHD=0;
m_iDiskNumber=0x80;
#ifdef _WIN32
for(int i=0;i<c_iMAX_DISKS;i++)
{
m_hPhysicalDrive[i]=INVALID_HANDLE_VALUE;
m_pDiskGeometry[i]=NULL;
memset(&m_PhyHardInfo[i],0,sizeof(m_PhyHardInfo[0]));
memset(&m_LogicalHardInfo[i],0,sizeof(m_LogicalHardInfo[0]));
}
#endif //_WIN32
#ifdef __DJGPP__
memset(&m_DosSegDpmiInfo,0,sizeof(m_DosSegDpmiInfo) );
memset(&m_DosBuf,0,sizeof(m_DosBuf) );
m_DosSegDpmiInfo.size = (512+15) / 16;
m_DosBuf.size = (c_dwCINT13_MAX_DOS_BUF) / 16;
_go32_dpmi_allocate_dos_memory(&m_DosSegDpmiInfo);
_go32_dpmi_allocate_dos_memory(&m_DosBuf);
#endif //__DJGPP__
m_iTotalHD=DetectPhyDisk();
return 1;
}
int CInt13::RefreshHd(void)
{
CloseHD();
return DetectPhyDisk();
}
void CInt13::CloseHD(void)
{
#ifdef _WIN32
for(int i=0;i<m_iTotalHD;i++)
{
CloseHandle(m_hPhysicalDrive[i]);
m_hPhysicalDrive[i]=INVALID_HANDLE_VALUE;
}
#endif
}
string CInt13::GetPhyDiskParameter(void)
{
ostringstream ostr;
if(m_iTotalHD==0)
{
ostr<<"Hard Disk cannot detected!!!" << endl;
return ostr.str();
}
int diskNumber;//=m_iDiskNumber-0x80;
ostr.fill('0');
ostr.setf(ios_base::right,ios_base::adjustfield);
ostr.setf(ios_base::uppercase| ios_base::showbase);
ostr.setf(ios_base::hex,ios_base::basefield);
for(int i=0;i<m_iTotalHD;i++)
{
diskNumber=i;
ostr<< "Logical Hard Disk Information:" <<endl;
ostr<< "ExBufferSize:" << m_LogicalHardInfo[diskNumber].ExBufferSize <<endl;
ostr<< "ExFlags:" << m_LogicalHardInfo[diskNumber].ExFlags <<endl;
ostr<< "ExCylinders:" << m_LogicalHardInfo[diskNumber].ExCylinders <<endl;
ostr<< "ExHeads:" << m_LogicalHardInfo[diskNumber].ExHeads <<endl;
ostr<< "ExSectorsPerTrack:" << m_LogicalHardInfo[diskNumber].ExSectorsPerTrack <<endl;
ostr<< "ExSectorSize:" << m_LogicalHardInfo[diskNumber].ExSectorSize <<endl;
ostr<< "ExSectorsPerDrive:" <<setw(16)
<< m_LogicalHardInfo[diskNumber].ExSectorsPerDrive <<endl;
ostr<< "Physical Hard Disk Information:" <<endl;
ostr<< setw(2);
ostr<< "bySignedByte:" << (int)m_PhyHardInfo[diskNumber].bySignedByte <<endl;
ostr<< "wTotalLogicalCyls:" << m_PhyHardInfo[diskNumber].wTotalLogicalCyls <<endl;
ostr<< "byLogicalHeads:" << (int)m_PhyHardInfo[diskNumber].byLogicalHeads <<endl;
ostr<< "byLogicalSectsPerTrack:" << (int)m_PhyHardInfo[diskNumber].byLogicalSectsPerTrack <<endl;
ostr<< "wTotalPhyCyls:" << m_PhyHardInfo[diskNumber].wTotalPhyCyls <<endl;
ostr<< "byPhySectsPerTrack:" << (int)m_PhyHardInfo[diskNumber].byPhySectsPerTrack <<endl;
ostr<< "byTotalPhyHeads:" << (int)m_PhyHardInfo[diskNumber].byTotalPhyHeads <<endl;
ostr<< "TotallHardDisk: " << m_iTotalHD << setw(8) << " HDSize(GB):"
<< dec << m_LogicalHardInfo[diskNumber].ExSectorsPerDrive/2000000 << "(dec, 1KB=1000bytes)" << hex <<endl;
}
return ostr.str();
}
BOOL CInt13::SetPhyDiskNumber(unsigned int dqPhyDiskNumber) //dqPhyDiskNumber: 0x80 =第一个硬盘 0x81=第二个硬盘
{
assert((dqPhyDiskNumber>=0x80) && (dqPhyDiskNumber< (c_iMAX_DISKS+0x80) ) );
if((int)dqPhyDiskNumber<m_iTotalHD+0x80)
{
m_iDiskNumber=dqPhyDiskNumber;
return TRUE;
}
else
{
m_pError->AddError(ERR_CINT13_NO_DISK);
return FALSE;
}
}
#ifdef _WIN32
BOOL CInt13::ReadSector( IN DWORD64 u64StartSectorNumber,IN DWORD dqnSectors,OUT void *pBuf)
{
HANDLE htmpHandle=m_hPhysicalDrive[m_iDiskNumber-0x80];
if(htmpHandle==INVALID_HANDLE_VALUE)
{
m_pError->AddError(ERR_CINT13_NO_DISK);
return FALSE;
}
DWORD n;
LARGE_INTEGER iPos;
LARGE_INTEGER iNewPos;
iPos.QuadPart=u64StartSectorNumber*c_uBYTES_PER_SECTOR;
iNewPos.QuadPart=iPos.QuadPart;
iNewPos.u.LowPart=SetFilePointer(htmpHandle,iNewPos.u.LowPart,&iNewPos.u.HighPart,FILE_BEGIN);
if(iPos.QuadPart == iNewPos.QuadPart)
// if(SetFilePointerEx(htmpHandle,iPos,&iNewPos,FILE_BEGIN))
{
if(ReadFile(htmpHandle,pBuf,dqnSectors*c_uBYTES_PER_SECTOR,&n,NULL))
{
if(n==dqnSectors*c_uBYTES_PER_SECTOR)
return TRUE;
}
}
m_pError->AddError(::GetLastError());
return FALSE;
}
BOOL CInt13::WriteSector( IN DWORD64 u64StartSectorNumber,IN DWORD dqnSectors,IN void *pBuf)
{
HANDLE htmpHandle=m_hPhysicalDrive[m_iDiskNumber-0x80];
if(htmpHandle==INVALID_HANDLE_VALUE)
{
m_pError->AddError(ERR_CINT13_NO_DISK);
return FALSE;
}
DWORD n;
LARGE_INTEGER iPos;
LARGE_INTEGER iNewPos;
iPos.QuadPart=u64StartSectorNumber*c_uBYTES_PER_SECTOR;
iNewPos.QuadPart=iPos.QuadPart;
iNewPos.u.LowPart=SetFilePointer(htmpHandle,iNewPos.u.LowPart,&iNewPos.u.HighPart,FILE_BEGIN);
if(iPos.QuadPart == iNewPos.QuadPart)
// if(SetFilePointerEx(htmpHandle,iPos,&iNewPos,FILE_BEGIN))
{
if(WriteFile(htmpHandle,pBuf,dqnSectors*c_uBYTES_PER_SECTOR,&n,NULL))
{
if(n==dqnSectors*c_uBYTES_PER_SECTOR)
return TRUE;
}return TRUE;
}
m_pError->AddError(::GetLastError());
return FALSE;
}
#endif // _WIN32
#ifdef __DJGPP__
WORD CInt13::CallInt13(WORD function,DWORD64 startSector,WORD nsectors,void *pbuf)
{
if(nsectors>c_INT13_MAX_DJ_NSECTORS)
{
throw std::invalid_argument("CInt13::CallInt13");
}
__dpmi_regs r2;
m_Int13AddrPackage.wnSectors=nsectors;
m_Int13AddrPackage.ddwStartSector=startSector;
m_Int13AddrPackage.wBufOffset=m_DosBuf.rm_offset;
m_Int13AddrPackage.wBufSeg=m_DosBuf.rm_segment;
dosmemput(&m_Int13AddrPackage, sizeof(INT13_ADDR_PACKAGE), m_DosSegDpmiInfo.rm_segment*16);
if (function == c_wCINT13_DISK_WRITE)
{
dosmemput(pbuf, nsectors *512, m_DosBuf.rm_segment*16);
}
//r2.h.ah = function;
//r2.h.al = 0;
r2.x.ax = function;
r2.h.dh = 0;
r2.h.dl = (BYTE)(m_iDiskNumber&0xff);
r2.x.cx = 1;
r2.x.si = m_DosSegDpmiInfo.rm_offset;
r2.x.ds = m_DosSegDpmiInfo.rm_segment;
r2.x.es = m_DosSegDpmiInfo.rm_segment;
r2.x.ss = r2.x.sp = 0;
_go32_dpmi_simulate_int(0x13, &r2);
if (function == c_wCINT13_DISK_READ )
{
dosmemget(m_DosBuf.rm_segment*16,nsectors *512 ,pbuf);
}
return r2.x.ax>>8;
}
// cout<< "nsectors= " << nsectors
// << "startsector= " << startSector << endl;
// cout << "dosbuf.offset= " <<m_DosBuf.rm_offset
// << "dosbuf.segment= " << m_DosBuf.rm_segment <<endl;
// cout << "m_DosSegDpmiInfo.rm_segment= " << m_DosSegDpmiInfo.rm_segment <<endl;
// union REGS r;
// struct SREGS s;
// r.h.ah = function;
// r.h.al = 0;
/// r.x.dx = (WORD)(m_iDiskNumber&0xffff);
// r.x.cx = 0;
// r.x.bx = m_DosSegDpmiInfo.rm_offset;
/// s.ds = m_DosSegDpmiInfo.rm_segment;
// s.es = m_DosSegDpmiInfo.rm_segment;
// cout<< endl << "ax=" << r2.x.ax <<endl;
// cout<< "s.ds= " <<s.ds <<" s.es= " << s.es <<endl;
// cout<< "r2.dx= " <<r2.x.dx <<endl;
// int i=1;
// while(i!=0);
// int86x(0x13, &r, &r, &s);
// __dpmi_regs r2;
// r2.h.ah = 0x08;
// r2.h.dl = 0x80;
// r2.x.ss = r2.x.sp = 0;
// _go32_dpmi_simulate_int(0x13, &r2);
// printf("disk is %d cyl, %d head, %d sect\n",
// r2.h.ch | ( (r2.h.cl <<2 )&0x300),
// r2.h.dh, r2.h.cl & 0x3f);
/*
WORD CInt13::CallInt13(BYTE function,DWORD64 startSector,WORD nsectors,void *pbuf)
{
__dpmi_regs r;
r.h.ah = function;
r.h.al = m_iDiskNumber-0x80+2;
r.x.dx = 0x80;
r.x.cx = 0xffff;
r.x.si = m_DosSegDpmiInfo.rm_offset;
r.x.bx = m_DosSegDpmiInfo.rm_offset;
r.x.ds = m_DosSegDpmiInfo.rm_segment;
r.x.es = m_DosSegDpmiInfo.rm_segment;
r.x.ss = r.x.sp = 0;
m_Int13XAddrPackage.nSectos=nsectors;
m_Int13XAddrPackage.StartSector=startSector;
m_Int13XAddrPackage.pBuf=(DWORD)pbuf;
dosmemput(&m_Int13XAddrPackage, sizeof(INT13_ADDR_PACKAGE), m_DosSegDpmiInfo.rm_segment*16);
_go32_dpmi_simulate_int(0x13, &r);
dosmemget(m_DosBuf.rm_segment*16,nsectors *512 ,pbuf);
return r.x.ax>>8;
}
*/
BOOL CInt13::ReadSector( IN DWORD64 u64StartSectorNumber,IN DWORD dqnSectors,OUT void *pBuf)
{
WORD ret=CallInt13(c_wCINT13_DISK_READ,u64StartSectorNumber,dqnSectors,pBuf);
if(ret)
{
m_pError->AddError(ret+ERR_CINT13_ERR_BASE);
return FALSE;
}
return TRUE;
}
BOOL CInt13::WriteSector( IN DWORD64 u64StartSectorNumber,IN DWORD dqnSectors,IN void *pBuf)
{
WORD ret=CallInt13(c_wCINT13_DISK_WRITE,u64StartSectorNumber,dqnSectors,pBuf);
if(ret)
{
m_pError->AddError(ret+ERR_CINT13_ERR_BASE);
return FALSE;
}
return TRUE;
}
#endif //__DJGPP__
// 取得上次操作的错误代码
/*
DWORD CInt13::GetLastError(void)
{
return m_dwErrCode;
}
*/
}; // namespace SLib {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -