Advertisement
Guest User

Untitled

a guest
May 26th, 2019
138
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.00 KB | None | 0 0
  1. #include <ntddk.h>
  2. #include <wdf.h>
  3. #include "Ioctl.hpp"
  4. #include "kmdfrc.hpp"
  5. #include "staticclassessupport.h"
  6. #include "trace.hpp"
  7. #include "kmdfrc.tmh"
  8.  
  9. EXTERN_C_START
  10.  
  11. DRIVER_INITIALIZE DriverEntry;
  12.  
  13. NTSTATUS
  14. DriverEntry(
  15.     IN OUT PDRIVER_OBJECT   DriverObject,
  16.     IN PUNICODE_STRING      RegistryPath
  17. );
  18.  
  19. EXTERN_C_END
  20.  
  21. typedef struct _DEVICE_EXTENSION
  22. {
  23.     int a;
  24. }DEVICE_CONTEXT, *PDEVICE_EXTENSION;
  25. WDF_DECLARE_CONTEXT_TYPE_WITH_NAME(DEVICE_CONTEXT, DeviceGetContext)
  26.  
  27. VOID
  28. KmdfrcUnload(
  29.     IN WDFDRIVER Driver
  30. )
  31. {
  32.     PAGED_CODE();
  33.     DrvLogInfo("Unload Driver=0x%p", Driver);
  34.     auto driverObject = WdfDriverWdmGetDriverObject(Driver);
  35.     WPP_CLEANUP(driverObject);
  36. }
  37.  
  38. _Function_class_(EVT_WDF_OBJECT_CONTEXT_CLEANUP)
  39. _IRQL_requires_same_
  40. _IRQL_requires_max_(DISPATCH_LEVEL)
  41. VOID
  42. KmdfrcContextCleanup(
  43.     _In_ WDFOBJECT Object
  44. )
  45. {
  46.     DrvLogInfo("KmdfrcContextCleanup Object=0x%p", Object);
  47. }
  48.  
  49. _Function_class_(EVT_WDF_OBJECT_CONTEXT_DESTROY)
  50. _IRQL_requires_same_
  51. _IRQL_requires_max_(DISPATCH_LEVEL)
  52. VOID
  53. KmdfrcContextDestroy(
  54.     _In_
  55.     WDFOBJECT Object
  56. )
  57. {
  58.     DrvLogInfo("KmdfrcContextDestroy Object=0x%p", Object);
  59. }
  60.  
  61. EVT_WDF_DEVICE_FILE_CREATE KmdfrcEvtWdfDeviceFileCreate;
  62. EVT_WDF_FILE_CLOSE KmdfrcEvtWdfFileClose;
  63. EVT_WDF_FILE_CLEANUP KmdfrcEvtWdfFileCleanup;
  64.  
  65. void
  66. KmdfrcEvtWdfDeviceFileCreate(
  67.     _In_ WDFDEVICE Device,
  68.     _In_ WDFREQUEST Request,
  69.     _In_ WDFFILEOBJECT FileObject
  70. )
  71. {
  72.     DrvLogInfo("KmdfrcEvtWdfDeviceFileCreate Device=0x%p, Request=0x%p, FileObject=0x%p", Device, Request, FileObject);
  73.     WdfRequestComplete(Request, STATUS_SUCCESS);
  74.  
  75. }
  76.  
  77. void
  78. KmdfrcEvtWdfFileCleanup(
  79.     _In_ WDFFILEOBJECT FileObject
  80. )
  81. {
  82.     DrvLogInfo("KmdfrcEvtWdfFileCleanup FileObject=0x%p", FileObject);
  83. }
  84.  
  85. void
  86. KmdfrcEvtWdfFileClose(
  87.     _In_ WDFFILEOBJECT FileObject
  88. )
  89. {
  90.     DrvLogInfo("KmdfrcEvtWdfFileClose FileObject=0x%p", FileObject);
  91. }
  92.  
  93. _Function_class_(EVT_WDF_IO_QUEUE_IO_READ)
  94. _IRQL_requires_same_
  95. _IRQL_requires_max_(DISPATCH_LEVEL)
  96. VOID
  97. KmdfrcIoQueueRead(
  98.     _In_ WDFQUEUE Queue,
  99.     _In_ WDFREQUEST Request,
  100.     _In_ size_t Length
  101. )
  102. {
  103.     DrvLogInfo("KmdfrcIoQueueRead Queue=0x%p, Request=0x%p, Length=0x%Iu", Queue, Request, Length);
  104.     WdfRequestComplete(Request, STATUS_ACCESS_DENIED);
  105. }
  106.  
  107. _Function_class_(EVT_WDF_IO_QUEUE_IO_WRITE)
  108. _IRQL_requires_same_
  109. _IRQL_requires_max_(DISPATCH_LEVEL)
  110. VOID
  111. KmdfrcIoQueueWrite(
  112.     _In_ WDFQUEUE Queue,
  113.     _In_ WDFREQUEST Request,
  114.     _In_ size_t Length
  115. )
  116. {
  117.     DrvLogInfo("KmdfrcIoQueueWrite Queue=0x%p, Request=0x%p, Length=0x%Iu", Queue, Request, Length);
  118.     WdfRequestComplete(Request, STATUS_ACCESS_DENIED);
  119. }
  120.  
  121. _Function_class_(EVT_WDF_IO_QUEUE_IO_DEVICE_CONTROL)
  122. _IRQL_requires_same_
  123. _IRQL_requires_max_(DISPATCH_LEVEL)
  124. VOID
  125. KmdfrcIoQueueDeviceControl(
  126.     _In_ WDFQUEUE Queue,
  127.     _In_ WDFREQUEST Request,
  128.     _In_ size_t OutputBufferLength,
  129.     _In_ size_t InputBufferLength,
  130.     _In_ ULONG IoControlCode
  131. )
  132. {
  133.     DrvLogInfo("KmdfrcIoQueueDeviceControl Queue=0x%p, Request=0x%p, OutputBufferLength=0x%Iu, InputBufferLength=0x%Iu, IoControlCode=0x%x", Queue, Request, OutputBufferLength, InputBufferLength, IoControlCode);
  134.     WdfRequestComplete(Request, STATUS_ACCESS_DENIED);
  135. }
  136.  
  137. _Function_class_(EVT_WDF_IO_IN_CALLER_CONTEXT)
  138. _IRQL_requires_same_
  139. _IRQL_requires_max_(DISPATCH_LEVEL)
  140. VOID
  141. KmdfrcEvtIoInCallerContext(
  142.     _In_ WDFDEVICE Device,
  143.     _In_ WDFREQUEST Request
  144. )
  145. {
  146.     DrvLogInfo("KmdfrcEvtIoInCallerContext Device=0x%p, Request=0x%p", Device, Request);
  147. }
  148.  
  149. NTSTATUS
  150. KmdfrcInitDevice(
  151.     _In_ WDFDRIVER Driver,
  152.     _In_ PWDFDEVICE_INIT DeviceInit
  153. )
  154. {
  155.     UNREFERENCED_PARAMETER(Driver);
  156.     NTSTATUS status = STATUS_UNSUCCESSFUL;;
  157.     WDF_OBJECT_ATTRIBUTES attributes = { 0 };
  158.     WDF_IO_QUEUE_CONFIG ioQueueConfig = { 0 };
  159.     WDF_FILEOBJECT_CONFIG fileConfig = { 0 };
  160.     WDFQUEUE queue = nullptr;
  161.     WDFDEVICE controlDevice = nullptr;
  162.     DECLARE_CONST_UNICODE_STRING(ntDeviceName, KMDFRC_DEVICE_NAME_STRING);
  163.     DECLARE_CONST_UNICODE_STRING(symbolicLinkName, KMDFRC_SYMBOLIC_NAME_STRING);
  164.  
  165.     WdfDeviceInitSetExclusive(DeviceInit, TRUE);
  166.     WdfDeviceInitSetIoType(DeviceInit, WdfDeviceIoBuffered);
  167.  
  168.     status = WdfDeviceInitAssignName(DeviceInit, &ntDeviceName);
  169.     if (!VERIFY_SUCCESS(status))
  170.     {
  171.         DrvLogError("WdfDeviceInitAssignName failed with status: 0x%x", status);
  172.         goto exit;
  173.     }
  174.  
  175.     // WdfControlDeviceInitSetShutdownNotification
  176.  
  177.     WDF_FILEOBJECT_CONFIG_INIT(
  178.         &fileConfig,
  179.         KmdfrcEvtWdfDeviceFileCreate,
  180.         KmdfrcEvtWdfFileClose,
  181.         KmdfrcEvtWdfFileCleanup // not interested in Cleanup
  182.     );
  183.  
  184.     WdfDeviceInitSetFileObjectConfig(
  185.         DeviceInit,
  186.         &fileConfig,
  187.         WDF_NO_OBJECT_ATTRIBUTES
  188.     );
  189.  
  190.     //WdfDeviceInitSetIoInCallerContextCallback(
  191.     //    DeviceInit,
  192.     //    KmdfrcEvtIoInCallerContext
  193.     //);
  194.  
  195.     WDF_OBJECT_ATTRIBUTES_INIT(&attributes);
  196.     WDF_OBJECT_ATTRIBUTES_SET_CONTEXT_TYPE(&attributes, DEVICE_CONTEXT);
  197.  
  198.     status = WdfDeviceCreate(
  199.         &DeviceInit,
  200.         &attributes,
  201.         &controlDevice
  202.     );
  203.     if (!VERIFY_SUCCESS(status))
  204.     {
  205.         DrvLogError("WdfDeviceCreate failed with status: 0x%x", status);
  206.         goto exit;
  207.     }
  208.  
  209.     status = WdfDeviceCreateSymbolicLink(
  210.         controlDevice,
  211.         &symbolicLinkName
  212.     );
  213.     if (!VERIFY_SUCCESS(status))
  214.     {
  215.         DrvLogError("WdfDeviceCreateSymbolicLink failed with status: 0x%x", status);
  216.         goto exit;
  217.     }
  218.  
  219.     WDF_IO_QUEUE_CONFIG_INIT_DEFAULT_QUEUE(
  220.         &ioQueueConfig,
  221.         WdfIoQueueDispatchSequential
  222.     );
  223.  
  224.     ioQueueConfig.EvtIoRead = KmdfrcIoQueueRead;
  225.     ioQueueConfig.EvtIoWrite = KmdfrcIoQueueWrite;
  226.     ioQueueConfig.EvtIoDeviceControl = KmdfrcIoQueueDeviceControl;
  227.  
  228.     WDF_OBJECT_ATTRIBUTES_INIT(&attributes);
  229.     status = WdfIoQueueCreate(
  230.         controlDevice,
  231.         &ioQueueConfig,
  232.         &attributes,
  233.         &queue // pointer to default queue
  234.     );
  235.     if (!VERIFY_SUCCESS(status))
  236.     {
  237.         DrvLogError("WdfIoQueueCreate failed with status: 0x%x", status);
  238.         goto exit;
  239.     }
  240.     WdfControlFinishInitializing(controlDevice);
  241. exit:
  242.     if (DeviceInit != NULL)
  243.     {
  244.         WdfDeviceInitFree(DeviceInit);
  245.     }
  246.  
  247.     return status;
  248. }
  249.  
  250. NTSTATUS
  251. DriverEntry(
  252.     _Inout_ PDRIVER_OBJECT DriverObject,
  253.     _In_ PUNICODE_STRING RegistryPath
  254. )
  255. {
  256.     NTSTATUS status = STATUS_UNSUCCESSFUL;
  257.     WDF_DRIVER_CONFIG config = { 0 };
  258.     WDFDRIVER driverObject = nullptr;
  259.     PWDFDEVICE_INIT deviceInit = nullptr;
  260.     WDF_OBJECT_ATTRIBUTES attributes = { 0 };
  261.  
  262.     WPP_INIT_TRACING(DriverObject, RegistryPath);
  263.  
  264.     CppInitStaticDestructorList();
  265.     CppCallStaticConstructors(__crtXca, __crtXcz);
  266.     if (!NT_VERIFY(::CppWereAllDestructorsRegistered()))
  267.     {
  268.         DrvLogCritical("Could not register all static destructors.");
  269.         status = STATUS_INSUFFICIENT_RESOURCES;
  270.         goto exit;
  271.     }
  272.  
  273.     WDF_DRIVER_CONFIG_INIT(
  274.         &config,
  275.         WDF_NO_EVENT_CALLBACK
  276.     );
  277.  
  278.     config.DriverInitFlags |= WdfDriverInitNonPnpDriver; // non-pnp driver
  279.     config.EvtDriverUnload = KmdfrcUnload;
  280.  
  281.     WDF_OBJECT_ATTRIBUTES_INIT(&attributes);
  282.     attributes.EvtCleanupCallback = KmdfrcContextCleanup;
  283.     attributes.EvtDestroyCallback = KmdfrcContextDestroy;
  284.     status = WdfDriverCreate(
  285.         DriverObject,
  286.         RegistryPath,
  287.         &attributes,
  288.         &config,
  289.         &driverObject
  290.     );
  291.     if (!NT_SUCCESS(status))
  292.     {
  293.         DrvLogCritical("NonPnp: WdfDriverCreate failed with status 0x%x", status);
  294.         goto exit;
  295.     }
  296.  
  297.     // manually allocate device init since we
  298.     // don't have a device add callback
  299.     deviceInit = WdfControlDeviceInitAllocate(
  300.         driverObject,
  301.         &SDDL_DEVOBJ_SYS_ALL_ADM_RWX_WORLD_RW_RES_R
  302.     );
  303.    
  304.     status = KmdfrcInitDevice(driverObject, deviceInit);
  305.  
  306. exit:
  307.     if (!VERIFY_SUCCESS(status))
  308.     {
  309.         CppExit();
  310.         WPP_CLEANUP(DriverObject);
  311.     }
  312.     return status;
  313. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement