windows驱动开发笔记(1、环境搭建&开发套路)

博主之前做过linux驱动开发,windows驱动还是新鲜事物,最近项目需要,研究了一段时间windows驱动,记录经验和感想如下:

先看总结

1、windows驱动网络上的资料较少,很多博客和书籍是基于古老的NT模型,学习途径主要是微软官方。

2、windows驱动没有设备树,但多了inf文件,以pcie设备驱动为例,linux中设备ID在设备树中配置,windows在inf文件配置。

3、虽然windows和linux驱动的api和开发方法有所差异,但整体模式和套路其实大差不差。都是创建一个设备文件或符号。对这个文件或符号open、read、write、close。linux下的ioctl对应windows下的EvtIoDeviceControl

4、windows驱动开发调试比linux要方便很多,使用vs就可以编译出目标驱动,基于网络就能单步调试。相比之前,linux驱动开发需要繁杂的配置工具链、编译环境;单步调试需要借助调试器。

搭建环境

目标电脑

在淘宝买二手的,现在大多数显示器都是hdmi的,最好注意主板是否有HDMI接口,否则要再买个VGA转HDMI模块

主板B85/
CPUi3 4150/
内存8G/
硬盘120G固态主板、CPU、内存、硬盘、风扇套装 235¥
电源长城300W35¥
合计270¥

安装最新的win11系统

开发电脑

参照https://learn.microsoft.com/zh-cn/windows-hardware/drivers/download-the-wdk安装开发工具

除了安装这些微软官方工具外,还可以安装一些辅助工具

工具用途
DebugView查看打印信息
windbg进行单步调试
winobj查看符号链接
pciutils查看pcie设备信息

开发套路

目标电脑配置

进入测试模式,重启

bcdedit /set testsigning on
bcdedit.exe /set nointegritychecks on
shutdown -r -t 5

驱动匹配

以pcie设备为例,驱动通过inf文件中的ID进行匹配,其中10EE和8011为厂家ID和设备ID

[Standard.NT$ARCH$.10.0...16299]
%test.DeviceDesc% = test_Device, PCI\VEN_10EE&DEV_8011&SUBSYS_000710EE ;

除此之外,inf文件还描述了设备的类型、版本等,类似于linux下的设备树

代码入口

NTSTATUS DriverEntry(_In_ PDRIVER_OBJECT  DriverObject, _In_ PUNICODE_STRING RegistryPath)
{
...
}

创建设备符号

// 创建给应用的符号接口
status = WdfDeviceCreateDeviceInterface(
    Device_G,
    &GUID_DEVINTERFACE_test,
    NULL // ReferenceString
    );

这个符号定义在Public.h文件中,示例如下:

DEFINE_GUID (GUID_DEVINTERFACE_test,
    0xf0041375,0xe829,0x4ea2,0xb9,0x64,0x6a,0x24,0x0b,0xe0,0xfc,0xf3);

ioctl

回调函数中实现ioctl

queueConfig.EvtIoDeviceControl = testEvtIoDeviceControl;
VOID testEvtIoDeviceControl(_In_ WDFQUEUE Queue, _In_ WDFREQUEST Request, _In_ size_t OutputBufferLength, _In_ size_t InputBufferLength, _In_ ULONG IoControlCode)

通过WdfRequestRetrieveInputBuffer和WdfRequestRetrieveOutputBuffer函数实现内核和应用层数据交互

struct FDEV_IOCTRL_WRITE_STR *p_u2k_buf, *p_k2u_buf;
status = WdfRequestRetrieveInputBuffer(Request, sizeof(struct FDEV_IOCTRL_WRITE_STR), &p_u2k_buf, NULL);
if (!NT_SUCCESS(status)) {
    WdfRequestComplete(Request, status);
    return;
}
status = WdfRequestRetrieveOutputBuffer(Request, sizeof(struct FDEV_IOCTRL_WRITE_STR), &p_k2u_buf, NULL);
if (!NT_SUCCESS(status)) {
    WdfRequestComplete(Request, status);
    return;
}

