新建一个c文件;myhellostr.c;

#include <ntddk.h>VOID DriverUnload(PDRIVER_OBJECT driver)
{DbgPrint("goodbye");
}// DriverEntry,入口函数。相当于main。
NTSTATUS DriverEntry(PDRIVER_OBJECT driver, PUNICODE_STRING reg_path)
{UNICODE_STRING      str1;(void) RtlInitUnicodeString( &str1, L"my test str AAAA");//DbgPrint(str1);DbgPrint("%ws", str1.Buffer);// 设置一个卸载函数便于这个函数能退出。driver->DriverUnload = DriverUnload;return STATUS_SUCCESS;
}

sources和makefile文件见前文;

先来学习驱动程序入口点和驱动对象;

DriverEntry是驱动程序的入口函数;返回值是NTSTATUS类型;

每个驱动程序会有唯一的驱动对象与之对应,并且这个驱动对象是在驱动加载的时候,被内核中的对象管理程序所创建的,内核对一个驱动只加载一个实例,是由内核中的I/O管理器负责加载的,驱动程序需要在DriverEntry中初始化该驱动对象。

_DRIVER_OBJECT结构体 (来自msdn)
typedef struct _DRIVER_OBJECT {
    CSHORT Type;
    CSHORT Size;
    PDEVICE_OBJECT DeviceObject;//设备对象
   ULONG Flags;
    PVOID DriverStart;
    ULONG DriverSize;
    PVOID DriverSection;
    PDRIVER_EXTENSION DriverExtension;
    UNICODE_STRING DriverName;
    PUNICODE_STRING HardwareDatabase;
    PFAST_IO_DISPATCH FastIoDispatch;
    PDRIVER_INITIALIZE DriverInit;
    PDRIVER_STARTIO DriverStartIo;
    PDRIVER_UNLOAD DriverUnload;
    PDRIVER_DISPATCH MajorFunction[IRP_MJ_MAXIMUM_FUNCTION + 1];

} DRIVER_OBJECT;
typedef struct _DRIVER_OBJECT *PDRIVER_OBJECT;

这个是由系统传给你的驱动程序的;在代码里写 driver->xxx ,就能访问到驱动对象的成员;

部分成员的含义;
PDEVICE_OBJECT DeviceObject
       指向一个由驱动创建的设备对象,当驱动程序调用IoCreateDevice成功时,该成员会自动更新。

PDRIVER_EXTENSION DriverExtension
    驱动扩展对象指针,该对象唯一能访问的成员是DriverExtension-> AddDevice,对应的是驱动DriverEntry例程中的AddDevice例程。

PUNICODE_STRING HardwareDatabase
       指向\Registry\Machine\Hardware,该路径指向的是注册表中包含该硬件的配置信息。

PFAST_IO_DISPATCH FastIoDispatch
       指向快速I/O入口地址,该成员之用于FSD(文件系统驱动)已经网络传输驱动。

PDRIVER_INITIALIZE DriverInit
       DriverEntry例程的入口点,由I\O管理器设置。

PDRIVER_STARTIO DriverStarIo
       驱动程序中StartIo例程的入口地址(如果有的话),当驱动初始化时,DriverEntry例程负责设置它,如果驱动程序没有StartIo,该成员为NULL。

PDRIVER_UNLOAD DriverUnload
       驱动程序中Unload例程的入口地址(如果有的话),当驱动初始化时,DriverEntry例程负责设置它,如果驱动程序没有StartIo,该成员为NULL。

RtlInitUnicodeString(),在内核中初始化一个unicode字符串;

来构建一下;如果DbgPrint如第一句,则出错如下;

//DbgPrint(str1);
    DbgPrint("%ws", str1.Buffer);

使用第二种写法就对了;

驱动对象结构体详情见;
https://docs.microsoft.com/zh-cn/windows-hardware/drivers/ddi/wdm/ns-wdm-_driver_object

加载驱动,捕捉内核打印字符串见;
https://blog.csdn.net/bcbobo21cn/article/details/112212728
空闲再做加载驱动和调试;

