驅動程式 - 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);
}

完成