[Com0com-cvs] com0com/sys trace.c,1.26,1.27
The virtual serial port driver for Windows.
Brought to you by:
vfrolov
From: Vyacheslav F. <vf...@us...> - 2007-06-05 12:26:42
|
Update of /cvsroot/com0com/com0com/sys In directory sc8-pr-cvs4.sourceforge.net:/tmp/cvs-serv20603 Modified Files: trace.c Log Message: Allocate trace buffers only if trace enabled Index: trace.c =================================================================== RCS file: /cvsroot/com0com/com0com/sys/trace.c,v retrieving revision 1.26 retrieving revision 1.27 diff -C2 -d -r1.26 -r1.27 *** trace.c 21 Feb 2007 16:52:34 -0000 1.26 --- trace.c 5 Jun 2007 12:26:38 -0000 1.27 *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.27 2007/06/05 12:26:38 vfrolov + * Allocate trace buffers only if trace enabled + * * Revision 1.26 2007/02/21 16:52:34 vfrolov * Added tracing of IRP_MJ_POWER with more details *************** *** 126,130 **** #define TRACE_ERROR_LIMIT 10 #define TRACE_BUF_SIZE 256 ! #define TRACE_BUFS_NUM 4 #define TRACE_IRQL_BUF_SIZE 1024 /********************************************************************/ --- 129,133 ---- #define TRACE_ERROR_LIMIT 10 #define TRACE_BUF_SIZE 256 ! #define TRACE_BUFS_NUM 8 #define TRACE_IRQL_BUF_SIZE 1024 /********************************************************************/ *************** *** 133,162 **** CHAR buf[TRACE_BUF_SIZE]; } TRACE_BUFFER, *PTRACE_BUFFER; - /********************************************************************/ - #define TRACE_ENABLE_IRP 0x00000001 - #define TRACE_ENABLE_DUMP 0x00000002 ! #define TRACE_ENABLE_ALL 0xFFFFFFFF ! static struct { ! ULONG read; ! ULONG write; ! ULONG getTimeouts; ! ULONG setTimeouts; ! ULONG getCommStatus; ! ULONG getModemStatus; ! ULONG modemStatus; ! } traceEnable; /********************************************************************/ ! static int errorCount; ! static WCHAR traceFileNameBuf[256]; ! static UNICODE_STRING traceFileName; static PDRIVER_OBJECT pDrvObj; - static KSPIN_LOCK irqlBufLock; - static KSPIN_LOCK bufsLock; - static TRACE_BUFFER traceBufs[TRACE_BUFS_NUM]; - static LONG skippedTraces; /********************************************************************/ ! #define TRACE_FILE_OK (traceFileName.Buffer != NULL) /********************************************************************/ --- 136,179 ---- CHAR buf[TRACE_BUF_SIZE]; } TRACE_BUFFER, *PTRACE_BUFFER; ! typedef struct _TRACE_DATA { ! UNICODE_STRING traceFileName; ! struct { ! KSPIN_LOCK lock; ! TRACE_BUFFER bufs[TRACE_BUFS_NUM]; ! } bufs; ! ! struct { ! KSPIN_LOCK lock; ! CHAR buf[TRACE_IRQL_BUF_SIZE]; ! LONG busyInd; ! LONG freeInd; ! } irqlBuf; ! ! #define TRACE_ENABLE_IRP 0x00000001 ! #define TRACE_ENABLE_DUMP 0x00000002 ! ! #define TRACE_ENABLE_ALL 0xFFFFFFFF ! ! struct { ! ULONG read; ! ULONG write; ! ULONG getTimeouts; ! ULONG setTimeouts; ! ULONG getCommStatus; ! ULONG getModemStatus; ! ULONG modemStatus; ! } traceEnable; ! ! int errorCount; ! LONG skippedTraces; ! ! } TRACE_DATA, *PTRACE_DATA; /********************************************************************/ ! static PTRACE_DATA pTraceData = NULL; static PDRIVER_OBJECT pDrvObj; /********************************************************************/ ! #define TRACE_FILE_OK (pTraceData != NULL) /********************************************************************/ *************** *** 180,190 **** RtlZeroMemory(queryTable, sizeof(queryTable)); ! traceFileName.Length = 0; ! traceFileName.MaximumLength = sizeof(traceFileNameBuf); ! traceFileName.Buffer = traceFileNameBuf; queryTable[0].Flags = RTL_QUERY_REGISTRY_DIRECT | RTL_QUERY_REGISTRY_REQUIRED; queryTable[0].Name = L"TraceFile"; ! queryTable[0].EntryContext = &traceFileName; status = RtlQueryRegistryValues( --- 197,208 ---- RtlZeroMemory(queryTable, sizeof(queryTable)); ! if (pTraceData->traceFileName.Buffer) { ! RtlFreeUnicodeString(&pTraceData->traceFileName); ! RtlInitUnicodeString(&pTraceData->traceFileName, NULL); ! } queryTable[0].Flags = RTL_QUERY_REGISTRY_DIRECT | RTL_QUERY_REGISTRY_REQUIRED; queryTable[0].Name = L"TraceFile"; ! queryTable[0].EntryContext = &pTraceData->traceFileName; status = RtlQueryRegistryValues( *************** *** 198,202 **** if (!NT_SUCCESS(status)) ! RtlInitUnicodeString(&traceFileName, NULL); } --- 216,220 ---- if (!NT_SUCCESS(status)) ! RtlInitUnicodeString(&pTraceData->traceFileName, NULL); } *************** *** 208,212 **** ULONG zero = 0; ! RtlZeroMemory(&traceEnable, sizeof(traceEnable)); status = STATUS_SUCCESS; --- 226,230 ---- ULONG zero = 0; ! RtlZeroMemory(&pTraceData->traceEnable, sizeof(pTraceData->traceEnable)); status = STATUS_SUCCESS; *************** *** 225,229 **** queryTable[0].Flags = RTL_QUERY_REGISTRY_DIRECT; queryTable[0].Name = L"Read"; ! queryTable[0].EntryContext = &traceEnable.read; queryTable[0].DefaultType = REG_DWORD; queryTable[0].DefaultData = &zero; --- 243,247 ---- queryTable[0].Flags = RTL_QUERY_REGISTRY_DIRECT; queryTable[0].Name = L"Read"; ! queryTable[0].EntryContext = &pTraceData->traceEnable.read; queryTable[0].DefaultType = REG_DWORD; queryTable[0].DefaultData = &zero; *************** *** 232,236 **** queryTable[1].Flags = RTL_QUERY_REGISTRY_DIRECT; queryTable[1].Name = L"Write"; ! queryTable[1].EntryContext = &traceEnable.write; queryTable[1].DefaultType = REG_DWORD; queryTable[1].DefaultData = &zero; --- 250,254 ---- queryTable[1].Flags = RTL_QUERY_REGISTRY_DIRECT; queryTable[1].Name = L"Write"; ! queryTable[1].EntryContext = &pTraceData->traceEnable.write; queryTable[1].DefaultType = REG_DWORD; queryTable[1].DefaultData = &zero; *************** *** 239,243 **** queryTable[2].Flags = RTL_QUERY_REGISTRY_DIRECT; queryTable[2].Name = L"GetTimeouts"; ! queryTable[2].EntryContext = &traceEnable.getTimeouts; queryTable[2].DefaultType = REG_DWORD; queryTable[2].DefaultData = &zero; --- 257,261 ---- queryTable[2].Flags = RTL_QUERY_REGISTRY_DIRECT; queryTable[2].Name = L"GetTimeouts"; ! queryTable[2].EntryContext = &pTraceData->traceEnable.getTimeouts; queryTable[2].DefaultType = REG_DWORD; queryTable[2].DefaultData = &zero; *************** *** 246,250 **** queryTable[3].Flags = RTL_QUERY_REGISTRY_DIRECT; queryTable[3].Name = L"SetTimeouts"; ! queryTable[3].EntryContext = &traceEnable.setTimeouts; queryTable[3].DefaultType = REG_DWORD; queryTable[3].DefaultData = &zero; --- 264,268 ---- queryTable[3].Flags = RTL_QUERY_REGISTRY_DIRECT; queryTable[3].Name = L"SetTimeouts"; ! queryTable[3].EntryContext = &pTraceData->traceEnable.setTimeouts; queryTable[3].DefaultType = REG_DWORD; queryTable[3].DefaultData = &zero; *************** *** 253,257 **** queryTable[4].Flags = RTL_QUERY_REGISTRY_DIRECT; queryTable[4].Name = L"GetCommStatus"; ! queryTable[4].EntryContext = &traceEnable.getCommStatus; queryTable[4].DefaultType = REG_DWORD; queryTable[4].DefaultData = &zero; --- 271,275 ---- queryTable[4].Flags = RTL_QUERY_REGISTRY_DIRECT; queryTable[4].Name = L"GetCommStatus"; ! queryTable[4].EntryContext = &pTraceData->traceEnable.getCommStatus; queryTable[4].DefaultType = REG_DWORD; queryTable[4].DefaultData = &zero; *************** *** 260,264 **** queryTable[5].Flags = RTL_QUERY_REGISTRY_DIRECT; queryTable[5].Name = L"GetModemStatus"; ! queryTable[5].EntryContext = &traceEnable.getModemStatus; queryTable[5].DefaultType = REG_DWORD; queryTable[5].DefaultData = &zero; --- 278,282 ---- queryTable[5].Flags = RTL_QUERY_REGISTRY_DIRECT; queryTable[5].Name = L"GetModemStatus"; ! queryTable[5].EntryContext = &pTraceData->traceEnable.getModemStatus; queryTable[5].DefaultType = REG_DWORD; queryTable[5].DefaultData = &zero; *************** *** 267,271 **** queryTable[6].Flags = RTL_QUERY_REGISTRY_DIRECT; queryTable[6].Name = L"ModemStatus"; ! queryTable[6].EntryContext = &traceEnable.modemStatus; queryTable[6].DefaultType = REG_DWORD; queryTable[6].DefaultData = &zero; --- 285,289 ---- queryTable[6].Flags = RTL_QUERY_REGISTRY_DIRECT; queryTable[6].Name = L"ModemStatus"; ! queryTable[6].EntryContext = &pTraceData->traceEnable.modemStatus; queryTable[6].DefaultType = REG_DWORD; queryTable[6].DefaultData = &zero; *************** *** 291,306 **** pBuf = NULL; ! KeAcquireSpinLock(&bufsLock, &oldIrql); for (i = 0 ; i < TRACE_BUFS_NUM ; i++) { ! if (!traceBufs[i].busy) { ! traceBufs[i].busy = TRUE; ! pBuf = &traceBufs[i]; break; } } ! KeReleaseSpinLock(&bufsLock, oldIrql); if (!pBuf) ! InterlockedIncrement(&skippedTraces); return pBuf; --- 309,324 ---- pBuf = NULL; ! KeAcquireSpinLock(&pTraceData->bufs.lock, &oldIrql); for (i = 0 ; i < TRACE_BUFS_NUM ; i++) { ! if (!pTraceData->bufs.bufs[i].busy) { ! pTraceData->bufs.bufs[i].busy = TRUE; ! pBuf = &pTraceData->bufs.bufs[i]; break; } } ! KeReleaseSpinLock(&pTraceData->bufs.lock, oldIrql); if (!pBuf) ! InterlockedIncrement(&pTraceData->skippedTraces); return pBuf; *************** *** 932,936 **** if (!NT_SUCCESS(status)) { ! errorCount++; SysLog(pIoObject, status, L"TraceWrite ZwWriteFile FAIL"); } --- 950,954 ---- if (!NT_SUCCESS(status)) { ! pTraceData->errorCount++; SysLog(pIoObject, status, L"TraceWrite ZwWriteFile FAIL"); } *************** *** 949,959 **** IO_STATUS_BLOCK ioStatusBlock; ! static CHAR irqlBuf[TRACE_IRQL_BUF_SIZE]; ! static LONG irqlBufBusyInd = 0; ! static LONG irqlBufFreeInd = 0; ! ! if (errorCount > TRACE_ERROR_LIMIT) { ! if (errorCount < (TRACE_ERROR_LIMIT + 100)) { ! errorCount += 100; SysLog(pDrvObj, STATUS_SUCCESS, L"Trace disabled"); } --- 967,973 ---- IO_STATUS_BLOCK ioStatusBlock; ! if (pTraceData->errorCount > TRACE_ERROR_LIMIT) { ! if (pTraceData->errorCount < (TRACE_ERROR_LIMIT + 100)) { ! pTraceData->errorCount += 100; SysLog(pDrvObj, STATUS_SUCCESS, L"Trace disabled"); } *************** *** 972,983 **** GetTimeFields(&timeFields); ! KeAcquireSpinLock(&irqlBufLock, &oldIrql); ! size = sizeof(irqlBuf) - irqlBufFreeInd; ! pDestStr = irqlBuf + (sizeof(irqlBuf) - size); pDestStr = AnsiStrCopyTimeFields(pDestStr, &size, &timeFields); pDestStr = AnsiStrFormat(pDestStr, &size, " *%u* %s\r\n", (unsigned)KeGetCurrentIrql(), pStr); ! HALT_UNLESS3(size > 0, irqlBufFreeInd, irqlBufBusyInd, sizeof(irqlBuf)); if (size == 1) { --- 986,998 ---- GetTimeFields(&timeFields); ! KeAcquireSpinLock(&pTraceData->irqlBuf.lock, &oldIrql); ! size = sizeof(pTraceData->irqlBuf.buf) - pTraceData->irqlBuf.freeInd; ! pDestStr = pTraceData->irqlBuf.buf + (sizeof(pTraceData->irqlBuf.buf) - size); pDestStr = AnsiStrCopyTimeFields(pDestStr, &size, &timeFields); pDestStr = AnsiStrFormat(pDestStr, &size, " *%u* %s\r\n", (unsigned)KeGetCurrentIrql(), pStr); ! HALT_UNLESS3(size > 0, pTraceData->irqlBuf.freeInd, ! pTraceData->irqlBuf.busyInd, sizeof(pTraceData->irqlBuf.buf)); if (size == 1) { *************** *** 987,993 **** } ! irqlBufFreeInd = (LONG)(sizeof(irqlBuf) - size); ! KeReleaseSpinLock(&irqlBufLock, oldIrql); return; --- 1002,1008 ---- } ! pTraceData->irqlBuf.freeInd = (LONG)(sizeof(pTraceData->irqlBuf.buf) - size); ! KeReleaseSpinLock(&pTraceData->irqlBuf.lock, oldIrql); return; *************** *** 1000,1004 **** HALT_UNLESS(TRACE_FILE_OK); ! InitializeObjectAttributes(&objectAttributes, &traceFileName, 0, NULL, NULL); status = ZwCreateFile( --- 1015,1024 ---- HALT_UNLESS(TRACE_FILE_OK); ! InitializeObjectAttributes( ! &objectAttributes, ! &pTraceData->traceFileName, ! OBJ_KERNEL_HANDLE, ! NULL, ! NULL); status = ZwCreateFile( *************** *** 1028,1048 **** pDestStr = pBuf->buf; ! while (irqlBufFreeInd) { SIZE_T lenBuf; KIRQL oldIrql; ! KeAcquireSpinLock(&irqlBufLock, &oldIrql); ! lenBuf = irqlBufFreeInd - irqlBufBusyInd; if (lenBuf) { if (lenBuf > size - 1) lenBuf = size - 1; ! RtlCopyMemory(pDestStr, &irqlBuf[irqlBufBusyInd], lenBuf); pDestStr[lenBuf] = 0; ! irqlBufBusyInd += (LONG)lenBuf; ! HALT_UNLESS3(irqlBufBusyInd <= irqlBufFreeInd, irqlBufFreeInd, irqlBufBusyInd, lenBuf); ! if (irqlBufBusyInd == irqlBufFreeInd) ! irqlBufFreeInd = irqlBufBusyInd = 0; } ! KeReleaseSpinLock(&irqlBufLock, oldIrql); if (lenBuf) --- 1048,1069 ---- pDestStr = pBuf->buf; ! while (pTraceData->irqlBuf.freeInd) { SIZE_T lenBuf; KIRQL oldIrql; ! KeAcquireSpinLock(&pTraceData->irqlBuf.lock, &oldIrql); ! lenBuf = pTraceData->irqlBuf.freeInd - pTraceData->irqlBuf.busyInd; if (lenBuf) { if (lenBuf > size - 1) lenBuf = size - 1; ! RtlCopyMemory(pDestStr, &pTraceData->irqlBuf.buf[pTraceData->irqlBuf.busyInd], lenBuf); pDestStr[lenBuf] = 0; ! pTraceData->irqlBuf.busyInd += (LONG)lenBuf; ! HALT_UNLESS3(pTraceData->irqlBuf.busyInd <= pTraceData->irqlBuf.freeInd, ! pTraceData->irqlBuf.freeInd, pTraceData->irqlBuf.busyInd, lenBuf); ! if (pTraceData->irqlBuf.busyInd == pTraceData->irqlBuf.freeInd) ! pTraceData->irqlBuf.freeInd = pTraceData->irqlBuf.busyInd = 0; } ! KeReleaseSpinLock(&pTraceData->irqlBuf.lock, oldIrql); if (lenBuf) *************** *** 1050,1054 **** } ! skipped = InterlockedExchange(&skippedTraces, 0); if (skipped) { --- 1071,1075 ---- } ! skipped = InterlockedExchange(&pTraceData->skippedTraces, 0); if (skipped) { *************** *** 1076,1085 **** if (!NT_SUCCESS(status)) { ! errorCount++; SysLog(pIoObject, status, L"TraceOutput ZwClose FAIL"); } } else { ! errorCount++; SysLog(pIoObject, status, L"TraceOutput ZwCreateFile FAIL"); } --- 1097,1106 ---- if (!NT_SUCCESS(status)) { ! pTraceData->errorCount++; SysLog(pIoObject, status, L"TraceOutput ZwClose FAIL"); } } else { ! pTraceData->errorCount++; SysLog(pIoObject, status, L"TraceOutput ZwCreateFile FAIL"); } *************** *** 1114,1117 **** --- 1135,1148 ---- } /********************************************************************/ + VOID TraceDisable() + { + if (pTraceData) { + if (pTraceData->traceFileName.Buffer) + RtlFreeUnicodeString(&pTraceData->traceFileName); + + C0C_FREE_POOL(pTraceData); + pTraceData = NULL; + } + } VOID TraceOpen( *************** *** 1121,1135 **** pDrvObj = _pDrvObj; ! KeInitializeSpinLock(&irqlBufLock); ! KeInitializeSpinLock(&bufsLock); ! skippedTraces = 0; ! RtlZeroMemory(traceBufs, sizeof(traceBufs)); ! RtlInitUnicodeString(&traceFileName, NULL); ! errorCount = 0; QueryRegistryTrace(pRegistryPath); QueryRegistryTraceEnable(pRegistryPath); if (TRACE_FILE_OK) { UNICODE_STRING msg; --- 1152,1173 ---- pDrvObj = _pDrvObj; ! pTraceData = (PTRACE_DATA)C0C_ALLOCATE_POOL(NonPagedPool, sizeof(*pTraceData)); ! if (!pTraceData) { ! SysLog(pDrvObj, STATUS_INSUFFICIENT_RESOURCES, L"TraceEnable C0C_ALLOCATE_POOL FAIL"); ! return; ! } ! ! RtlZeroMemory(pTraceData, sizeof(*pTraceData)); ! ! KeInitializeSpinLock(&pTraceData->bufs.lock); ! KeInitializeSpinLock(&pTraceData->irqlBuf.lock); QueryRegistryTrace(pRegistryPath); QueryRegistryTraceEnable(pRegistryPath); + if (!pTraceData->traceFileName.Buffer) + TraceDisable(); + if (TRACE_FILE_OK) { UNICODE_STRING msg; *************** *** 1140,1144 **** RtlInitUnicodeString(&msg, NULL); StrAppendStr0(&status, &msg, L"Trace enabled. See "); ! StrAppendStr(&status, &msg, traceFileName.Buffer, traceFileName.Length); if (NT_SUCCESS(status)) --- 1178,1182 ---- RtlInitUnicodeString(&msg, NULL); StrAppendStr0(&status, &msg, L"Trace enabled. See "); ! StrAppendStr(&status, &msg, pTraceData->traceFileName.Buffer, pTraceData->traceFileName.Length); if (NT_SUCCESS(status)) *************** *** 1150,1155 **** TraceF(NULL, "VERSION " C0C_VERSION_STR " (" __DATE__ " " __TIME__ ")"); ! if (errorCount) { ! RtlInitUnicodeString(&traceFileName, NULL); SysLog(pDrvObj, STATUS_SUCCESS, L"Trace disabled"); } --- 1188,1193 ---- TraceF(NULL, "VERSION " C0C_VERSION_STR " (" __DATE__ " " __TIME__ ")"); ! if (pTraceData->errorCount) { ! TraceDisable(); SysLog(pDrvObj, STATUS_SUCCESS, L"Trace disabled"); } *************** *** 1164,1168 **** TraceF(NULL, "===== END ====="); ! RtlInitUnicodeString(&traceFileName, NULL); } --- 1202,1206 ---- TraceF(NULL, "===== END ====="); ! TraceDisable(); } *************** *** 1251,1255 **** return; ! if (!traceEnable.modemStatus) return; --- 1289,1293 ---- return; ! if (!pTraceData->traceEnable.modemStatus) return; *************** *** 1286,1307 **** switch (major) { case IRP_MJ_WRITE: ! enableMask = traceEnable.write; break; case IRP_MJ_READ: ! enableMask = traceEnable.read; break; case IRP_MJ_DEVICE_CONTROL: switch (pIrpStack->Parameters.DeviceIoControl.IoControlCode) { case IOCTL_SERIAL_GET_TIMEOUTS: ! enableMask = traceEnable.getTimeouts; break; case IOCTL_SERIAL_SET_TIMEOUTS: ! enableMask = traceEnable.setTimeouts; break; case IOCTL_SERIAL_GET_COMMSTATUS: ! enableMask = traceEnable.getCommStatus; break; case IOCTL_SERIAL_GET_MODEMSTATUS: ! enableMask = traceEnable.getModemStatus; break; } --- 1324,1345 ---- switch (major) { case IRP_MJ_WRITE: ! enableMask = pTraceData->traceEnable.write; break; case IRP_MJ_READ: ! enableMask = pTraceData->traceEnable.read; break; case IRP_MJ_DEVICE_CONTROL: switch (pIrpStack->Parameters.DeviceIoControl.IoControlCode) { case IOCTL_SERIAL_GET_TIMEOUTS: ! enableMask = pTraceData->traceEnable.getTimeouts; break; case IOCTL_SERIAL_SET_TIMEOUTS: ! enableMask = pTraceData->traceEnable.setTimeouts; break; case IOCTL_SERIAL_GET_COMMSTATUS: ! enableMask = pTraceData->traceEnable.getCommStatus; break; case IOCTL_SERIAL_GET_MODEMSTATUS: ! enableMask = pTraceData->traceEnable.getModemStatus; break; } |