📄 cmdtools.cpp
字号:
/*
Command Line Tools for DOS(V32) Prgram v0.1.0 write by 孙宝建
6-20-2004
(暂停)
3.0.0 9-27-2004
3.0.1 9-28-2004
3.1.0 9-29-2004
3.1.1 10-27-2004
*/
#include "stdafx.h"
#ifndef __commcpp_h
#include "commcpp.hpp"
#endif
#ifndef _INCLUDE_SLIB_FUNC_HPP_INCLUDE
#include "slib_func.hpp"
#endif
#ifndef _INCLUDE_SLIB_ERROR_HPP_INCLUDE
#include "slib_error.hpp"
#endif
#ifndef _INT13_H
#include "int13.hpp"
#endif
#ifndef _NTFS_H
#include "ntfs.hpp"
#endif
#ifndef _DRIVE_H
#include "drive.hpp"
#endif
#ifndef _SEARCH_H
#include "srch.hpp"
#endif
#ifndef _CMDTOOLS_H
#include "cmdtools.hpp"
#endif
#ifndef _INCLUCDE_BIGINT_HPP_INCLUDE
#include "bigint.hpp"
#endif
#ifdef __DJGPP__
#ifndef __dj_include_sys_movedata_h_
#include <sys/movedata.h>
#endif
#ifndef __dj_include_go32_h_
#include <go32.h>
#endif
#endif
#ifndef _INCLUDE_BACKUP_DISK_SECTOR_HPP_INCLUDE
#include "backup_disk_sector.hpp"
#endif
using namespace SLib;
extern CHAR *szCmdLine;
CCmdToolError g_Error;
SLIB_DEFINE_FILE_NAME_VARIABLE
CTools::CTools(CSError *pError):m_pError(pError)
{
SVERIFY_ARGUMENTS(pError!=NULL);
m_uDisk=0x80;
m_uBufPos=0;
m_ulBufOffset=0;
m_bIsLoadFat = FALSE;
m_pSrch=NULL;
m_pLD32=NULL;
m_pInt13=NULL;
m_pNtfs=NULL;
m_pszFileName=NULL;
for(int i=0;i<c_CMD_T_MAX_BUF;i++)
{
m_ppBuf[i]=NULL;
m_dqBufSector[i]=0;
}
m_pInt13=new CInt13(m_uDisk,m_pError);
cout<< m_pInt13->GetPhyDiskParameter();
}
CTools::~CTools()
{
for(int i=0;i<c_CMD_T_MAX_BUF;i++)
{
if(m_ppBuf[i]!=NULL)
delete []m_ppBuf[i];
}
if(m_pszFileName!=NULL)
delete m_pszFileName;
if(m_pSrch!=NULL)
delete m_pSrch;
if(m_pLD32!=NULL)
delete m_pLD32;
if(m_pInt13!=NULL)
delete m_pInt13;
if(m_pNtfs!=NULL)
delete m_pNtfs;
}
void CTools::Run(CHAR *argv)
{
if(argv!=NULL)
{
if(argv[0]!='-')
{
return ;
}
else
{
cout<< argv <<endl;
TranslateCommand(&argv[1]);
HandleError();
}
}
else
{
do
{
GetCmd(szCmdLine);
if(*szCmdLine!='\n'&&*szCmdLine)
{
TranslateCommand(szCmdLine);
HandleError();
}
}while(m_pError->GetLastError()!=c_CMD_T_CM_QUIT);
}
}
void CTools::GetCmd(CHAR *szCmdLine)
{
// fflush(stdin);
#ifdef __DJGPP__
// cprintf("\r<< endl;
#endif
again:
cprintf("Command>");
int c;
unsigned int i=0;
while((c=getchar())!='\n'
&&i<(_MAX_PATH-2)
&&c!=EOF)
{
szCmdLine[i]=c;
i++;
}
szCmdLine[i]='\0';
if(i==0)
goto again;
}
void CTools::TranslateCommand(CHAR *argv1)
{
while(isspace(*argv1))
argv1++;
CHAR *argv=argv1;
while(*argv1&&(*argv1!='\"'))
argv1++;
if(*argv1=='\"')
{
*argv1='\0';
strlwr(argv);
*argv1='\"';
}
else
strlwr(argv);
switch(argv[0])
{
case 'a':
switch(argv[1])
{
case 'c':AddSub(&argv[2]);break;;
case ' ':
case '\0':
default:
goto Bad_Command;
}
break;
case 'b':
switch(argv[1])
{
case 'c':BufferAlloc(&argv[2]);break;
case 'd':BackupDiskPartitions(&argv[2]);break;
case ' ':
case '\0':
default:
goto Bad_Command;
}
break;
case 'c':
switch(argv[1])
{
case ' ':Calculater(&argv[1]);break;;
#ifdef __DJGPP__
case 'm':Cmos(&argv[2]);break;;
#endif
#ifdef WIN32
case 'n':Counter(&argv[2]);break;;
#endif
case 's':ClustertoSectors(&argv[2]);break;;
case '\0':
default:
goto Bad_Command;
}
break;
case 'd':
switch(argv[1])
{
case 'c':DosCommand(&argv[2]); break;;
case 'd':DispDir(&argv[2]); break;;
case 's':Status(); break;;
case 'n':SetActivePhyDisk(&argv[2]); break;;
case ' ':
case '\0':DispBuffer(&argv[1]); break;;
default:
goto Bad_Command;
}
break;
case 'e':
switch(argv[1])
{
case 'b':EditBuffer(&argv[2]); break;;
case '\0':
default:
goto Bad_Command;
}
break;
case 'g':
switch(argv[1])
{
case 'c':GetCluster(&argv[2]); break;;
case '\0':
default:
goto Bad_Command;
}
break;
case 'h':
switch(argv[1])
{
case ' ':
case '\0':Help();break;;
default:
goto Bad_Command;
}
break;
case 'l':
switch(argv[1])
{
case 's':LoadSectors(&argv[2]);break;;
case 'f':LoadFile(&argv[2]);break;;
case 't':LoadNtfsBootBlock(&argv[2]);break;;
case 'b':LoadBpb(&argv[2]);break;;
case 'c':LoadCluster(&argv[2]);break;;
case 'd':LoadDir32(&argv[2]);break;;
case 'm':LoadMbr(&argv[2]);break;;
case 'p':LoadPartition(&argv[2]);break;;
case '\0':
default:
goto Bad_Command;
}
break;
case 'm':
switch(argv[1])
{
case 'd':MoveData(&argv[2]);break;
default:
goto Bad_Command;
}
break;
case 'r':
switch(argv[1])
{
case 'd':RestoreDiskPartitions(&argv[2]);break;;
case '\0':
default:
goto Bad_Command;
}
break;
case 's':
switch(argv[1])
{
case 'b':
switch(argv[2])
{
case '\0':
case ' ':
SearchBuffer(&argv[2]);break;;
//case 'a':
// SearchBufferAll(&argv[3]);break;;
default:
goto Bad_Command;
};
break;
case 's':
switch(argv[2])
{
case '\0':
case ' ':
SearchSectors(&argv[2]);break;;
//case 'a':
// SearchSectorsAll(&argv[3]);break;;
case 'o':
SearchSectorsOffset(&argv[3]);break;;
default:
goto Bad_Command;
}
break;
case 'd':SaveSectors(&argv[2]);break;;
case 'f':SaveFile(&argv[2]); break;;
case 'p':SearchPartition(&argv[2]); break;;
default:
goto Bad_Command;
}
break;
case 'q':
switch(argv[1])
{
case ' ':
case '\0':Quit();return;
default:
goto Bad_Command;
}
break;
case 'u':
switch(argv[1])
{
case 'b':UseBuf(&argv[2]);break;;
case '\0':
default:
goto Bad_Command;
}
break;
default:
goto Bad_Command;
}
if(m_pError->GetLastError()==ERR_NO_FOUND_ERROR)
m_pError->SetLastError(ERR_BAD_PARAMETER);
return ;
Bad_Command:
m_pError->SetLastError(ERR_BAD_COMMAND);
}
void CTools::GetCluster(CHAR *argv)
{
DWORD ulSec;
if (!m_bIsLoadFat)
{
m_pError->AddError("Please load cluster before getcluster");
return;
}
istringstream strin(argv);
strin.setf(ios_base::hex,ios_base::basefield);
strin>>ulSec;
if( strin.fail())
return ;
DWORD tmp;
if(m_pLD32->GetCluster(ulSec,tmp))
{
m_pError->AddError(ERR_NO_ERROR);
cout<< setw(8) << tmp<< endl ;
}
else
m_pError->AddError(ERR_NO_CLUSTER);
}
void CTools::MoveData(CHAR *argv)
{
unsigned int tmp[5];
istringstream strin(argv);
strin.setf(ios_base::hex,ios_base::basefield);
strin>>tmp[0]>>tmp[1]>>tmp[2]>>tmp[3]>>tmp[4];
if( strin.fail())
return ;
if( m_BufSize[tmp[2]]>= (tmp[3]+tmp[4])
&& m_BufSize[tmp[0]]>= (tmp[1]+tmp[4])
&& tmp[0]<c_CMD_T_MAX_BUF
&& tmp[2]<c_CMD_T_MAX_BUF
)
{
memmove(m_ppBuf[tmp[0]]+tmp[1],m_ppBuf[tmp[2]]+tmp[3],tmp[4]);
m_pError->AddError(ERR_NO_ERROR);
}
}
void CTools::ClustertoSectors(CHAR *argv)
{
DWORD cluster;
istringstream strin(argv);
strin.setf(ios_base::hex,ios_base::basefield);
strin>>cluster;
if( strin.fail())
return ;
DWORD64 sector=m_pLD32->CtoS(cluster);
if(sector)
{
m_pError->AddError(ERR_NO_ERROR);
cout<< setw(18) <<sector<< endl;
}
}
void CTools::Help(void)
{
m_pError->AddError(ERR_NO_ERROR);
cout<< endl
<< "tools(nt|dos) -[Switch] -[Switch] ..." << endl
<< "Example:" << endl
<< "tools(nt|dos) -bc 1 1000 -db" << endl
<< "Command List:"<< endl
<< "ac n1 n2 n1+n2 n1-n2 n1*n2 n1/n2 n1%%n2"<< endl
<< "bc BufferNumber NewSize Alloc Memory for Buffer"<< endl
<< "bd outputpath disk number(80) backup all partitions"<< endl
<< "c x|d|b Value Change Value"<< endl
#ifdef __DJGPP__
<< "cm b|c|r File name Cmos Backup,Clear,Restore"<< endl
#endif
#ifdef WIN32
<< "cn path Count cpp source lines"<< endl
#endif
<< "cs ClusterNumber ClusterNumber to Sector Number"<< endl
<< "d [StartPosition] DispBuffer Value"<< endl
// << "db DispBPB"<< endl
<< "dc Command Execute DOS COMMAND "<< endl
<< "dd [fdtPos] DispDirecttory"<< endl
// << "dm DispMBR"<< endl
<< "dn DiskNumber SetActivePhyDisk"<< endl
<< "ds DispStatus"<< endl
<< "eb StartPosition HexValueString | \"Strings EditBuffer"<< endl
<< "gc ClusterNumber GetNextCluster"<< endl
<< "h Help"<< endl
<< "lt [StartSector] Load MFT"<< endl
<< "lb [StartSector] Load Bpb"<< endl
<< "lc StartSector FatSize Load FAT32 Table"<< endl
<< "ld [BufOffset] LoadDirtory"<< endl
<< "lf Filename [len] Load File"<< endl
<< "lm [StartSector] [MbrNumber] LoadMbr "<< endl
<< "lp StartSector LoadPartition"<< endl
<< "ls SectorsNumber nSectors Load Sector"<< endl
<< "md DesbufId DesOffset Scr2Id ScrOffset Len Move Data"<< endl
<< "rd input file name(a file include partition info) disk number(80) "<<endl
<< "\t\t restore partitions."<< endl
<< "sb BeginPosition HexValue | \"String Search In Buffer"<< endl
//<< "sba BeginPosition HexValue | \"String Search In Buffer No Stop"<< endl
<< "sd SectorsNumber nSectors Save buffer to Sector"<< endl
<< "sf Filename [len] Save Buffer to File"<< endl
<< "sp StartCyl Search Partition"<< endl
<< "ss Sectors Position HexValue | \"String Search In Sectors"<< endl
//<< "ssa SectorsNumber HexValue | \"String Search In Sectors No Stop"<< endl
<< "sso SectorsNumber NSectors Offset HexValue | \"String"<< endl<<" Search In Sectors At Offset"<< endl
<< "ub n Use Buffer Number"<< endl
<< "q Quit"<< endl;
}
void CTools::Quit(void )
{
m_pError->AddError(c_CMD_T_CM_QUIT);
}
void CTools::SearchBufferAll(CHAR *argv)
{
SearchBuffer(argv);
if(m_pError->GetLastError()!=ERR_NO_ERROR)
return;
*argv='\0';
while(m_pError->GetLastError()!=ERR_SRCH_NO_FIND)
{
SearchBuffer(argv);
}
}
void CTools::SearchBuffer(CHAR *argv)
{
istringstream strin(argv);
string searchArg;
unsigned int ulFindPos=ERR_SRCH_NO_FIND;
unsigned int ulPos=0;
strin.setf(ios_base::hex,ios_base::basefield);
strin>>ulPos;
char buf[_MAX_PATH];
strin.getline(buf, _MAX_PATH-1);
if (strin.fail())
{
ulFindPos=m_pSrch->CSearch::FindNext();
}
else
{
if(m_pSrch->Init((BYTE*)m_ppBuf[m_uBufPos], buf,m_BufSize[m_uBufPos]))
{
ulFindPos=m_pSrch->CSearch::Find(ulPos);
}
else
{
m_pError->AddError(ERR_SEARCH_INIT_FAIL);
return;
}
}
if(ulFindPos!=c_dwSRCH_NO_FOUND)
{
m_pError->AddError(ERR_NO_ERROR);
cout<< setw(8) << ulFindPos <<endl;
}
else
m_pError->AddError(ERR_SRCH_NO_FIND);
//unsigned int ulFindPos=ERR_SRCH_NO_FIND;
//unsigned int ulPos=0;
//if(*argv)
//{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -