Chinaunix首页 | 论坛 | 博客
  • 博客访问: 55171
  • 博文数量: 51
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 410
  • 用 户 组: 普通用户
  • 注册时间: 2018-08-26 01:30
文章分类

全部博文(51)

文章存档

2020年(2)

2018年(49)

我的朋友

分类: Windows平台

2018-08-26 01:38:47

    最后的一点开发工作:跟踪驱动。


一、驱动跟踪

    1. 包含TMH头文件

  1. #include "step5.tmh"

    2. 初始化跟踪

            在DriverEntry中初始化。


  1. WPP_INIT_TRACING( DriverObject, RegistryPath );

  2.     WDF_OBJECT_ATTRIBUTES_INIT(&attributes);

  3.     attributes.EvtCleanupCallback = EvtDriverContextCleanup;

        (1) WPP跟踪初始化

                 


  1. VOID
  2.   WPP_INIT_TRACING(
  3.     IN PDRIVER_OBJECT DriverObject,
  4.     IN OPT PUNICODE_STRING RegistryPath
  5.     );

        (2) WDF对象属性初始化

               


  1. VOID WDF_OBJECT_ATTRIBUTES_INIT(
  2.   _Out_ PWDF_OBJECT_ATTRIBUTES Attributes
  3. );

        (3) 设置回调事件 

             


  1. EVT_WDF_OBJECT_CONTEXT_CLEANUP EvtCleanupCallback;

  2. VOID EvtCleanupCallback(
  3.   _In_ WDFOBJECT Object
  4. )
  5. { ... }

3. 清理跟踪

        使用宏。


  1. VOID
  2. WPP_CLEANUP(
  3.     IN PDRIVER_OBJECT DriverObject
  4. );

(1) 清理WDM驱动对象

      


  1. PDRIVER_OBJECT WdfDriverWdmGetDriverObject(
  2.   [in] WDFDRIVER Driver
  3. );

    Windows 驱动开发编后话:

        我们的开发工作到此已经完成了。但是,这不是工作状态的驱动程序。

        后继还要进行IRQL、EvtIoStop、电源的细化处理、IOTarget(包括EvtIoDeviceControl)以及inf文件等等。


附:

