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

📄 int13.cpp

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