C++驱动基础

C++实现一个时间驱动框架 时间驱动框架是一个基于时间的事件触发机制,可以用来实现定时任务、周期性任务以及延时执行等功能。以上就是一个简单的C++时间驱动框架的实现。可以根据具体需求进行扩展和优化。 阅读详情

入口与对象

设计高标准驱动程式当然少不了内核和内存管理、进程管理等等,程序员编写的所有内容无碍乎离不了一个结构,那就是DRIVER_OBJECT,它对应着一个驱动结构,


最简单的驱动程式

Win32程序里有Winmain(),而windows中的DriverEntry和其中的WINDOWSmain函数一样必不可少。

#include <ntddk.h>
    DriverEntry(
    IN PDRIVER_OBJECT DriverObject,
    IN PUNICODE_STRING RegistryPath
){
    NTSTATUS status = STATYS_UNSUCCESSFUL;
    return status;
}

DriverEntry参数及其作用:

参数作用
DIVER_OBJECT指针对应编写的驱动程式,系统预分配内存
RegistryPath字符串注册表子键,专用于本程序信息保存到注册表中
DriverEntry的返回值决定这个驱动的加载是否成功,如果返回STATUS_SUCCESS,则驱动将成功加载,否则不成功加载。

重点:当读者打算反汇编阅读一个内核程序的时候,先可寻找DriverEntry的位置。

分发函数和卸载函数

分发函数指针,就是用来处理发送到这个驱动程序中的请求的,包含于DRIVER_OBJECT中。windows总是自己调用DRIVER_OBJECT下的分发函数来处理这些被发总到驱动中的请求。所以可以理解编写驱动程序的实质是编写请求处理请求的分发函数。

NTSTATUS
DriverEntry(
    IN PDRIVER_OBJECT DriverObject,
    IN PUNICODE_STRING RegistryPath
){
    ULONG i;
    for(i=0;i<IRP_MJ_MAXIMUM_FUNCTION;++i)
    {
        DriverObject->MajorFunctions[i] = MyDispatchFunction;
    }
}

然后编写MyDispatchFunction:

NTSTATUS MyDispatchFunction(PDEVICE_OBJECT device,PIRP irp){    
    //device是由本驱动生成的设备
    //irp是一个系统请求
    //这个函数要处理的是发送给设备device的请求irp
}

卸载函数不放在分发函数数组中,在卸载时,该函数动态执行,起到了该驱动的动态卸载的作用:

NTSTATUS MyDispatchFunction(PDEVICE_OBJECT driver){ 
    //无返回值,地址设置到DriverObject->DriverUnload;
}

设备与符号链接

如果一个驱动程序只是想写写日志文件或者内核钩子来做一些Rootkit,就不发要分发函数:

#include <ntifs.h>
    DriverEntry(
    IN PDRIVER_OBJECT river,
    IN PUNICODE_STRING Reg_path
){
    NTSTATUS status;
    PDEVICE_OBJECT device;
    UNICODE_STRING device_name = RTL_CONSTANT_STRING("\\Device\\MyCDO");
    UNICODE_STRING symb_link = RTL_CONSTANT_STRING("\\DosDevice\\MyCDOSL");
    STATUS=IoCreateDevice(
        driver,
        0,
        device_name,
        FILE_DEVICE_UNKNOWN,
        0,
        FALSE,
        &device
    );
    if(!NT_SUCCESS(status))
        return status;
    status=IoCreateSymbolicLink(
        &symb_link,
        &device_name
    );
    if(!NT_SUCCESS(status)){
        IoDeleteDevice(device);
        return status;
    }
    device->Flag &=~DO_DEVICE_INITIALIZING;
    return status;
}

这个驱动加载之后,生成了一个叫\Device\MyCDO的设备,符号连接叫做\DosDevices\MySDOSL,应用层可以通过打开符号链接打开设备。

C++类中使用表驱动方案 表驱动是一种很不错的编程方法,合理的使用表驱动能够极大的减少代码的复杂度,消除掉大量的if else或者是switch语句,并且能够提升代码性能。 因为哈希是最快的查找算法。这儿我只是给出如何在C++ 中使用表驱动的编程方法。 假设我们正在编写一个消息协议处理程序,需要处理不同协议的消息包,那么肯定会立即想到需要根据消息头中的协议字段来区分消息类型,并 发送到对应的消息处理函数中处理 阅读详情

相关推荐

最新零基础C++逆向辅助+过驱动保护+lua

