核心模式驅動程式架構是微軟公司推出的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
- 縮寫:KMDF
簡介
- 即插即用(PNP)設備所使用的Function Driver。
- 即插即用(PNP)設備所使用的Filter Driver。
- 即插即用(PNP)設備堆疊(Stack)所使用的Bus Driver。
- Windows NT 4.0類型設備所使用的Control設備驅動程式。
與WDM的關係
- Plug and Play and power management
- I/O queues
- Direct memory access(DMA)
驅動程式進入點
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(&config, EvtDeviceAdd);
status = WdfDriverCreate(
DriverObject,
RegistryPath,
''WDF_NO_OBJECT_ATTRIBUTES'',
&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
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(&pnpPowerCallbacks);
pnpPowerCallbacks.EvtDevicePrepareHardware = DioEvtPrepareHardware;
pnpPowerCallbacks.EvtDeviceReleaseHardware = DioEvtReleaseHardware;
pnpPowerCallbacks.EvtDeviceD0Entry= DioEvtDeviceD0Entry;
pnpPowerCallbacks.EvtDeviceD0Exit = DioEvtDeviceD0Exit;
WdfDeviceInitSetPnpPowerEventCallbacks(DeviceInit, pnpPowerCallbacks);
WDF_OBJECT_ATTRIBUTES_INIT(&objAttributes);
WDF_OBJECT_ATTRIBUTES_SET_CONTEXT_TYPE(&objAttributes, DIO_DEVICE_CONTEXT);
status = WdfDeviceInitUpdateName(DeviceInit, L"\\device\\WDFDIO");
status = WdfDeviceCreate(&DeviceInit, // Device Init structure
&objAttributes, // Attributes for WDF Device
&device); // return new WDF Device pointer,
devContext = DioGetContextFromDevice(device); // Get device extension
devContext->WdfDevice = device;
// Create a symbolic link for the control object
status = WdfDeviceCreateSymbolicLink(device, L"\\DosDevices\\WDFDIO");
WDF_IO_QUEUE_CONFIG_INIT(&ioCallbacks,
WdfIoQueueDispatchSerial,
WDF_NO_EVENT_CALLBACK, // StartIo
WDF_NO_EVENT_CALLBACK); // CancelRoutine
ioCallbacks.EvtIoDeviceControl = DioEvtDeviceControlIoctl;
status = WdfDeviceCreateDefaultQueue(device,
&ioCallbacks,
''WDF_NO_OBJECT_ATTRIBUTES'',
NULL); // pointer to default queue
WDF_INTERRUPT_CONFIG_INIT(&interruptConfig, // Configure the Interrupt object
FALSE, // auto-queue DPC?
DioIsr, // ISR
DioDpc); // Defered Procedule Call
interruptConfig.EvtInterruptEnable = DioEvtInterruptEnable;
interruptConfig.EvtInterruptDisable = DioEvtInterruptDisable;
status = WdfInterruptCreate(device,
&interruptConfig,
&objAttributes,
&devContext->WdfInterrupt);
WDF_DEVICE_POWER_POLICY_IDLE_SETTINGS_INIT(&idleSettings, // Initialize idle policy
IdleCannotWakeFromS0);
status = WdfDeviceUpdateS0IdleSettings(device, &idleSettings);
return status;
}
Prepare Hardware
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);
}