📄 trace.c
字号:
TraceWrite(pIoObject, handle, pBuf->buf);
}
FreeTraceBuf(pBuf);
}
status = ZwClose(handle);
if (!NT_SUCCESS(status))
SysLog(pIoObject, status, L"TraceOutput ZwClose FAIL");
}
else {
SysLog(pIoObject, status, L"TraceOutput ZwCreateFile FAIL");
}
}
/********************************************************************/
VOID TraceF(
IN PC0C_COMMON_EXTENSION pDevExt,
IN PCHAR pFmt,
...)
{
PTRACE_BUFFER pBuf;
PCHAR pDestStr;
SIZE_T size;
va_list va;
pBuf = AllocTraceBuf();
if (!pBuf)
return;
size = TRACE_BUF_SIZE;
pDestStr = pBuf->buf;
pDestStr = AnsiStrCopyHead(pDestStr, &size, pDevExt, NULL);
pDestStr = AnsiStrCopyStr(pDestStr, &size, " ");
va_start(va, pFmt);
pDestStr = AnsiStrVaFormat(pDestStr, &size, pFmt, va);
va_end(va);
TraceOutput(pDevExt, pBuf->buf);
FreeTraceBuf(pBuf);
}
/********************************************************************/
VOID TraceOpen(
IN PDRIVER_OBJECT _pDrvObj,
IN PUNICODE_STRING pRegistryPath)
{
pDrvObj = _pDrvObj;
KeInitializeSpinLock(&strOldLock);
KeInitializeSpinLock(&bufsLock);
skippedTraces = 0;
RtlZeroMemory(traceBufs, sizeof(traceBufs));
RtlInitUnicodeString(&traceFileName, NULL);
QueryRegistryTrace(pRegistryPath);
QueryRegistryTraceEnable(pRegistryPath);
if (TRACE_FILE_OK) {
UNICODE_STRING msg;
NTSTATUS status;
status = STATUS_SUCCESS;
RtlInitUnicodeString(&msg, NULL);
StrAppendStr0(&status, &msg, L"Trace enabled. See ");
StrAppendStr(&status, &msg, traceFileName.Buffer, traceFileName.Length);
if (NT_SUCCESS(status))
SysLog(pDrvObj, status, msg.Buffer);
StrFree(&msg);
TraceF(NULL, "===== BEGIN =====");
TraceF(NULL, "VERSION " C0C_VERSION_STR " (" __DATE__ " " __TIME__ ")");
}
}
VOID TraceClose()
{
if (!TRACE_FILE_OK)
return;
TraceF(NULL, "===== END =====");
RtlInitUnicodeString(&traceFileName, NULL);
}
VOID Trace0(
IN PC0C_COMMON_EXTENSION pDevExt,
IN PWCHAR pStr)
{
if (!TRACE_FILE_OK || !pStr)
return;
TraceF(pDevExt, "%S", pStr);
}
VOID Trace00(
IN PC0C_COMMON_EXTENSION pDevExt,
IN PWCHAR pStr1,
IN PWCHAR pStr2)
{
if (!TRACE_FILE_OK || !pStr1 || !pStr2)
return;
TraceF(pDevExt, "%S%S", pStr1, pStr2);
}
VOID TraceCode(
IN PC0C_COMMON_EXTENSION pDevExt,
IN PCHAR pHead,
IN PCODE2NAME pTable,
IN ULONG code,
IN PNTSTATUS pStatus)
{
PTRACE_BUFFER pBuf;
PCHAR pDestStr;
SIZE_T size;
if (!TRACE_FILE_OK)
return;
pBuf = AllocTraceBuf();
if (!pBuf)
return;
size = TRACE_BUF_SIZE;
pDestStr = pBuf->buf;
pDestStr = AnsiStrCopyHead(pDestStr, &size, pDevExt, pHead);
pDestStr = AnsiStrCopyCode(pDestStr, &size, code, pTable, "0x", 16);
if (pStatus) {
pDestStr = AnsiStrCopyStr(pDestStr, &size, ", status=");
pDestStr = AnsiStrCopyCode(pDestStr, &size, *pStatus, codeNameTableStatus, "0x", 16);
}
TraceOutput(pDevExt, pBuf->buf);
FreeTraceBuf(pBuf);
}
VOID TraceMask(
IN PC0C_COMMON_EXTENSION pDevExt,
IN PCHAR pHead,
IN PCODE2NAME pTable,
IN ULONG mask)
{
PTRACE_BUFFER pBuf;
PCHAR pDestStr;
SIZE_T size;
if (!TRACE_FILE_OK)
return;
pBuf = AllocTraceBuf();
if (!pBuf)
return;
size = TRACE_BUF_SIZE;
pDestStr = pBuf->buf;
pDestStr = AnsiStrCopyHead(pDestStr, &size, pDevExt, pHead);
pDestStr = AnsiStrCopyMask(pDestStr, &size, pTable, mask);
TraceOutput(pDevExt, pBuf->buf);
FreeTraceBuf(pBuf);
}
VOID TraceModemStatus(IN PC0C_IO_PORT pIoPort)
{
if (!TRACE_FILE_OK)
return;
if (!traceEnable.modemStatus)
return;
TraceMask(
(PC0C_COMMON_EXTENSION)pIoPort->pDevExt,
"ModemStatus",
codeNameTableModemStatus,
pIoPort->modemStatus);
}
VOID TraceIrp(
IN PCHAR pHead,
IN PIRP pIrp,
IN PNTSTATUS pStatus,
IN ULONG flags)
{
PTRACE_BUFFER pBuf;
PCHAR pDestStr;
SIZE_T size;
PIO_STACK_LOCATION pIrpStack;
PC0C_COMMON_EXTENSION pDevExt;
PVOID pSysBuf;
ULONG_PTR inform;
ULONG major;
ULONG enableMask;
if (!TRACE_FILE_OK)
return;
pIrpStack = IoGetCurrentIrpStackLocation(pIrp);
major = pIrpStack->MajorFunction;
enableMask = TRACE_ENABLE_ALL;
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;
}
break;
}
pDevExt = pIrpStack->DeviceObject->DeviceExtension;
if (!(enableMask & TRACE_ENABLE_IRP)) {
TraceOutput(pDevExt, NULL);
return;
}
pBuf = AllocTraceBuf();
if (!pBuf)
return;
size = TRACE_BUF_SIZE;
pDestStr = pBuf->buf;
pDestStr = AnsiStrCopyHead(pDestStr, &size, pDevExt, pHead);
switch (major) {
case IRP_MJ_DEVICE_CONTROL:
case IRP_MJ_PNP:
case IRP_MJ_POWER:
case IRP_MJ_SYSTEM_CONTROL:
break;
default:
pDestStr = AnsiStrCopyStr(pDestStr, &size, " ");
pDestStr = AnsiStrCopyCode(pDestStr, &size,
major, codeNameTableIrpMj, "IRP_MJ_", 10);
}
pSysBuf = pIrp->AssociatedIrp.SystemBuffer;
inform = pIrp->IoStatus.Information;
switch (major) {
case IRP_MJ_WRITE:
case IRP_MJ_READ:
if (flags & TRACE_FLAG_PARAMS) {
ULONG length;
if (major == IRP_MJ_WRITE)
length = pIrpStack->Parameters.Write.Length;
else
length = pIrpStack->Parameters.Read.Length;
pDestStr = AnsiStrFormat(pDestStr, &size, " length=%lu", (long)length);
}
if (flags & TRACE_FLAG_RESULTS) {
pDestStr = AnsiStrCopyStr(pDestStr, &size, " ");
if (enableMask & TRACE_ENABLE_DUMP)
pDestStr = AnsiStrCopyDump(pDestStr, &size, pSysBuf, inform);
else
pDestStr = AnsiStrFormat(pDestStr, &size, "%lu:", (long)inform);
}
break;
case IRP_MJ_DEVICE_CONTROL: {
ULONG code = pIrpStack->Parameters.DeviceIoControl.IoControlCode;
ULONG inLength = pIrpStack->Parameters.DeviceIoControl.InputBufferLength;
pDestStr = AnsiStrCopyStr(pDestStr, &size, " ");
pDestStr = AnsiStrCopyCode(pDestStr, &size, code, codeNameTableIoctl, "IOCTL_", 16);
switch (code) {
case IOCTL_SERIAL_GET_MODEMSTATUS:
if ((flags & TRACE_FLAG_RESULTS) && inform >= sizeof(ULONG)) {
pDestStr = AnsiStrCopyStr(pDestStr, &size, " ");
pDestStr = AnsiStrCopyMask(pDestStr, &size,
codeNameTableModemStatus, *((PULONG)pSysBuf));
}
break;
case IOCTL_SERIAL_GET_MODEM_CONTROL:
case IOCTL_SERIAL_GET_DTRRTS:
if ((flags & TRACE_FLAG_RESULTS) && inform >= sizeof(ULONG)) {
pDestStr = AnsiStrCopyStr(pDestStr, &size, " ");
pDestStr = AnsiStrCopyMask(pDestStr, &size,
codeNameTableModemControl, *((PULONG)pSysBuf));
}
break;
case IOCTL_SERIAL_SET_WAIT_MASK:
if ((flags & TRACE_FLAG_PARAMS) && inLength >= sizeof(ULONG)) {
pDestStr = AnsiStrCopyStr(pDestStr, &size, " ");
pDestStr = AnsiStrCopyMask(pDestStr, &size,
codeNameTableWaitMask, *((PULONG)pSysBuf));
}
break;
case IOCTL_SERIAL_GET_WAIT_MASK:
if ((flags & TRACE_FLAG_RESULTS) && inform >= sizeof(ULONG)) {
pDestStr = AnsiStrCopyStr(pDestStr, &size, " ");
pDestStr = AnsiStrCopyMask(pDestStr, &size,
codeNameTableWaitMask, *((PULONG)pSysBuf));
}
break;
case IOCTL_SERIAL_WAIT_ON_MASK:
if ((flags & TRACE_FLAG_PARAMS) && pDevExt->doType == C0C_DOTYPE_FP) {
pDestStr = AnsiStrCopyStr(pDestStr, &size, " ");
pDestStr = AnsiStrCopyMask(pDestStr, &size, codeNameTableWaitMask,
((PC0C_FDOPORT_EXTENSION)pDevExt)->pIoPortLocal->waitMask);
}
if ((flags & TRACE_FLAG_RESULTS) && inform >= sizeof(ULONG)) {
pDestStr = AnsiStrCopyStr(pDestStr, &size, " ");
pDestStr = AnsiStrCopyMask(pDestStr, &size,
codeNameTableWaitMask, *((PULONG)pSysBuf));
}
break;
case IOCTL_SERIAL_PURGE:
if ((flags & TRACE_FLAG_PARAMS) && inLength >= sizeof(ULONG)) {
pDestStr = AnsiStrCopyStr(pDestStr, &size, " ");
pDestStr = AnsiStrCopyMask(pDestStr, &size,
codeNameTablePurgeMask, *((PULONG)pSysBuf));
}
break;
case IOCTL_SERIAL_SET_HANDFLOW:
if ((flags & TRACE_FLAG_PARAMS) && inLength >= sizeof(SERIAL_HANDFLOW))
pDestStr = AnsiStrCopyHandFlow(pDestStr, &size, (PSERIAL_HANDFLOW)pSysBuf);
break;
case IOCTL_SERIAL_GET_HANDFLOW:
if ((flags & TRACE_FLAG_RESULTS) && inform >= sizeof(SERIAL_HANDFLOW))
pDestStr = AnsiStrCopyHandFlow(pDestStr, &size, (PSERIAL_HANDFLOW)pSysBuf);
break;
case IOCTL_SERIAL_SET_TIMEOUTS:
if ((flags & TRACE_FLAG_PARAMS) && inLength >= sizeof(SERIAL_TIMEOUTS))
pDestStr = AnsiStrCopyTimeouts(pDestStr, &size, (PSERIAL_TIMEOUTS)pSysBuf);
break;
case IOCTL_SERIAL_GET_TIMEOUTS:
if ((flags & TRACE_FLAG_RESULTS) && inform >= sizeof(SERIAL_TIMEOUTS))
pDestStr = AnsiStrCopyTimeouts(pDestStr, &size, (PSERIAL_TIMEOUTS)pSysBuf);
break;
case IOCTL_SERIAL_SET_CHARS:
if ((flags & TRACE_FLAG_PARAMS) && inLength >= sizeof(SERIAL_CHARS))
pDestStr = AnsiStrCopyChars(pDestStr, &size, (PSERIAL_CHARS)pSysBuf);
break;
case IOCTL_SERIAL_GET_CHARS:
if ((flags & TRACE_FLAG_RESULTS) && inform >= sizeof(SERIAL_CHARS))
pDestStr = AnsiStrCopyChars(pDestStr, &size, (PSERIAL_CHARS)pSysBuf);
break;
case IOCTL_SERIAL_SET_LINE_CONTROL:
if ((flags & TRACE_FLAG_PARAMS) && inLength >= sizeof(SERIAL_LINE_CONTROL))
pDestStr = AnsiStrCopyLineControl(pDestStr, &size, (PSERIAL_LINE_CONTROL)pSysBuf);
break;
case IOCTL_SERIAL_GET_LINE_CONTROL:
if ((flags & TRACE_FLAG_RESULTS) && inform >= sizeof(SERIAL_LINE_CONTROL))
pDestStr = AnsiStrCopyLineControl(pDestStr, &size, (PSERIAL_LINE_CONTROL)pSysBuf);
break;
case IOCTL_SERIAL_SET_BAUD_RATE:
if ((flags & TRACE_FLAG_PARAMS) && inLength >= sizeof(SERIAL_BAUD_RATE))
pDestStr = AnsiStrCopyBaudRate(pDestStr, &size, (PSERIAL_BAUD_RATE)pSysBuf);
break;
case IOCTL_SERIAL_GET_BAUD_RATE:
if ((flags & TRACE_FLAG_RESULTS) && inform >= sizeof(SERIAL_BAUD_RATE))
pDestStr = AnsiStrCopyBaudRate(pDestStr, &size, (PSERIAL_BAUD_RATE)pSysBuf);
break;
case IOCTL_SERIAL_SET_QUEUE_SIZE:
if ((flags & TRACE_FLAG_PARAMS) && inLength >= sizeof(SERIAL_QUEUE_SIZE))
pDestStr = AnsiStrCopyQueueSize(pDestStr, &size, (PSERIAL_QUEUE_SIZE)pSysBuf);
break;
case IOCTL_SERIAL_GET_COMMSTATUS:
if ((flags & TRACE_FLAG_RESULTS) && inform >= sizeof(SERIAL_STATUS))
pDestStr = AnsiStrCopyCommStatus(pDestStr, &size, (PSERIAL_STATUS)pSysBuf);
break;
case IOCTL_SERIAL_LSRMST_INSERT:
if ((flags & TRACE_FLAG_PARAMS) && inLength >= sizeof(UCHAR))
pDestStr = AnsiStrFormat(pDestStr, &size, " escapeChar=0x%02X", (int)(*(PUCHAR)pSysBuf & 0xFF));
break;
case IOCTL_SERIAL_GET_STATS:
if ((flags & TRACE_FLAG_RESULTS) && inform >= sizeof(SERIALPERF_STATS))
pDestStr = AnsiStrCopyPerfStats(pDestStr, &size, (PSERIALPERF_STATS)pSysBuf);
break;
case IOCTL_SERIAL_IMMEDIATE_CHAR:
if (flags & TRACE_FLAG_RESULTS) {
pDestStr = AnsiStrCopyStr(pDestStr, &size, " ");
pDestStr = AnsiStrCopyDump(pDestStr, &size, pSysBuf, inform);
}
break;
}
break;
}
case IRP_MJ_PNP: {
ULONG code = pIrpStack->MinorFunction;
pDestStr = AnsiStrCopyStr(pDestStr, &size, " ");
pDestStr = AnsiStrCopyCode(pDestStr, &size, code, codeNameTablePnp, "PNP_", 10);
switch (code) {
case IRP_MN_QUERY_ID:
pDestStr = AnsiStrCopyStr(pDestStr, &size, " ");
pDestStr = AnsiStrCopyCode(pDestStr, &size,
pIrpStack->Parameters.QueryId.IdType,
codeNameTableBusQuery, "BusQuery", 10);
if (flags & TRACE_FLAG_RESULTS && pIrp->IoStatus.Information) {
pDestStr = AnsiStrFormat(pDestStr, &size,
" Information: \"%S\"",
(PWCHAR)pIrp->IoStatus.Information);
}
break;
case IRP_MN_QUERY_DEVICE_TEXT:
pDestStr = AnsiStrCopyStr(pDestStr, &size, " ");
pDestStr = AnsiStrCopyCode(pDestStr, &size,
pIrpStack->Parameters.QueryDeviceText.DeviceTextType,
codeNameTableDeviceText, "DeviceText", 10);
if (flags & TRACE_FLAG_RESULTS && pIrp->IoStatus.Information) {
pDestStr = AnsiStrFormat(pDestStr, &size,
" Information: \"%S\"",
(PWCHAR)pIrp->IoStatus.Information);
}
break;
case IRP_MN_QUERY_DEVICE_RELATIONS:
pDestStr = AnsiStrCopyStr(pDestStr, &size, " ");
pDestStr = AnsiStrCopyCode(pDestStr, &size,
pIrpStack->Parameters.QueryDeviceRelations.Type,
codeNameTableRelations, "Relations", 10);
if (flags & TRACE_FLAG_RESULTS) {
if (pIrp->IoStatus.Information)
pDestStr = AnsiStrFormat(pDestStr, &size, " Count=%u",
(unsigned)((PDEVICE_RELATIONS)pIrp->IoStatus.Information)->Count);
}
break;
case IRP_MN_QUERY_INTERFACE:
pDestStr = AnsiStrCopyStr(pDestStr, &size, " ");
pDestStr = AnsiStrFormat(pDestStr, &size,
" GUID: %8lX-%4X-%4X-%2X%2X-%2X%2X%2X%2X%2X%2X",
(long)pIrpStack->Parameters.QueryInterface.InterfaceType->Data1,
(int)pIrpStack->Parameters.QueryInterface.InterfaceType->Data2,
(int)pIrpStack->Parameters.QueryInterface.InterfaceType->Data3,
(int)pIrpStack->Parameters.QueryInterface.InterfaceType->Data4[0],
(int)pIrpStack->Parameters.QueryInterface.InterfaceType->Data4[1],
(int)pIrpStack->Parameters.QueryInterface.InterfaceType->Data4[2],
(int)pIrpStack->Parameters.QueryInterface.InterfaceType->Data4[3],
(int)pIrpStack->Parameters.QueryInterface.InterfaceType->Data4[4],
(int)pIrpStack->Parameters.QueryInterface.InterfaceType->Data4[5],
(int)pIrpStack->Parameters.QueryInterface.InterfaceType->Data4[6],
(int)pIrpStack->Parameters.QueryInterface.InterfaceType->Data4[7]);
break;
}
break;
}
case IRP_MJ_POWER: {
ULONG code = pIrpStack->MinorFunction;
pDestStr = AnsiStrCopyStr(pDestStr, &size, " ");
pDestStr = AnsiStrCopyCode(pDestStr, &size, code, codeNameTablePower, "POWER_", 10);
break;
}
case IRP_MJ_SYSTEM_CONTROL: {
ULONG code = pIrpStack->MinorFunction;
pDestStr = AnsiStrCopyStr(pDestStr, &size, " ");
pDestStr = AnsiStrCopyCode(pDestStr, &size, code, codeNameTableWmi, "WMI_", 10);
break;
}
case IRP_MJ_QUERY_INFORMATION: {
ULONG code = pIrpStack->Parameters.QueryFile.FileInformationClass;
pDestStr = AnsiStrCopyStr(pDestStr, &size, " ");
pDestStr = AnsiStrCopyCode(pDestStr, &size, code, codeNameTableFileInformationClass, NULL, 10);
break;
}
case IRP_MJ_SET_INFORMATION: {
ULONG code = pIrpStack->Parameters.SetFile.FileInformationClass;
pDestStr = AnsiStrCopyStr(pDestStr, &size, " ");
pDestStr = AnsiStrCopyCode(pDestStr, &size, code, codeNameTableFileInformationClass, NULL, 10);
break;
}
}
if (pStatus) {
pDestStr = AnsiStrCopyStr(pDestStr, &size, ", status=");
pDestStr = AnsiStrCopyCode(pDestStr, &size, *pStatus, codeNameTableStatus, "0x", 16);
}
TraceOutput(pDevExt, pBuf->buf);
FreeTraceBuf(pBuf);
}
/********************************************************************/
#else /* DBG */
#pragma warning(disable:4206) // nonstandard extension used : translation unit is empty
#endif /* DBG */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -