📄 dumpmem.c
字号:
/*
dumpmem.c copyright by luobin @2004.6.27
*/
#include "..\typedef\type.h"
#include "..\txlib\txlib.h"
//#define WIN_DEBUG
#include "string.h"
#include "memory.h"
char strHelp[] = "HELP";
char strSpace[] = " ";
#ifdef WIN_DEBUG
// 用于windows调试
#include "stdio.h"
int GetCommand(char * strCommand,char ** argv)
{
int argcnt = 0;
char * com = strCommand;
while(IS_WHITE_SPACE(*com))
com++;
for( ; *com != 0 ; )
{
argv[argcnt++] = com;
// 找到下一个分段点
while(!IS_WHITE_SPACE(*com) && *com != 0)
com++;
if(*com == 0) break;
*com = 0;
com++;
while(IS_WHITE_SPACE(*com))
com++;
}
return argcnt;
}
char * upcase(char * str)
{
char * s = str;
for( ; *s ; s++)
{
if(*s >= 'a' && *s <= 'z')
*s -= 0x20;
}
return str;
}
// 10进制需要考虑符号问题
int atoi10(const char * num)
{
int retval;
int base;
int sign = 0;
const char * snum;
// 去掉前导空白
while(IS_WHITE_SPACE(*num))
num++;
// 判断符号
switch(*num)
{
case '-':
sign = 1;
num++;
break;
case '+':
num++;
break;
}
snum = num;
while((!IS_WHITE_SPACE(*snum)) && *snum )
{
if(*snum < '0' || *snum > '9')
return 0;
snum++;
}
snum--;
retval = 0;
base = 1;
for( ; snum >= num ; snum--)
{
retval += (*snum - '0') * base;
base *= 10;
}
return sign?(-retval):retval;
}
unsigned int atoi16(const char * num)
{
unsigned int retval;
unsigned int base;
const char * snum;
// 去掉前导空白
while(IS_WHITE_SPACE(*num))
num++;
if(!(num[0] == '0' && ( num[1] == 'x' || num[1] == 'X')))
return 0;
num += 2;
snum = num ;
while((!IS_WHITE_SPACE(*snum)) && *snum )
{
if((*snum >= '0' && *snum <= '9') ||
(*snum >= 'a' && *snum <= 'f') ||
(*snum >= 'A' && *snum <= 'F') )
{
snum++;
}
else
return 0;
}
snum--;
retval = 0;
base = 1;
for( ; snum >= num ; snum--)
{
if(*snum >= '0' && *snum <= '9')
retval += (unsigned int)(*snum - '0') * base;
else if(*snum >= 'a' && *snum <= 'f')
retval += (unsigned int)(*snum - 'a' + 10) * base;
else if(*snum >= 'A' && *snum <= 'F')
retval += (unsigned int)(*snum - 'A' + 10) * base;
base *= 16;
}
return retval;
}
int IsHex(char * strNumber)
{
char * num = strNumber;
if(!(num[0] == '0' && (num[1] == 'x' || num[1] == 'X')))
return 0;
num += 2;
for( ; *num != 0 ; num++)
{
if(!((*num >= '0' && *num <= '9') ||
(*num >= 'a' && *num <= 'f') ||
(*num >= 'A' && *num <= 'F')))
return 0;
}
return 1;
}
int IsDigital(char * strNumber)
{
char * num = strNumber;
for( ; *num != 0 ; num++)
{
if(*num < '0' || *num > '9')
return 0;
}
return 1;
}
void main()
{
int argc;
char * argv[32];
char com[] = "dumpmem/G etCommand( com,a rgv )etCo m mand(co m,argv)etCommand(com,argv)";
//argc = GetCommand(com,argv);
//DumpMemory(argc,argv);
DumpMemoryA(com,strlen(com));
}
#else
#include "txstdio.h"
#define printf kprintf
#endif // WIN_DEBUG
#include "string.h"
void DumpMemUsage();
int DumpMemoryA(void * buffer,DWORD dwLeng);
int DumpMemory(int argc,char ** argv)
{
int i = 0;
char buf[256];
DWORD dwAddress = 0;
DWORD dwLeng = 0;
DWORD dwHelpFlag= 0;
for( i = 1 ; i < argc ; i++)
{
if(argv[i][0] == '-' || argv[i][0] == '/')
{
if(argv[i][1] == 'a' || argv[i][1] == 'A')
{
if(IsHex(&(argv[i][3])) == 0){
printf("memory address invalid,please check it out!");
return 0;
}
dwAddress = atoi16(&(argv[i][3]));
}
else if(argv[i][1] == 'l' || argv[i][1] == 'L')
{
if(IsDigital(&(argv[i][3])) == 0){
printf("leng invalid,please check it out!");
return 0;
}
dwLeng = atoi10(&(argv[i][3]));
}
else if(argv[i][1] == 'h' || argv[i][1] == 'H')
{
upcase(argv[i]);
if(strcmp(&(argv[i][1]),strHelp) == 0) dwHelpFlag = 1;
else {
printf("some parameter invalid,check it out!");
return 0;
}
}
}
else{
printf("some parameter invalid,check it out!");
return 0;
}
}
if( argc == 1 ) {
DumpMemUsage();
return 1;
}
if( dwLeng > 256) dwLeng = 256;
memcpy(buf,(char *)dwAddress,dwLeng);
if(dwHelpFlag) DumpMemUsage();
else DumpMemoryA(buf,dwLeng);
return 0;
}
void DumpMemUsage()
{
printf("Usage: dumpmem [/a:address],[/l:leng],[/help]\n");
printf(" address : only use hex , exampl: 0xcdcdcdcd.\n");
printf(" leng : only user digital.\n");
printf(" help : show how to use.\n");
printf(" the parameter order can not chang.\n");
}
int DumpMemoryA(void * buffer,DWORD dwLeng)
{
DWORD l = dwLeng; // 剩余
DWORD i = 0;
DWORD j = 0;
DWORD k = 0;
char * buf = (char *)buffer;
int c = 0;
for ( i = 0 ; i < l ; i++)
{
/*c = (buf[i] >> 4) & 0x0f;
if( c < 10)
printf("%c",c + '0');
else
printf("%c",c - 10 + 'A');
c = buf[i] & 0x0f;
if( c < 10)
printf("%c ",c +'0');
else
printf("%c ",c - 10 + 'A');*/
printf("%02x ",(buf[i])&0xff);
if( i > 0 && ((i + 1) % 8) == 0)
{
if( (( (i + 1) / 8) % 2) == 1)
printf("-- ");
else {
j = i & 0xfffffff0;
printf(" ");
for( k = 0 ; k < 16 ; k++)
{
c = buf[j + k];
if(c <= 32 || c >= 127)
printf("%c",'.');
else
printf("%c",c);
}
printf(" \n");
}
}
}
k = i;
if( (k % 16) < 8)
printf(" ");
for ( ; (k % 16) != 0 ; k++)
printf(" ");
j = i & 0xfffffff0;
printf(" ");
for( k = 0 ; k < (i & 0x0f) ; k++)
printf("%c",buf[j + k]);
printf(" \n");
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -