You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
179 lines
3.8 KiB
179 lines
3.8 KiB
|
|
/*
|
|
Copyright (c) 1990 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
kdexts.c
|
|
|
|
Abstract:
|
|
|
|
This function contains some example KD debugger extensions
|
|
|
|
Author:
|
|
|
|
John Vert (jvert) 6-Aug-1992
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
#include "precomp.h"
|
|
|
|
|
|
typedef BOOLEAN
|
|
(*PRINT_FUNC) (
|
|
IN PROW Row
|
|
);
|
|
|
|
HANDLE FileHandle;
|
|
PRINT_FUNC Print;
|
|
|
|
DWORD
|
|
MyOpenFile (
|
|
IN PCHAR Name,
|
|
IN PWINDBG_OUTPUT_ROUTINE out,
|
|
OUT HANDLE *File
|
|
)
|
|
|
|
{
|
|
HANDLE hFile;
|
|
hFile = CreateFile(Name,
|
|
GENERIC_WRITE | GENERIC_READ,
|
|
0,
|
|
NULL,
|
|
CREATE_ALWAYS ,
|
|
FILE_ATTRIBUTE_NORMAL,
|
|
NULL);
|
|
|
|
if (INVALID_HANDLE_VALUE == hFile) {
|
|
out ("MyOpenFile: CreateFile Failed.\n");
|
|
}
|
|
|
|
*File = hFile;
|
|
|
|
return(INVALID_HANDLE_VALUE == hFile ? (!(ERROR_SUCCESS)) : ERROR_SUCCESS);
|
|
}
|
|
|
|
BOOLEAN MyWriteFile(PROW lRow)
|
|
{
|
|
LONG len;
|
|
BOOL bRv;
|
|
DWORD dwWritten;
|
|
CHAR buffer[1024];
|
|
|
|
dprintf(".");
|
|
wsprintf(buffer, "[%4d] 0x%x:0x%x:0x%x:0x%x: %s\n", lRow->Line, lRow->P1, lRow->P2, lRow->P3, lRow->P4, lRow->Row);
|
|
len = strlen(buffer);
|
|
bRv = WriteFile( FileHandle, buffer, len, &dwWritten, NULL );
|
|
|
|
if (!bRv) {
|
|
dprintf("WriteFile: Puked\n");
|
|
}
|
|
|
|
return bRv ? TRUE :FALSE;
|
|
}
|
|
|
|
BOOLEAN MyWriteConsole(PROW lRow)
|
|
{
|
|
dprintf("[%4d] 0x%x:0x%x:0x%x:0x%x: %s\n", lRow->Line, lRow->P1, lRow->P2, lRow->P3, lRow->P4, lRow->Row);
|
|
return TRUE;
|
|
}
|
|
|
|
DECLARE_API( tt )
|
|
{
|
|
UINT i, max, total = 0;
|
|
DWORD hostAddress;
|
|
LOG LLog;
|
|
ULONG status, success;
|
|
ULONG bytesread;
|
|
CHAR DeviceName[] = "c:\\tmp\\";
|
|
CHAR buffer[255];
|
|
|
|
char LogBase[] = {"&msgpc!Log"};
|
|
|
|
hostAddress = GetExpression(LogBase);
|
|
|
|
if ( *args != '\0' ) {
|
|
|
|
strcpy( buffer, DeviceName );
|
|
strcat( buffer, args );
|
|
status = MyOpenFile( buffer, dprintf, &FileHandle );
|
|
if ( status == ERROR_SUCCESS ) {
|
|
Print = MyWriteFile;
|
|
max = LOGSIZE;
|
|
}
|
|
else {
|
|
goto cleanup;
|
|
}
|
|
|
|
dprintf( "handle =%x status=%x \n", FileHandle, status);
|
|
}
|
|
else {
|
|
Print = MyWriteConsole;
|
|
max = 100;
|
|
}
|
|
|
|
if (!hostAddress){
|
|
dprintf("bad string conversion (%s) \n", LogBase);
|
|
goto cleanup;
|
|
}
|
|
|
|
success = ReadMemory((ULONG)hostAddress, &LLog, sizeof(LOG), &bytesread );
|
|
if (!success){
|
|
dprintf("problems reading memory at %x for %x bytes\n", hostAddress, sizeof(LOG));
|
|
goto cleanup;
|
|
}
|
|
|
|
dprintf( "TT Log dumping %d entries\n", max);
|
|
for(i = LLog.Index; (i < LOGSIZE) && (total < max); i++, total++)
|
|
{
|
|
PROW pRow;
|
|
ROW lRow;
|
|
|
|
pRow = &LLog.Buffer[i];
|
|
|
|
success = ReadMemory((ULONG)pRow, &lRow, sizeof(ROW), &bytesread);
|
|
|
|
if(!success) {
|
|
|
|
dprintf("problems reading memory at %x for %x bytes\n", pRow, sizeof(LOG));
|
|
goto cleanup;
|
|
}
|
|
|
|
(*Print)(&lRow);
|
|
|
|
}
|
|
|
|
if (total < max) {
|
|
dprintf( "TT Log dumping the rest (%d) from the top....\n", LLog.Index);
|
|
}
|
|
|
|
for(i = 0; (i < LLog.Index) && (total < max); i++, total++)
|
|
{
|
|
PROW pRow;
|
|
ROW lRow;
|
|
|
|
pRow = &LLog.Buffer[i];
|
|
|
|
success = ReadMemory((ULONG)pRow, &lRow, sizeof(ROW), &bytesread);
|
|
|
|
if(!success) {
|
|
|
|
dprintf("problems reading memory at %x for %x bytes\n", pRow, sizeof(LOG));
|
|
goto cleanup;
|
|
}
|
|
|
|
(*Print)(&lRow);
|
|
|
|
}
|
|
|
|
cleanup:
|
|
if ( *args != '\0' ) {
|
|
CloseHandle(FileHandle);
|
|
}
|
|
return;
|
|
|
|
}
|
|
|
|
|