核心模式驱动程序框架

✍ dations ◷ 2025-10-22 03:57:15 #微软API,驱动程序

核心模式驱动程序框架(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)。

自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 = ;
 KdPrint((__DRIVER_NAME "DriverEntry Begin\n"));
 WDF_DRIVER_CONFIG_INIT(&config, EvtDeviceAdd); status = WdfDriverCreate(                     DriverObject,                     RegistryPath,                     ,                     &config, // Pointer to config structure                     ); // 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(&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,                                       ,                                       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

如果EvtDeviceAdd顺利运行成功,那么EvtDevicePrepareHardware是框架下一个被运行的函数,用以保证驱动程序能够访问硬件。

相关

  • 江南丘陵江南丘陵指的是长江以南,南岭北,武夷山和天目山等山脉以西,雪峰山以东的广大低山、丘陵的总称。其范围介于介于北纬25°—31°,东经110°—120°之间,包括湖南省、江西省的中南部
  • 聚亚胺酯聚胺酯(英语:Polyurethane,IUPAC缩写为PUR,一般缩写为PU),是指主链中含有氨基甲酸酯特征单元的一类高分子。这种高分子材料广泛用于黏合剂,涂层,低速轮胎,垫圈,车垫等工业领域。在日常
  • 婴儿油矿物油(或石蜡油)指的是从矿物源、特别是石油分馏物中提取的任何一种无色无臭的高级烷烃。“矿物油”这个名字其实并不准确,在过去曾经被用于描述某些具体的油。“白油”、“液
  • 小行星2104小行星2104(英语:2104 Toronto)是一颗围绕太阳公转的小行星。1963年8月15日,K. W. Kamper在陶腾堡发现了此天体,并以多伦多大学命名。这也是加拿大的天文台所发现的第一颗小行星
  • 健壮性 (计算机科学)计算机科学中,稳健性(英语:Robustness)是指一个计算机系统在执行过程中处理错误,以及算法在遭遇输入、运算等异常时继续正常运行的能力。诸如模糊测试之类的形式化方法中,必须通过
  • 阿尔弗雷德·莫里纳阿尔弗雷德·莫里纳(英语:Alfred Molina,1953年5月24日-)英格兰人,英国电影电视演员。1953年,阿尔弗雷德·莫里纳出生在英格兰伦敦帕丁顿。他的母亲吉瓦娜(Givanna)是一名意大利女厨
  • 麻醉药物和危险药物管理局麻醉药物和危险药物管理局( Bureau of Narcotics and Dangerous Drugs,简称BNDD)是美国缉毒局的前身。它建立于1968年,是美国司法部的下属机构,包括由原属于美国财政部的麻醉药物
  • 利普希茨利普希茨或李普希茨(德语:Lipschitz;俄语:Липшиц)是一个中欧、东欧姓氏,可能来自于波兰、捷克边境上的格武布奇采。其拼写变体很多;就译名而言,变体有利夫希茨、莱夫谢茨、利
  • 水浒传角色列表本条目陈列“四大奇书”之一的《水浒传》内之角色。书中的主角宋江、歹角高俅,以至如道君皇帝、张叔夜等,乃宋代的真实历史人物;而天罡地煞一百单八将,则由《大宋宣和遗事》所载
  • 阿雷希朱塞佩·阿雷希 (Giuseppe Alessi ,1905年10月29日-2009年7月13日)是意大利基督教民主派政客。1947年至1949年及再次在1955年至1956年担任西西里岛地区议会议长(President of the