博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Windows 驱动开发 - 8
阅读量:6215 次
发布时间:2019-06-21

本文共 15448 字,大约阅读时间需要 51 分钟。

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

一、驱动跟踪

    1. 包括TMH头文件

#include "step5.tmh"

    

    2. 初始化跟踪

            在DriverEntry中初始化。

WPP_INIT_TRACING( DriverObject, RegistryPath );    WDF_OBJECT_ATTRIBUTES_INIT(&attributes);    attributes.EvtCleanupCallback = EvtDriverContextCleanup;

        (1) WPP跟踪初始化

                 

VOID  WPP_INIT_TRACING(    IN PDRIVER_OBJECT  DriverObject,    IN OPT PUNICODE_STRING  RegistryPath    );

        (2) WDF对象属性初始化

                 

VOID WDF_OBJECT_ATTRIBUTES_INIT(  _Out_ PWDF_OBJECT_ATTRIBUTES Attributes);

        (3) 设置回调事件 

             

EVT_WDF_OBJECT_CONTEXT_CLEANUP EvtCleanupCallback;VOID EvtCleanupCallback(  _In_ WDFOBJECT Object){ ... }

    3. 清理跟踪

        使用宏。

VOID WPP_CLEANUP(    IN PDRIVER_OBJECT  DriverObject);

        (1) 清理WDM驱动对象

               

PDRIVER_OBJECT WdfDriverWdmGetDriverObject(  [in] WDFDRIVER Driver);

    Windows 驱动开发编后话:

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

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

附:

step5.c

