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