step5.c


  1. /*++

  2. Step5: This steps shows:
  3.        1) How to map KdPrint function to do WPP tracing
  4. --*/

  5. #include <stdarg.h> // To avoid build errors on Win2K due to WPP
  6. #include "ntddk.h"
  7. #include "wdf.h"
  8. #include "prototypes.h"
  9. #pragma warning(disable:4200) // suppress nameless struct/union warning
  10. #pragma warning(disable:4201) // suppress nameless struct/union warning
  11. #pragma warning(disable:4214) // suppress bit field types other than int warning
  12. #include "usbdi.h"
  13. #pragma warning(default:4200)
  14. #pragma warning(default:4201)
  15. #pragma warning(default:4214)
  16. #include "wdfusb.h"
  17. #include "initguid.h"

  18. #include "step5.tmh"

  19. DEFINE_GUID(GUID_DEVINTERFACE_OSRUSBFX2, // Generated using guidgen.exe
  20.    0x573e8c73, 0xcb4, 0x4471, 0xa1, 0xbf, 0xfa, 0xb2, 0x6c, 0x31, 0xd3, 0x84);
  21. // {573E8C73-0CB4-4471-A1BF-FAB26C31D384}

  22. #define IOCTL_INDEX 0x800
  23. #define FILE_DEVICE_OSRUSBFX2 0x65500
  24. #define USBFX2LK_SET_BARGRAPH_DISPLAY 0xD8
  25. #define BULK_OUT_ENDPOINT_INDEX 1
  26. #define BULK_IN_ENDPOINT_INDEX 2
  27. #define IOCTL_OSRUSBFX2_SET_BAR_GRAPH_DISPLAY CTL_CODE(FILE_DEVICE_OSRUSBFX2,\
  28.                                                     IOCTL_INDEX + 5, \
  29.                                                     METHOD_BUFFERED, \
  30.                                                     FILE_WRITE_ACCESS)
  31. typedef struct _DEVICE_CONTEXT {
  32.   WDFUSBDEVICE UsbDevice;
  33.   WDFUSBINTERFACE UsbInterface;
  34.   WDFUSBPIPE BulkReadPipe;
  35.   WDFUSBPIPE BulkWritePipe;
  36. } DEVICE_CONTEXT, *PDEVICE_CONTEXT;

  37. WDF_DECLARE_CONTEXT_TYPE_WITH_NAME(DEVICE_CONTEXT, GetDeviceContext)


  38. NTSTATUS
  39. DriverEntry(
  40.     IN PDRIVER_OBJECT DriverObject,
  41.     IN PUNICODE_STRING RegistryPath
  42.     )
  43. {
  44.     WDF_DRIVER_CONFIG config;
  45.     NTSTATUS status;
  46.     WDF_OBJECT_ATTRIBUTES attributes;

  47.     WPP_INIT_TRACING( DriverObject, RegistryPath );

  48.     KdPrint(("DriverEntry of Step5\n"));

  49.     WDF_DRIVER_CONFIG_INIT(&config, EvtDeviceAdd);

  50.     //
  51.     // Register a cleanup callback so that we can call WPP_CLEANUP when
  52.     // the framework driver object is deleted during driver unload.
  53.     //
  54.     WDF_OBJECT_ATTRIBUTES_INIT(&attributes);
  55.     attributes.EvtCleanupCallback = EvtDriverContextCleanup;

  56.     status = WdfDriverCreate(DriverObject,
  57.                         RegistryPath,
  58.                         &attributes,
  59.                         &config,
  60.                         WDF_NO_HANDLE
  61.                         );

  62.     if (!NT_SUCCESS(status)) {
  63.         KdPrint(("WdfDriverCreate failed %!STATUS!\n", status));
  64.         //
  65.         // Cleanup tracing here because DriverContextCleanup will not be called
  66.         // as we have failed to create WDFDRIVER object itself.
  67.         // Please note that if your return failure from DriverEntry after the
  68.         // WDFDRIVER object is created successfully, you don't have to
  69.         // call WPP cleanup because in those cases DriverContextCleanup
  70.         // will be executed when the framework deletes the DriverObject.
  71.         //
  72.         WPP_CLEANUP(DriverObject);
  73.     }

  74.     return status;
  75. }

  76. VOID
  77. EvtDriverContextCleanup(
  78.     IN WDFDRIVER Driver
  79.     )
  80. {
  81.     WPP_CLEANUP( WdfDriverWdmGetDriverObject( Driver ));
  82. }

  83. NTSTATUS
  84. EvtDeviceAdd(
  85.     IN WDFDRIVER Driver,
  86.     IN PWDFDEVICE_INIT DeviceInit
  87.     )
  88. {
  89.     WDF_OBJECT_ATTRIBUTES attributes;
  90.     NTSTATUS status;
  91.     WDFDEVICE device;
  92.     PDEVICE_CONTEXT pDevContext;
  93.     WDF_PNPPOWER_EVENT_CALLBACKS pnpPowerCallbacks;
  94.     WDF_IO_QUEUE_CONFIG ioQueueConfig;

  95.     UNREFERENCED_PARAMETER(Driver);

  96.     WDF_PNPPOWER_EVENT_CALLBACKS_INIT(&pnpPowerCallbacks);
  97.     pnpPowerCallbacks.EvtDevicePrepareHardware = EvtDevicePrepareHardware;
  98.     WdfDeviceInitSetPnpPowerEventCallbacks(DeviceInit, &pnpPowerCallbacks);

  99.     WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE(&attributes, DEVICE_CONTEXT);

  100.     status = WdfDeviceCreate(&DeviceInit, &attributes, &device);
  101.     if (!NT_SUCCESS(status)) {
  102.         KdPrint(("WdfDeviceCreate failed %!STATUS!\n", status));
  103.         return status;
  104.     }

  105.     pDevContext = GetDeviceContext(device);

  106.     status = WdfDeviceCreateDeviceInterface(device,
  107.                                 (LPGUID) &GUID_DEVINTERFACE_OSRUSBFX2,
  108.                                 NULL);// Reference String
  109.     if (!NT_SUCCESS(status)) {
  110.         KdPrint(("WdfDeviceCreateDeviceInterface failed %!STATUS!\n", status));
  111.         return status;
  112.     }

  113.     WDF_IO_QUEUE_CONFIG_INIT_DEFAULT_QUEUE(&ioQueueConfig,
  114.                                     WdfIoQueueDispatchParallel);

  115.     ioQueueConfig.EvtIoDeviceControl = EvtIoDeviceControl;
  116.     ioQueueConfig.EvtIoRead = EvtIoRead;
  117.     ioQueueConfig.EvtIoWrite = EvtIoWrite;

  118.     status = WdfIoQueueCreate(device,
  119.                          &ioQueueConfig,
  120.                          WDF_NO_OBJECT_ATTRIBUTES,
  121.                          WDF_NO_HANDLE);
  122.     if (!NT_SUCCESS(status)) {
  123.         KdPrint(("WdfIoQueueCreate failed %!STATUS!\n", status));
  124.         return status;
  125.     }

  126.     return status;
  127. }


  128. NTSTATUS
  129. EvtDevicePrepareHardware(
  130.     IN WDFDEVICE Device,
  131.     IN WDFCMRESLIST ResourceList,
  132.     IN WDFCMRESLIST ResourceListTranslated
  133.     )
  134. {
  135.     NTSTATUS status;
  136.     PDEVICE_CONTEXT pDeviceContext;
  137.     WDF_USB_DEVICE_SELECT_CONFIG_PARAMS configParams;
  138.     WDFUSBPIPE pipe;

  139.     UNREFERENCED_PARAMETER(ResourceList);
  140.     UNREFERENCED_PARAMETER(ResourceListTranslated);

  141.     pDeviceContext = GetDeviceContext(Device);
  142.     
  143.     //
  144.     // Create the USB device if it is not already created.
  145.     //
  146.     if (pDeviceContext->UsbDevice == NULL) {
  147.         status = WdfUsbTargetDeviceCreate(Device,
  148.                                     WDF_NO_OBJECT_ATTRIBUTES,
  149.                                     &pDeviceContext->UsbDevice);
  150.         if (!NT_SUCCESS(status)) {
  151.             KdPrint(("WdfUsbTargetDeviceCreate failed %!STATUS!\n", status));
  152.             return status;
  153.         }
  154.     }

  155.     WDF_USB_DEVICE_SELECT_CONFIG_PARAMS_INIT_SINGLE_INTERFACE(&configParams);

  156.     status = WdfUsbTargetDeviceSelectConfig(pDeviceContext->UsbDevice,
  157.                                         WDF_NO_OBJECT_ATTRIBUTES,
  158.                                         &configParams);
  159.     if(!NT_SUCCESS(status)) {
  160.         KdPrint(("WdfUsbTargetDeviceSelectConfig failed %!STATUS!\n", status));
  161.         return status;
  162.     }

  163.     pDeviceContext->UsbInterface =
  164.                 configParams.Types.SingleInterface.ConfiguredUsbInterface;

  165.     pipe = WdfUsbInterfaceGetConfiguredPipe(pDeviceContext->UsbInterface,
  166.                                        2, //PipeIndex,
  167.                                        NULL);// pipeInfo

  168.     pDeviceContext->BulkReadPipe = WdfUsbInterfaceGetConfiguredPipe(
  169.                                                   pDeviceContext->UsbInterface,
  170.                                                   BULK_IN_ENDPOINT_INDEX,
  171.                                                   NULL);// pipeInfo

  172.     WdfUsbTargetPipeSetNoMaximumPacketSizeCheck(pDeviceContext->BulkReadPipe);

  173.     pDeviceContext->BulkWritePipe = WdfUsbInterfaceGetConfiguredPipe(
  174.                                                   pDeviceContext->UsbInterface,
  175.                                                   BULK_OUT_ENDPOINT_INDEX,
  176.                                                   NULL);// pipeInfo

  177.     WdfUsbTargetPipeSetNoMaximumPacketSizeCheck(pDeviceContext->BulkWritePipe);

  178.     return status;
  179. }

  180. VOID
  181. EvtIoDeviceControl(
  182.     IN WDFQUEUE Queue,
  183.     IN WDFREQUEST Request,
  184.     IN size_t OutputBufferLength,
  185.     IN size_t InputBufferLength,
  186.     IN ULONG IoControlCode
  187.     )
  188. {
  189.     WDFDEVICE device;
  190.     PDEVICE_CONTEXT pDevContext;
  191.     size_t bytesTransferred = 0;
  192.     NTSTATUS status;
  193.     WDF_USB_CONTROL_SETUP_PACKET controlSetupPacket;
  194.     WDF_MEMORY_DESCRIPTOR memDesc;
  195.     WDFMEMORY memory;
  196.     WDF_REQUEST_SEND_OPTIONS sendOptions;

  197.     UNREFERENCED_PARAMETER(InputBufferLength);
  198.     UNREFERENCED_PARAMETER(OutputBufferLength);

  199.     device = WdfIoQueueGetDevice(Queue);
  200.     pDevContext = GetDeviceContext(device);

  201.     switch(IoControlCode) {

  202.     case IOCTL_OSRUSBFX2_SET_BAR_GRAPH_DISPLAY:

  203.         if(InputBufferLength < sizeof(UCHAR)) {
  204.             status = STATUS_BUFFER_OVERFLOW;
  205.             bytesTransferred = sizeof(UCHAR);
  206.             break;
  207.         }

  208.         status = WdfRequestRetrieveInputMemory(Request, &memory);
  209.         if (!NT_SUCCESS(status)) {
  210.             KdPrint(("WdfRequestRetrieveMemory failed %!STATUS!", status));
  211.             break;
  212.         }

  213.         WDF_USB_CONTROL_SETUP_PACKET_INIT_VENDOR(&controlSetupPacket,
  214.                                         BmRequestHostToDevice,
  215.                                         BmRequestToDevice,
  216.                                         USBFX2LK_SET_BARGRAPH_DISPLAY, // Request
  217.                                         0, // Value
  218.                                         0); // Index

  219.         WDF_MEMORY_DESCRIPTOR_INIT_HANDLE(&memDesc, memory, NULL);

  220.        //
  221.        // Send the I/O with a timeout to avoid hanging the calling
  222.        // thread indefinitely.
  223.        //
  224.         WDF_REQUEST_SEND_OPTIONS_INIT(&sendOptions,
  225.                                   WDF_REQUEST_SEND_OPTION_TIMEOUT);

  226.         WDF_REQUEST_SEND_OPTIONS_SET_TIMEOUT(&sendOptions,
  227.                                          WDF_REL_TIMEOUT_IN_MS(100));

  228.         status = WdfUsbTargetDeviceSendControlTransferSynchronously(
  229.                                         pDevContext->UsbDevice,
  230.                                         NULL, // Optional WDFREQUEST
  231.                                         &sendOptions, // PWDF_REQUEST_SEND_OPTIONS
  232.                                         &controlSetupPacket,
  233.                                         &memDesc,
  234.                                         (PULONG)&bytesTransferred);
  235.         if (!NT_SUCCESS(status)) {
  236.             KdPrint(("SendControlTransfer failed %!STATUS!", status));
  237.             break;
  238.         }
  239.         break;

  240.     default:
  241.         status = STATUS_INVALID_DEVICE_REQUEST;
  242.         break;
  243.     }

  244.     WdfRequestCompleteWithInformation(Request, status, bytesTransferred);

  245.     return;
  246. }

  247. VOID
  248. EvtIoRead(
  249.     IN WDFQUEUE Queue,
  250.     IN WDFREQUEST Request,
  251.     IN size_t Length
  252.     )
  253. {
  254.     WDFUSBPIPE pipe;
  255.     NTSTATUS status;
  256.     WDFMEMORY reqMemory;
  257.     PDEVICE_CONTEXT pDeviceContext;
  258.     BOOLEAN ret;

  259.     UNREFERENCED_PARAMETER(Length);

  260.     pDeviceContext = GetDeviceContext(WdfIoQueueGetDevice(Queue));

  261.     pipe = pDeviceContext->BulkReadPipe;

  262.     status = WdfRequestRetrieveOutputMemory(Request, &reqMemory);
  263.     if(!NT_SUCCESS(status)){
  264.         goto Exit;
  265.     }

  266.     status = WdfUsbTargetPipeFormatRequestForRead(pipe,
  267.                                         Request,
  268.                                         reqMemory,
  269.                                         NULL // Offsets
  270.                                         );
  271.     if (!NT_SUCCESS(status)) {
  272.         goto Exit;
  273.     }

  274.     WdfRequestSetCompletionRoutine(
  275.                             Request,
  276.                             EvtRequestReadCompletionRoutine,
  277.                             pipe);

  278.     ret = WdfRequestSend(Request,
  279.                     WdfUsbTargetPipeGetIoTarget(pipe),
  280.                     WDF_NO_SEND_OPTIONS);
  281.     if (ret == FALSE) {
  282.         status = WdfRequestGetStatus(Request);
  283.         goto Exit;
  284.     } else {
  285.         return;
  286.     }

  287. Exit:
  288.     WdfRequestCompleteWithInformation(Request, status, 0);

  289.     return;
  290. }

  291. VOID
  292. EvtRequestReadCompletionRoutine(
  293.     IN WDFREQUEST Request,
  294.     IN WDFIOTARGET Target,
  295.     PWDF_PEQUEST_COMPLETION_PARAMS CompletionParams,
  296.     IN WDFCONTEXT Context
  297.     )
  298. {
  299.     NTSTATUS status;
  300.     size_t bytesRead = 0;
  301.     PWDF_USB_REQUEST_COMPLETION_PARAMS usbCompletionParams;

  302.     UNREFERENCED_PARAMETER(Target);
  303.     UNREFERENCED_PARAMETER(Context);

  304.     status = CompletionParams->IoStatus.Status;

  305.     usbCompletionParams = CompletionParams->Parameters.Usb.Completion;

  306.     bytesRead = usbCompletionParams->Parameters.PipeRead.Length;

  307.     if (NT_SUCCESS(status)){
  308.         KdPrint(("Number of bytes read: %I64d\n", (INT64)bytesRead));
  309.     } else {
  310.         KdPrint(("Read failed - request status %!STATUS! UsbdStatus %!STATUS!\n",
  311.                 status, usbCompletionParams->UsbdStatus));

  312.     }

  313.     WdfRequestCompleteWithInformation(Request, status, bytesRead);

  314.     return;
  315. }

  316. VOID
  317. EvtIoWrite(
  318.     IN WDFQUEUE Queue,
  319.     IN WDFREQUEST Request,
  320.     IN size_t Length
  321.     )
  322. {
  323.     NTSTATUS status;
  324.     WDFUSBPIPE pipe;
  325.     WDFMEMORY reqMemory;
  326.     PDEVICE_CONTEXT pDeviceContext;
  327.     BOOLEAN ret;

  328.     UNREFERENCED_PARAMETER(Length);

  329.     pDeviceContext = GetDeviceContext(WdfIoQueueGetDevice(Queue));

  330.     pipe = pDeviceContext->BulkWritePipe;

  331.     status = WdfRequestRetrieveInputMemory(Request, &reqMemory);
  332.     if(!NT_SUCCESS(status)){
  333.         goto Exit;
  334.     }

  335.     status = WdfUsbTargetPipeFormatRequestForWrite(pipe,
  336.                                               Request,
  337.                                               reqMemory,
  338.                                               NULL); // Offset
  339.     if (!NT_SUCCESS(status)) {
  340.         goto Exit;
  341.     }

  342.     WdfRequestSetCompletionRoutine(
  343.                             Request,
  344.                             EvtRequestWriteCompletionRoutine,
  345.                             pipe);

  346.     ret = WdfRequestSend(Request,
  347.                     WdfUsbTargetPipeGetIoTarget(pipe),
  348.                     WDF_NO_SEND_OPTIONS);
  349.     if (ret == FALSE) {
  350.         status = WdfRequestGetStatus(Request);
  351.         goto Exit;
  352.     } else {
  353.         return;
  354.     }

  355. Exit:
  356.     WdfRequestCompleteWithInformation(Request, status, 0);

  357.     return;
  358. }

  359. VOID
  360. EvtRequestWriteCompletionRoutine(
  361.     IN WDFREQUEST Request,
  362.     IN WDFIOTARGET Target,
  363.     PWDF_REQUEST_COMPLETION_PARAMS CompletionParams,
  364.     IN WDFCONTEXT Context
  365.     )
  366. {
  367.     NTSTATUS status;
  368.     size_t bytesWritten = 0;
  369.     PWDF_USB_REQUEST_COMPLETION_PARAMS usbCompletionParams;

  370.     UNREFERENCED_PARAMETER(Target);
  371.     UNREFERENCED_PARAMETER(Context);

  372.     status = CompletionParams->IoStatus.Status;

  373.     usbCompletionParams = CompletionParams->Parameters.Usb.Completion;

  374.     bytesWritten = usbCompletionParams->Parameters.PipeWrite.Length;

  375.     if (NT_SUCCESS(status)){
  376.         KdPrint(("Number of bytes written: %I64d\n", (INT64)bytesWritten));
  377.     } else {
  378.         KdPrint(("Write failed: request Status %!STATUS! UsbdStatus %!STATUS!\n",
  379.                 status, usbCompletionParams->UsbdStatus));
  380.     }

  381.     WdfRequestCompleteWithInformation(Request, status, bytesWritten);

  382.     return;
  383. }










阅读(959) | 评论(0) | 转发(0) |
0

上一篇:没有了

下一篇:Windows 驱动开发 - 7

给主人留下些什么吧!~~