新建一个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驱动开发 - 设备对象初步学习相关推荐

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

    1.为什么要写这篇文章? 最近浏览招聘网站看到关于windows驱动开发的岗位,前几天一个C++客户端工作岗位,猎头也问我是否有了解windows内核. 所以,调研了一下C++的开发方向:window ...

  2. 《Windows驱动开发技术详解》学习笔记

    Abstract   如果推荐 Windows 驱动开发的入门书,我强烈推荐<Windows驱动开发技术详解>.但是由于成书的时间较早,该书中提到的很多工具和环境都已不可用或找不到,而本文 ...

  3. Windows驱动开发学习笔记(四)—— 3环与0环通信(常规方式)

    Windows驱动开发学习笔记(四)-- 3环与0环通信(常规方式) 设备对象 创建设备对象 设置数据交互方式 创建符号链接 IRP与派遣函数 IRP的类型 其它类型的IRP 派遣函数 派遣函数注册位 ...

  4. Windows驱动开发学习笔记(三)—— 内核空间内核模块

    Windows驱动开发学习笔记(三)-- 内核空间&内核模块 内核空间 实验 第一步:编译如下代码 第二步:将 .sys 文件拷贝到虚拟机中 第三步:部署 .sys 文件并运行 第四步:创建一 ...

  5. windows驱动开发学习

    序言]  很多人都对驱动开发有兴趣,但往往找不到正确的学习方式.当然这跟驱动开发的本土化资 料少有关系.大多学的驱动开发资料都以英文为主,这样让很多驱动初学者很头疼.本人从 事驱动开发时间不长也不短, ...

  6. Windows驱动开发学习笔记(七)—— 多核同步内核重载

    Windows驱动开发学习笔记(七)-- 多核同步 基础知识 并发与同步 分析 InterlockedIncrement 原子操作相关API 内核文件 多核同步 临界区 示例一:错误的临界区 示例二: ...

  7. Windows驱动开发学习笔记(六)—— Inline HOOK

    Windows驱动开发学习笔记(六)-- Inline HOOK SSDT HOOK Inline Hook 挂钩 执行流程 脱钩 实验一:3环 Inline Hook 实验二:0环 Inline H ...

  8. Windows驱动开发学习笔记(五)—— SSDT HOOK

    Windows驱动开发学习笔记(五)-- SSDT HOOK 系统服务表 系统服务描述符表 实验一:通过代码获取SSDT表地址 通过页表基址修改页属性 方法1:修改页属性 方法2:修改CR0寄存器 实 ...

  9. Windows驱动开发学习笔记(二)—— 驱动调试内核编程基础

    Windows驱动开发学习笔记(二)-- 驱动调试&内核编程基础 基础知识 驱动调试 PDB(Program Debug Database) WinDbg 加载 PDB 实验:调试 .sys ...

最新文章

  1. 【组队学习】【33期】3. 李宏毅机器学习(含深度学习)
  2. 最好用的嵌入式网络C库、Lua库
  3. windows篇-第四章 安装和配置Windows域
  4. Spring学习总结(6)——Spring之核心容器bean
  5. Redefine:Change in the Changing World
  6. 【bzoj2844 albus就是要第一个出场】
  7. PCB第二节知识整理
  8. linux下截取安卓手机屏幕,截取屏幕截图
  9. viewpager 跳转到指定页面
  10. Js获取当前日期时间及其它操作(转)
  11. Java多线程学习二十五:阻塞和非阻塞队列的并发安全原理||如何选择适合自己的阻塞队列?
  12. 学习Python的好去处,微信公众号“Python小屋”
  13. 吴恩达机器学习 11.聚类
  14. node.js中实现同步操作的3种实现方法
  15. 一种用于茶叶病害识别的低阶学习方法
  16. .Net MVC框架 + WCF 搭建 集群开发
  17. 直接通过服务器文件相对路径实现文件下载
  18. JSON格式错误报JSON parse error:
  19. jclasslib的使用
  20. 立创 EDA #学习笔记10# | 常用连接器元器件识别 和 蜂鸣器驱动电路

热门文章

  1. Leetcode 98. 验证二叉搜索树 解题思路及C++实现
  2. oracle rac重建grid,oracle 11g rac安装之grid报错解决
  3. angular 控件css_Angular 4 设置组件样式的几种方式
  4. Python 技术篇-全局与当前socket超时连接时间设置方法实例演示,查看socket超时连接时间
  5. Windows系统高质量Gif录制工具推荐:LICEcap录屏软件,非常小巧好用,只有200k
  6. C# 学习笔记(9)线程
  7. 访问Mat中每个像素的值
  8. 【MPI程序】向量乘法,向量点积(高性能计算)
  9. 某些列满足某些条件就被改是什么值,不满足就被改为另外的一些值(python pandas)
  10. 第七篇T语言实例开发,文本与程序的几种打开方法(版5.3)