mirror of
https://github.com/reactos/reactos.git
synced 2024-12-27 01:24:38 +00:00
Porting pice. Bug fixes.
svn path=/trunk/; revision=2533
This commit is contained in:
parent
656f7cb1f4
commit
88650ed55e
14 changed files with 447 additions and 343 deletions
|
@ -210,9 +210,15 @@ BOOLEAN ReInstallSWBreakpoint(ULONG ulAddress)
|
|||
{
|
||||
if(IsAddressValid(p->ulAddress))
|
||||
{
|
||||
*(PUCHAR)(p->ulAddress) = 0xCC;
|
||||
p->bInstalled = TRUE;
|
||||
bResult = TRUE;
|
||||
BOOLEAN isWriteable;
|
||||
|
||||
if( !( isWriteable = IsAddressWriteable(p->ulAddress) ) )
|
||||
SetAddressWriteable(p->ulAddress,TRUE);
|
||||
*(PUCHAR)(p->ulAddress) = 0xCC;
|
||||
if( !isWriteable )
|
||||
SetAddressWriteable(p->ulAddress,FALSE);
|
||||
p->bInstalled = TRUE;
|
||||
bResult = TRUE;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -239,17 +245,26 @@ BOOLEAN InstallSWBreakpoint(ULONG ulAddress,BOOLEAN bPermanent,void (*SWBreakpoi
|
|||
// TODO: must also check if it's a writable page
|
||||
if(IsAddressValid(ulAddress) )
|
||||
{
|
||||
DPRINT((0,"InstallSWBreakpoint(): %.8X is valid, writable? %d\n",ulAddress,IsAddressWriteable(ulAddress)));
|
||||
DPRINT((2,"InstallSWBreakpoint(): %.8X is valid, writable? %d\n",ulAddress,IsAddressWriteable(ulAddress)));
|
||||
DPRINT((2,"pde: %x, pte: %x\n", *(ADDR_TO_PDE(ulAddress)), *(ADDR_TO_PTE(ulAddress))));
|
||||
if((p = FindSwBp(ulAddress))==NULL)
|
||||
{
|
||||
DPRINT((0,"InstallSWBreakpoint(): %.8X is free\n",ulAddress));
|
||||
DPRINT((2,"InstallSWBreakpoint(): %.8X is free\n",ulAddress));
|
||||
if( (p=FindEmptySwBpSlot()) )
|
||||
{
|
||||
DPRINT((0,"InstallSWBreakpoint(): found empty slot\n"));
|
||||
DPRINT((0,"InstallSWBreakpoint(): %x value: %x", ulAddress, *(PUCHAR)ulAddress));
|
||||
BOOLEAN isWriteable;
|
||||
DPRINT((2,"InstallSWBreakpoint(): found empty slot\n"));
|
||||
DPRINT((2,"InstallSWBreakpoint(): %x value: %x", ulAddress, *(PUCHAR)ulAddress));
|
||||
p->ucOriginalOpcode = *(PUCHAR)ulAddress;
|
||||
*(PUCHAR)ulAddress = 0xCC;
|
||||
p->bUsed = TRUE;
|
||||
//allow writing to page
|
||||
if( !( isWriteable = IsAddressWriteable(ulAddress) ) )
|
||||
SetAddressWriteable(ulAddress,TRUE);
|
||||
DPRINT((2,"writing breakpoint\n"));
|
||||
*(PUCHAR)ulAddress = 0xCC;
|
||||
DPRINT((2,"restoring page access\n"));
|
||||
if( !isWriteable )
|
||||
SetAddressWriteable(ulAddress,FALSE);
|
||||
p->bUsed = TRUE;
|
||||
p->bInstalled = TRUE;
|
||||
// find next address
|
||||
p->ulAddress = ulAddress;
|
||||
|
@ -337,9 +352,15 @@ void TryToInstallVirtualSWBreakpoints(void)
|
|||
|
||||
if(IsAddressValid(ulAddressWithOffset))
|
||||
{
|
||||
DPRINT((0,"TryToInstallVirtualSWBreakpoints(): installing...\n"));
|
||||
BOOLEAN isWriteable;
|
||||
DPRINT((0,"TryToInstallVirtualSWBreakpoints(): installing...\n"));
|
||||
p->ucOriginalOpcode = *(PUCHAR)ulAddressWithOffset;
|
||||
//allow writing to page
|
||||
if( !( isWriteable = IsAddressWriteable(ulAddressWithOffset) ) )
|
||||
SetAddressWriteable(ulAddressWithOffset,TRUE);
|
||||
*(PUCHAR)ulAddressWithOffset = 0xCC;
|
||||
if( !isWriteable )
|
||||
SetAddressWriteable(ulAddressWithOffset,FALSE);
|
||||
p->bUsed = TRUE;
|
||||
p->bInstalled = TRUE;
|
||||
p->bVirtual = FALSE;
|
||||
|
@ -380,8 +401,13 @@ BOOLEAN RemoveSWBreakpoint(ULONG ulAddress)
|
|||
{
|
||||
if(IsAddressValid(ulAddress) && p->bInstalled == TRUE && p->bVirtual==FALSE)
|
||||
{
|
||||
// restore original opcode
|
||||
BOOLEAN isWriteable;
|
||||
if( !( isWriteable = IsAddressWriteable(ulAddress) ) )
|
||||
SetAddressWriteable(ulAddress,TRUE);
|
||||
// restore original opcode
|
||||
*(PUCHAR)(p->ulAddress) = p->ucOriginalOpcode;
|
||||
if( !isWriteable )
|
||||
SetAddressWriteable(ulAddress,FALSE);
|
||||
}
|
||||
|
||||
PICE_memset(p,0,sizeof(*p));
|
||||
|
@ -411,8 +437,13 @@ BOOLEAN DeInstallSWBreakpoint(ULONG ulAddress)
|
|||
{
|
||||
if(IsAddressValid(ulAddress) && p->bInstalled == TRUE && p->bVirtual==FALSE)
|
||||
{
|
||||
BOOLEAN isWriteable;
|
||||
if( !( isWriteable = IsAddressWriteable(ulAddress) ) )
|
||||
SetAddressWriteable(ulAddress,TRUE);
|
||||
// restore original opcode
|
||||
*(PUCHAR)(p->ulAddress) = p->ucOriginalOpcode;
|
||||
if( !isWriteable )
|
||||
SetAddressWriteable(ulAddress,FALSE);
|
||||
}
|
||||
|
||||
p->bInstalled = FALSE;
|
||||
|
@ -447,7 +478,12 @@ BOOLEAN RemoveAllSWBreakpoints(BOOLEAN bEvenPermanents)
|
|||
{
|
||||
if(IsAddressValid(p->ulAddress) && p->bVirtual==FALSE)
|
||||
{
|
||||
BOOLEAN isWriteable;
|
||||
if( !( isWriteable = IsAddressWriteable(p->ulAddress) ) )
|
||||
SetAddressWriteable(p->ulAddress,TRUE);
|
||||
*(PUCHAR)(p->ulAddress) = p->ucOriginalOpcode;
|
||||
if( !isWriteable )
|
||||
SetAddressWriteable(p->ulAddress,FALSE);
|
||||
bResult = TRUE;
|
||||
}
|
||||
PICE_memset(p,0,sizeof(*p));
|
||||
|
@ -458,7 +494,12 @@ BOOLEAN RemoveAllSWBreakpoints(BOOLEAN bEvenPermanents)
|
|||
{
|
||||
if(IsAddressValid(p->ulAddress) && p->bVirtual==FALSE)
|
||||
{
|
||||
BOOLEAN isWriteable;
|
||||
if( !( isWriteable = IsAddressWriteable(p->ulAddress) ) )
|
||||
SetAddressWriteable(p->ulAddress,TRUE);
|
||||
*(PUCHAR)(p->ulAddress) = p->ucOriginalOpcode;
|
||||
if( !isWriteable )
|
||||
SetAddressWriteable(p->ulAddress,FALSE);
|
||||
bResult = TRUE;
|
||||
}
|
||||
PICE_memset(p,0,sizeof(*p));
|
||||
|
@ -583,8 +624,13 @@ void RevirtualizeBreakpointsForModule(PDEBUG_MODULE pMod)
|
|||
p->bVirtual = TRUE;
|
||||
if(IsAddressValid(p->ulAddress) )
|
||||
{
|
||||
BOOLEAN isWriteable;
|
||||
if( !( isWriteable = IsAddressWriteable(p->ulAddress) ) )
|
||||
SetAddressWriteable(p->ulAddress,TRUE);
|
||||
DPRINT((0,"RevirtualizeBreakpointsForModule(): restoring original opcode @ %x\n",p->ulAddress));
|
||||
*(PUCHAR)(p->ulAddress) = p->ucOriginalOpcode;
|
||||
if( !isWriteable )
|
||||
SetAddressWriteable(p->ulAddress,FALSE);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
|
@ -51,6 +51,7 @@ ULONG ulDebugFlags;
|
|||
char tempDebug[2048];
|
||||
USHORT usDebugPortBase;
|
||||
|
||||
extern BOOLEAN bIsPrintkPatched;
|
||||
////////////////////////////////////////////////////
|
||||
// FUNCTIONS
|
||||
////
|
||||
|
@ -74,6 +75,7 @@ VOID Pice_dprintf(ULONG DebugLevel, PCHAR DebugMessage, ...)
|
|||
PICE_vsprintf(tempDebug, DebugMessage, ap);
|
||||
//ei DebugSendString(tempDebug);
|
||||
Print(OUTPUT_WINDOW, tempDebug);
|
||||
DbgPrint("%s", tempDebug);
|
||||
restore_flags(ulDebugFlags);
|
||||
}
|
||||
va_end(ap);
|
||||
|
@ -179,10 +181,11 @@ void DebugSetOthers(ULONG Parity, ULONG Bits, ULONG StopBit)
|
|||
void DebugSetupSerial(ULONG port,ULONG baudrate)
|
||||
{
|
||||
USHORT ports[]={COM1BASE,COM2BASE};
|
||||
|
||||
#if 0 //ei temporary
|
||||
usDebugPortBase = ports[port-1];
|
||||
DebugSetOthers(NO_PARITY,8,1);
|
||||
DebugSetSpeed(baudrate);
|
||||
#endif
|
||||
}
|
||||
#endif // DEBUG
|
||||
|
||||
|
|
|
@ -48,6 +48,7 @@ PMADDRESS_SPACE mm_init_mm;
|
|||
|
||||
ULONG KeyboardIRQL;
|
||||
|
||||
extern void NewInt31Handler(void);
|
||||
//*************************************************************************
|
||||
// InitPICE()
|
||||
//
|
||||
|
@ -100,7 +101,7 @@ BOOLEAN InitPICE(void)
|
|||
DPRINT((0,"InitPICE(): trace step 4\n"));
|
||||
// print the initial screen template
|
||||
PrintTemplate();
|
||||
|
||||
/*
|
||||
DPRINT((0,"InitPICE(): trace step 5\n"));
|
||||
// ask the user if he wants to abort the debugger load
|
||||
if(!CheckLoadAbort())
|
||||
|
@ -111,7 +112,7 @@ BOOLEAN InitPICE(void)
|
|||
LEAVE_FUNC();
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
*/
|
||||
DPRINT((0,"InitPICE(): trace step 6\n"));
|
||||
// load the file /boot/System.map.
|
||||
// !!! It must be consistent with the current kernel at all cost!!!
|
||||
|
@ -128,7 +129,7 @@ BOOLEAN InitPICE(void)
|
|||
|
||||
DPRINT((0,"InitPICE(): trace step 7\n"));
|
||||
ScanExports("_KernelAddressSpace", &ulAddr);
|
||||
my_init_mm = ulAddr;
|
||||
my_init_mm = (PEPROCESS) ulAddr;
|
||||
DPRINT((0,"init_mm %x @ %x\n",&my_init_mm,my_init_mm));
|
||||
if(!my_init_mm)
|
||||
{
|
||||
|
@ -146,7 +147,7 @@ BOOLEAN InitPICE(void)
|
|||
DPRINT((0,"InitPICE(): trace step 7.1\n"));
|
||||
|
||||
ScanExports("_PsProcessListHead",&ulAddr);
|
||||
pPsProcessListHead = ulAddr;
|
||||
pPsProcessListHead = (LIST_ENTRY*)ulAddr;
|
||||
DPRINT((0,"pPsProcessListHead @ %X\n",pPsProcessListHead));
|
||||
if(!pPsProcessListHead)
|
||||
{
|
||||
|
@ -180,7 +181,7 @@ BOOLEAN InitPICE(void)
|
|||
|
||||
// the loaded module list
|
||||
ScanExports("_NameSpaceRoot", &ulAddr);
|
||||
pNameSpaceRoot = ulAddr;
|
||||
pNameSpaceRoot = (PDIRECTORY_OBJECT *)ulAddr;
|
||||
DPRINT((0,"pNameSpaceRoot @ %X\n",pNameSpaceRoot));
|
||||
if(!pNameSpaceRoot)
|
||||
{
|
||||
|
@ -278,10 +279,11 @@ BOOLEAN InitPICE(void)
|
|||
InstallGlobalKeyboardHook();
|
||||
InstallSyscallHook();
|
||||
InstallInt3Hook();
|
||||
InstallPrintkHook();
|
||||
InstallDblFltHook();
|
||||
InstallGPFaultHook();
|
||||
InstallIntEHook();
|
||||
//__asm__("int3");
|
||||
InstallPrintkHook();
|
||||
|
||||
DPRINT((0,"InitPICE(): trace step 16\n"));
|
||||
if(ulDoInitialBreak)
|
||||
|
|
|
@ -47,9 +47,13 @@ Copyright notice:
|
|||
|
||||
char tempOutput[1024],tempOutput2[1024];
|
||||
|
||||
ULONG ulPrintk=0;
|
||||
//ULONG ulPrintk=0;
|
||||
|
||||
ULONG (*ulPrintk) (PANSI_STRING String);
|
||||
|
||||
BOOLEAN bInPrintk = FALSE;
|
||||
BOOLEAN bIsDebugPrint = FALSE;
|
||||
BOOLEAN bIsPrintkPatched = FALSE;
|
||||
|
||||
ULONG ulCountTimerEvents = 0;
|
||||
|
||||
|
@ -126,10 +130,20 @@ ULONG CountArgs(LPSTR fmt)
|
|||
return count;
|
||||
}
|
||||
|
||||
//***********************************************************************************
|
||||
// Our replacement of kernel function.
|
||||
// Must not make any calls to KdpPrintString (e.g. by calling DbgPrint).
|
||||
//***********************************************************************************
|
||||
ULONG PICE_KdpPrintString(PANSI_STRING String)
|
||||
{
|
||||
//dummy function
|
||||
DPRINT((0,"PICE_KdpPrintString\n\n\n"));
|
||||
}
|
||||
//*************************************************************************
|
||||
// PrintkCallback()
|
||||
//
|
||||
// called from RealIsr() when processing INT3 placed
|
||||
// Must not make any calls to KdpPrintString (e.g. by calling DbgPrint).
|
||||
//*************************************************************************
|
||||
void PrintkCallback(void)
|
||||
{
|
||||
|
@ -138,55 +152,26 @@ void PrintkCallback(void)
|
|||
ULONG countArgs,i,len;
|
||||
PANSI_STRING temp;
|
||||
|
||||
DPRINT((2,"In PrintkCallback:1\n"));
|
||||
|
||||
bInPrintk = TRUE;
|
||||
DPRINT((2,"In PrintkCallback:2\n"));
|
||||
|
||||
// get the linear address of stack where string resides
|
||||
ulAddress = GetLinearAddress(CurrentSS,CurrentESP);
|
||||
if(ulAddress)
|
||||
{
|
||||
DPRINT((2,"In PrintkCallback: ulAddress: %x\n", ulAddress));
|
||||
if(IsAddressValid(ulAddress+sizeof(char *)) )
|
||||
{
|
||||
//KdpPrintString has PANSI_STRING as a parameter
|
||||
temp = (PANSI_STRING)*(PULONG)(ulAddress+sizeof(char *));
|
||||
DPRINT((2,"temp: %x\n", temp));
|
||||
fmt = temp->Buffer;
|
||||
|
||||
// validate format string
|
||||
if((len = PICE_strlen(fmt)) )
|
||||
{
|
||||
// skip debug prefix if present
|
||||
if(len>=3 && *fmt=='<' && *(fmt+2)=='>')
|
||||
fmt += 3;
|
||||
|
||||
if((countArgs = CountArgs(fmt))>0)
|
||||
{
|
||||
|
||||
args = (LPSTR)(ulAddress+2*sizeof(char *));
|
||||
if(IsAddressValid((ULONG)args))
|
||||
{
|
||||
// validate passed in args
|
||||
for(i=0;i<countArgs;i++)
|
||||
{
|
||||
if(!IsRangeValid((ULONG)(args+i*sizeof(ULONG)),sizeof(ULONG)) )
|
||||
{
|
||||
PICE_sprintf(tempOutput,"printk(%s): argument #%u is not valid!\n",(LPSTR)fmt,i);
|
||||
Print(OUTPUT_WINDOW,tempOutput);
|
||||
bInPrintk = FALSE;
|
||||
return;
|
||||
}
|
||||
}
|
||||
PICE_vsprintf(tempOutput2, fmt, args);
|
||||
}
|
||||
else
|
||||
{
|
||||
Print(OUTPUT_WINDOW,"printk(): ARGS are passed in but not valid!\n");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
PICE_strcpy(tempOutput2, fmt);
|
||||
}
|
||||
Print(OUTPUT_WINDOW,tempOutput2);
|
||||
}
|
||||
Print(OUTPUT_WINDOW,fmt);
|
||||
DPRINT((2,"%s\n", fmt));
|
||||
CurrentEIP = (ULONG)PICE_KdpPrintString;
|
||||
}
|
||||
}
|
||||
bInPrintk = FALSE;
|
||||
|
@ -260,21 +245,23 @@ void RemovePiceRunningTimer(void)
|
|||
//*************************************************************************
|
||||
void InstallPrintkHook(void)
|
||||
{
|
||||
ENTER_FUNC();
|
||||
|
||||
ENTER_FUNC();
|
||||
return;
|
||||
if( bIsPrintkPatched )
|
||||
return;
|
||||
|
||||
DPRINT((0,"installing PrintString hook\n"));
|
||||
DPRINT((0,"installing PrintString hook. DISABLED for now!!!!!!!!!!!\n"));
|
||||
/* ei fix later
|
||||
ScanExports("_KdpPrintString",(PULONG)&ulPrintk);
|
||||
ScanExports("_KdpPrintString",(PULONG)&ulPrintk);
|
||||
|
||||
DPRINT((0,"_KdpPrintString @ %x\n", ulPrintk));
|
||||
ASSERT( ulPrintk ); // temporary
|
||||
|
||||
if(ulPrintk)
|
||||
{
|
||||
InstallSWBreakpoint(ulPrintk,TRUE,PrintkCallback);
|
||||
bIsPrintkPatched = InstallSWBreakpoint(ulPrintk,TRUE,PrintkCallback);
|
||||
DPRINT((0,"KdpPrintStringTest breakpoint installed? %d\n", bIsPrintkPatched));
|
||||
}
|
||||
*/
|
||||
|
||||
LEAVE_FUNC();
|
||||
LEAVE_FUNC();
|
||||
}
|
||||
|
||||
//*************************************************************************
|
||||
|
@ -285,13 +272,11 @@ void DeInstallPrintkHook(void)
|
|||
{
|
||||
ENTER_FUNC();
|
||||
DPRINT((0,"enter DeInstallPrintkHook()\n"));
|
||||
|
||||
if(ulPrintk)
|
||||
if(bIsPrintkPatched && ulPrintk)
|
||||
{
|
||||
// will be done on exit debugger
|
||||
DeInstallSWBreakpoint(ulPrintk);
|
||||
if( DeInstallSWBreakpoint(ulPrintk) )
|
||||
bIsPrintkPatched = FALSE;
|
||||
}
|
||||
|
||||
|
||||
LEAVE_FUNC();
|
||||
}
|
||||
|
|
|
@ -15,7 +15,7 @@ Environment:
|
|||
LINUX 2.2.X
|
||||
Kernel mode only
|
||||
|
||||
Author:
|
||||
Author:
|
||||
|
||||
Klaus P. Gerlicher
|
||||
|
||||
|
@ -30,7 +30,11 @@ Copyright notice:
|
|||
--*/
|
||||
void InstallPrintkHook(void);
|
||||
void DeInstallPrintkHook(void);
|
||||
extern ULONG ulPrintk;
|
||||
|
||||
//extern ULONG ulPrintk;
|
||||
|
||||
extern ULONG (*ulPrintk) (PANSI_STRING String);
|
||||
|
||||
extern BOOLEAN bInPrintk;
|
||||
extern BOOLEAN bIsDebugPrint;
|
||||
|
||||
|
|
|
@ -979,7 +979,7 @@ COMMAND_PROTOTYPE(ShowPageDirs)
|
|||
|
||||
PICE_sprintf(tempCmd,"%.8X %.8X %s %s %s (PTE @ %.8X)\n",
|
||||
pArgs->Value[0],
|
||||
(pPage->PTBase<<12)|(pArgs->Value[0]&(PAGE_SIZE-1)),
|
||||
(pPage->PTBase<<12)|(pArgs->Value[0]&(_PAGE_SIZE-1)),
|
||||
(pPage->P==1)?"P ":"NP",
|
||||
pPage->RW?"RW":"R ",
|
||||
pPage->US?"U":"S",
|
||||
|
@ -1313,7 +1313,7 @@ void DisplaySourceFile(LPSTR pSrcLine,LPSTR pSrcEnd,ULONG ulLineNumber,ULONG ulL
|
|||
LPSTR pTemp;
|
||||
ULONG j = ulLineNumber-1;
|
||||
|
||||
DPRINT((2,"DisplaySourceFile(%.8X,%u,%u)\n",pSrcLine,ulLineNumber,ulLineNumberToInvert));
|
||||
DPRINT((0,"DisplaySourceFile(%.8X,%u,%u)\n",pSrcLine,ulLineNumber,ulLineNumberToInvert));
|
||||
|
||||
// go to line
|
||||
while(j--)
|
||||
|
@ -1411,16 +1411,16 @@ void UnassembleOneLineDown(void)
|
|||
{
|
||||
ULONG addr,addrorg;
|
||||
|
||||
DPRINT((2,"UnassembleOneLineDown()\n"));
|
||||
DPRINT((0,"UnassembleOneLineDown()\n"));
|
||||
|
||||
addrorg = addr = GetLinearAddress(usOldDisasmSegment,ulOldDisasmOffset);
|
||||
|
||||
DPRINT((2,"UnassembleOneLineDown(): addr = %.8X\n",addr));
|
||||
DPRINT((0,"UnassembleOneLineDown(): addr = %.8X\n",addr));
|
||||
|
||||
tempCmd[0]=0;
|
||||
Disasm(&addr,tempCmd);
|
||||
|
||||
DPRINT((2,"UnassembleOneLineDown(): addr after = %.8X\n",addr));
|
||||
DPRINT((0,"UnassembleOneLineDown(): addr after = %.8X\n",addr));
|
||||
|
||||
ulOldDisasmOffset += (addr - addrorg);
|
||||
RepaintSource();
|
||||
|
@ -1434,17 +1434,17 @@ void UnassembleOnePageDown(ULONG page)
|
|||
{
|
||||
ULONG addr,addrorg,i;
|
||||
|
||||
DPRINT((2,"UnassembleOnePageDown()\n"));
|
||||
DPRINT((0,"UnassembleOnePageDown()\n"));
|
||||
|
||||
addrorg = addr = GetLinearAddress(usOldDisasmSegment,ulOldDisasmOffset);
|
||||
|
||||
DPRINT((2,"UnassembleOnePageDown(): addr = %.8X\n",addr));
|
||||
DPRINT((0,"UnassembleOnePageDown(): addr = %.8X\n",addr));
|
||||
|
||||
tempCmd[0]=0;
|
||||
for(i=0;i<page;i++)
|
||||
Disasm(&addr,tempCmd);
|
||||
|
||||
DPRINT((2,"UnassembleOnePageDown(): addr after = %.8X\n",addr));
|
||||
DPRINT((0,"UnassembleOnePageDown(): addr after = %.8X\n",addr));
|
||||
|
||||
ulOldDisasmOffset += (addr - addrorg);
|
||||
RepaintSource();
|
||||
|
@ -1460,18 +1460,18 @@ void UnassembleOneLineUp(void)
|
|||
LONG offset;
|
||||
LPSTR pSymbol;
|
||||
|
||||
DPRINT((2,"UnassembleOneLineUp()\n"));
|
||||
DPRINT((0,"UnassembleOneLineUp()\n"));
|
||||
|
||||
addrorg = addr = GetLinearAddress(usOldDisasmSegment,ulOldDisasmOffset);
|
||||
|
||||
DPRINT((2,"UnassembleOneLineUp(): addrorg = %.8X\n",addr));
|
||||
DPRINT((0,"UnassembleOneLineUp(): addrorg = %.8X\n",addr));
|
||||
|
||||
offset = 1;
|
||||
|
||||
if((pSymbol = FindFunctionByAddress(addrorg-offset,&start,&end)) )
|
||||
{
|
||||
offset = addrorg - start;
|
||||
DPRINT((2,"UnassembleOneLineUp(): %s @ offset = %u\n",pSymbol,offset));
|
||||
DPRINT((0,"UnassembleOneLineUp(): %s @ offset = %u\n",pSymbol,offset));
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -1485,12 +1485,12 @@ void UnassembleOneLineUp(void)
|
|||
addr = addrorg - offset;
|
||||
do
|
||||
{
|
||||
DPRINT((2,"UnassembleOneLineUp(): offset = %u addrorg %x addr %x\n",offset,addrorg,addr));
|
||||
DPRINT((0,"UnassembleOneLineUp(): offset = %u addrorg %x addr %x\n",offset,addrorg,addr));
|
||||
// disassemble while not reaching current instruction
|
||||
addrbefore = addr;
|
||||
tempCmd[0]=0;
|
||||
Disasm(&addr,tempCmd);
|
||||
DPRINT((2,"%.8X: %s\n",addrbefore,tempCmd));
|
||||
DPRINT((0,"%.8X: %s\n",addrbefore,tempCmd));
|
||||
}while((addr != addrorg) && (addrbefore < addrorg));
|
||||
|
||||
if((addrorg - addrstart)<=0)
|
||||
|
@ -1498,7 +1498,7 @@ void UnassembleOneLineUp(void)
|
|||
else
|
||||
ulOldDisasmOffset -= (addrorg - addrbefore);
|
||||
|
||||
DPRINT((2,"UnassembleOneLineUp(): new addr = %.4X:%.8X\n",usOldDisasmSegment,ulOldDisasmOffset));
|
||||
DPRINT((0,"UnassembleOneLineUp(): new addr = %.4X:%.8X\n",usOldDisasmSegment,ulOldDisasmOffset));
|
||||
|
||||
RepaintSource();
|
||||
}
|
||||
|
@ -1513,20 +1513,20 @@ void UnassembleOnePageUp(ULONG page)
|
|||
LONG offset;
|
||||
LPSTR pSymbol;
|
||||
|
||||
DPRINT((2,"UnassembleOnePageUp()\n"));
|
||||
DPRINT((0,"UnassembleOnePageUp()\n"));
|
||||
|
||||
for(i=0;i<page;i++)
|
||||
{
|
||||
addrorg = addr = GetLinearAddress(usOldDisasmSegment,ulOldDisasmOffset);
|
||||
|
||||
DPRINT((2,"UnassembleOnePageUp(): addrorg = %.8X\n",addr));
|
||||
DPRINT((0,"UnassembleOnePageUp(): addrorg = %.8X\n",addr));
|
||||
|
||||
offset = 1;
|
||||
|
||||
if((pSymbol = FindFunctionByAddress(addrorg-offset,&start,&end)) )
|
||||
{
|
||||
offset = addrorg - start;
|
||||
DPRINT((2,"UnassembleOnePageUp(): %s @ offset = %u\n",pSymbol,offset));
|
||||
DPRINT((0,"UnassembleOnePageUp(): %s @ offset = %u\n",pSymbol,offset));
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -1539,12 +1539,12 @@ void UnassembleOnePageUp(ULONG page)
|
|||
addrstart = addrorg;
|
||||
do
|
||||
{
|
||||
DPRINT((2,"UnassembleOnePageUp(): offset = %u addrorg %x addr %x\n",offset,addrorg,addr));
|
||||
DPRINT((0,"UnassembleOnePageUp(): offset = %u addrorg %x addr %x\n",offset,addrorg,addr));
|
||||
addrbefore = addr;
|
||||
// disassemble while not reaching current instruction
|
||||
tempCmd[0]=0;
|
||||
Disasm(&addr,tempCmd);
|
||||
DPRINT((2,"%.8X: %s\n",addrbefore,tempCmd));
|
||||
DPRINT((0,"%.8X: %s\n",addrbefore,tempCmd));
|
||||
}while((addr != addrorg) && (addrbefore < addrorg));
|
||||
|
||||
if((addrorg - addrstart)<=0)
|
||||
|
@ -1554,7 +1554,7 @@ void UnassembleOnePageUp(ULONG page)
|
|||
|
||||
}
|
||||
|
||||
DPRINT((2,"UnassembleOnePageUp(): new addr = %.4X:%.8X\n",usOldDisasmSegment,ulOldDisasmOffset));
|
||||
DPRINT((0,"UnassembleOnePageUp(): new addr = %.4X:%.8X\n",usOldDisasmSegment,ulOldDisasmOffset));
|
||||
|
||||
RepaintSource();
|
||||
}
|
||||
|
@ -1614,7 +1614,7 @@ COMMAND_PROTOTYPE(Unassemble)
|
|||
return TRUE;
|
||||
|
||||
|
||||
DPRINT((2,"Unassemble(%0.4X:%0.8X)\n",segment,addr));
|
||||
DPRINT((0,"Unassemble(%0.4X:%0.8X)\n",segment,addr));
|
||||
|
||||
//
|
||||
// unassemble
|
||||
|
@ -1652,19 +1652,19 @@ COMMAND_PROTOTYPE(Unassemble)
|
|||
if(pCurrentMod)
|
||||
{
|
||||
ULONG mod_addr;
|
||||
DPRINT((2,"Unassemble(): pCurrentMod->name = %S\n",pCurrentMod->name));
|
||||
DPRINT((0,"Unassemble(): pCurrentMod->name = %S\n",pCurrentMod->name));
|
||||
mod_addr = (ULONG)pCurrentMod->BaseAddress;
|
||||
|
||||
pCurrentSymbols = FindModuleSymbols(mod_addr);
|
||||
DPRINT((2,"Unassemble(): pCurrentSymbols = %x\n",(ULONG)pCurrentSymbols));
|
||||
DPRINT((0,"Unassemble(): pCurrentSymbols = %x\n",(ULONG)pCurrentSymbols));
|
||||
}
|
||||
DPRINT((2,"Unassemble(): pCurrentMod = %x, showsrc: %d\n",pCurrentMod, bShowSrc));
|
||||
DPRINT((0,"Unassemble(): pCurrentMod = %x, showsrc: %d\n",pCurrentMod, bShowSrc));
|
||||
|
||||
ulCurrentlyDisplayedLineNumber = 0;
|
||||
|
||||
if(bShowSrc && bForceDisassembly == FALSE && (pSrc = FindSourceLineForAddress(addr,&ulLineNumber,&pSrcStart,&pSrcEnd,&pFilename)) )
|
||||
{
|
||||
DPRINT((2,"\n\n\nFoundSourceLineForAddress: file: %s line: %d\n", pFilename, ulLineNumber));
|
||||
DPRINT((0,"FoundSourceLineForAddress: file: %s line: %d\n", pFilename, ulLineNumber));
|
||||
PICE_strcpy(szCurrentFile,pFilename);
|
||||
|
||||
ulCurrentlyDisplayedLineNumber = ulLineNumber;
|
||||
|
@ -1711,7 +1711,7 @@ COMMAND_PROTOTYPE(Unassemble)
|
|||
else
|
||||
{
|
||||
*szCurrentFile = 0;
|
||||
DPRINT((2,"Couldn't find source for file\n"));
|
||||
DPRINT((0,"Couldn't find source for file\n"));
|
||||
Home(SOURCE_WINDOW);
|
||||
// for each line in the disassembly window
|
||||
for(i=0;i<wWindow[SOURCE_WINDOW].cy;i++)
|
||||
|
@ -2476,6 +2476,7 @@ COMMAND_PROTOTYPE(SwitchTables)
|
|||
CopyWideToAnsi(temp,pMod->name);
|
||||
|
||||
pCurrentSymbols = (PICE_SYMBOLFILE_HEADER*)pArgs->Value[0];
|
||||
DPRINT((2,"TableSwitchSym: pCurrentSymbols: %x, Name: %S\n", pCurrentSymbols, pCurrentSymbols->name));
|
||||
pTempMod = IsModuleLoaded(temp);
|
||||
if( pTempMod )
|
||||
pCurrentMod = pTempMod;
|
||||
|
@ -2611,8 +2612,10 @@ COMMAND_PROTOTYPE(ShowLocals)
|
|||
if(pArgs->Count==0)
|
||||
{
|
||||
p = FindLocalsByAddress(GetLinearAddress(CurrentCS,CurrentEIP));
|
||||
DPRINT((0,"ShowLocals: %x", p));
|
||||
if(p)
|
||||
{
|
||||
DPRINT((0,"ShowLocals: name %s, type_name %s\n", p->name, p->type_name));
|
||||
while(PICE_strlen(p->name))
|
||||
{
|
||||
if(!p->bRegister)
|
||||
|
|
|
@ -88,18 +88,27 @@ BOOLEAN PiceKbdIsr (
|
|||
|
||||
if(isDown)
|
||||
{
|
||||
DbgPrint("bControl: %x, ucKey: %x, breakkey: %x\n", bControl, ucKey, AsciiToScan(ucBreakKey));
|
||||
DPRINT((2,"bControl: %x, ucKey: %x, breakkey: %x\n", bControl, ucKey, AsciiToScan(ucBreakKey)));
|
||||
// CTRL pressed
|
||||
if(ucKey==0x1d)
|
||||
{
|
||||
bControl=TRUE;
|
||||
}
|
||||
if(bControl==TRUE && ucKey==AsciiToScan(ucBreakKey)) // CTRL-D
|
||||
else if(bControl==TRUE && ucKey==AsciiToScan(ucBreakKey)) // CTRL-D
|
||||
{
|
||||
// fake a CTRL-D release call
|
||||
bForward=FALSE;
|
||||
bEnterNow=TRUE;
|
||||
bControl=FALSE;
|
||||
// simulate an initial break
|
||||
__asm__("
|
||||
pushfl
|
||||
pushl %cs
|
||||
pushl $returnpoint
|
||||
pushl $" STR(REASON_CTRLF) "
|
||||
jmp NewInt31Handler
|
||||
returnpoint:");
|
||||
|
||||
}
|
||||
else if((ucKey == 66|| ucKey == 68) && bStepping)
|
||||
{
|
||||
|
|
|
@ -151,11 +151,15 @@ ULONG HandlePageFault(FRAME* ptr)
|
|||
PLIST_ENTRY current_entry;
|
||||
MEMORY_AREA* current;
|
||||
|
||||
//for some reason stack is corrupted. disable for now.
|
||||
return 0;
|
||||
|
||||
// get linear address of page fault
|
||||
__asm__("movl %%cr2,%0":"=r" (address));
|
||||
|
||||
// current process
|
||||
tsk = IoGetCurrentProcess();
|
||||
DPRINT((2,"\nPageFault: Name: %s, bInDebShell: %d, error: %d, addr: %x\n", tsk->ImageFileName, bInDebuggerShell, ptr->error_code, address));
|
||||
|
||||
// there's something terribly wrong if we get a fault in our command handler
|
||||
if(bInDebuggerShell)
|
||||
|
@ -182,35 +186,67 @@ ULONG HandlePageFault(FRAME* ptr)
|
|||
current = CONTAINING_RECORD(current_entry,
|
||||
MEMORY_AREA,
|
||||
Entry);
|
||||
DPRINT((2,"address: %x %x - %x Attrib: %x, Type: %x\n", address, current->BaseAddress, current->BaseAddress + current->Length, current->Attributes, current->Type));
|
||||
return 0;
|
||||
if( (address >= current->BaseAddress) && (address <= current->BaseAddress + current->Length ))
|
||||
{
|
||||
if(error_code & 2)
|
||||
{
|
||||
// area was not writable
|
||||
if(!(current->Attributes & PAGE_READONLY))
|
||||
{
|
||||
Print(OUTPUT_WINDOW,"pICE: virtual memory arena is not writeable!\n");
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
// READ ACCESS
|
||||
else
|
||||
{
|
||||
// test EXT bit in error code
|
||||
if (error_code & 1)
|
||||
{
|
||||
Print(OUTPUT_WINDOW,"pICE: page-level protection fault!\n");
|
||||
return 1;
|
||||
}
|
||||
//
|
||||
if (!(current->Attributes & PAGE_EXECUTE_READ))
|
||||
{
|
||||
Print(OUTPUT_WINDOW,"pICE: VMA is not readable!\n");
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
// let the system handle it
|
||||
return 0;
|
||||
//page not present
|
||||
if( !(error_code & 1) ){
|
||||
//check it is in pageable area
|
||||
if( current->Type == MEMORY_AREA_SECTION_VIEW_COMMIT ||
|
||||
current->Type == MEMORY_AREA_SECTION_VIEW_RESERVE ||
|
||||
current->Type == MEMORY_AREA_VIRTUAL_MEMORY ||
|
||||
current->Type == MEMORY_AREA_PAGED_POOL
|
||||
){
|
||||
Print(OUTPUT_WINDOW,"pICE: VMA Pageable Section.\n");
|
||||
return 0; //let the system handle this
|
||||
}
|
||||
Print(OUTPUT_WINDOW,"pICE: VMA Page not present in non-pageable Section!\n");
|
||||
return 1;
|
||||
}
|
||||
else{ //access violation
|
||||
|
||||
if( error_code & 4 )
|
||||
{ //user mode
|
||||
if( (ULONG)address >= KERNEL_BASE )
|
||||
{
|
||||
Print(OUTPUT_WINDOW,"pICE: User mode program trying to access kernel memory!\n");
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
/*
|
||||
if(error_code & 2)
|
||||
{
|
||||
//on write
|
||||
if(!(current->Attributes & PAGE_READONLY))
|
||||
{
|
||||
Print(OUTPUT_WINDOW,"pICE: virtual memory arena is not writeable!\n");
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
// READ ACCESS
|
||||
else
|
||||
{
|
||||
// test EXT bit in error code
|
||||
if (error_code & 1)
|
||||
{
|
||||
Print(OUTPUT_WINDOW,"pICE: page-level protection fault!\n");
|
||||
return 1;
|
||||
}
|
||||
//
|
||||
*/
|
||||
/*
|
||||
if (!(current->Attributes & PAGE_EXECUTE_READ))
|
||||
{
|
||||
Print(OUTPUT_WINDOW,"pICE: VMA is not readable!\n");
|
||||
return 1;
|
||||
}
|
||||
*/
|
||||
|
||||
// let the system handle it
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
current_entry = current_entry->Flink;
|
||||
}
|
||||
|
@ -301,7 +337,7 @@ void InstallIntEHook(void)
|
|||
OldIntEHandler=SetGlobalInt(0x0E,(ULONG)LocalIntEHandler);
|
||||
}
|
||||
UnmaskIrqs();
|
||||
|
||||
DPRINT((2,"OldIntE @ %x\n", OldIntEHandler));
|
||||
LEAVE_FUNC();
|
||||
}
|
||||
|
||||
|
|
|
@ -50,10 +50,10 @@ PUCHAR pScreenBufferSerial;
|
|||
|
||||
USHORT usSerialPortBase;
|
||||
|
||||
UCHAR packet[PAGE_SIZE];
|
||||
UCHAR assemble_packet[PAGE_SIZE];
|
||||
UCHAR packet[_PAGE_SIZE];
|
||||
UCHAR assemble_packet[_PAGE_SIZE];
|
||||
|
||||
UCHAR flush_buffer[PAGE_SIZE],g_x,g_y;
|
||||
UCHAR flush_buffer[_PAGE_SIZE],g_x,g_y;
|
||||
ULONG ulFlushBufferPos = 0;
|
||||
|
||||
UCHAR ucLastKeyRead;
|
||||
|
|
|
@ -323,9 +323,9 @@ void DebuggerShell(void)
|
|||
CheckRingBuffer();
|
||||
|
||||
// kill the speakers annoying beep
|
||||
speaker = inb_p(0x61);
|
||||
speaker = inb_p((PCHAR)0x61);
|
||||
speaker &= 0xFC;
|
||||
outb_p(speaker,0x61);
|
||||
outb_p(speaker,(PCHAR)0x61);
|
||||
|
||||
ProcessBootParams();
|
||||
|
||||
|
@ -1038,16 +1038,19 @@ void RealIsr(ULONG dwReasonForBreak)
|
|||
|
||||
bIrqStateAtBreak = ((CurrentEFL&(1<<9))!=0);
|
||||
|
||||
DPRINT((2,"\nbInDebuggerShell %x, dwReasonForBreak: %x, bIrqStateAtBreak: %d\n", bInDebuggerShell, dwReasonForBreak, bIrqStateAtBreak));
|
||||
DPRINT((2,"CurrentEIP: %x, CurrentESP: %x\n", CurrentEIP, CurrentESP));
|
||||
|
||||
// came in because TF flag was set
|
||||
if(dwReasonForBreak == REASON_SINGLESTEP)
|
||||
{
|
||||
ULONG ulAddress,ulAddressCurrent;
|
||||
|
||||
DPRINT((0,"REASON_SINGLESTEP\n"));
|
||||
DPRINT((2,"REASON_SINGLESTEP\n"));
|
||||
|
||||
if(!bSingleStep)
|
||||
{
|
||||
DPRINT((0,"no single step requested!\n"));
|
||||
DPRINT((2,"no single step requested!\n"));
|
||||
dwCallOldInt1Handler = 1;
|
||||
goto common_return_point;
|
||||
}
|
||||
|
@ -1060,7 +1063,7 @@ void RealIsr(ULONG dwReasonForBreak)
|
|||
// simply restart the system.
|
||||
if(NeedToReInstallSWBreakpoints(ulAddress,TRUE) )
|
||||
{
|
||||
DPRINT((0,"reinstalling INT3 @ %.4X:%.8X\n",OldCS,OldEIP));
|
||||
DPRINT((2,"reinstalling INT3 @ %.4X:%.8X\n",OldCS,OldEIP));
|
||||
|
||||
ReInstallSWBreakpoint(ulAddress);
|
||||
|
||||
|
@ -1079,7 +1082,7 @@ void RealIsr(ULONG dwReasonForBreak)
|
|||
}
|
||||
|
||||
LEAVE_FUNC();
|
||||
DPRINT((0,"-----------------------------------------------------------------\n"));
|
||||
DPRINT((2,"-----------------------------------------------------------------\n"));
|
||||
return;
|
||||
}
|
||||
bPreviousCommandWasGo = FALSE;
|
||||
|
@ -1094,7 +1097,7 @@ void RealIsr(ULONG dwReasonForBreak)
|
|||
ULONG ulLineNumber;
|
||||
LPSTR pSrc,pFileName;
|
||||
|
||||
DPRINT((0,"RealIsr(): stepping through source!\n"));
|
||||
DPRINT((2,"RealIsr(): stepping through source!\n"));
|
||||
|
||||
// look up the corresponding source line
|
||||
// if there isn't any or the source line number has changed
|
||||
|
@ -1103,12 +1106,12 @@ void RealIsr(ULONG dwReasonForBreak)
|
|||
pSrc = FindSourceLineForAddress(ulAddressCurrent,&ulLineNumber,NULL,NULL,&pFileName);
|
||||
else pSrc = NULL;
|
||||
|
||||
DPRINT((0,"RealIsr(): line #%u pSrc=%x (old line #%u)\n",ulLineNumber,(ULONG)pSrc,g_ulLineNumberStart));
|
||||
DPRINT((2,"RealIsr(): line #%u pSrc=%x (old line #%u)\n",ulLineNumber,(ULONG)pSrc,g_ulLineNumberStart));
|
||||
|
||||
// if we have found a source line there
|
||||
if(pSrc && ulLineNumber==g_ulLineNumberStart)
|
||||
{
|
||||
DPRINT((0,"RealIsr(): stepping through line #%u in file = %s!\n",ulLineNumber,pFileName));
|
||||
DPRINT((2,"RealIsr(): stepping through line #%u in file = %s!\n",ulLineNumber,pFileName));
|
||||
|
||||
if(bStepInto)
|
||||
StepInto(NULL);
|
||||
|
@ -1117,7 +1120,7 @@ void RealIsr(ULONG dwReasonForBreak)
|
|||
|
||||
bInDebuggerShell = FALSE;
|
||||
LEAVE_FUNC();
|
||||
DPRINT((0,"-----------------------------------------------------------------\n"));
|
||||
DPRINT((2,"-----------------------------------------------------------------\n"));
|
||||
return;
|
||||
}
|
||||
bStepThroughSource = FALSE;
|
||||
|
@ -1130,7 +1133,7 @@ void RealIsr(ULONG dwReasonForBreak)
|
|||
{
|
||||
ULONG ulReason;
|
||||
|
||||
DPRINT((0,"REASON_HARDWARE_BP\n"));
|
||||
DPRINT((2,"REASON_HARDWARE_BP\n"));
|
||||
|
||||
// disable HW breakpoints
|
||||
__asm__("
|
||||
|
@ -1144,7 +1147,7 @@ void RealIsr(ULONG dwReasonForBreak)
|
|||
:"eax"
|
||||
);
|
||||
|
||||
DPRINT((0,"REASON_HARDWARE_BP: %x\n",(ulReason&0xF)));
|
||||
DPRINT((2,"REASON_HARDWARE_BP: %x\n",(ulReason&0xF)));
|
||||
|
||||
// HW breakpoint DR1 (skip: only used in init_module detection)
|
||||
if(ulReason&0x2)
|
||||
|
@ -1178,12 +1181,12 @@ void RealIsr(ULONG dwReasonForBreak)
|
|||
else
|
||||
pSrc = NULL;
|
||||
|
||||
DPRINT((0,"RealIsr(): line #%u pSrc=%x (old line #%u) [2]\n",ulLineNumber,(ULONG)pSrc,g_ulLineNumberStart));
|
||||
DPRINT((2,"RealIsr(): line #%u pSrc=%x (old line #%u) [2]\n",ulLineNumber,(ULONG)pSrc,g_ulLineNumberStart));
|
||||
|
||||
// if we have found a source line there
|
||||
if(pSrc && ulLineNumber==g_ulLineNumberStart)
|
||||
{
|
||||
DPRINT((0,"RealIsr(): stepping through line #%u in file = %s! [2]\n",ulLineNumber,pFileName));
|
||||
DPRINT((2,"RealIsr(): stepping through line #%u in file = %s! [2]\n",ulLineNumber,pFileName));
|
||||
|
||||
if(bStepInto)
|
||||
StepInto(NULL);
|
||||
|
@ -1205,7 +1208,7 @@ void RealIsr(ULONG dwReasonForBreak)
|
|||
{
|
||||
ULONG ulAddress;
|
||||
|
||||
DPRINT((0,"REASON_INT3\n"));
|
||||
DPRINT((2,"REASON_INT3\n"));
|
||||
|
||||
// must subtract one cause INT3s are generated after instructions execution
|
||||
CurrentEIP--;
|
||||
|
@ -1213,26 +1216,26 @@ void RealIsr(ULONG dwReasonForBreak)
|
|||
// make a flat address
|
||||
ulAddress = GetLinearAddress(CurrentCS,CurrentEIP);
|
||||
|
||||
DPRINT((0,"INT3 @ %.8X\n",ulAddress));
|
||||
DPRINT((2,"INT3 @ %.8X\n",ulAddress));
|
||||
|
||||
// if there's a breakpoint installed at current EIP remove it
|
||||
if(DeInstallSWBreakpoint(ulAddress) )
|
||||
{
|
||||
PSW_BP p;
|
||||
|
||||
DPRINT((0,"INT3 @ %.8X removed\n",ulAddress));
|
||||
DPRINT((2,"INT3 @ %.8X removed\n",ulAddress));
|
||||
|
||||
// if it's permanent (must be Printk() ) skip the DebuggerShell() and
|
||||
// do a callback
|
||||
if( (p = IsPermanentSWBreakpoint(ulAddress)) )
|
||||
{
|
||||
DPRINT((0,"permanent breakpoint\n"));
|
||||
DPRINT((2,"permanent breakpoint\n"));
|
||||
|
||||
OldCS = CurrentCS;
|
||||
OldEIP = CurrentEIP;
|
||||
|
||||
bSkipMainLoop = TRUE;
|
||||
|
||||
DPRINT((2,"callback at %x\n",p->Callback));
|
||||
if(p->Callback)
|
||||
p->Callback();
|
||||
}
|
||||
|
@ -1256,6 +1259,9 @@ void RealIsr(ULONG dwReasonForBreak)
|
|||
LPSTR pFind;
|
||||
PEPROCESS my_current = IoGetCurrentProcess();
|
||||
|
||||
DPRINT((2,"can't deinstall, somebody else's breakpoint\n"));
|
||||
|
||||
|
||||
// if no other debugger is running on this process and the address is
|
||||
// above TASK_SIZE we assume this to be a hard embedded INT3
|
||||
/*
|
||||
|
@ -1316,7 +1322,7 @@ void RealIsr(ULONG dwReasonForBreak)
|
|||
{
|
||||
LPSTR pSymbolName;
|
||||
|
||||
DPRINT((0,"REASON_PAGEFAULT\n"));
|
||||
DPRINT((2,"REASON_PAGEFAULT\n"));
|
||||
|
||||
if( ScanExportsByAddress(&pSymbolName,GetLinearAddress(CurrentCS,CurrentEIP)) )
|
||||
{
|
||||
|
@ -1335,7 +1341,7 @@ void RealIsr(ULONG dwReasonForBreak)
|
|||
{
|
||||
LPSTR pSymbolName;
|
||||
|
||||
DPRINT((0,"REASON_GPFAULT\n"));
|
||||
DPRINT((2,"REASON_GPFAULT\n"));
|
||||
|
||||
if( ScanExportsByAddress(&pSymbolName,GetLinearAddress(CurrentCS,CurrentEIP)) )
|
||||
{
|
||||
|
@ -1350,19 +1356,19 @@ void RealIsr(ULONG dwReasonForBreak)
|
|||
}
|
||||
else if(dwReasonForBreak == REASON_CTRLF)
|
||||
{
|
||||
DPRINT((0,"REASON_CTRLF\n"));
|
||||
DPRINT((2,"REASON_CTRLF\n"));
|
||||
// nothing to do
|
||||
}
|
||||
else if(dwReasonForBreak == REASON_DOUBLE_FAULT)
|
||||
{
|
||||
DPRINT((0,"REASON_DOUBLE_FAULT\n"));
|
||||
DPRINT((2,"REASON_DOUBLE_FAULT\n"));
|
||||
|
||||
PICE_sprintf(tempShell,"pICE: Breakpoint due to double fault at %.4X:%.8X\n",CurrentCS,CurrentEIP);
|
||||
Print(OUTPUT_WINDOW,tempShell);
|
||||
}
|
||||
else if(dwReasonForBreak == REASON_INTERNAL_ERROR)
|
||||
{
|
||||
DPRINT((0,"REASON_INTERNAL_ERROR\n"));
|
||||
DPRINT((2,"REASON_INTERNAL_ERROR\n"));
|
||||
|
||||
Print(OUTPUT_WINDOW,"pICE: Please report this error to klauspg@diamondmm.com!\n");
|
||||
// Print(OUTPUT_WINDOW,"pICE: !!! SYSTEM HALTED !!!\n");
|
||||
|
@ -1370,7 +1376,7 @@ void RealIsr(ULONG dwReasonForBreak)
|
|||
}
|
||||
else
|
||||
{
|
||||
DPRINT((0,"REASON_UNKNOWN\n"));
|
||||
DPRINT((2,"REASON_UNKNOWN\n"));
|
||||
|
||||
PICE_sprintf(tempShell,"pICE: Breakpoint due to unknown reason at %.4X:%.8X (code %x)\n",CurrentCS,CurrentEIP,dwReasonForBreak);
|
||||
Print(OUTPUT_WINDOW,tempShell);
|
||||
|
@ -1380,13 +1386,13 @@ void RealIsr(ULONG dwReasonForBreak)
|
|||
}
|
||||
|
||||
// we don't single-step yet
|
||||
DPRINT((0,"RealIsr(): not stepping yet\n"));
|
||||
DPRINT((2,"RealIsr(): not stepping yet\n"));
|
||||
bSingleStep=FALSE;
|
||||
|
||||
// process commands
|
||||
if(bSkipMainLoop == FALSE)
|
||||
{
|
||||
DPRINT((0,"RealIsr(): saving registers\n"));
|
||||
DPRINT((2,"RealIsr(): saving registers\n"));
|
||||
// save the extended regs
|
||||
__asm__ __volatile__
|
||||
("
|
||||
|
@ -1418,17 +1424,17 @@ void RealIsr(ULONG dwReasonForBreak)
|
|||
popl %eax"
|
||||
);
|
||||
|
||||
DPRINT((0,"RealIsr(): adding colon to output()\n"));
|
||||
DPRINT((2,"RealIsr(): adding colon to output()\n"));
|
||||
Print(OUTPUT_WINDOW,":");
|
||||
|
||||
DPRINT((0,"RealIsr(): calling DebuggerShell()\n"));
|
||||
DPRINT((2,"RealIsr(): calling DebuggerShell()\n"));
|
||||
DebuggerShell();
|
||||
}
|
||||
|
||||
// if there was a SW breakpoint at CS:EIP
|
||||
if(NeedToReInstallSWBreakpoints(GetLinearAddress(CurrentCS,CurrentEIP),TRUE))
|
||||
{
|
||||
DPRINT((0,"need to reinstall INT3\n"));
|
||||
DPRINT((2,"need to reinstall INT3\n"));
|
||||
// remember how we restarted last time
|
||||
bPreviousCommandWasGo = !bSingleStep;
|
||||
// do a single step to reinstall breakpoint
|
||||
|
@ -1449,7 +1455,7 @@ common_return_point:
|
|||
bInDebuggerShell = FALSE;
|
||||
|
||||
LEAVE_FUNC();
|
||||
DPRINT((0,"-----------------------------------------------------------------\n"));
|
||||
DPRINT((2,"common return-----------------------------------------------------------------\n"));
|
||||
}
|
||||
|
||||
__asm__(".global NewInt31Handler
|
||||
|
@ -1560,7 +1566,7 @@ afterswitch:
|
|||
// restore EAX
|
||||
popl %eax
|
||||
|
||||
// do we need to call old INT1 handler
|
||||
// do we need to call old INT1 handler
|
||||
.byte 0x2e
|
||||
cmp $0,_dwCallOldInt1Handler
|
||||
je do_iret2
|
||||
|
@ -1604,6 +1610,8 @@ do_iret3:
|
|||
jmp *_OldGPFaultHandler
|
||||
|
||||
do_iret:
|
||||
//ei
|
||||
//int3
|
||||
iretl ");
|
||||
|
||||
//
|
||||
|
|
|
@ -53,7 +53,7 @@ LOCAL_VARIABLE local_vars[512];
|
|||
PICE_SYMBOLFILE_HEADER* apSymbols[32]={NULL,};
|
||||
ULONG ulNumSymbolsLoaded=0;
|
||||
|
||||
//ULONG kernel_end=0;
|
||||
ULONG kernel_end=0;
|
||||
|
||||
char tempSym[1024]; // temp buffer for output
|
||||
|
||||
|
@ -231,14 +231,13 @@ BOOLEAN ListDriverModules( void )
|
|||
PICE_wcscpy( pdebug_module_tail->name, pm->BaseName.Buffer);
|
||||
pdebug_module_tail = pdebug_module_tail->next;
|
||||
|
||||
/*
|
||||
if (_wcsicmp(current_obj->Name.Buffer, "Modules")==0)
|
||||
|
||||
if (_wcsicmp(pm->BaseName.Buffer, L"ntoskrnl")==0 && pm)
|
||||
{
|
||||
DbgPrint("Found it %x\n",HEADER_TO_BODY(current_obj));
|
||||
pd=HEADER_TO_BODY(current_obj);
|
||||
}
|
||||
*/
|
||||
current = current->Flink;
|
||||
kernel_end = (ULONG)pm->Base + pm->Length;
|
||||
}
|
||||
|
||||
current = current->Flink;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -594,104 +593,107 @@ BOOLEAN ScanExportsByAddress(LPSTR *pFind,ULONG ulValue)
|
|||
ENTER_FUNC();
|
||||
|
||||
pSymbols = FindModuleSymbols(ulValue);
|
||||
if(pSymbols && pdebug_module_head)
|
||||
{
|
||||
PDEBUG_MODULE pdTemp;
|
||||
if(BuildModuleList()){
|
||||
if(pSymbols && pdebug_module_head)
|
||||
{
|
||||
PDEBUG_MODULE pdTemp;
|
||||
|
||||
DPRINT((0,"looking up symbols\n"));
|
||||
pd = pdebug_module_head;
|
||||
do
|
||||
{
|
||||
ASSERT(pd->size);
|
||||
DPRINT((0,"looking up symbols\n"));
|
||||
pd = pdebug_module_head;
|
||||
do
|
||||
{
|
||||
if(pd->size){
|
||||
pdTemp = pd;
|
||||
|
||||
pdTemp = pd;
|
||||
|
||||
if(ulValue>=((ULONG)pdTemp->BaseAddress) && ulValue<((ULONG)pdTemp+pdTemp->size))
|
||||
{
|
||||
if(PICE_wcsicmp(pdTemp->name,pSymbols->name) == 0)
|
||||
{
|
||||
DPRINT((0,"ScanExportsByAddress(): found symbols for module %S @ %x \n",pdTemp->name,(ULONG)pSymbols));
|
||||
|
||||
pSym = (PIMAGE_SYMBOL)((ULONG)pSymbols+pSymbols->ulOffsetToGlobals);
|
||||
pSymEnd = (PIMAGE_SYMBOL)((ULONG)pSym+pSymbols->ulSizeOfGlobals);
|
||||
pStr = (LPSTR)((ULONG)pSymbols+pSymbols->ulOffsetToGlobalsStrings);
|
||||
pShdr = (PIMAGE_SECTION_HEADER)((ULONG)pSymbols+pSymbols->ulOffsetToHeaders);
|
||||
|
||||
if(!IsRangeValid((ULONG)pSym,sizeof(IMAGE_SYMBOL) ) ) //should we actually check all the symbols here?
|
||||
if(ulValue>=((ULONG)pdTemp->BaseAddress) && ulValue<((ULONG)pdTemp+pdTemp->size))
|
||||
{
|
||||
DPRINT((0,"ScanExportsByAddress(): pSym = %x is not a valid pointer\n",(ULONG)pSym));
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
DPRINT((0,"ScanExportsByAddress(): pSym = %x\n",pSym));
|
||||
DPRINT((0,"ScanExportsByAddress(): pStr = %x\n",pStr));
|
||||
DPRINT((0,"ScanExportsByAddress(): pShdr = %x\n",pShdr));
|
||||
|
||||
DPRINT((0,"ScanExportsByAddress(): %S has %u symbols\n",pSymbols->name,pSymbols->ulSizeOfGlobals/sizeof(IMAGE_SYMBOL)));
|
||||
|
||||
/* go through all the global symbols and find the one with
|
||||
the largest address which is less than ulValue */
|
||||
while(pSym < pSymEnd)
|
||||
{ //it seems only 0x0 and 0x20 are used for type and External or Static storage classes
|
||||
if(((pSym->Type == 0x0) || (pSym->Type == 0x20) ) &&
|
||||
((pSym->StorageClass == IMAGE_SYM_CLASS_EXTERNAL) || (pSym->StorageClass==IMAGE_SYM_CLASS_STATIC)) &&
|
||||
(pSym->SectionNumber > 0 ))
|
||||
if(PICE_wcsicmp(pdTemp->name,pSymbols->name) == 0)
|
||||
{
|
||||
ULONG ulCurrAddr;
|
||||
PIMAGE_SECTION_HEADER pShdrThis = (PIMAGE_SECTION_HEADER)pShdr + (pSym->SectionNumber-1);
|
||||
DPRINT((0,"ScanExportsByAddress(): found symbols for module %S @ %x \n",pdTemp->name,(ULONG)pSymbols));
|
||||
|
||||
pSym = (PIMAGE_SYMBOL)((ULONG)pSymbols+pSymbols->ulOffsetToGlobals);
|
||||
pSymEnd = (PIMAGE_SYMBOL)((ULONG)pSym+pSymbols->ulSizeOfGlobals);
|
||||
pStr = (LPSTR)((ULONG)pSymbols+pSymbols->ulOffsetToGlobalsStrings);
|
||||
pShdr = (PIMAGE_SECTION_HEADER)((ULONG)pSymbols+pSymbols->ulOffsetToHeaders);
|
||||
|
||||
DPRINT((0,"ScanExportsByAddress(): pShdr[%x] = %x\n",pSym->SectionNumber,(ULONG)pShdrThis));
|
||||
|
||||
if(!IsRangeValid((ULONG)pShdrThis,sizeof(IMAGE_SECTION_HEADER)) )
|
||||
if(!IsRangeValid((ULONG)pSym,sizeof(IMAGE_SYMBOL) ) ) //should we actually check all the symbols here?
|
||||
{
|
||||
DPRINT((0,"ScanExportsByAddress(): pElfShdr[%x] = %x is not a valid pointer\n",pSym->SectionNumber,(ULONG)pShdrThis));
|
||||
DPRINT((0,"ScanExportsByAddress(): pSym = %x is not a valid pointer\n",(ULONG)pSym));
|
||||
return FALSE;
|
||||
}
|
||||
//to get address in the memory we base address of the module and
|
||||
//add offset of the section and then add offset of the symbol from
|
||||
//the begining of the section
|
||||
ulCurrAddr = ((ULONG)pdTemp->BaseAddress+pShdrThis->VirtualAddress+pSym->Value);
|
||||
DPRINT((0,"ScanExportsByAddress(): CurrAddr [1] = %x\n",ulCurrAddr));
|
||||
|
||||
if(ulCurrAddr<=ulValue && ulCurrAddr>ulAddr)
|
||||
{
|
||||
ulAddr = ulCurrAddr;
|
||||
pFoundSym = pSym;
|
||||
DPRINT((0,"ScanExportsByAddress(): pSym = %x\n",pSym));
|
||||
DPRINT((0,"ScanExportsByAddress(): pStr = %x\n",pStr));
|
||||
DPRINT((0,"ScanExportsByAddress(): pShdr = %x\n",pShdr));
|
||||
|
||||
DPRINT((0,"ScanExportsByAddress(): %S has %u symbols\n",pSymbols->name,pSymbols->ulSizeOfGlobals/sizeof(IMAGE_SYMBOL)));
|
||||
|
||||
/* go through all the global symbols and find the one with
|
||||
the largest address which is less than ulValue */
|
||||
while(pSym < pSymEnd)
|
||||
{ //it seems only 0x0 and 0x20 are used for type and External or Static storage classes
|
||||
if(((pSym->Type == 0x0) || (pSym->Type == 0x20) ) &&
|
||||
((pSym->StorageClass == IMAGE_SYM_CLASS_EXTERNAL) || (pSym->StorageClass==IMAGE_SYM_CLASS_STATIC)) &&
|
||||
(pSym->SectionNumber > 0 ))
|
||||
{
|
||||
ULONG ulCurrAddr;
|
||||
PIMAGE_SECTION_HEADER pShdrThis = (PIMAGE_SECTION_HEADER)pShdr + (pSym->SectionNumber-1);
|
||||
|
||||
|
||||
DPRINT((0,"ScanExportsByAddress(): pShdr[%x] = %x\n",pSym->SectionNumber,(ULONG)pShdrThis));
|
||||
|
||||
if(!IsRangeValid((ULONG)pShdrThis,sizeof(IMAGE_SECTION_HEADER)) )
|
||||
{
|
||||
DPRINT((0,"ScanExportsByAddress(): pElfShdr[%x] = %x is not a valid pointer\n",pSym->SectionNumber,(ULONG)pShdrThis));
|
||||
return FALSE;
|
||||
}
|
||||
//to get address in the memory we base address of the module and
|
||||
//add offset of the section and then add offset of the symbol from
|
||||
//the begining of the section
|
||||
ulCurrAddr = ((ULONG)pdTemp->BaseAddress+pShdrThis->VirtualAddress+pSym->Value);
|
||||
DPRINT((0,"ScanExportsByAddress(): CurrAddr [1] = %x\n",ulCurrAddr));
|
||||
|
||||
if(ulCurrAddr<=ulValue && ulCurrAddr>ulAddr)
|
||||
{
|
||||
ulAddr = ulCurrAddr;
|
||||
pFoundSym = pSym;
|
||||
}
|
||||
}
|
||||
//skip the auxiliary symbols and get the next symbol
|
||||
pSym += pSym->NumberOfAuxSymbols + 1;
|
||||
}
|
||||
*pFind = temp3;
|
||||
if(0)
|
||||
{
|
||||
PIMAGE_SECTION_HEADER pShdrThis = (PIMAGE_SECTION_HEADER)pShdr + (pFoundSym->SectionNumber-1);
|
||||
//check that ulValue is below the limit for the section where best match is found
|
||||
ASSERT(ulValue < ((ULONG)pdTemp->BaseAddress+pShdrThis->SizeOfRawData));
|
||||
}
|
||||
if( pFoundSym->N.Name.Short ){
|
||||
pName = pFoundSym->N.ShortName; //name is in the header
|
||||
PICE_sprintf(temp3,"%S!%.8s",pdTemp->name,pName); //if name is in the header it may be nonzero terminated
|
||||
}
|
||||
else{
|
||||
ASSERT(pFoundSym->N.Name.Long<=pSymbols->ulSizeOfGlobalsStrings); //sanity check
|
||||
pName = pStr+pFoundSym->N.Name.Long;
|
||||
if(!IsAddressValid((ULONG)pName))
|
||||
{
|
||||
DPRINT((0,"ScanExportsByAddress(): pName = %x is not a valid pointer\n",pName));
|
||||
return FALSE;
|
||||
}
|
||||
PICE_sprintf(temp3,"%S!%s",pdTemp->name,pName);
|
||||
}
|
||||
DPRINT((0,"ScanExportsByAddress(): pName = %x\n",(ULONG)pName));
|
||||
return TRUE;
|
||||
}
|
||||
//skip the auxiliary symbols and get the next symbol
|
||||
pSym += pSym->NumberOfAuxSymbols + 1;
|
||||
}
|
||||
*pFind = temp3;
|
||||
{
|
||||
PIMAGE_SECTION_HEADER pShdrThis = (PIMAGE_SECTION_HEADER)pShdr + (pFoundSym->SectionNumber-1);
|
||||
//check that ulValue is below the limit for the section where best match is found
|
||||
ASSERT(ulValue < ((ULONG)pdTemp->BaseAddress+pShdrThis->SizeOfRawData));
|
||||
}
|
||||
if( pFoundSym->N.Name.Short ){
|
||||
pName = pFoundSym->N.ShortName; //name is in the header
|
||||
PICE_sprintf(temp3,"%S!%.8s",pdTemp->name,pName); //if name is in the header it may be nonzero terminated
|
||||
}
|
||||
else{
|
||||
ASSERT(pFoundSym->N.Name.Long<=pSymbols->ulSizeOfGlobalsStrings); //sanity check
|
||||
pName = pStr+pFoundSym->N.Name.Long;
|
||||
if(!IsAddressValid((ULONG)pName))
|
||||
{
|
||||
DPRINT((0,"ScanExportsByAddress(): pName = %x is not a valid pointer\n",pName));
|
||||
return FALSE;
|
||||
}
|
||||
PICE_sprintf(temp3,"%S!%s",pdTemp->name,pName);
|
||||
}
|
||||
DPRINT((0,"ScanExportsByAddress(): pName = %x\n",(ULONG)pName));
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
}while((pd = pd->next));
|
||||
}while((pd = pd->next));
|
||||
}
|
||||
}
|
||||
// if haven't found in the symbols try ntoskrnl exports. (note: check that this is needed since we
|
||||
// already checked ntoskrnl coff symbol table)
|
||||
if(pExports /*&& ulValue >= TASK_SIZE && ulValue < kernel_end*/)
|
||||
if(pExports && ulValue >= KERNEL_START && ulValue < kernel_end)
|
||||
{
|
||||
p = pExports;
|
||||
// while we bound in System.map
|
||||
|
@ -1348,7 +1350,7 @@ PLOCAL_VARIABLE FindLocalsByAddress(ULONG addr)
|
|||
break;
|
||||
case N_LSYM:
|
||||
// if we're in the function we're looking for
|
||||
if(szCurrentFunction[0] && PICE_strcmp(szCurrentFunction,pFunctionName)==0)
|
||||
if(szCurrentFunction[0] && PICE_fncmp(szCurrentFunction,pFunctionName)==0)
|
||||
{
|
||||
DPRINT((0,"local variable %.8X %.8X %.8X %.8X %.8X %s\n",pStab->n_strx,pStab->n_type,pStab->n_other,pStab->n_desc,pStab->n_value,pName));
|
||||
ulTypeNumber = ExtractTypeNumber(pName);
|
||||
|
@ -1367,7 +1369,7 @@ PLOCAL_VARIABLE FindLocalsByAddress(ULONG addr)
|
|||
break;
|
||||
case N_PSYM:
|
||||
// if we're in the function we're looking for
|
||||
if(szCurrentFunction[0] && PICE_strcmp(szCurrentFunction,pFunctionName)==0)
|
||||
if(szCurrentFunction[0] && PICE_fncmp(szCurrentFunction,pFunctionName)==0)
|
||||
{
|
||||
DPRINT((0,"parameter variable %.8X %.8X %.8X %.8X %.8X %s\n",pStab->n_strx,pStab->n_type,pStab->n_other,pStab->n_desc,pStab->n_value,pName));
|
||||
ulTypeNumber = ExtractTypeNumber(pName);
|
||||
|
@ -1384,7 +1386,7 @@ PLOCAL_VARIABLE FindLocalsByAddress(ULONG addr)
|
|||
break;
|
||||
case N_RSYM:
|
||||
// if we're in the function we're looking for
|
||||
if(szCurrentFunction[0] && PICE_strcmp(szCurrentFunction,pFunctionName)==0)
|
||||
if(szCurrentFunction[0] && PICE_fncmp(szCurrentFunction,pFunctionName)==0)
|
||||
{
|
||||
DPRINT((0,"local variable %.8X %.8X %.8X %.8X %.8X %s\n",pStab->n_strx,pStab->n_type,pStab->n_other,pStab->n_desc,pStab->n_value,pName));
|
||||
ulTypeNumber = ExtractTypeNumber(pName);
|
||||
|
@ -1452,14 +1454,16 @@ LPSTR FindSourceLineForAddress(ULONG addr,PULONG pulLineNumber,LPSTR* ppSrcStart
|
|||
|
||||
// lookup the functions name and start-end (external symbols)
|
||||
pFunctionName = FindFunctionByAddress(addr,&start,&end);
|
||||
DPRINT((2,"FindSourceLineForAddress: %x\n", pFunctionName));
|
||||
DPRINT((0,"FindSourceLineForAddress: for function: %s\n", pFunctionName));
|
||||
|
||||
if(pFunctionName)
|
||||
{
|
||||
// lookup the modules symbol table (STABS)
|
||||
pSymbols = FindModuleSymbols(addr);
|
||||
DPRINT((0,"FindSourceLineForAddress: pSymbols %x\n", pSymbols));
|
||||
if(pSymbols)
|
||||
{
|
||||
DPRINT((0,"FindSourceLineForAddress: pSymbols->ulNumberOfSrcFiles %x\n", pSymbols->ulNumberOfSrcFiles));
|
||||
// no source files so we don't need to lookup anything
|
||||
if(!pSymbols->ulNumberOfSrcFiles)
|
||||
return NULL;
|
||||
|
@ -1514,9 +1518,9 @@ LPSTR FindSourceLineForAddress(ULONG addr,PULONG pulLineNumber,LPSTR* ppSrcStart
|
|||
// line number
|
||||
case N_SLINE:
|
||||
// if we're in the function we're looking for
|
||||
if(szCurrentFunction[0] && PICE_strcmp(szCurrentFunction,pFunctionName)==0)
|
||||
if(szCurrentFunction[0] && PICE_fncmp(szCurrentFunction,pFunctionName)==0)
|
||||
{
|
||||
//DPRINT((0,"code source line number #%u for addr. %x (function @ %x) ulMinValue = %x ulDelta = %x\n",pStab->n_desc,start+pStab->n_value,start,ulMinValue,(addr-(start+pStab->n_value))));
|
||||
DPRINT((0,"code source line number #%u for addr. %x (function @ %x) ulMinValue = %x ulDelta = %x\n",pStab->n_desc,start+pStab->n_value,start,ulMinValue,(addr-(start+pStab->n_value))));
|
||||
|
||||
if(bFirstOccurence)
|
||||
{
|
||||
|
@ -1638,6 +1642,7 @@ LPSTR FindSourceLineForAddress(ULONG addr,PULONG pulLineNumber,LPSTR* ppSrcStart
|
|||
}
|
||||
}
|
||||
}
|
||||
DPRINT((0,"FindSourceLineForAddress: exit 1\n"));
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
@ -1768,7 +1773,7 @@ ULONG ListSymbolStartingAt(PDEBUG_MODULE pMod,PICE_SYMBOLFILE_HEADER* pSymbols,U
|
|||
LPSTR pName;
|
||||
|
||||
if(((pSym->Type == 0x0) || (pSym->Type == 0x20) ) &&
|
||||
((pSym->StorageClass == IMAGE_SYM_CLASS_EXTERNAL) || (pSym->StorageClass==IMAGE_SYM_CLASS_STATIC)) &&
|
||||
((pSym->StorageClass == IMAGE_SYM_CLASS_EXTERNAL) /*|| (pSym->StorageClass==IMAGE_SYM_CLASS_STATIC)*/) &&
|
||||
(pSym->SectionNumber > 0 ))
|
||||
{
|
||||
PIMAGE_SECTION_HEADER pShdrThis = (PIMAGE_SECTION_HEADER)pShdr + (pSym->SectionNumber-1);
|
||||
|
@ -1956,37 +1961,37 @@ PICE_SYMBOLFILE_HEADER* LoadSymbols(LPSTR filename)
|
|||
|
||||
if( !( conv = PICE_MultiByteToWideChar(CP_ACP, NULL, filename, -1, tempstr, 256 ) ) )
|
||||
{
|
||||
DPRINT((0,"Can't convert module name.\n"));
|
||||
DPRINT((2,"Can't convert module name.\n"));
|
||||
return NULL;
|
||||
}
|
||||
DPRINT((0,"LoadSymbols: test %S, %s, tempstr %S, conv: %d\n",L"testing", filename, tempstr, conv));
|
||||
DPRINT((2,"LoadSymbols: filename %s, tempstr %S, conv: %d\n", filename, tempstr, conv));
|
||||
|
||||
if(ulNumSymbolsLoaded<DIM(apSymbols))
|
||||
{
|
||||
hf = PICE_open(tempstr,OF_READ);
|
||||
DPRINT((0,"LoadSymbols: hf: %x, file: %S\n",hf, tempstr));
|
||||
DPRINT((2,"LoadSymbols: hf: %x, file: %S\n",hf, tempstr));
|
||||
if(hf)
|
||||
{
|
||||
//mm_segment_t oldfs;
|
||||
size_t len;
|
||||
|
||||
DPRINT((0,"hf = %x\n",hf));
|
||||
DPRINT((2,"hf = %x\n",hf));
|
||||
|
||||
len = PICE_len(hf);
|
||||
DPRINT((0,"file len = %d\n",len));
|
||||
DPRINT((2,"file len = %d\n",len));
|
||||
|
||||
if(len)
|
||||
{
|
||||
pSymbols = PICE_malloc(len+1,NONPAGEDPOOL); // maybe make pool setting an option
|
||||
DPRINT((0,"pSymbols = %x\n",pSymbols));
|
||||
DPRINT((2,"pSymbols = %x\n",pSymbols));
|
||||
|
||||
if(pSymbols)
|
||||
{
|
||||
//oldfs = get_fs(); set_fs(KERNEL_DS);
|
||||
if(len == PICE_read(hf,(PVOID)pSymbols,len))
|
||||
{
|
||||
DPRINT((0,"LoadSymbols(): success reading symbols!\n"));
|
||||
DPRINT((0,"LoadSymbols(): pSymbols->magic = %X\n",pSymbols->magic));
|
||||
DPRINT((2,"LoadSymbols(): success reading symbols!\n"));
|
||||
DPRINT((2,"LoadSymbols(): pSymbols->magic = %X\n",pSymbols->magic));
|
||||
}
|
||||
//set_fs(oldfs);
|
||||
|
||||
|
@ -2017,7 +2022,7 @@ PICE_SYMBOLFILE_HEADER* LoadSymbols(LPSTR filename)
|
|||
}
|
||||
else
|
||||
{
|
||||
DPRINT((0,"pICE: could not load symbols for %s...\n",filename));
|
||||
DPRINT((2,"pICE: could not load symbols for %s...\n",filename));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -2178,7 +2183,7 @@ BOOLEAN LoadSymbolsFromConfig(BOOLEAN bIgnoreBootParams)
|
|||
{
|
||||
DPRINT((0,"Load symbols from file %s\n", temp));
|
||||
pSymbols = LoadSymbols(temp);
|
||||
DbgPrint("Load symbols from file %s, pSymbols: %x\n", temp, pSymbols);
|
||||
DPRINT((2,"Load symbols from file %s, pSymbols: %x\n", temp, pSymbols));
|
||||
if(pSymbols)
|
||||
{
|
||||
PICE_SYMBOLFILE_SOURCE* pSrc;
|
||||
|
|
|
@ -44,7 +44,7 @@ char tempFlowChanges[256];
|
|||
|
||||
//PMADDRESS_SPACE my_init_mm=NULL;
|
||||
|
||||
ULONG TwoPagesForPhysMem[2*PAGE_SIZE];
|
||||
ULONG TwoPagesForPhysMem[2*_PAGE_SIZE];
|
||||
|
||||
// scancode to ASCII conversion
|
||||
typedef struct tagSCANTOASCII
|
||||
|
@ -301,13 +301,13 @@ ULONG result=1;
|
|||
}
|
||||
|
||||
//*************************************************************************
|
||||
// PICE_strcmpi()
|
||||
// PICE_strcmp()
|
||||
//
|
||||
// my version of strcmp()
|
||||
//*************************************************************************
|
||||
ULONG PICE_strcmp(char* s1,char* s2)
|
||||
{
|
||||
ULONG result=1;
|
||||
ULONG result=1;
|
||||
|
||||
while(IsAddressValid((ULONG)s1) && *s1 && // not end of string
|
||||
IsAddressValid((ULONG)s2) && *s2 && // not end of string
|
||||
|
@ -323,6 +323,37 @@ ULONG result=1;
|
|||
return result;
|
||||
}
|
||||
|
||||
//*************************************************************************
|
||||
// PICE_fncmp()
|
||||
//
|
||||
// compare function names ignoring decorations:
|
||||
// leading '_' or '@" and trailing "@xx"
|
||||
//*************************************************************************
|
||||
ULONG PICE_fncmp(char* s1,char* s2)
|
||||
{
|
||||
ULONG result=1;
|
||||
|
||||
if( IsAddressValid((ULONG)s1) && (*s1 == '_' || *s1 == '@'))
|
||||
s1++;
|
||||
|
||||
if( IsAddressValid((ULONG)s2) && (*s2 == '_' || *s2 == '@'))
|
||||
s2++;
|
||||
|
||||
while(IsAddressValid((ULONG)s1) && *s1 && // not end of string
|
||||
IsAddressValid((ULONG)s2) && *s2 )
|
||||
{
|
||||
if( (*s1 != *s2) || *s1=='@' || *s2=='@' )
|
||||
break;
|
||||
s1++;
|
||||
s2++;
|
||||
}
|
||||
// strings same length
|
||||
if((*s1==0 || *s1=='@') && (*s2==0 || *s2 =='@')){
|
||||
result=0;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
ULONG PICE_wcsicmp(WCHAR* s1, WCHAR* s2)
|
||||
{
|
||||
ULONG result=1;
|
||||
|
@ -366,11 +397,11 @@ char c;
|
|||
//
|
||||
// does a page validity check on every character in th string
|
||||
//*************************************************************************
|
||||
USHORT PICE_strlen(char* s)
|
||||
USHORT PICE_strlen(const char* s)
|
||||
{
|
||||
USHORT i;
|
||||
|
||||
for(i=0;IsAddressValid((ULONG)&s[i]) && s[i]!=0 && i<PAGE_SIZE;i++);
|
||||
for(i=0;IsAddressValid((ULONG)&s[i]) && s[i]!=0 && i<_PAGE_SIZE;i++);
|
||||
|
||||
if(IsAddressValid((ULONG)&s[i]) && s[i]==0)
|
||||
return i;
|
||||
|
@ -437,7 +468,7 @@ BOOLEAN IsAddressValid(ULONG address)
|
|||
BOOLEAN bResult = FALSE;
|
||||
PEPROCESS my_current = IoGetCurrentProcess();
|
||||
|
||||
address &= (~(PAGE_SIZE-1));
|
||||
address &= (~(_PAGE_SIZE-1));
|
||||
|
||||
if(my_current)
|
||||
{
|
||||
|
@ -477,10 +508,9 @@ BOOLEAN IsAddressWriteable(ULONG address)
|
|||
{
|
||||
PULONG pPGD;
|
||||
PULONG pPTE;
|
||||
BOOLEAN bResult = FALSE;
|
||||
PEPROCESS my_current = IoGetCurrentProcess();
|
||||
|
||||
address &= (~(PAGE_SIZE-1));
|
||||
//address &= (~(_PAGE_SIZE-1));
|
||||
|
||||
if(my_current)
|
||||
{
|
||||
|
@ -490,24 +520,26 @@ BOOLEAN IsAddressWriteable(ULONG address)
|
|||
// not large page
|
||||
if(!((*pPGD)&_PAGE_4M))
|
||||
{
|
||||
bResult |= (*pPGD) & _PAGE_RW;
|
||||
if(!((*pPGD) & _PAGE_RW))
|
||||
return FALSE;
|
||||
|
||||
pPTE = ADDR_TO_PTE(address);
|
||||
if(pPTE)
|
||||
{
|
||||
if( (*pPTE)&(_PAGE_PRESENT | _PAGE_PSE) )
|
||||
bResult |= (*pPTE) & _PAGE_RW;
|
||||
if( ((*pPTE)&(_PAGE_PRESENT | _PAGE_PSE)) &&
|
||||
((*pPTE) & _PAGE_RW))
|
||||
return TRUE;
|
||||
else
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
// large page
|
||||
else
|
||||
{
|
||||
bResult |= (*pPGD) & _PAGE_RW;
|
||||
}
|
||||
return ((*pPGD) & _PAGE_RW);
|
||||
}
|
||||
}
|
||||
|
||||
return bResult;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
||||
|
@ -519,11 +551,9 @@ BOOLEAN SetAddressWriteable(ULONG address,BOOLEAN bSet)
|
|||
{
|
||||
PULONG pPGD;
|
||||
PULONG pPTE;
|
||||
BOOLEAN bResult = FALSE;
|
||||
PEPROCESS my_current = IoGetCurrentProcess();
|
||||
|
||||
address &= (~(PAGE_SIZE-1));
|
||||
|
||||
//address &= (~(_PAGE_SIZE-1));
|
||||
if(my_current)
|
||||
{
|
||||
pPGD = ADDR_TO_PDE(address);
|
||||
|
@ -537,11 +567,14 @@ BOOLEAN SetAddressWriteable(ULONG address,BOOLEAN bSet)
|
|||
{
|
||||
if( (*pPTE)&(_PAGE_PRESENT | _PAGE_PSE) )
|
||||
{
|
||||
if( bSet )
|
||||
if( bSet ){
|
||||
*pPTE |= _PAGE_RW;
|
||||
else
|
||||
}
|
||||
else{
|
||||
*pPTE &= ~_PAGE_RW;
|
||||
bResult = TRUE;
|
||||
}
|
||||
FLUSH_TLB;
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -552,12 +585,12 @@ BOOLEAN SetAddressWriteable(ULONG address,BOOLEAN bSet)
|
|||
*pPGD |= _PAGE_RW;
|
||||
else
|
||||
*pPGD &= ~_PAGE_RW;
|
||||
bResult = TRUE;
|
||||
FLUSH_TLB;
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return bResult;
|
||||
return FALSE;
|
||||
}
|
||||
//*************************************************************************
|
||||
// IsRangeValid()
|
||||
|
@ -570,7 +603,7 @@ ULONG i,NumPages,PageNum;
|
|||
|
||||
// need to only touch one byte per page
|
||||
// calculate PICE_number of pages to touch
|
||||
NumPages=(Length+(PAGE_SIZE-1))>>12;
|
||||
NumPages=(Length+(_PAGE_SIZE-1))>>12;
|
||||
|
||||
// calculate PICE_number of page
|
||||
PageNum=Addr>>PAGE_SHIFT;
|
||||
|
@ -579,7 +612,7 @@ ULONG i,NumPages,PageNum;
|
|||
for(i=0;i<NumPages;i++)
|
||||
{
|
||||
// if any one page is invalid range is invalid
|
||||
if(!IsAddressValid((ULONG)((PageNum+i)*PAGE_SIZE)) )
|
||||
if(!IsAddressValid((ULONG)((PageNum+i)*_PAGE_SIZE)) )
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
@ -1411,7 +1444,7 @@ PULONG FindPteForLinearAddress(ULONG address)
|
|||
|
||||
ENTER_FUNC();
|
||||
|
||||
address &= (~(PAGE_SIZE-1));
|
||||
address &= (~(_PAGE_SIZE-1));
|
||||
|
||||
if(my_current)
|
||||
{
|
||||
|
@ -1464,7 +1497,7 @@ void InvalidateLB(void)
|
|||
//*************************************************************************
|
||||
ULONG ReadPhysMem(ULONG Address,ULONG ulSize)
|
||||
{
|
||||
ULONG Page = ((ULONG)TwoPagesForPhysMem+PAGE_SIZE)&~(PAGE_SIZE-1);
|
||||
ULONG Page = ((ULONG)TwoPagesForPhysMem+_PAGE_SIZE)&~(_PAGE_SIZE-1);
|
||||
PULONG pPTE;
|
||||
ULONG temp = 0;
|
||||
ULONG oldPTE;
|
||||
|
@ -1478,7 +1511,7 @@ ULONG ReadPhysMem(ULONG Address,ULONG ulSize)
|
|||
{
|
||||
oldPTE = *pPTE;
|
||||
DPRINT((0,"ReadPhysMem(): oldPTE = %.8X\n",oldPTE));
|
||||
temp = (Address & ~(PAGE_SIZE-1));
|
||||
temp = (Address & ~(_PAGE_SIZE-1));
|
||||
DPRINT((0,"ReadPhysMem(): page-aligned Address = %.8X\n",temp));
|
||||
*pPTE = temp|0x1;
|
||||
DPRINT((0,"ReadPhysMem(): new PTE = %.8X\n",*pPTE));
|
||||
|
@ -1486,15 +1519,15 @@ ULONG ReadPhysMem(ULONG Address,ULONG ulSize)
|
|||
switch(ulSize)
|
||||
{
|
||||
case sizeof(UCHAR): // BYTE
|
||||
temp = *(PUCHAR)(Page + (Address & (PAGE_SIZE-1)));
|
||||
temp = *(PUCHAR)(Page + (Address & (_PAGE_SIZE-1)));
|
||||
temp = (UCHAR)temp;
|
||||
break;
|
||||
case sizeof(USHORT): // WORD
|
||||
temp = *(PUSHORT)(Page + (Address & (PAGE_SIZE-1)));
|
||||
temp = *(PUSHORT)(Page + (Address & (_PAGE_SIZE-1)));
|
||||
temp = (USHORT)temp;
|
||||
break;
|
||||
case sizeof(ULONG): // DWORD
|
||||
temp = *(PULONG)(Page + (Address & (PAGE_SIZE-1)));
|
||||
temp = *(PULONG)(Page + (Address & (_PAGE_SIZE-1)));
|
||||
break;
|
||||
}
|
||||
*pPTE = oldPTE;
|
||||
|
@ -1511,7 +1544,7 @@ ULONG ReadPhysMem(ULONG Address,ULONG ulSize)
|
|||
//*************************************************************************
|
||||
void WritePhysMem(ULONG Address,ULONG Datum,ULONG ulSize)
|
||||
{
|
||||
ULONG Page = ((ULONG)TwoPagesForPhysMem+PAGE_SIZE)&~(PAGE_SIZE-1);
|
||||
ULONG Page = ((ULONG)TwoPagesForPhysMem+_PAGE_SIZE)&~(_PAGE_SIZE-1);
|
||||
PULONG pPTE;
|
||||
ULONG temp;
|
||||
ULONG oldPTE;
|
||||
|
@ -1520,19 +1553,19 @@ void WritePhysMem(ULONG Address,ULONG Datum,ULONG ulSize)
|
|||
if(pPTE)
|
||||
{
|
||||
oldPTE = *pPTE;
|
||||
temp = (Address & ~(PAGE_SIZE-1));
|
||||
temp = (Address & ~(_PAGE_SIZE-1));
|
||||
*pPTE = temp | 0x3; // present and writable
|
||||
InvalidateLB();
|
||||
switch(ulSize)
|
||||
{
|
||||
case sizeof(UCHAR): // BYTE
|
||||
*(PUCHAR)(Page + (Address & (PAGE_SIZE-1))) = (UCHAR)Datum;
|
||||
*(PUCHAR)(Page + (Address & (_PAGE_SIZE-1))) = (UCHAR)Datum;
|
||||
break;
|
||||
case sizeof(USHORT): // WORD
|
||||
*(PUSHORT)(Page + (Address & (PAGE_SIZE-1))) = (USHORT)Datum;
|
||||
*(PUSHORT)(Page + (Address & (_PAGE_SIZE-1))) = (USHORT)Datum;
|
||||
break;
|
||||
case sizeof(ULONG): // DWORD
|
||||
*(PULONG)(Page + (Address & (PAGE_SIZE-1))) = Datum;
|
||||
*(PULONG)(Page + (Address & (_PAGE_SIZE-1))) = Datum;
|
||||
break;
|
||||
}
|
||||
*pPTE = oldPTE;
|
||||
|
@ -2038,39 +2071,6 @@ ULONG inl(PULONG port)
|
|||
return READ_PORT_ULONG(port);
|
||||
}
|
||||
|
||||
#if 0
|
||||
//*************************************************************************
|
||||
// GetInitMm()
|
||||
//
|
||||
//*************************************************************************
|
||||
struct mm_struct *GetInitMm(void)
|
||||
{
|
||||
|
||||
#if REAL_LINUX_VERSION_CODE >= 0x02020B
|
||||
ENTER_FUNC();
|
||||
/* symbol export of init_mm was added in 2.2.11 */
|
||||
LEAVE_FUNC();
|
||||
return &init_mm;
|
||||
#else
|
||||
// see also Rubini, Linux Device Drivers, page 288
|
||||
struct task_struct *pt;
|
||||
|
||||
ENTER_FUNC();
|
||||
|
||||
for (pt = current->next_task; pt != current; pt = pt->next_task) {
|
||||
if (pt->pid == 0) {
|
||||
LEAVE_FUNC();
|
||||
return pt->mm;
|
||||
}
|
||||
}
|
||||
|
||||
DPRINT((0,"GetInitMm(): failure\n"));
|
||||
LEAVE_FUNC();
|
||||
return NULL;
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
||||
//*************************************************************************
|
||||
// EnablePassThrough()
|
||||
//
|
||||
|
@ -2186,7 +2186,7 @@ int PICE_close (HANDLE hFile)
|
|||
{
|
||||
return 0;
|
||||
}
|
||||
DbgPrint("ZwClose failed:\n");
|
||||
DPRINT((2,"ZwClose failed:\n"));
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
@ -2200,7 +2200,7 @@ size_t PICE_len( HANDLE hFile )
|
|||
if( !NT_SUCCESS( status ) ){
|
||||
DPRINT((0,"PICE_len: ZwQueryInformationFile error: %x\n", status));
|
||||
}
|
||||
ASSERT(fs.EndOfFile.u.HighPart == 0);
|
||||
//ASSERT(fs.EndOfFile.u.HighPart == 0);
|
||||
return (size_t)fs.EndOfFile.u.LowPart;
|
||||
}
|
||||
|
||||
|
|
|
@ -175,7 +175,7 @@ char *PICE_strrev(char *);
|
|||
ULONG PICE_strcmp(char* s1,char* s2);
|
||||
ULONG PICE_strcmpi(char* s1,char* s2);
|
||||
ULONG PICE_strncmpi(char* s1,char* s2,ULONG len);
|
||||
USHORT PICE_strlen(char* s);
|
||||
USHORT PICE_strlen(const char* s);
|
||||
char* PICE_strcat(char* s1,char* s2);
|
||||
BOOLEAN PICE_isprint(char c);
|
||||
char* PICE_strcpy(char* s1,char* s2);
|
||||
|
@ -240,7 +240,9 @@ void KeyboardFlushKeyboardQueue(void);
|
|||
#define _PAGE_ACCESSED 0x020
|
||||
#define _PAGE_DIRTY 0x040
|
||||
#define _PAGE_PSE 0x080
|
||||
#define _PAGE_4M _PAGE_PSE
|
||||
#define _PAGE_4M _PAGE_PSE
|
||||
#define _PAGE_SIZE 0x1000
|
||||
|
||||
|
||||
UCHAR AsciiFromScan(UCHAR s);
|
||||
UCHAR AsciiToScan(UCHAR s);
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
# sample
|
||||
+vga
|
||||
\\SystemRoot\symbols\pice.dbg
|
||||
\\SystemRoot\symbols\ntoskrnl.dbg
|
||||
|
|
Loading…
Reference in a new issue