通过WdfRequestCompleteWithInformation函数配置内核返回给应用的数据长度

// !!!设置实际返回的字节数(必须调用此函数,否则应用程序收不到数据)
WdfRequestCompleteWithInformation(Request, STATUS_SUCCESS, sizeof(struct FDEV_IOCTRL_WRITE_STR));

完结

以上就是windows驱动开发的简要经验,整体其实和linux的套路是类似的,只是接口函数存在差异。

为了在较短时间实现pcie设备的驱动,可以借鉴linux下UIO驱动的思想,在内核中实现内存读写、中断处理、内存分配和DMA操作等关键接口。具体的设备驱动在应用层通过c++来实现。

内容概要:本文围绕基于支持向量机的电力短期负荷预测方法展开基于支持向量机的电力短期负荷预测方法研究——最小二乘支持向量机、标准粒子群算法支持向量机与改进粒子群算法支持向量机的对比分析(Matlab代码实现)研究,重点对比分析了三种方法:最小二乘支持向量机(LSSVM)、标准粒子群算法优化的支持向量机(PSO-SVM)以及改进粒子群算法优化的支持向量机(IPSO-SVM)。文章详细介绍了各模型的构建过程与优化机制,并通过Matlab代码实现对电力负荷数据进行预测,评估不同方法在预测精度、收敛速度和稳定性方面的性能差异。研究旨在为电力系统调度提供高精度的短期负荷预测方案,提升电网运行效率与可靠性。; 适合人群:具备一定电力系统基础知识和Matlab编程能力的科研人员、电气工程及相关专业的研究生或高年级本科生;对机器学习在能源领域应用感兴趣的技术人员。; 使用场景及目标:①应用于电力系统短期负荷预测的实际建模与仿真;②比较不同优化算法对支持向量机预测性能的影响;③为相关课题研究提供可复现的代码参考和技术路线支持。; 阅读建议:建议读者结合文中提供的Matlab代码,深入理解每种支持向量机模型的参数设置与优化流程,动手实践以掌握算法细节,并可通过更换数据集进一步验证模型泛化能力。
【源码免费下载链接】:https://renmaiwang.cn/s/qaiji 18、MapReduce的计数器与通过MapReduce读取_写入数据库示例网址: input files to process”表示处理的总输入文件数量,“number of splits”指示文件被分割成多少个块进行处理,“Running job”显示作业的状态等。自定义计数器则是开发者根据实际需求创建的,用于跟踪特定任务的特定指标。开发者可以在Mapper或Reducer类中增加自定义计数器,然后在代码中增加计数器的值。这样,当作业完成后,可以通过查看计数器的值来分析程序的行为和性能。接下来,我们将讨论如何通过MapReduce与数据库交互,尤其是MySQL数据库。在大数据场景下,有时需要将MapReduce处理的结果存储到关系型数据库中,或者从数据库中读取数据进行处理。Hadoop提供了JDBC(Java Database Connectivity)接口,使得MapReduce作业能够与数据库进行连接和操作。要实现MapReduce读取数据库,首先需要在Mapper类中加载数据库驱动并建立连接。然后,可以在map()方法中使用SQL查询获取所需数据。在Reduce阶段,可以对数据进行进一步处理和聚合,最后将结果写入到数据库中。对于写入数据库,通常在Reducer类的reduce()方法或cleanup()方法中进行,将处理后的数据转换为适合数据库存储的格式,然后通过JDBC API执行插入、更新或删除等操作。需要注意的是,由于MapReduce作业可能涉及大量的数据写入,因此需要考虑数据库的并发处理能力和性能优化策略。总结一下,MapReduce的计数器提供了强大的监控和调试能力,而通过MapReduce与数据库的交互则扩展了大数据处理的应用场景。开发者可以根据需求利用计数器来优化作业
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

最好有梦想~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值