/*++Step5: This steps shows:       1) How to map KdPrint function to do WPP tracing--*/#include 
// To avoid build errors on Win2K due to WPP#include "ntddk.h"#include "wdf.h"#include "prototypes.h"#pragma warning(disable:4200) // suppress nameless struct/union warning#pragma warning(disable:4201) // suppress nameless struct/union warning#pragma warning(disable:4214) // suppress bit field types other than int warning#include "usbdi.h"#pragma warning(default:4200)#pragma warning(default:4201)#pragma warning(default:4214)#include "wdfusb.h"#include "initguid.h"#include "step5.tmh"DEFINE_GUID(GUID_DEVINTERFACE_OSRUSBFX2, // Generated using guidgen.exe 0x573e8c73, 0xcb4, 0x4471, 0xa1, 0xbf, 0xfa, 0xb2, 0x6c, 0x31, 0xd3, 0x84);// {573E8C73-0CB4-4471-A1BF-FAB26C31D384}#define IOCTL_INDEX 0x800#define FILE_DEVICE_OSRUSBFX2 0x65500#define USBFX2LK_SET_BARGRAPH_DISPLAY 0xD8#define BULK_OUT_ENDPOINT_INDEX 1#define BULK_IN_ENDPOINT_INDEX 2#define IOCTL_OSRUSBFX2_SET_BAR_GRAPH_DISPLAY CTL_CODE(FILE_DEVICE_OSRUSBFX2,\ IOCTL_INDEX + 5, \ METHOD_BUFFERED, \ FILE_WRITE_ACCESS)typedef struct _DEVICE_CONTEXT { WDFUSBDEVICE UsbDevice; WDFUSBINTERFACE UsbInterface; WDFUSBPIPE BulkReadPipe; WDFUSBPIPE BulkWritePipe;} DEVICE_CONTEXT, *PDEVICE_CONTEXT;WDF_DECLARE_CONTEXT_TYPE_WITH_NAME(DEVICE_CONTEXT, GetDeviceContext)NTSTATUSDriverEntry( IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath ){ WDF_DRIVER_CONFIG config; NTSTATUS status; WDF_OBJECT_ATTRIBUTES attributes; WPP_INIT_TRACING( DriverObject, RegistryPath ); KdPrint(("DriverEntry of Step5\n")); WDF_DRIVER_CONFIG_INIT(&config, EvtDeviceAdd); // // Register a cleanup callback so that we can call WPP_CLEANUP when // the framework driver object is deleted during driver unload. // WDF_OBJECT_ATTRIBUTES_INIT(&attributes); attributes.EvtCleanupCallback = EvtDriverContextCleanup; status = WdfDriverCreate(DriverObject, RegistryPath, &attributes, &config, WDF_NO_HANDLE ); if (!NT_SUCCESS(status)) { KdPrint(("WdfDriverCreate failed %!STATUS!\n", status)); // // Cleanup tracing here because DriverContextCleanup will not be called // as we have failed to create WDFDRIVER object itself. // Please note that if your return failure from DriverEntry after the // WDFDRIVER object is created successfully, you don't have to // call WPP cleanup because in those cases DriverContextCleanup // will be executed when the framework deletes the DriverObject. // WPP_CLEANUP(DriverObject); } return status;}VOIDEvtDriverContextCleanup( IN WDFDRIVER Driver ){ WPP_CLEANUP( WdfDriverWdmGetDriverObject( Driver ));}NTSTATUSEvtDeviceAdd( IN WDFDRIVER Driver, IN PWDFDEVICE_INIT DeviceInit ){ WDF_OBJECT_ATTRIBUTES attributes; NTSTATUS status; WDFDEVICE device; PDEVICE_CONTEXT pDevContext; WDF_PNPPOWER_EVENT_CALLBACKS pnpPowerCallbacks; WDF_IO_QUEUE_CONFIG ioQueueConfig; UNREFERENCED_PARAMETER(Driver); WDF_PNPPOWER_EVENT_CALLBACKS_INIT(&pnpPowerCallbacks); pnpPowerCallbacks.EvtDevicePrepareHardware = EvtDevicePrepareHardware; WdfDeviceInitSetPnpPowerEventCallbacks(DeviceInit, &pnpPowerCallbacks); WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE(&attributes, DEVICE_CONTEXT); status = WdfDeviceCreate(&DeviceInit, &attributes, &device); if (!NT_SUCCESS(status)) { KdPrint(("WdfDeviceCreate failed %!STATUS!\n", status)); return status; } pDevContext = GetDeviceContext(device); status = WdfDeviceCreateDeviceInterface(device, (LPGUID) &GUID_DEVINTERFACE_OSRUSBFX2, NULL);// Reference String if (!NT_SUCCESS(status)) { KdPrint(("WdfDeviceCreateDeviceInterface failed %!STATUS!\n", status)); return status; } WDF_IO_QUEUE_CONFIG_INIT_DEFAULT_QUEUE(&ioQueueConfig, WdfIoQueueDispatchParallel); ioQueueConfig.EvtIoDeviceControl = EvtIoDeviceControl; ioQueueConfig.EvtIoRead = EvtIoRead; ioQueueConfig.EvtIoWrite = EvtIoWrite; status = WdfIoQueueCreate(device, &ioQueueConfig, WDF_NO_OBJECT_ATTRIBUTES, WDF_NO_HANDLE); if (!NT_SUCCESS(status)) { KdPrint(("WdfIoQueueCreate failed %!STATUS!\n", status)); return status; } return status;}NTSTATUSEvtDevicePrepareHardware( IN WDFDEVICE Device, IN WDFCMRESLIST ResourceList, IN WDFCMRESLIST ResourceListTranslated ){ NTSTATUS status; PDEVICE_CONTEXT pDeviceContext; WDF_USB_DEVICE_SELECT_CONFIG_PARAMS configParams; WDFUSBPIPE pipe; UNREFERENCED_PARAMETER(ResourceList); UNREFERENCED_PARAMETER(ResourceListTranslated); pDeviceContext = GetDeviceContext(Device); // // Create the USB device if it is not already created. // if (pDeviceContext->UsbDevice == NULL) { status = WdfUsbTargetDeviceCreate(Device, WDF_NO_OBJECT_ATTRIBUTES, &pDeviceContext->UsbDevice); if (!NT_SUCCESS(status)) { KdPrint(("WdfUsbTargetDeviceCreate failed %!STATUS!\n", status)); return status; } } WDF_USB_DEVICE_SELECT_CONFIG_PARAMS_INIT_SINGLE_INTERFACE(&configParams); status = WdfUsbTargetDeviceSelectConfig(pDeviceContext->UsbDevice, WDF_NO_OBJECT_ATTRIBUTES, &configParams); if(!NT_SUCCESS(status)) { KdPrint(("WdfUsbTargetDeviceSelectConfig failed %!STATUS!\n", status)); return status; } pDeviceContext->UsbInterface = configParams.Types.SingleInterface.ConfiguredUsbInterface; pipe = WdfUsbInterfaceGetConfiguredPipe(pDeviceContext->UsbInterface, 2, //PipeIndex, NULL);// pipeInfo pDeviceContext->BulkReadPipe = WdfUsbInterfaceGetConfiguredPipe( pDeviceContext->UsbInterface, BULK_IN_ENDPOINT_INDEX, NULL);// pipeInfo WdfUsbTargetPipeSetNoMaximumPacketSizeCheck(pDeviceContext->BulkReadPipe); pDeviceContext->BulkWritePipe = WdfUsbInterfaceGetConfiguredPipe( pDeviceContext->UsbInterface, BULK_OUT_ENDPOINT_INDEX, NULL);// pipeInfo WdfUsbTargetPipeSetNoMaximumPacketSizeCheck(pDeviceContext->BulkWritePipe); return status;}VOIDEvtIoDeviceControl( IN WDFQUEUE Queue, IN WDFREQUEST Request, IN size_t OutputBufferLength, IN size_t InputBufferLength, IN ULONG IoControlCode ){ WDFDEVICE device; PDEVICE_CONTEXT pDevContext; size_t bytesTransferred = 0; NTSTATUS status; WDF_USB_CONTROL_SETUP_PACKET controlSetupPacket; WDF_MEMORY_DESCRIPTOR memDesc; WDFMEMORY memory; WDF_REQUEST_SEND_OPTIONS sendOptions; UNREFERENCED_PARAMETER(InputBufferLength); UNREFERENCED_PARAMETER(OutputBufferLength); device = WdfIoQueueGetDevice(Queue); pDevContext = GetDeviceContext(device); switch(IoControlCode) { case IOCTL_OSRUSBFX2_SET_BAR_GRAPH_DISPLAY: if(InputBufferLength < sizeof(UCHAR)) { status = STATUS_BUFFER_OVERFLOW; bytesTransferred = sizeof(UCHAR); break; } status = WdfRequestRetrieveInputMemory(Request, &memory); if (!NT_SUCCESS(status)) { KdPrint(("WdfRequestRetrieveMemory failed %!STATUS!", status)); break; } WDF_USB_CONTROL_SETUP_PACKET_INIT_VENDOR(&controlSetupPacket, BmRequestHostToDevice, BmRequestToDevice, USBFX2LK_SET_BARGRAPH_DISPLAY, // Request 0, // Value 0); // Index WDF_MEMORY_DESCRIPTOR_INIT_HANDLE(&memDesc, memory, NULL); // // Send the I/O with a timeout to avoid hanging the calling // thread indefinitely. // WDF_REQUEST_SEND_OPTIONS_INIT(&sendOptions, WDF_REQUEST_SEND_OPTION_TIMEOUT); WDF_REQUEST_SEND_OPTIONS_SET_TIMEOUT(&sendOptions, WDF_REL_TIMEOUT_IN_MS(100)); status = WdfUsbTargetDeviceSendControlTransferSynchronously( pDevContext->UsbDevice, NULL, // Optional WDFREQUEST &sendOptions, // PWDF_REQUEST_SEND_OPTIONS &controlSetupPacket, &memDesc, (PULONG)&bytesTransferred); if (!NT_SUCCESS(status)) { KdPrint(("SendControlTransfer failed %!STATUS!", status)); break; } break; default: status = STATUS_INVALID_DEVICE_REQUEST; break; } WdfRequestCompleteWithInformation(Request, status, bytesTransferred); return;}VOIDEvtIoRead( IN WDFQUEUE Queue, IN WDFREQUEST Request, IN size_t Length ){ WDFUSBPIPE pipe; NTSTATUS status; WDFMEMORY reqMemory; PDEVICE_CONTEXT pDeviceContext; BOOLEAN ret; UNREFERENCED_PARAMETER(Length); pDeviceContext = GetDeviceContext(WdfIoQueueGetDevice(Queue)); pipe = pDeviceContext->BulkReadPipe; status = WdfRequestRetrieveOutputMemory(Request, &reqMemory); if(!NT_SUCCESS(status)){ goto Exit; } status = WdfUsbTargetPipeFormatRequestForRead(pipe, Request, reqMemory, NULL // Offsets ); if (!NT_SUCCESS(status)) { goto Exit; } WdfRequestSetCompletionRoutine( Request, EvtRequestReadCompletionRoutine, pipe); ret = WdfRequestSend(Request, WdfUsbTargetPipeGetIoTarget(pipe), WDF_NO_SEND_OPTIONS); if (ret == FALSE) { status = WdfRequestGetStatus(Request); goto Exit; } else { return; }Exit: WdfRequestCompleteWithInformation(Request, status, 0); return;}VOIDEvtRequestReadCompletionRoutine( IN WDFREQUEST Request, IN WDFIOTARGET Target, PWDF_PEQUEST_COMPLETION_PARAMS CompletionParams, IN WDFCONTEXT Context ){ NTSTATUS status; size_t bytesRead = 0; PWDF_USB_REQUEST_COMPLETION_PARAMS usbCompletionParams; UNREFERENCED_PARAMETER(Target); UNREFERENCED_PARAMETER(Context); status = CompletionParams->IoStatus.Status; usbCompletionParams = CompletionParams->Parameters.Usb.Completion; bytesRead = usbCompletionParams->Parameters.PipeRead.Length; if (NT_SUCCESS(status)){ KdPrint(("Number of bytes read: %I64d\n", (INT64)bytesRead)); } else { KdPrint(("Read failed - request status %!STATUS! UsbdStatus %!STATUS!\n", status, usbCompletionParams->UsbdStatus)); } WdfRequestCompleteWithInformation(Request, status, bytesRead); return;}VOIDEvtIoWrite( IN WDFQUEUE Queue, IN WDFREQUEST Request, IN size_t Length ){ NTSTATUS status; WDFUSBPIPE pipe; WDFMEMORY reqMemory; PDEVICE_CONTEXT pDeviceContext; BOOLEAN ret; UNREFERENCED_PARAMETER(Length); pDeviceContext = GetDeviceContext(WdfIoQueueGetDevice(Queue)); pipe = pDeviceContext->BulkWritePipe; status = WdfRequestRetrieveInputMemory(Request, &reqMemory); if(!NT_SUCCESS(status)){ goto Exit; } status = WdfUsbTargetPipeFormatRequestForWrite(pipe, Request, reqMemory, NULL); // Offset if (!NT_SUCCESS(status)) { goto Exit; } WdfRequestSetCompletionRoutine( Request, EvtRequestWriteCompletionRoutine, pipe); ret = WdfRequestSend(Request, WdfUsbTargetPipeGetIoTarget(pipe), WDF_NO_SEND_OPTIONS); if (ret == FALSE) { status = WdfRequestGetStatus(Request); goto Exit; } else { return; }Exit: WdfRequestCompleteWithInformation(Request, status, 0); return;}VOIDEvtRequestWriteCompletionRoutine( IN WDFREQUEST Request, IN WDFIOTARGET Target, PWDF_REQUEST_COMPLETION_PARAMS CompletionParams, IN WDFCONTEXT Context ){ NTSTATUS status; size_t bytesWritten = 0; PWDF_USB_REQUEST_COMPLETION_PARAMS usbCompletionParams; UNREFERENCED_PARAMETER(Target); UNREFERENCED_PARAMETER(Context); status = CompletionParams->IoStatus.Status; usbCompletionParams = CompletionParams->Parameters.Usb.Completion; bytesWritten = usbCompletionParams->Parameters.PipeWrite.Length; if (NT_SUCCESS(status)){ KdPrint(("Number of bytes written: %I64d\n", (INT64)bytesWritten)); } else { KdPrint(("Write failed: request Status %!STATUS! UsbdStatus %!STATUS!\n", status, usbCompletionParams->UsbdStatus)); } WdfRequestCompleteWithInformation(Request, status, bytesWritten); return;}

转载地址:http://oxsja.baihongyu.com/

你可能感兴趣的文章
iOS-本地推送和远程推送,常用的三方推送和常用的测试方法,推送实现和原理详解...
查看>>
Android开发者指南(16) —— Activity and Task Design
查看>>
h5+css3最简单的图片飞入以及淡入淡出效果
查看>>
jquery mobile validation
查看>>
LVS模式二:隧道模式(Tun)
查看>>
DNS 攻击方式及攻击案例
查看>>
Android系统adb_shell命令大全
查看>>
零碎知识点
查看>>
setTimeOut(),和setInterVal()调用函数加不加括号!!!
查看>>
jmobile学习之路 ---- 视口
查看>>
Hadoop1 Centos伪分布式部署
查看>>
supervisor:进程管理工具
查看>>
JAVA的继承
查看>>
rtf格式说明
查看>>
SQL系列(十三)—— 关于表的DDL
查看>>
windows环境cmd下执行jar
查看>>
POJ 1201-Intervals(差分约束系统)
查看>>
Object C中retain和copy的区别
查看>>
单向散列函数(Hash)
查看>>
快速搭建phpwind论坛系统
查看>>