⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 trace.c

📁 这个是一个开源项目, 有能力的人可以一起来写
💻 C
📖 第 1 页 / 共 3 页
字号:

        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 + -