windows-nt/Source/XPSP1/NT/net/qos/pclass/kdext/logger.c
2020-09-26 16:20:57 +08:00

180 lines
3.6 KiB
C

/*
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;
}