📄 int13.cpp
字号:
/*
Command Line Tools for DOS(V32) Prgram v0.1.1 write by 孙宝建
6-20-2004
(暂停)
Extend int 13h (128Gb) v1.1 write by
0.7.2 9-27-2004
0.7.3 9-29-2004
0.7.4 3-09-2005
*/
#include "stdafx.h"
#ifndef _INCLUDE_SLIB_FUNC_HPP_INCLUDE
#include "slib_func.hpp"
#endif
#ifdef _WIN32
#ifndef _INC_WINDOWS
#include <windows.h>
#endif
#ifndef _WINIOCTL_
#include <Winioctl.h>
#endif
#endif //_WIN32
#ifndef _INCLUDE_SLIB_ERROR_HPP_INCLUDE
#include "slib_error.hpp"
#endif
#ifndef _INT13_H
#include "int13.hpp"
#endif
using namespace SLib;
SLIB_DEFINE_FILE_NAME_VARIABLE
S_LIB_BEGIN
#ifdef __DJGPP__
/*
int CInt13::Work( INT13IOBUFF &in)
{
m_Param=p;
switch(p.uCommand)
{
case c_CINT13_DISK_READ:
case c_CINT13_DISK_WRITE:Work() ;break;
case c_wCINT13_DISK_RESET:DetectHDByPort(); break;
default: m_dwErrCode=ERR_UNKNOW_ERROR;
}
return m_dwErrCode;
unsigned int ulStatSects=in.ddwStartSector ;
CHAR *pStartBuf=in.pBuff;
unsigned int uCount=in.unSectors;
int ret;
if(uCount>c_INT13_MAX_DJ_NSECTORS)
{
in.bynSectors=c_INT13_MAX_DJ_NSECTORS;
for(unsigned int i=0;(i+c_INT13_MAX_DJ_NSECTORS)<=uCount;i+=c_INT13_MAX_DJ_NSECTORS)
{
ret=WorkOnce(&in);
in.pBuff+=c_INT13_MAX_DJ_NSECTORS*c_uBYTES_PER_SECTOR;
in.ddwStartSector+=c_INT13_MAX_DJ_NSECTORS;
}
in.bynSectors=uCount%c_INT13_MAX_DJ_NSECTORS;
if(in.bynSectors!=0)
ret=WorkOnce(&in);
}
else
{
in.bynSectors=uCount;
ret=WorkOnce(&in);
}
in.ddwStartSector=ulStatSects ;
in.pBuff=pStartBuf;
in.unSectors=uCount;
return ret;
}
void CInt13::Work(void)
{
if(m_Param.ucDiskNumber<0x80||m_Param.ucDiskNumber>=0x84)
{
m_dwErrCode=ERR_CINT13_NO_DISK;
return ;
}
m_Param.ucDiskNumber-=0x80;
if(!m_Port[m_Param.ucDiskNumber].bIsExist)
{
m_dwErrCode=ERR_CINT13_NO_DISK;
return ;
}
unsigned int uCount=m_Param.unSectors;
if(m_Param.unSectors>c_INT13_MAX_NSECTORS)
{
m_Param.unSectors=c_INT13_MAX_NSECTORS;
for(unsigned int i=0;(i+c_INT13_MAX_NSECTORS)<=uCount;i+=c_INT13_MAX_NSECTORS)
{
WorkOnce();
if(m_dwErrCode)
return ;
m_Param.pBuff+=c_INT13_MAX_NSECTORS*c_uBYTES_PER_SECTOR;
m_Param.ddwStartSector+=c_INT13_MAX_NSECTORS;
}
m_Param.unSectors=uCount%c_INT13_MAX_NSECTORS;
if(m_Param.unSectors)
WorkOnce();
}
else
{
WorkOnce();
}
}
void CInt13::WorkOnce(void)
{
CommonInit();
if(!IsControllerReady())
return ;
if(!IsDiskReady())
return ;
if(!LoadParam())
return ;
if(!IsTrackReady())
return;
IRQ14(TRUE);
switch(m_Param.uCommand)
{
case c_CINT13_DISK_READ:
outportb(m_Port[m_Param.ucDiskNumber].wStartPort1+7,COMMAND_READ);
Read();break;
case c_CINT13_DISK_WRITE:
outportb(m_Port[m_Param.ucDiskNumber].wStartPort1+7,COMMAND_WRITE);
Write();break;
case c_wCINT13_DISK_RESET:
outportb(m_Port[m_Param.ucDiskNumber].wStartPort1+7,COMMAND_GET_INFO);
Read();break;
default:m_dwErrCode=ERR_UNKNOW_ERROR;return;
}
IRQ14(FALSE);
IsWrong();
Reset();
if(m_dwErrCode!=ERR_NO_ERROR)
{
Reset();
}
}
*/
#endif //__DJGPP__
CInt13::CInt13(CSError *pError) :m_pError(pError)
{
SVERIFY_ARGUMENTS(pError!=NULL);
Init();
}
CInt13::CInt13(unsigned int dqPhyDiskNumber, CSError *pError) :m_pError(pError)
//dqPhyDiskNumber: 0x80 =第一个硬盘 0x81=第二个硬盘
{
assert((dqPhyDiskNumber>=0x80) && (dqPhyDiskNumber< (c_iMAX_DISKS+0x80) ) );
Init();
m_iDiskNumber=dqPhyDiskNumber; //在init后
}
CInt13::~CInt13()
{
#ifdef _WIN32
for(int i=0;i<c_iMAX_DISKS;i++)
{
if(m_pDiskGeometry[i]!=NULL)
{
delete []m_pDiskGeometry[i];
}
}
CloseHD();
#endif //_WIN32
#ifdef __DJGPP__
_go32_dpmi_free_dos_memory(&m_DosSegDpmiInfo);
_go32_dpmi_free_dos_memory(&m_DosBuf);
#endif //__DJGPP__
}
int CInt13::DetectPhyDisk(void)
{
#ifdef _WIN32
CHAR drive[]="\\\\.\\PHYSICALDRIVE0";
m_iTotalHD=0;
for(int i=0;i<c_iMAX_DISKS;i++)
{
drive[17]=i+'0';
m_hPhysicalDrive[m_iTotalHD]=CreateFile(drive,GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,0,OPEN_EXISTING,0,0);
if(m_hPhysicalDrive[m_iTotalHD]!=INVALID_HANDLE_VALUE)
{
GetDiskParameter(m_hPhysicalDrive[m_iTotalHD],m_iTotalHD);
m_iTotalHD++;
}
else
{
DWORD error = ::GetLastError();
if (error != ERROR_FILE_NOT_FOUND)
{
m_pError->AddError(error);
}
}
}
#endif //_WIN32
#ifdef __DJGPP__
BYTE buf[c_uBYTES_PER_SECTOR];
for (int i=0; i<c_iMAX_DISKS; i++)
{
m_iDiskNumber = 0X80+i;
if (GetExtInfo(&m_LogicalHardInfo[i]) == 0)
{
m_iTotalHD++;
if (m_LogicalHardInfo[i].ExBufferSize > 0x1a)
{
dosmemget(m_LogicalHardInfo[i].ExSegment*16+m_LogicalHardInfo[i].ExOffset,
sizeof(PHY_HARD_INFO), &m_PhyHardInfo[i]);
}
}
else
break;
}
m_iDiskNumber = 0X80;
#endif //__DJGPP__
return m_iTotalHD;
}
#ifdef __DJGPP__
WORD CInt13::GetExtInfo(DISK_EX_INT13_INFO *pbuf)
{
__dpmi_regs r2;
dosmemput(pbuf, sizeof(DISK_EX_INT13_INFO), m_DosSegDpmiInfo.rm_segment*16);
r2.x.ax = c_wCINT13_DISK_GET_EXT_INFO;
r2.h.dh = 0;
r2.h.dl = (BYTE)(m_iDiskNumber&0xff);
r2.x.cx = 0;
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);
dosmemget(m_DosSegDpmiInfo.rm_segment*16, sizeof(DISK_EX_INT13_INFO), pbuf);
return r2.x.ax>>8;
}
#endif //__DJGPP__
#ifdef _WIN32
void CInt13::GetDiskParameter(HANDLE diskHandle,int diskNumber)
{
// if(!GetFileSizeEx(diskHandle,(PLARGE_INTEGER) &m_LogicalHardInfo[diskNumber].ExSectorsPerDrive))
// {
// m_pError->AddError(::GetLastError());
// }
DWORD bufsize=1024*1024;
DWORD nOutBufferSize; // size of output buffer
DWORD lpBytesReturned; // number of bytes returned
m_pDiskGeometry[diskNumber]=(DISK_GEOMETRY *) new BYTE [bufsize];
if(!DeviceIoControl(diskHandle,IOCTL_DISK_GET_DRIVE_GEOMETRY,NULL, 0,
(LPVOID) m_pDiskGeometry[diskNumber],bufsize,& lpBytesReturned, NULL) )
{
m_pError->AddError(::GetLastError());
m_pError->AddError(ERR_CINT13_BUF_SMALL);
return;
}
delete []m_pDiskGeometry[diskNumber];
m_pDiskGeometry[diskNumber]=(DISK_GEOMETRY *) new BYTE [lpBytesReturned+1];
if(!DeviceIoControl(diskHandle,IOCTL_DISK_GET_DRIVE_GEOMETRY,NULL, 0,
(LPVOID) m_pDiskGeometry[diskNumber],lpBytesReturned+1,& nOutBufferSize, NULL))
{
m_pError->AddError(::GetLastError());
m_pError->AddError(ERR_CINT13_BUF_SMALL);
return;
}
m_LogicalHardInfo[diskNumber].ExCylinders=m_pDiskGeometry[diskNumber]->Cylinders.LowPart; ///bug bug
m_LogicalHardInfo[diskNumber].ExSectorsPerTrack=m_pDiskGeometry[diskNumber]->SectorsPerTrack;
m_LogicalHardInfo[diskNumber].ExSectorSize=m_pDiskGeometry[diskNumber]->BytesPerSector;
m_LogicalHardInfo[diskNumber].ExHeads=m_pDiskGeometry[diskNumber]->TracksPerCylinder;
m_LogicalHardInfo[diskNumber].ExFlags=m_pDiskGeometry[diskNumber]->MediaType;
//m_pDiskPartitionInfo[diskNumber]=DiskGeometryGetPartition(&m_pDiskGeometry[diskNumber]);
//m_pDiskDetectionInfo[diskNumber]=DiskGeometryGetDetect(&m_pDiskGeometry[diskNumber]);
//memcpy(&m_LogicalHardInfo[diskNumber],&m_pDiskDetectionInfo[diskNumber]->ExInt13,sizeof(DISK_EX_INT13_INFO));
/*m_PhyHardInfo[diskNumber].wTotalPhyCyls= diskInfo.Geometry.Cylinders;
m_PhyHardInfo[diskNumber].byLogicalSectsPerTrack=diskInfo.Geometry.SectorsPerTrack;
m_PhyHardInfo[diskNumber].byLogicalHeads=diskInfo.Geometry.TracksPerCylinder;
m_PhyHardInfo[diskNumber].bySignedByte=diskInfo.Geometry.MediaType;
m_PhyHardInfo[diskNumber].diskInfo.DiskSize.QuadPart;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -