Windows驱动开发 - 设备对象初步学习
新建一个myhellodevice.c;
代码如下;makefile和sources如前文;
#include <ntddk.h>#define NTDEVICE_NAME_STRING L"\\Device\\MytestDevice"typedef struct _DEVICE_EXTENSION {PDEVICE_OBJECT Self;LIST_ENTRY EventQueueHead; // where all the user notification requests are queuedKSPIN_LOCK QueueLock;
} DEVICE_EXTENSION, *PDEVICE_EXTENSION;VOID DriverUnload(PDRIVER_OBJECT driver)
{DbgPrint("goodbye");
}// DriverEntry,入口函数。相当于main。
NTSTATUS DriverEntry(PDRIVER_OBJECT driver, PUNICODE_STRING reg_path)
{PDEVICE_OBJECT deviceObject;UNICODE_STRING ntDeviceName;UNICODE_STRING str1;NTSTATUS status;(void) RtlInitUnicodeString( &str1, L"my test str AAAA");//DbgPrint(str1);DbgPrint("%ws", str1.Buffer);//创建设备对象RtlInitUnicodeString(&ntDeviceName, NTDEVICE_NAME_STRING);status = IoCreateDevice(driver, // DriverObjectsizeof(DEVICE_EXTENSION), // DeviceExtensionSize&ntDeviceName, // DeviceNameFILE_DEVICE_UNKNOWN, // DeviceTypeFILE_DEVICE_SECURE_OPEN, // DeviceCharacteristicsFALSE, // Not Exclusive&deviceObject // DeviceObject);if (!NT_SUCCESS(status)) {DbgPrint(("\tIoCreateDevice returned 0x%x\n", status));return(status);}// 设置一个卸载函数便于这个函数能退出。driver->DriverUnload = DriverUnload;return STATUS_SUCCESS;
}
驱动开发首先要了解的基本概念是驱动对象;然后就是设备对象;
DEVICE_OBJECT结构体是操作系统用来表示某个具体的设备对象,一个设备对象是一个逻辑上的,或者虚拟的,或者物理上的设备的具体抽象,驱动通过设备对象来处理I/O请求;
备对象用于保存设备特征和状态的相关信息。设备对象的I/O请求由一个驱动对象操控着。每一个内核模式的驱动必须创建设备对象,它通过调用IoCreateDevice函数一次或多次来创建。
设备对象用结构体DEVICE_OBJECT表示。每个设备对象有一个指针(NextDevice)指向下一个设备对象,从而形成一个设备对象链表。
在NT式驱动中创建设备对象是由IoCreateDevice内核函数完成的;
NTSTATUS IoCreateDevice{
IN PDRIVER_OBJECT DriverObject,
IN ULONG DeviceExtensionSize,
IN PUNICODE_STRING DeviceName OPTIONAL,
IN DEVICE_TYPE DeviceType,
IN ULONG DeviceCharateristics,
OUT PDEVICE_OBJECT* DeviceObject
};
参数;
DriverObject:输入参数,每个驱动程序中,会有唯一的驱动对象与之对应
IoCreateDevice函数的第一个参数是本驱动的驱动对象;
DeviceExtensionSize:
输入参数,设备扩展的大小,
I/O管理器会根据这个大小,在内存中创建设备扩展,并与驱动对象关联;
DeviceName:
输入参数,设备对象的名字
DeviceCharacteristics:
输入参数,设置设备对象的特征
Exclusive:
输入参数,设置设备对象是否为内核模式下使用,一般为TRUE;
DeviceObject:
输入参数,I/O管理器负责创建这个设备对象,并返回设备对象的地址;
返回值:返回此函数的调用状态;
设备名称用UNICODE字符串指定,并且字符串必须是"\Device\[设备名]"的形式;
在windows下,所有设备都是以类似名字命名的;
例如C盘、D盘、E盘,以如下方式命名
"\Device\HarddiskVolume1" "\Device\HarddiskVolume2" "\Device\HarddiskVolume3"
也可以不指定不指定设备名字,如果是这样,
I/O管理器会自动分配一个数字作为设备的设备名,
例如"\Device\00000001" "\Device\00000002" "\Device\00000003"
若指定了设备名,只能被内核模式下的其他驱动所识别。但是在用户模式下的应用程序无法识别这个设备;
代码先来创建一个设备对象;看build是否成功;空闲再加载和调试;万一挂了,还有其他工作要做;
build成功;也许设备对象创建成功;但要完整运行,应该还有更多设备对象相关的代码;
Windows驱动开发 - 设备对象初步学习相关推荐
- C++开发方向之windows驱动开发
1.为什么要写这篇文章? 最近浏览招聘网站看到关于windows驱动开发的岗位,前几天一个C++客户端工作岗位,猎头也问我是否有了解windows内核. 所以,调研了一下C++的开发方向:window ...
- 《Windows驱动开发技术详解》学习笔记
Abstract 如果推荐 Windows 驱动开发的入门书,我强烈推荐<Windows驱动开发技术详解>.但是由于成书的时间较早,该书中提到的很多工具和环境都已不可用或找不到,而本文 ...
- Windows驱动开发学习笔记(四)—— 3环与0环通信(常规方式)
Windows驱动开发学习笔记(四)-- 3环与0环通信(常规方式) 设备对象 创建设备对象 设置数据交互方式 创建符号链接 IRP与派遣函数 IRP的类型 其它类型的IRP 派遣函数 派遣函数注册位 ...
- Windows驱动开发学习笔记(三)—— 内核空间内核模块
Windows驱动开发学习笔记(三)-- 内核空间&内核模块 内核空间 实验 第一步:编译如下代码 第二步:将 .sys 文件拷贝到虚拟机中 第三步:部署 .sys 文件并运行 第四步:创建一 ...
- windows驱动开发学习
序言] 很多人都对驱动开发有兴趣,但往往找不到正确的学习方式.当然这跟驱动开发的本土化资 料少有关系.大多学的驱动开发资料都以英文为主,这样让很多驱动初学者很头疼.本人从 事驱动开发时间不长也不短, ...
- Windows驱动开发学习笔记(七)—— 多核同步内核重载
Windows驱动开发学习笔记(七)-- 多核同步 基础知识 并发与同步 分析 InterlockedIncrement 原子操作相关API 内核文件 多核同步 临界区 示例一:错误的临界区 示例二: ...
- Windows驱动开发学习笔记(六)—— Inline HOOK
Windows驱动开发学习笔记(六)-- Inline HOOK SSDT HOOK Inline Hook 挂钩 执行流程 脱钩 实验一:3环 Inline Hook 实验二:0环 Inline H ...
- Windows驱动开发学习笔记(五)—— SSDT HOOK
Windows驱动开发学习笔记(五)-- SSDT HOOK 系统服务表 系统服务描述符表 实验一:通过代码获取SSDT表地址 通过页表基址修改页属性 方法1:修改页属性 方法2:修改CR0寄存器 实 ...
- Windows驱动开发学习笔记(二)—— 驱动调试内核编程基础
Windows驱动开发学习笔记(二)-- 驱动调试&内核编程基础 基础知识 驱动调试 PDB(Program Debug Database) WinDbg 加载 PDB 实验:调试 .sys ...
最新文章
- 【组队学习】【33期】3. 李宏毅机器学习(含深度学习)
- 最好用的嵌入式网络C库、Lua库
- windows篇-第四章 安装和配置Windows域
- Spring学习总结(6)——Spring之核心容器bean
- Redefine:Change in the Changing World
- 【bzoj2844 albus就是要第一个出场】
- PCB第二节知识整理
- linux下截取安卓手机屏幕,截取屏幕截图
- viewpager 跳转到指定页面
- Js获取当前日期时间及其它操作(转)
- Java多线程学习二十五:阻塞和非阻塞队列的并发安全原理||如何选择适合自己的阻塞队列?
- 学习Python的好去处,微信公众号“Python小屋”
- 吴恩达机器学习 11.聚类
- node.js中实现同步操作的3种实现方法
- 一种用于茶叶病害识别的低阶学习方法
- .Net MVC框架 + WCF 搭建 集群开发
- 直接通过服务器文件相对路径实现文件下载
- JSON格式错误报JSON parse error:
- jclasslib的使用
- 立创 EDA #学习笔记10# | 常用连接器元器件识别 和 蜂鸣器驱动电路
热门文章
- Leetcode 98. 验证二叉搜索树 解题思路及C++实现
- oracle rac重建grid,oracle 11g rac安装之grid报错解决
- angular 控件css_Angular 4 设置组件样式的几种方式
- Python 技术篇-全局与当前socket超时连接时间设置方法实例演示,查看socket超时连接时间
- Windows系统高质量Gif录制工具推荐:LICEcap录屏软件,非常小巧好用,只有200k
- C# 学习笔记(9)线程
- 访问Mat中每个像素的值
- 【MPI程序】向量乘法,向量点积(高性能计算)
- 某些列满足某些条件就被改是什么值,不满足就被改为另外的一些值(python pandas)
- 第七篇T语言实例开发,文本与程序的几种打开方法(版5.3)