最新零基础C++逆向辅助+过驱动保护+lua

zygx8_com的博客 6205

用C++ RAII思想写windows驱动

用实例展示如何用C++的RAII思想来写驱动

lif12345的专栏 1723

C++基础学习之12 - 测试驱动开发

测试驱动开发,英文全称 Test-Driven Development,简称TDD,是一种不同于传统软件开发流程的新型的开发方法。它要求在编写某个功能的代码之前先编写测试代码,然后只编写使测试通过的功能代码,通过测试来推动整个开发的进行。这有助于编写简洁可用和高质量的代码,并加速开发过程。         测试驱动开发的基本过程如下: 1. 快速新增一个测试; 2. 运行所有的测试(有时

跟随技术的脚步-linolzhang的专栏 884

C++开发方向之windows驱动开发

1.为什么要写这篇文章? 最近浏览招聘网站看到关于windows驱动开发的岗位,前几天一个C++客户端工作岗位,猎头也问我是否有了解windows内核。 所以,调研了一下C++的开发方向:windows驱动开发。 先来看看招聘网上,关于windows驱动开发的岗位要求: 1.深圳的C++客户端高级岗 2.四川成都的windows驱动开发岗 2.如何学习windows驱动开发 windows驱动开发学习路径主要分三个阶段: 第一阶段:C/C++语言 第二阶段:windows.

haimianjie2012的专栏 6110

《拉依达的嵌入式\驱动面试宝典》—C/CPP基础篇(七)

《拉依达的嵌入式\驱动面试宝典》 整合了所有我认为可能遇到的技术面试问题。所有问题及其答案均是我个人学习后查阅资料总结,每个回答都做了仔细的分析,在嵌入式及其驱动面试相关问题解析做到全网独一无二。学习或者转行到嵌入式、驱动开发领域学习的不二之选

拉依达不拉跨的博客 356

《拉依达的嵌入式\驱动面试宝典》—C/CPP基础篇(四)

《拉依达的嵌入式\驱动面试宝典》 整合了所有我认为可能遇到的技术面试问题。所有问题及其答案均是我个人学习后查阅资料总结,每个回答都做了仔细的分析,在嵌入式及其驱动面试相关问题解析做到全网独一无二。学习或者转行到嵌入式、驱动开发领域学习的不二之选

拉依达不拉跨的博客 389

c++开发Windows驱动程序步骤

请注意,驱动程序是系统级别的代码,因此需要非常小心地编写和测试它们,以避免对系统的损害。在Visual Studio中,可以创建一个新的Win32驱动程序项目,并将代码添加到其中。驱动程序可以使用C++或汇编语言进行编写,但是由于C++更加结构化和易于维护,因此建议采用C++进行编写。可以使用Visual Studio的调试工具来调试驱动程序,或者使用Windbg和Kd来进行内核级别的调试。安装Windows Driver Kit (WDK),该工具包包含了开发Windows驱动所需的所有工具和库文件。

wkk521000的博客 1929

《拉依达的嵌入式\驱动面试宝典》—C/CPP基础篇(三)

《拉依达的嵌入式\驱动面试宝典》 整合了所有我认为可能遇到的技术面试问题。所有问题及其答案均是我个人学习后查阅资料总结,每个回答都做了仔细的分析,在嵌入式及其驱动面试相关问题解析做到全网独一无二。学习或者转行到嵌入式、驱动开发领域学习的不二之选

拉依达不拉跨的博客 466

探索Essential_CPP:掌握C++编程的高效指南

探索Essential_CPP:掌握C++编程的高效指南 是一个由AndyHsu开发的开源项目,旨在为初学者和进阶者提供一套全面且实用的C++学习资源。该项目不仅包含了一系列教程,还提供了丰富的示例代码,帮助用户深入理解C++的核心概念和技术。 项目概述 Essential_CPP涵盖了C++的基础到高级主题,包括数据类型、控制结构、函数、类与对象、模板、异常处理等关键概念。每个主题都有详细的解释...

gitblog_00046的博客 450

《拉依达的嵌入式\驱动面试宝典》—C/CPP基础篇(六)

《拉依达的嵌入式\驱动面试宝典》 整合了所有我认为可能遇到的技术面试问题。所有问题及其答案均是我个人学习后查阅资料总结,每个回答都做了仔细的分析,在嵌入式及其驱动面试相关问题解析做到全网独一无二。学习或者转行到嵌入式、驱动开发领域学习的不二之选

拉依达不拉跨的博客 344

《拉依达的嵌入式\驱动面试宝典》—C/CPP基础篇(一)

《拉依达的嵌入式\驱动面试宝典》 整合了所有我认为可能遇到的技术面试问题。所有问题及其答案均是我个人学习后查阅资料总结,每个回答都做了仔细的分析,在嵌入式及其驱动面试相关问题解析做到全网独一无二。学习或者转行到嵌入式、驱动开发领域学习的不二之选

拉依达不拉跨的博客 1069

嵌入式C++驱动开发:从基础到实践

嵌入式系统开发中,设备驱动作为连接硬件与操作系统的关键组件,其开发效率与质量直接影响系统性能。C++凭借面向对象特性、模板元编程等优势,在嵌入式驱动开发领域逐渐取代传统C语言。通过类封装硬件寄存器、使用现代C++实现中断处理等方法,开发者可以构建类型安全、可维护性高的驱动代码。在ARM Cortex-M和Linux平台下,合理运用零成本抽象、静态内存管理等技术,能在资源受限环境中充分发挥C++优势。这些技术广泛应用于工业通信协议栈、电机控制等场景,是嵌入式工程师提升开发效率的重要技能。

weixin_29193259的博客 253

C++ 驱动开发:操作系统内核级 C++ 编程基础

操作系统要指挥硬件干活,但硬件听不懂操作系统的“人话”,这时候就需要驱动程序来把操作系统的指令翻译成硬件能理解的“硬件语”。但别怕,今天我就用最通俗易懂的方式,带大家走进这个神秘的世界。当然,这只是一个最简单的框架,实际的驱动程序要复杂得多。记住,实践才是最好的老师,多写代码,多调试,你一定会成为一名优秀的驱动工程师!这段代码打开了驱动程序创建的设备,然后发送了一个自定义的 I/O 控制请求。理论知识讲了一堆,现在咱们来写个简单的 C++ 驱动程序,让它在内核里打印一句 "Hello, Kernel!

weixin_41455464的博客 545

利用C++打造网络驱动器映射,值得零基础学c++的开源项目

C++ 网络驱动器映射,好像前有发过类似的程序,每个驱动器映射的写法都不同,每个人都有自己的思路,这一个是书中的例子,可能比较简单了点,在Windows7下可以成功映射,特此与大家分享源码。 源码测试截图: 映射网络驱动器的批处理文件批处理映射网络驱动器开机启动 映射网络驱动器时,每次重启电脑需要映射,让人不厌其烦,后来想到制作一个批处理文件,并设置开机启动,这样就解决...

2975

《拉依达的嵌入式\驱动面试宝典》—C/CPP基础篇(二)

《拉依达的嵌入式\驱动面试宝典》 整合了所有我认为可能遇到的技术面试问题。所有问题及其答案均是我个人学习后查阅资料总结,每个回答都做了仔细的分析,在嵌入式及其驱动面试相关问题解析做到全网独一无二。学习或者转行到嵌入式、驱动开发领域学习的不二之选

拉依达不拉跨的博客 578

《拉依达的嵌入式\驱动面试宝典》—C/CPP基础篇(五)

《拉依达的嵌入式\驱动面试宝典》 整合了所有我认为可能遇到的技术面试问题。所有问题及其答案均是我个人学习后查阅资料总结,每个回答都做了仔细的分析,在嵌入式及其驱动面试相关问题解析做到全网独一无二。学习或者转行到嵌入式、驱动开发领域学习的不二之选

拉依达不拉跨的博客 392

C++开源代码收藏

C++开源代码收藏

Turn X7 714

基于WSK的Windows驱动网络编程入门:cpp-KSOCKET示例

WSK(Winsock Kernel)是Windows系统提供的一套网络编程API,它为内核模式下的网络数据通信提供支持。WSK API提供了一种不同于传统Winsock的网络编程接口,它允许开发者直接在内核模式下进行网络I/O操作,提供更细粒度的控制和高性能网络服务。与传统的Winsock API相比,WSK的优势在于其对内核模式的直接支持,减少了上下文切换的开销,从而提高了网络通信的效率。此外,WSK提供了更严格的性能保证,特别适合于需要高性能和低延迟的网络应用,例如高性能服务器和嵌入式系统。

weixin_42514750的博客 1193
上一篇: WindowBuilder的DES文件加密系统实现
下一篇: 浅析AndroidManfest文件的标签
HansMa
博客等级 码龄12年 24粉丝 49原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值