Windows驱动开发-_驱动对象学习和内核处理字符串初步相关推荐

  1. Linux下驱动开发_块设备驱动开发(硬件上采用SD卡+SPI协议)

    一.前言 块设备主要为存储设备设计的框架. 在前面章节Linux下驱动开发_块设备驱动开发(内存模拟存储) 里介绍了块设备驱动编写思路,并且利用内存模拟了硬件存储,完成了块设备驱动开发测试.这一篇文章 ...

  2. Linux驱动开发必看详解神秘内核(完全转载)

    Linux驱动开发必看详解神秘内核 完全转载-链接:http://blog.chinaunix.net/uid-21356596-id-1827434.html IT168 技术文档]在开始步入Lin ...

  3. STM32MP157驱动开发——SPI驱动

    STM32MP157驱动开发--SPI驱动 一.简介 1.SPI介绍 2.STM32MP1 SPI介绍 3. ICM-20608 简介 4.Linux下的SPI框架 二.驱动开发 1)IO 的 pin ...

  4. Linux驱动开发 -- touch驱动注册

    Linux i2c驱动开发 – touch 驱动 文章目录 Linux i2c驱动开发 -- touch 驱动 前言 一.i2c 驱动框架 二.Linux的MODULE声明 1. MODULE相关声明 ...

  5. Linux驱动开发——串口设备驱动

    Linux驱动开发--串口设备驱动 一.串口简介 串口全称叫做串行接口,通常也叫做 COM 接口,串行接口指的是数据一个一个的顺序传输,通信线路简单.使用两条线即可实现双向通信,一条用于发送,一条用于 ...

  6. Linux嵌入式驱动开发02——驱动编译到内核

    文章目录 全系列传送门 make menuconfig图形化配置界面 1. 怎么进入到make menuconfig图形化界面? 2. make menuconfig图形化界面的操作 3. 退出 4. ...

  7. Linux驱动开发_设备文件系统详解

    目录 何为设备管理器? Linux下dev的作用 Devfs sysfs kobject udev proc 何为设备管理器? 设备管理器就是负责管理这台电脑上的外设,当我们通过电脑提供的USB口插入 ...

  8. windows 驱动开发入门——驱动中的数据结构

    最近在学习驱动编程方面的内容,在这将自己的一些心得分享出来,供大家参考,与大家共同进步,本人学习驱动主要是通过两本书--<独钓寒江 windows安全编程> 和 <windows驱动 ...

  9. 《Linux设备驱动开发详解》学习笔记一

    Linux设备驱动开发详解学习笔记<一> 书名:<Linux设备驱动开发详解>第二版 主机环境:Linux version 2.6.25-14.fc9.i686@Fedora ...

最新文章

  1. OpenAI透露GPT-4动向:文本与视觉融合,人类反馈+强化学习解决安全问题 | AI日报...
  2. 分布式锁的实现方式——ACID数据库、缓存或者是zk
  3. 创建Python虚拟环境——下
  4. [JZOJ5836] Sequence
  5. python语言的单行注释以井号开头_【学习】Python语言入门
  6. 稳定性测试怎么测_心理测试:选择你喜爱的一种食物,测你2020年的运势怎么样...
  7. Intel® Nehalem/Westmere架构/微架构/流水线 (4) - 执行引擎
  8. hadoop---(1)hadoop核心知识点总结
  9. Gsonformat
  10. 【VulnHub靶场】——HARRYPOTTER第三部: FAWKES
  11. Android Ui卡断的原因分析及常见的解决方式
  12. 大于2TB的卷的知识.主要关于windows, EFI,GPT
  13. 图机器学习——5.9 图神经网络:图的增广
  14. IIC总线协议---以存储芯片at24c64为例
  15. 英语电影观后感之角斗士
  16. Javascript实现表单检验(如注册界面)
  17. HM编码器代码阅读(20)——与变换量化有关的其他知识
  18. php 获取 知乎,php - 如何获取知乎日报里的图片?
  19. 1G→2G→3G→4G→5G:一部波澜壮阔的移动通信史
  20. eth 创建钱包,转账 web3j

热门文章

  1. 多线程高并发 底层锁机制与优化的最佳实践——各种锁的分类 || synchronized 关键字 倒底锁的是什么东西?|| CAS与ABA问题||锁优化||轻量级锁一定比重量级锁的性能高吗
  2. Java静态变量与静态方法与成员变量成员方法的区别
  3. 白盒测试工具 - sonar的安装、配置与使用入门手册,用sonar检查代码质量实战演示
  4. Java 技术篇 - java同时连接多种数据库执行sql语句的兼容性验证,数据库类型包括:oracle、sqlserver、DB2、人大金仓、达梦、PG、瀚高、polardb
  5. Windows 技术篇 - 无需确认快速删除包含大量文件的目录,cmd删除文件的rmdir、del、erase和rd四种命令使用方法
  6. Windows 技术篇-设置电脑启用或禁用开机按Ctrl+Alt+Del解除锁定
  7. Python+selenium 自动化-获取当前页面的url地址,打开指定的url地址
  8. Python 库安装问题-用pip安装pyHook3报错的两种常见问题和解决方法
  9. Python+selenium 自动化-chrome驱动的下载安装
  10. 已知两个信号的协方差矩阵,如何生成这两个信号