核心模式驱动程序框架

✍ dations ◷ 2025-11-21 23:54: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是框架下一个被运行的函数,用以保证驱动程序能够访问硬件。

相关

  • 龟城市龟城市(朝鲜语:구성시/龜城市 Kusŏng si */?)是朝鲜民主主义人民共和国平安北道的一个市,位于该道中南部。面积666.8平方公里。朝鲜王朝时期设郡。1967年建市。下分二十四洞、
  • 1961年哈马舍尔德空难身亡案阴谋论联合国DC-6号班机空难于1961年9月18日发生在北罗得西亚,搭载原计划前往刚果与莫伊兹·冲伯进行停火协议磋商的第二任联合国秘书长达格·哈马舍尔德等15人的客机坠毁,机上全员
  • GenusGenus (LSE:GNS)是英国的一家种畜公司。Genus是富时250指数成份股,总部位于贝辛斯托克。该公司有两个子公司,分别是生产种牛的ABS和生产种猪的PIC。Genus公司的前身是成立于193
  • 古希腊罗马美学古希腊罗马美学是从前六世纪开始,极盛于前4世纪和前5世纪的希腊奴隶制全盛期。属于自然哲学的存在本体论,以荷马时代或英雄时代神话的幻想直观,,形而上学对立, 阶级意识为主。
  • 生态社区主义生态社区主义(Eco-communalism)是一种环境哲学,基本理念是简单生活、自给自足、可持续性,以及投资本土经济。生态社区主义设想在将来,资本主义经济体系将被相互依赖和相互联系的
  • PacmanPacman是一个软件包管理器,作为Arch Linux发行版的一部分。它最早由Arch Linux的Judd Vinet开发。Pacman可以解决安装过程中的依赖问题,自动下载并且安装所有需要的软件包。Pa
  • 奇科·奥拉·德维·瓦多约奇科·奥拉·德维·瓦多约(印尼语:Chico Aura Dwi Wardoyo,1998年6月15日-),印尼男子羽毛球运动员。2016年11月,奇科·奥拉·德维·瓦多约代表印尼参加在西班牙毕尔巴鄂举行的世界
  • 南香织参数所指定的目标页面不存在,建议更正成存在页面或直接建立下列一个页面(建立前请先搜寻是否有合适的存在页面可以取代):南香织(日语:南 かおり,1969年6月25日-),日本女艺人、主持人、
  • 高师直高师直(?-1351年3月24日),日本南北朝时代武将。足利尊氏的侧近,参加讨幕战争,建武新政等。南北朝动乱时期,与楠木正成,北畠显家,新田义贞等名将长期对阵。 1338年,足利尊氏就任征夷大将
  • 韩文藻韩文藻(1923年9月-2006年2月3日),男,汉族,上海人,中国基督教人物、政治人物,中国基督教协会会长,中国宗教界和平委员会副主席兼秘书长,江苏省政协副主席,第七、八、九届全国政协委员。