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

📄 parse.c

📁 Linux下的类似softice的调试工具
💻 C
📖 第 1 页 / 共 5 页
字号:
		        PICE_sprintf(tempCmd,"%-20s   %s\n",CmdTable[i].Cmd,CmdTable[i].Help);		        Print(OUTPUT_WINDOW,tempCmd);		        if(WaitForKey()==FALSE)return TRUE;            }	    }    }	LEAVE_FUNC();	return TRUE;}//*************************************************************************// ShowPageDirs()////*************************************************************************COMMAND_PROTOTYPE(ShowPageDirs) {	ULONG i;	PPAGEDIR pPageDir;	pgd_t * pPGD;	pmd_t * pPMD;	pte_t * pPTE;    struct mm_struct* mm;    ENTER_FUNC();    // get current process pointer    DPRINT(PICE_DEBUG, DBT_PARSE, DBL_INFO, "current = %.8X\n",(ULONG)current);    // don't touch if not valid process	if(current)	{		if(current->mm)		{			pPageDir = (PPAGEDIR)pgd_offset(current->mm,0);            mm = current->mm;            DPRINT(PICE_DEBUG, DBT_PARSE, DBL_INFO, "(1) pPageDir = %.8X\n",(ULONG)pPageDir);		}		else		{            mm = my_init_mm;			pPageDir = (PPAGEDIR)my_init_mm->pgd;            DPRINT(PICE_DEBUG, DBT_PARSE, DBL_INFO, "(2) pPageDir = %.8X\n",(ULONG)pPageDir);		}        // no arguments supplied -> show all page directories		if(!pArgs->Count)		{		    SetForegroundColor(COLOR_TEXT);			SetBackgroundColor(COLOR_CAPTION);            PutStatusText("Linear            Physical Attributes");			ResetColor();            // there are 1024 page directories each mapping 1024*4k of address space			for(i=0;i<1024;i++) 			{                 ULONG ulAddress = i<<22;                // from the mm_struct get pointer to page directory for this address                pPGD = pgd_offset(mm,ulAddress);                if(pPGD)                {                    // create a structurized pointer from PGD                    pPageDir = (PPAGEDIR)pPGD;				    PICE_sprintf(tempCmd,"%.8X-%.8X %.8X %s %s %s\n", 							    ulAddress, ulAddress + 0x400000,							    (pPageDir->PTBase<<12), 							    pPageDir->P?"P ":"NP", 							    pPageDir->RW?"RW":"R ", 							    pPageDir->US?"U":"S"); 				    Print(OUTPUT_WINDOW,tempCmd);     				if(WaitForKey()==FALSE)break;                 }			} 		}        // one arg supplied -> show individual page		else if(pArgs->Count == 1)		{            pPGD = pgd_offset(mm,pArgs->Value[0]);            DPRINT(PICE_DEBUG, DBT_PARSE, DBL_INFO, "VA = %.8X\n",pArgs->Value[0]);            DPRINT(PICE_DEBUG, DBT_PARSE, DBL_INFO, "pPGD = %.8X\n",(ULONG)pPGD);            if(pPGD && pgd_val(*pPGD)&_PAGE_PRESENT)            {                // 4M page                if(pgd_val(*pPGD)&_PAGE_4M)                {                    PPAGEDIR pPage = (PPAGEDIR)pPGD;					SetForegroundColor(COLOR_TEXT);					SetBackgroundColor(COLOR_CAPTION);                    PutStatusText("Linear    Physical   Attributes");					ResetColor();                    PICE_sprintf(tempCmd,"%.8X  %.8X     %s %s %s (LARGE PAGE PTE @ %.8X)\n", 						        pArgs->Value[0], 						        (pPage->PTBase<<12)|(pArgs->Value[0]&0x7FFFFF), 						        pPage->P?"P ":"NP", 						        pPage->RW?"RW":"R ", 						        pPage->US?"U":"S",                                (ULONG)pPGD);                }                else                {                    pPMD = pmd_offset(pPGD,pArgs->Value[0]);                    DPRINT(PICE_DEBUG, DBT_PARSE, DBL_INFO, "pPMD = %.8X\n",(ULONG)pPMD);                    pPTE = pte_offset(pPMD,pArgs->Value[0]);                    DPRINT(PICE_DEBUG, DBT_PARSE, DBL_INFO, "pPTE = %.8X\n",(ULONG)pPTE);                    if(pPTE)                    {                        PPAGEDIR pPage = (PPAGEDIR)pPTE;                        DPRINT(PICE_DEBUG, DBT_PARSE, DBL_INFO, "pte_val = %.8X\n",(ULONG)pte_val(*pPTE));                        DPRINT(PICE_DEBUG, DBT_PARSE, DBL_INFO, "pPage->PTBase = %.8X\n",(ULONG)pPage->PTBase);						SetForegroundColor(COLOR_TEXT);						SetBackgroundColor(COLOR_CAPTION);                        PutStatusText("Linear    Physical   Attributes");						ResetColor();                        PICE_sprintf(tempCmd,"%.8X  %.8X     %s %s %s (PTE @ %.8X)\n", 						            pArgs->Value[0], 						            (pPage->PTBase<<12)|(pArgs->Value[0]&(PAGE_SIZE-1)), 						            (pPage->P==1)?"P ":"NP", 						            pPage->RW?"RW":"R ", 						            pPage->US?"U":"S",                                    (ULONG)pPTE);                     }                }    			Print(OUTPUT_WINDOW,tempCmd);             }            else            {                PICE_sprintf(tempCmd,"page at %.8X not present.\n",pArgs->Value[0]);    			Print(OUTPUT_WINDOW,tempCmd);             }		}	}	LEAVE_FUNC();	return TRUE; } //*************************************************************************// ShowProcesses()////*************************************************************************COMMAND_PROTOTYPE(ShowProcesses) { 	struct task_struct* p;	ULONG i;	ENTER_FUNC(); 	if(current)	{		DPRINT(PICE_DEBUG, DBT_PARSE, DBL_INFO, "current = %p current->prev_task = %p current->next_task = %p\n",			   current,			   current->prev_task,			   current->next_task);		SetForegroundColor(COLOR_TEXT);		SetBackgroundColor(COLOR_CAPTION);        PutStatusText("NAME             TASK         PID");		ResetColor();		for(i=0,p = current; (p = p->next_task) != current;i++)		{			DPRINT(PICE_DEBUG, DBT_PARSE, DBL_INFO, "p = %p\n",p);			PICE_sprintf(tempCmd,"%-16.16s %-12x %x\n",(LPSTR)&(p->comm),(ULONG)p,p->pid); 			Print(OUTPUT_WINDOW,tempCmd); 			if(WaitForKey()==FALSE)				break; 		} 	}    LEAVE_FUNC();	return TRUE; } //*************************************************************************// DisplayMemoryDword()////*************************************************************************COMMAND_PROTOTYPE(DisplayMemoryDword){    ULONG i,j,k;    static ULONG addr=0,addrorg;    static USHORT segment;    char temp[8];    LPSTR pSymbolName;	ENTER_FUNC();	if(pArgs->Count==2)	{		segment=(USHORT)pArgs->Value[0];		if(!segment)segment = pFrame->ds;		addr=pArgs->Value[1];        OldSelector = segment;        OldOffset = addr;		addrorg=addr;		addr=GetLinearAddress(segment,addr);	}	else if(pArgs->Count==1)	{		segment=pFrame->ds;		addr=pArgs->Value[0];        OldOffset = addr;		addrorg=addr;		addr=GetLinearAddress(segment,addr);	}	else if(pArgs->Count==0)    {        addr += sizeof(ULONG)*4*4;        OldOffset = addr;    }#ifdef ACTIVATE_SYMBOL_LOOKUP    if(FindSymbolByAddress(&pSymbolName,addr))    {		PICE_sprintf(tempCmd," %s ",pSymbolName);		SetForegroundColor(COLOR_TEXT);		SetBackgroundColor(COLOR_CAPTION);		PutChar(tempCmd,GLOBAL_SCREEN_WIDTH-1-PICE_strlen(tempCmd),wWindow[DATA_WINDOW].y-1);        ResetColor();    }#endif // ACTIVATE_SYMBOL_LOOKUP	DisableScroll(DATA_WINDOW);    if(DisplayMemory != DisplayMemoryDword)    {        Clear(DATA_WINDOW);        DisplayMemory = DisplayMemoryDword;    }    else	    Home(DATA_WINDOW);	for(k=0;k<wWindow[DATA_WINDOW].cy;k++) // 4 lines	{		PICE_sprintf(tempCmd,"%.4X:%.8X: ",segment,addrorg+k*16);		Print(1,tempCmd);		for(i=0;i<4;i++) // 4 dwords		{			tempCmd[0]=0;			Print(1," ");			for(j=0;j<4;j++) // 1 dword = 4 bytes			{				if(IsAddressValid(addr+i*4+j+k*16))				{					PICE_sprintf(temp,"%.2x",*(PUCHAR)(addr+i*4+j+k*16));					PICE_strrev(temp);					PICE_strcat(tempCmd,temp);				}				else				{					PICE_strcat(tempCmd,"??");				}			}			PICE_strrev(tempCmd);			Print(1,tempCmd);		}		Print(1,"                     ");		tempCmd[0]=0;		for(j=0;j<16;j++) // 1 dword = 4 bytes		{            wWindow[DATA_WINDOW].usCurX = GLOBAL_SCREEN_WIDTH-17;			if(IsAddressValid(addr+j+k*16))			{				PICE_sprintf(temp,"%c",PICE_isprint(*(PUCHAR)(addr+j+k*16))?(*(PUCHAR)(addr+j+k*16)):'.');				PICE_strcat(tempCmd,temp);			}			else			{				PICE_strcat(tempCmd,"?");			}		}		Print(1,tempCmd);		Print(1,"\n");	}	EnableScroll(DATA_WINDOW);	addr+=16*4;	LEAVE_FUNC();	return TRUE;}//*************************************************************************// DisplayMemoryByte()////*************************************************************************COMMAND_PROTOTYPE(DisplayMemoryByte){    ULONG j,k;    static ULONG addr=0,addrorg;    static USHORT segment;    char temp[8];    LPSTR pSymbolName;	ENTER_FUNC();	if(pArgs->Count==2)	{		segment=(USHORT)pArgs->Value[0];		if(!segment)segment = pFrame->ds;		addr=pArgs->Value[1];        OldSelector = segment;        OldOffset = addr;		addrorg=addr;		addr=GetLinearAddress(segment,addr);	}	else if(pArgs->Count==1)	{		segment=pFrame->ds;		addr=pArgs->Value[0];        OldOffset = addr;		addrorg=addr;		addr=GetLinearAddress(segment,addr);	}	else if(pArgs->Count==0)    {        addr += sizeof(ULONG)*4*4;        OldOffset = addr;    }    if(DisplayMemory != DisplayMemoryByte)    {        Clear(DATA_WINDOW);        DisplayMemory = DisplayMemoryByte;    }    else	    Home(DATA_WINDOW);#ifdef ACTIVATE_SYMBOL_LOOKUP    if(FindSymbolByAddress(&pSymbolName,addr))    {		PICE_sprintf(tempCmd," %s ",pSymbolName);		SetForegroundColor(COLOR_TEXT);		SetBackgroundColor(COLOR_CAPTION);		PutChar(tempCmd,GLOBAL_SCREEN_WIDTH-1-PICE_strlen(tempCmd),wWindow[DATA_WINDOW].y-1);        ResetColor();    }#endif // ACTIVATE_SYMBOL_LOOKUP    DisableScroll(DATA_WINDOW);	for(k=0;k<wWindow[DATA_WINDOW].cy;k++) // 4 lines	{		PICE_sprintf(tempCmd,"%.4X:%.8X: ",segment,addrorg+k*16);		Print(1,tempCmd);		tempCmd[0]=0;		Print(1," ");		for(j=0;j<16;j++) // 1 dword = 4 bytes		{			if(IsAddressValid(addr+j+k*16))			{				PICE_sprintf(temp,"%.2x ",*(PUCHAR)(addr+j+k*16));				PICE_strcat(tempCmd,temp);			}			else			{				PICE_strcat(tempCmd,"?? ");			}		}		Print(1,tempCmd);		Print(1,"  ");		tempCmd[0]=0;		for(j=0;j<16;j++) // 1 dword = 4 bytes		{            wWindow[DATA_WINDOW].usCurX = GLOBAL_SCREEN_WIDTH-17;			if(IsAddressValid(addr+j+k*16))			{				PICE_sprintf(temp,"%c",PICE_isprint(*(PUCHAR)(addr+j+k*16))?(*(PUCHAR)(addr+j+k*16)):'.');				PICE_strcat(tempCmd,temp);			}			else			{				PICE_strcat(tempCmd,"?");			}		}		Print(1,tempCmd);		Print(1,"\n");	}	EnableScroll(DATA_WINDOW);	addr+=16*4;	LEAVE_FUNC();	return TRUE;}//*************************************************************************// DisplayPhysMemDword()////*************************************************************************COMMAND_PROTOTYPE(DisplayPhysMemDword){    ULONG i,j,k;    static ULONG addr=0,addrorg;    static USHORT segment;    char temp[8];	ENTER_FUNC();	if(pArgs->Count==1)	{		segment=pFrame->ds;		addr=pArgs->Value[0];        OldOffset = addr;		addrorg=addr;		addr=GetLinearAddress(segment,addr);	}	else if(pArgs->Count==0)    {        addr += sizeof(ULONG)*4*4;        OldOffset = addr;    }	DisableScroll(DATA_WINDOW);    if(DisplayMemory != DisplayPhysMemDword)    {        Clear(DATA_WINDOW);        DisplayMemory = DisplayPhysMemDword;    }    else	    Home(DATA_WINDOW);	for(k=0;k<wWindow[DATA_WINDOW].cy;k++) // 4 lines	{		PICE_sprintf(tempCmd,"PHYS:%.8X: ",addrorg+k*16);		Print(1,tempCmd);		for(i=0;i<4;i++) // 4 dwords		{			tempCmd[0]=0;            PICE_sprintf(tempCmd," %.8X",ReadPhysMem(addr+i*4+k*16,sizeof(ULONG)));			Print(1,tempCmd);		}		Print(1,"                     ");		tempCmd[0]=0;		for(j=0;j<16;j++) // 1 dword = 4 bytes		{            UCHAR ucData;            wWindow[DATA_WINDOW].usCurX = GLOBAL_SCREEN_WIDTH-17;            ucData = ReadPhysMem(addr+j+k*16,sizeof(UCHAR));			PICE_sprintf(temp,"%c",PICE_isprint(ucData)?ucData:'.');			PICE_strcat(tempCmd,temp);		}		Print(1,tempCmd);		Print(1,"\n");	}	EnableScroll(DATA_WINDOW);	addr+=16*4;	return TRUE;}//*************************************************************************// DisplaySourceFile()////*************************************************************************void DisplaySourceFile(LPSTR pSrcLine,LPSTR pSrcEnd,ULONG ulLineNumber,ULONG ulLineNumberToInvert){    ULONG i;    LPSTR pTemp;    ULONG j = ulLineNumber-1;    DPRINT(PICE_DEBUG, DBT_PARSE, DBL_INFO, "DisplaySourceFile(%p, %u, %u)\n", pSrcLine, ulLineNumber, ulLineNumberToInvert);    // go to line    while(j--)    {        // goto end of current line        while(*pSrcLine!=0x0a && *pSrcLine!=0x0d)            pSrcLine++;               // skip over the line end

⌨️ 快捷键说明

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