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

📄 cmdtools.cpp

📁 命令行方式的硬盘工具 可以在dos和nt下运行。 需要djgpp和vs7.0以上
💻 CPP
📖 第 1 页 / 共 3 页
字号:
    bitset<32> binval;
	CBigInt bigInt;
    if( strin.fail())
        return ;
    switch(c)
    {
    case 'x':
        //strin>>hex>>tmp;break;
		tmp = CBigInt::HEX;
		break;
    case 'd':
        //strin>>dec>>tmp;break;
		tmp = CBigInt::DEC;
		break;
    //case 'o':
        //strin>>oct>>tmp;break;
		//bigInt.AtoI(s, CBigInt::);
	//	break;
    case 'b':
        //strin>>binval;
        //tmp=binval.to_ulong();
		tmp = CBigInt::BIN;
        break;
    default:;
		return ;
    }
	DWORD ret = bigInt.AtoI(s, tmp, 16);
	if (ret == ERR_SUCCESS)
    {
        m_pError->AddError(ERR_NO_ERROR);
        //cout<< "Hex:" <<hex << tmp
        //    << "   Dec:" <<dec << tmp
        //    << "   Oct:" <<oct << tmp
        //    << "   Bin:" <<hex << bitset<32> (tmp).to_string<char,std::char_traits<char> ,std::allocator<char> >() 
        //    << endl;
		cout<< "Hex:" << bigInt.ItoA(CBigInt::HEX, 16)
			<< "   Dec:" << bigInt.ItoA(CBigInt::DEC, 16)
			//<< "   Oct:" << bigInt.ItoA(CBigInt::HEX, 16)
			<< "   Bin:" << bigInt.ItoA(CBigInt::BIN, 16)
			<< endl;
//        HextoBin(tmp);
    }
	else
	{
		m_pError->AddError(ret);
	}
}
/*
void CTools::HextoBin(unsigned int ulHex)
{
    CHAR buf[33];
    int i=0;
    while(ulHex)
    {
        buf[i]=ulHex%2;
        ulHex=ulHex/2;
        i++;
    }
    buf[i]='\0';
    int k=8;
    while(k>i)
    {
        cout<< '0';
        k--;
        if(k%4==0)
            cout<< ' ';
    }
    for(i--;i>=0;i--)
    {
        if((i+1)%4==0)
            cout<< ' ';
        cout<< dec <<setw(1) << buf[i] <<hex;
    }
}
*/

unsigned int CTools::BintoHex(CHAR *argv)
{
    unsigned int ulVal=0;
    unsigned int i=0;
    if(*argv!=' ')
        return 0;
    argv++;
    while(  *argv!='\0' && i<(sizeof(unsigned int)*8) )
    {
        if( *argv=='0'|| *argv=='1' )
        {
            ulVal=ulVal*2+(*argv-'0');
            argv++;
        }
        else
        {
            return 0;
        }
        i++;
    }
    return ulVal;
}

void CTools::Status(void)
{
    cout<< "Current File:" << m_pszFileName<< endl
        << "m_uBufPos:" << m_uBufPos << endl
        << "m_ulBufOffset:"<< m_ulBufOffset << endl
        << "m_uDisk:" << m_uDisk << endl
		<< "m_pszFileName: " << m_pszFileName << endl;

    int i=0;
    for(;i<c_CMD_T_MAX_BUF;i++)
    {
        cout<< "Buffer " << setw(1) << i;
        cout<< "Size:" << setw(8) <<m_BufSize[i] << "Bytes" << endl;
        cout<< "CurSectorNumber: " << setw(10) << m_dqBufSector[i] << endl;
    }
    m_pError->AddError(ERR_NO_ERROR);
}

void CTools::HandleError(void)
{
    DWORD tmp=m_pError->GetLastError();
    if( tmp!=ERR_NO_ERROR &&tmp  !=c_CMD_T_CM_QUIT )
    {
        m_pError->ReportAllError();
//    m_pError->ReportLastError();
        m_pError->ClearAllError();
        cout<< "Type h for help" <<endl;
    }
    else if(tmp==ERR_NO_ERROR)
    {
        m_pError->ClearAllError();
    }
}

void CTools::DosCommand(CHAR *argv)
{
    if(*argv==' ')
    {
        argv++;
        //        int ret=system(argv);
        system(argv);
        m_pError->AddError(ERR_NO_ERROR);
        //        if(!ret)
        //			cout<< "Dos Command Executed Fail");
    }
}

void CTools::UseBuf(CHAR *argv)
{
    unsigned int tmp;
    istringstream strin(argv);
    strin.setf(ios_base::hex,ios_base::basefield);
    strin>>tmp;
    if( strin.fail())
        return ;
    if(tmp<c_CMD_T_MAX_BUF)
    {
        m_uBufPos=tmp;
        m_pError->AddError(ERR_NO_ERROR);
        return;
    }
}

