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

📄 int13.cpp

📁 命令行方式的硬盘工具 可以在dos和nt下运行。 需要djgpp和vs7.0以上
💻 CPP
📖 第 1 页 / 共 2 页
字号:
    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 + -