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

📄 cmdtools.cpp

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