/*++ Copyright (c) 2000 Microsoft Corporation Module Name: kdlog.c Abstract: This app dumps out the KD debugger log, which is produced by the KD hw ext (e.g. KD1394.DLL, KDCOM.DLL). Author: Neil Sandlin (neilsa) 31-Oct-2000 Envirnoment: Revision History: --*/ #include #include #include #include #include #include VOID DumpLogData( PKD_DBG_LOG_CONTEXT LogContext, PUCHAR pData ); __cdecl main( int argc, char *argv[], char *envp[] ) { HANDLE DriverHandle; UNICODE_STRING DriverName; NTSTATUS status; OBJECT_ATTRIBUTES ObjA; IO_STATUS_BLOCK IOSB; KD_DBG_LOG_CONTEXT LogContext; PUCHAR pData; ULONG DataLength; // // Open PStat driver // RtlInitUnicodeString(&DriverName, L"\\Device\\KDLog"); InitializeObjectAttributes( &ObjA, &DriverName, OBJ_CASE_INSENSITIVE, 0, 0 ); status = NtOpenFile ( &DriverHandle, // return handle SYNCHRONIZE | FILE_READ_DATA, // desired access &ObjA, // Object &IOSB, // io status block FILE_SHARE_READ | FILE_SHARE_WRITE, // share access FILE_SYNCHRONOUS_IO_ALERT // open options ); if (!NT_SUCCESS(status)) { printf("Error: KDLOG.SYS not running\n"); return ; } // // Get the log context // status = NtDeviceIoControlFile( DriverHandle, (HANDLE) NULL, (PIO_APC_ROUTINE) NULL, (PVOID) NULL, &IOSB, KDLOG_QUERY_LOG_CONTEXT, &LogContext, sizeof (LogContext), NULL, 0 ); if (!NT_SUCCESS(status)) { printf("Error %08x retrieving Log Context\n", status); NtClose (DriverHandle); return ; } printf("EntryLength %08x, LastIndex %08x\n", LogContext.EntryLength, LogContext.LastIndex); printf("Count %08x, Index %08x\n\n", LogContext.Count, LogContext.Index); DataLength = LogContext.EntryLength * (LogContext.LastIndex + 1); pData = malloc(DataLength); if (pData == NULL) { printf("Unable to allocate %08x bytes for data\n", DataLength); } else { // // Get the log data // status = NtDeviceIoControlFile( DriverHandle, (HANDLE) NULL, (PIO_APC_ROUTINE) NULL, (PVOID) NULL, &IOSB, KDLOG_GET_LOG_DATA, pData, DataLength, NULL, 0 ); if (!NT_SUCCESS(status)) { printf("Error %08x retrieving Log Context\n", status); } else { DumpLogData(&LogContext, pData); } free(pData); } NtClose (DriverHandle); return; } VOID DumpLogData( PKD_DBG_LOG_CONTEXT LogContext, PUCHAR pData ) { ULONG Count = LogContext->Count; ULONG Index = LogContext->Index; while(Count--) { if (Index == 0) { Index = LogContext->LastIndex+1; } Index--; printf("%s", &pData[Index*LogContext->EntryLength]); } }