核心模式驱动程式架构

核心模式驱动程式架构（Kernel-Mode Driver Framework，缩写KMDF）是微软公司推出的Windows驱动程式基础（Windows Driver Foundation）之一，建构Windows XP与Windows Server 2003的核心模式（Kernel-Mode）驱动程式所需的基本功能，包括对随插即用（PNP）、电源管理（Power Manager）、I/O伫列、直接记忆体存取（DMA）、Windows Management Instrumentation（WMI）和同步处理等的完整支援。KMDF的设计并不能用来取代WDM，它提供“Skeletal WDM”建置来替代WDM；目前，KMDF并不支援汇流排筛选驱动程式（Bus Filter Driver）。
Kernel-Mode Driver Framework目前支援下列类型的核心模式（kernel mode）驱动程式之建立了：
KMDF是可重新进入程式库（Reentrant Library）。
与WDM的关系.
自Windows 2000开始，开发驱动程式必以WDM为基础的，但开发难度太大，无法像使用者模式应用程式开发那样容易。KMDF支援驱动程式在Windows Driver Model环境中撰写驱动程式，简化其中的过程，但是KMDF的设计并不能用来取代WDM，它提供「Skeletal WDM」建置来替代WDM。早期的WDM可支援Windows 98、Windows Me、Windows 2000和Windows XP；至于WDF计划支援Windows XP，以及更新的版本。
KMDF系以物件为基底建立于WDM架构之上。不同的功能有不同的物件，KMDF在实作上包含了：
驱动程式进入点.
在Windows作业系统中驱动程式的起始点都是在DriverEntry函式，DriveryEntry是驱动程式的进入点（entry point）。在DriverEntry函式的实作里，你需要具现化（instantiate）你的WDFDRIVER物件，并且告知WDF framework要去哪里呼叫你的系统。
 NTSTATUS DriverEntry(
 IN PDRIVER_OBJECT DriverObject,
 IN PUNICODE_STRING RegistryPath
 {
 WDF_DRIVER_CONFIG config;
 NTSTATUS status = "S_OK";
 KdPrint((__DRIVER_NAME "DriverEntry Begin\n"));
 WDF_DRIVER_CONFIG_INIT(&amp;config, EvtDeviceAdd);
 status = WdfDriverCreate(
 DriverObject,
 RegistryPath,
 "WDF_NO_OBJECT_ATTRIBUTES",
 &amp;config, // Pointer to config structure
 "WDF_NO_HANDLE"); // or NULL, Pointer to get WDFDRIVER handle
 if(T_SUCCESS(status))
 KdPrint((__DRIVER_NAME "WdfDriverCreate failed with status 0x%08x\n", status));
 KdPrint((__DRIVER_NAME "DriverEntry End\n"));
 return status;
Add Device.
EvtDeviceAdd函数，在系统发现新硬体插入时被呼叫。这个函数将挑起WDF驱动程式架构的大部分工作，EvtDeviceAdd事件被唤起之余一定会带出一个WDFDRIVER物件，并且指向一个WDFDEVICE_INIT结构。在装置产生（device crated）之前，必先进行初始化的动作。如果EvtDeviceAdd执行成功，那么EvtDevicePrepareHardware是架构下一个被执行的函式，用以保证驱动程式能够访问硬体。
 WDFSTATUS DioEvtDeviceAdd(WDFDRIVER Driver, PWDFDEVICE_INIT DeviceInit)
 WDFSTATUS status = STATUS_SUCCESS;
 WDF_PNPPOWER_EVENT_CALLBACKS pnpPowerCallbacks;
 WDF_OBJECT_ATTRIBUTES objAttributes;
 WDFDEVICE device;
 PDIO_DEVICE_CONTEXT devContext;
 WDF_IO_QUEUE_CONFIG ioCallbacks;
 WDF_INTERRUPT_CONFIG interruptConfig;
 WDF_DEVICE_POWER_POLICY_IDLE_SETTINGS idleSettings;
 WDF_PNPPOWER_EVENT_CALLBACKS_INIT(&amp;pnpPowerCallbacks);
 pnpPowerCallbacks.EvtDevicePrepareHardware = DioEvtPrepareHardware;
 pnpPowerCallbacks.EvtDeviceReleaseHardware = DioEvtReleaseHardware;
 pnpPowerCallbacks.EvtDeviceD0Entry= DioEvtDeviceD0Entry;
 pnpPowerCallbacks.EvtDeviceD0Exit = DioEvtDeviceD0Exit;
 WdfDeviceInitSetPnpPowerEventCallbacks(DeviceInit, pnpPowerCallbacks);
 WDF_OBJECT_ATTRIBUTES_INIT(&amp;objAttributes);
 WDF_OBJECT_ATTRIBUTES_SET_CONTEXT_TYPE(&amp;objAttributes, DIO_DEVICE_CONTEXT);
 status = WdfDeviceInitUpdateName(DeviceInit, L"\\device\\WDFDIO");
 status = WdfDeviceCreate(&amp;DeviceInit, // Device Init structure
 &amp;objAttributes, // Attributes for WDF Device
 &amp;device); // return new WDF Device pointer,
 devContext = DioGetContextFromDevice(device); // Get device extension
 devContext-&gt;WdfDevice = device;
 // Create a symbolic link for the control object
 status = WdfDeviceCreateSymbolicLink(device, L"\\DosDevices\\WDFDIO");
 WDF_IO_QUEUE_CONFIG_INIT(&amp;ioCallbacks,
 WdfIoQueueDispatchSerial,
 WDF_NO_EVENT_CALLBACK, // StartIo
 WDF_NO_EVENT_CALLBACK); // CancelRoutine
 ioCallbacks.EvtIoDeviceControl = DioEvtDeviceControlIoctl;
 status = WdfDeviceCreateDefaultQueue(device,
 &amp;ioCallbacks,
 "WDF_NO_OBJECT_ATTRIBUTES",
 NULL); // pointer to default queue
 WDF_INTERRUPT_CONFIG_INIT(&amp;interruptConfig, // Configure the Interrupt object
 FALSE, // auto-queue DPC?
 DioIsr, // ISR
 DioDpc); // Defered Procedule Call
 interruptConfig.EvtInterruptEnable = DioEvtInterruptEnable;
 interruptConfig.EvtInterruptDisable = DioEvtInterruptDisable;
 status = WdfInterruptCreate(device,
 &amp;interruptConfig,
 &amp;objAttributes,
 &amp;devContext-&gt;WdfInterrupt);
 WDF_DEVICE_POWER_POLICY_IDLE_SETTINGS_INIT(&amp;idleSettings, // Initialize idle policy
 IdleCannotWakeFromS0);
 status = WdfDeviceUpdateS0IdleSettings(device, &amp;idleSettings);
 return status;
Prepare Hardware.
如果EvtDeviceAdd顺利执行成功，那么EvtDevicePrepareHardware是架构下一个被执行的函式，用以保证驱动程式能够访问硬体。
 NTSTATUS EvtDevicePrepareHardware(
 IN WDFDEVICE Device,
 IN WDFCMRESLIST ResourceList,
 IN WDFCMRESLIST ResourceListTranslated
 {
 NTSTATUS status = STATUS_SUCCESS;
 UNREFERENCED_PARAMETER(Device);
 UNREFERENCED_PARAMETER(ResourceList);
 UNREFERENCED_PARAMETER(ResourceListTranslated);
 return status;
 NTSTATUS EvtDeviceD0Entry(
 IN WDFDEVICE Device,
 IN WDF_POWER_DEVICE_STATE PreviousState
 {
 NTSTATUS status = STATUS_SUCCESS;
 return status;
 NTSTATUS EvtDeviceD0Exit(
 IN WDFDEVICE Device,
 IN WDF_POWER_DEVICE_STATE TargetState
 {
 NTSTATUS status = STATUS_SUCCESS;
 return status;
IO requests.
 VOID EvtDeviceIoDefault(
 IN WDFQUEUE Queue,
 IN WDFREQUEST Request
 {
 WdfRequestComplete(Request, STATUS_NOT_IMPLEMENTED);