void CTools::SearchPartition(CHAR *argv)
{
	DWORD ulStartCyl;
    istringstream strin(argv);
    strin.setf(ios_base::hex,ios_base::basefield);
    strin>>ulStartCyl;
    if( strin.fail())
        return ;

	BYTE buff[512];
	double tmp1 = 255L*63L*512L;
	double tmp2 = 1024L*1024L*100L;
	double tmp3 = 1024L*1024L*1024L;
	cout<< "The compacity of one cyliner is: "  << endl
		<< dec << (DWORD)tmp1 << "bytes(dec)  " 
		<< hex << (DWORD)tmp1 << "bytes(hex)  " 
		<< dec << tmp1/1024/1024 << "Mb(dec)  "  << endl
		<< "100 Mb = " << dec << tmp2/tmp1 << "(dec) cyliners\t\t 1 Gb = "  
		<< dec << tmp3/tmp1 << "(dec) cyliners" 
		<< endl;
		
#ifdef WIN32
    cout<<"Press any key to Stop.";
#endif//
#ifdef __DJGPP__
    cout<<"Press Ctrl+Break to Stop.";
    _go32_want_ctrl_break(1);
#endif//
	cout<< "	Please Wait. Searching ... " << endl
		<< "Current Sectors(Hex):" << endl;
	DWORD64 startSector=0;
	DWORD64 i;
	ostringstream ostr;
	//ostr.fill('0');
	ostr.setf(ios_base::right,ios_base::adjustfield);
	ostr.setf(ios_base::uppercase);
	ostr.setf(ios_base::hex,ios_base::basefield);

	for(i=ulStartCyl;;i++)
	{
//		startSector=i*255*63;
		cprintf("%llX\r", startSector);	//??
		for(int head=0;head<255;head++)
		{
			startSector=i*255*63+head*63;
			if(!m_pInt13->ReadSector(startSector,1,buff))
			{
				cout<< endl 
					<< "End of Disk. Search complete."
					<< endl;
				goto quit;
			}

			if( *( (WORD *)&buff[510] ) ==0xaa55)
			{
				cout<< endl
					<< "Found at: Cyl= " << hex << uppercase << i 
					<< " \tSectors Number= " << hex << uppercase <<( DWORD64) (startSector)
					<< endl;
				cout<< "Press any key to continue. " <<endl;
				getch();
			}
			else
			{
				#ifdef __DJGPP__
				if(_go32_was_ctrl_break_hit())
				{
				#endif
				#ifdef WIN32
				if (kbhit())
				{
					getch();
				#endif//
					if(SLib::GetYesNo())
					{
						m_pError->AddError(ERR_NO_ERROR);
						goto quit ;
					}
				}
			}
		}
	}
quit:
#ifdef __DJGPP__
    _go32_want_ctrl_break(0);
#endif
cout<<hex;
}

void CTools::SaveSectors(CHAR *argv)
{
    DWORD64 ulStartSec;
    DWORD ulLen;
    istringstream strin(argv);
    strin.setf(ios_base::hex,ios_base::basefield);
    strin>>ulStartSec>>ulLen;
    if( strin.fail())
        return ;
    if(ulLen*c_uBYTES_PER_SECTOR>m_BufSize[m_uBufPos])
    {
        m_pError->AddError(ERR_BUF_SMALL);
        return;
    }
    if(m_pInt13->WriteSector(ulStartSec,ulLen,(BYTE *)m_ppBuf[m_uBufPos]) )
        m_pError->AddError(ERR_NO_ERROR);
   // else
    //    m_pError->AddError();
}

void CTools::SaveFile(CHAR *argv)
{
	string sname;
	DWORD len;
	istringstream strin(argv);
	strin.setf(ios_base::hex,ios_base::basefield);
	strin>>sname;
	if( strin.fail())
		return;
	strin>>len;
	if( strin.fail())
		len=m_BufSize[m_uBufPos];
	if(WriteFile(sname.c_str(),len,m_ppBuf[m_uBufPos]))
		m_pError->AddError(ERR_NO_ERROR); 
}

void CTools::BackupDiskPartitions(CHAR *argv)
{
	int diskNumber;
	string spath;
	istringstream strin(argv);
	strin.setf(ios_base::hex,ios_base::basefield);
	strin>>spath;
	if (strin.fail())
	{
		diskNumber = 0x80;
		spath = "";
		cout<<"Use current directory to save backup file for disk 0x80" << endl;
	}
	else
	{
		strin>>diskNumber;
		if (strin.fail())
		{
			diskNumber = 0x80;
			cout<<"Use default disk 0x80" << endl;
		}
	}
	cout<<"Use directory " << spath << " to save backup file for disk " << hex<< showbase << uppercase << diskNumber << endl;
	int oldDiskNumber = m_pInt13->GetActiveDisk();
	if (!m_pInt13->SetPhyDiskNumber(diskNumber))
		return ;
	
	auto_ptr<CBackupDiskSector>pbackup (new CBackupDiskSector(m_pInt13, m_pError));
	if (pbackup->BackupOneDisk(spath))
		m_pError->AddError(ERR_NO_ERROR);

	m_pInt13->SetPhyDiskNumber(oldDiskNumber);
}

void CTools::RestoreDiskPartitions(CHAR *argv)
{
	int diskNumber;
	string spath;
	istringstream strin(argv);
	strin.setf(ios_base::hex,ios_base::basefield);
	strin>>spath;
	if (strin.fail())
	{
		diskNumber = 0x80;
		spath = "";
		cout<<"Use current directory to restore backup file for disk 0x80" << endl;
	}
	else
	{
		strin>>diskNumber;
		if (strin.fail())
		{
			diskNumber = 0x80;
			cout<<"Use default disk 0x80" << endl;
		}
	}
	cout<<"Use directory " << spath << " to restore backup file for disk " << hex<< showbase << uppercase << diskNumber << endl;
	int oldDiskNumber = m_pInt13->GetActiveDisk();
	if (!m_pInt13->SetPhyDiskNumber(diskNumber))
		return ;

	if (GetYesNo("Do you want to backup current disk ?(Y/N)"))
	{
		cout<< endl <<"Input backup directory:";
		string s;
		cin>> s;
		int c =getchar();
		auto_ptr<CBackupDiskSector>pbackup (new CBackupDiskSector(m_pInt13, m_pError));
		if (!pbackup->BackupOneDisk(s))
		{
			return;
		}
	}
	cout<< endl;
	auto_ptr<CBackupDiskSector>pbackup (new CBackupDiskSector(m_pInt13, m_pError));
	if (pbackup->RestoreOneDisk(spath))
		m_pError->AddError(ERR_NO_ERROR);

	m_pInt13->SetPhyDiskNumber(oldDiskNumber);}


#ifdef WIN32
extern void Counter(const char *argv);
void CTools::Counter(CHAR *argv)
{
	if (*argv == ' ' || *argv == '\t')
		;
	else
		return;
	string spath;
	istringstream strin(argv);
	strin.setf(ios_base::hex,ios_base::basefield);
	strin>>spath;
	if (strin.fail())
	{
		cout<<"Using current directory" <<endl;
		::Counter(".");
	}
	else
	{
		::Counter(spath.c_str());
	}
	m_pError->AddError(ERR_NO_ERROR);
}
#endif 

#ifdef __DJGPP__
void CTools::Cmos(CHAR *argv)
{
	if (*argv == ' ' || *argv == '\t')
		;
	else
		return;
	char c;
	string spath;
	istringstream strin(argv);
	strin.setf(ios_base::hex,ios_base::basefield);
	strin>>c>>spath;
	if (!strin.fail() || c== 'c')
	{
		string fileInfo = spath + "ifo";
		string fileBin = spath + "bin";
		switch(c)
		{
		case 'b':
			{
				int i;
				FILE *cmfp,*cmbfp;
				unsigned j;
				if((cmfp=fopen(fileInfo.c_str(),"w"))==NULL)
				{
					printf("can't creat %s\n", fileInfo.c_str());
					return ;
				}
				if((cmbfp=fopen(fileBin.c_str(),"wb"))==NULL)
				{
					printf("can't creat %s\n", fileBin.c_str());
					return ;
				}
				for(i=0;i<=0xff;i++)
				{
					outportb(0x70,i);
					j=inportb(0x71);
					fputc(j,cmbfp);
					if(i%16==0)
						fprintf(cmfp,"\n");
					fprintf(cmfp,"%02X %02X ",i,j );
				}
				fclose(cmfp);
				fclose(cmbfp);
				printf("Backup CMOS Information successfull.\n");
			}
			break;
		case 'c':
			{
				int i;
				for(i=0;i<=0xff;i++)
				{
						outportb(0x70,i);
						outportb(0x71,0);
				}
				printf("Clear CMOS Information successfull.\n");
			}
			break;
		case 'r':
			{
				FILE *cmopen;
				int j,i;
				if((cmopen=fopen(fileBin.c_str(),"r+b"))==NULL)
				{
					printf("can't open %s\n", fileBin.c_str());
					return ;
				}
				for( i=0;i<=0xff;i++)
				{
					outportb(0x70,i);
					j=fgetc(cmopen);
					outportb(0x71,j);
				}
				fclose(cmopen);
				printf("Restore CMOS Information successfull.\n");
			}
			break;
		default:
			return;
		}
	}
	else
	{
		return ;
	}
	m_pError->AddError(ERR_NO_ERROR);
}

#endif 

void DispError(CHAR *p)
{
    cout<<"Error is:" << p << endl;
}

void CTools::SetActivePhyDisk(CHAR *argv)
{
    unsigned int tmp;
    istringstream strin(argv);
    strin.setf(ios_base::hex,ios_base::basefield);
    strin>>tmp;
    if( strin.fail())
        return ;
    if( tmp>=0x80 && tmp < ( 0x80+c_iMAX_DISKS) )
    {
        if(m_pInt13->SetPhyDiskNumber(tmp))
		{
			m_uDisk=tmp;
			m_pError->AddError(ERR_NO_ERROR);
		}
    }
}

//__declspec(dllimport)  const SLib::ERROR_STRING g_allErrorString[];

CCmdToolError::CCmdToolError(void)
{

}

CCmdToolError::~CCmdToolError()
{

}

void CCmdToolError::OutputMsg(const tstring & msg)const 
{
    cout<< msg ;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -