Steward
分享是一種喜悅、更是一種幸福
驅動程式 - Kernel Mode Driver Framework (KMDF) - 使用範例 - C/C++ (WDF) - PNP - Handle File IRP - Choose WdfDeviceIoDirect
參考資訊:
https://wasm.in/
http://four-f.narod.ru/
https://github.com/steward-fu/ddk
main.c
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 | #include <ntddk.h> #include <wdf.h> #define DEV_NAME L"\\Device\\MyDriver" #define SYM_NAME L"\\DosDevices\\MyDriver" char szBuffer[255] = { 0 }; void IrpFileCreate ( WDFDEVICE myDevice, WDFREQUEST myRequest, WDFFILEOBJECT myFileObject) { DbgPrint ( "IRP_MJ_CREATE" ); WdfRequestComplete (myRequest, STATUS_SUCCESS ); } void IrpFileClose ( WDFFILEOBJECT myFileObject) { DbgPrint ( "IRP_MJ_CLOSE" ); } void IrpRead ( WDFQUEUE myQueue, WDFREQUEST myRequest, size_t myLen) { PMDL mdl = NULL ; ULONG len = 0; UCHAR *dst = NULL ; WDFMEMORY mem = { 0 }; DbgPrint ( "IRP_MJ_READ" ); len = strlen (szBuffer); WdfRequestRetrieveOutputWdmMdl (myRequest, &mdl); dst= MmGetSystemAddressForMdlSafe (mdl, LowPagePriority ); memcpy (dst, szBuffer, len); WdfRequestCompleteWithInformation (myRequest, STATUS_SUCCESS , len); } void IrpWrite ( WDFQUEUE myQueue, WDFREQUEST myRequest, size_t myLen) { PMDL mdl = NULL ; UCHAR *src = NULL ; WDFMEMORY mem = { 0 }; DbgPrint ( "IRP_MJ_WRITE" ); WdfRequestRetrieveInputWdmMdl (myRequest, &mdl); src = MmGetSystemAddressForMdlSafe (mdl, LowPagePriority ); memcpy (szBuffer, src, myLen); DbgPrint ( "Buffer: %s, Length:%d" , szBuffer, myLen); WdfRequestCompleteWithInformation (myRequest, STATUS_SUCCESS , myLen); } NTSTATUS AddDevice ( WDFDRIVER myDriver, PWDFDEVICE_INIT pMyDeviceInit) { WDFDEVICE device = { 0 }; UNICODE_STRING szDevName = { 0 }; UNICODE_STRING szSymName = { 0 }; WDF_IO_QUEUE_CONFIG io_cfg = { 0 }; WDF_FILEOBJECT_CONFIG file_cfg = { 0 }; RtlInitUnicodeString (&szDevName, DEV_NAME ); RtlInitUnicodeString (&szSymName, SYM_NAME ); WdfDeviceInitAssignName (pMyDeviceInit, &szDevName); WdfDeviceInitSetIoType (pMyDeviceInit, WdfDeviceIoDirect ); WDF_FILEOBJECT_CONFIG_INIT (&file_cfg, IrpFileCreate , IrpFileClose , NULL ); WdfDeviceInitSetFileObjectConfig (pMyDeviceInit, &file_cfg, WDF_NO_OBJECT_ATTRIBUTES ); WdfDeviceCreate (&pMyDeviceInit, WDF_NO_OBJECT_ATTRIBUTES , & device ); WdfDeviceCreateSymbolicLink ( device , &szSymName); WDF_IO_QUEUE_CONFIG_INIT_DEFAULT_QUEUE (&io_cfg, WdfIoQueueDispatchSequential ); io_cfg.EvtIoRead = IrpRead ; io_cfg.EvtIoWrite = IrpWrite ; return WdfIoQueueCreate ( device , &io_cfg, WDF_NO_OBJECT_ATTRIBUTES , WDF_NO_HANDLE ); } NTSTATUS DriverEntry ( PDRIVER_OBJECT pMyDriver, PUNICODE_STRING pRegistry) { WDF_DRIVER_CONFIG config = { 0 }; WDF_DRIVER_CONFIG_INIT (& config , AddDevice ); return WdfDriverCreate (pMyDriver, pRegistry, WDF_NO_OBJECT_ATTRIBUTES , & config , WDF_NO_HANDLE ); } |
完成