/*
1.基本的驱动数据结构 //驱动对象结构体
typedef struct _DRIVER_OBJECT {
CSHORT Type; //结构类型
CSHORT Size; //结构大小
PDEVICE_OBJECT DeviceObject; //驱动设备对象
PDRIVER_EXTENSION DriverExtension; //驱动扩展指针
UNICODE_STRING DriverName; //驱动程序的名字
PDRIVER_UNLOAD DriverUnload; //驱动的卸载函数
PDRIVER_DISPATCH MajorFunction[IRP_MJ_MAXIMUM_FUNCTION + 1]; //普通的分发函数
...... //其他的成员没有列出
} DRIVER_OBJECT; //定义驱动对象指针
typedef struct _DRIVER_OBJECT *PDRIVER_OBJECT; //************************************************************************************************************ //设备对象结构体
typedef struct _DEVICE_OBJECT {
CSHORT Type;//结构类型
USHORT Size;//结构大小
LONG ReferenceCount; //引用计数
struct _DRIVER_OBJECT *DriverObject; //这个设备所属对象
struct _DEVICE_OBJECT *NextDevice; //指向下一个设备。
//在一个驱动对象中有N个设备,这些设备通过这个指针链接起来作为一个单向链表
ULONG Flags;
struct _DEVOBJ_EXTENSION *DeviceObjectExtension; //设备扩展结构
...... //其他的成员没有列出
} DEVICE_OBJECT; //定义设备对象指针
typedef struct _DEVICE_OBJECT *P_DEVICE_OBJECT; //============================================================================================================ 2.驱动编程基本函数介绍: //Unicode字符串的初始化
VOID RtlInitUnicodeString(
OUT PUNICODE_STRING DestinationString,
IN PCWSTR SourceString) DestinationString 需要初始化的指针PUNICODE_STRING
SourceString 指向一个以空结尾的Unicode字符串常量,用这个字符串来初始化DestinationString。 例子
PUNICODE_STRING s;
RtlInitUnicodeString(s, L"宽字符"); //s=L"宽字符"; //************************************************************************************************************ //IoCreateDevice为驱动创建一个设备对象
NTSTATUS IoCreateDevice(
IN PDRIVER_OBJECT DriverObject,
IN ULONG DeviceExtensionSize,
IN PUNICODE_STRING DeviceName OPTIONAL,
IN DEVICE_TYPE DeviceType,
IN ULONG DeviceCharacteristics,
IN BOOLEAN Exclusive,
OUT PDEVICE_OBJECT *DeviceObject) //指针的指针
参数:
DriverObject 为指向驱动对象的指针。
DeviceExtensionSize 给_DEVICE_OBJECT.DeviceExtension指定内存空间大小,具体看定义的设备扩展结构的大小
DeviceName 设备名字,如:\\Device\\GetGDT0
DeviceType 设备类型,这里我们用 FILE_DEVICE_UNKNOWN
DeviceCharacteristics 设备特征信息 一般为0
Exclusive 是否指定设备为独占 是为TRUE,否为FALSE
DeviceObject 指针变量接收一个指向新创建的DEVICE_OBJECT结构。用来回传数据 返回值解释:
调用成功会返回 STATUS_SUCCESS
如果出错会返回下列值
STATUS_INSUFFICIENT_RESOURCES //资源不足
STATUS_OBJECT_NAME_EXISTS //指定对象名存在
STATUS_OBJECT_NAME_COLLISION //对象名有冲突 //************************************************************************************************************ //IoCreateSymbolicLink创建一个设备链接符。
//驱动程序虽然有了设备名称,但是这种设备名称只能在内核态可见,而对于应用程序是不可见的,
//因此,驱动程序需要暴露一个符号链接,该链接指向真正的设备名称(不是必须的)
//只是让Ring3环应用程序连接驱动程序更容易 NTSTATUS IoCreateSymbolicLink(
IN PUNICODE_STRING SymbolicLinkName,
IN PUNICODE_STRING DeviceName);
参数:
SymbolicLinkName Unicode字符串指针,是一个用户态可见的名称。如:\\DosDevices\\GetGDT0 或者 \\??\\GetGDT0
DeviceName Unicode字符串指针,是驱动程序创建的设备对象名称。如:\\Device\\GetGDT0 返回值解释:
如果符号链接创建成功 返回STATUS_SUCCESS //************************************************************************************************************ VOID IoDeleteDevice(
IN PDEVICE_OBJECT DeviceObject) 参数
DeviceObject PDEVICE_OBJECT类型的设备对象指针,指向需要删除的设备对象 //============================================================================================================ 3.编写简单的驱动程序Demo 创建设备的步骤:
1用RtlInitUnicodeString初如化设备名称指针
2用IoCreateDevice创建设备,如果不成功则返回
3用IoCreateSymlicLink创建符号链接,创建成功返回 STATUS_SUCCESS;创建不成功则调用 IoDeleteDevice删除设备; 简单的代码示例: //代码片段--使用C语言 #define INITCODE code_seg("INIT") //初始化时载入内存,然后可以从内存中卸掉 #pragma INITCODE
NTSTATUS CreateMyDevice (IN PDRIVER_OBJECT pDriverObject)
{
NTSTATUS status; //用来返回创建设备
PDEVICE_OBJECT pDevObj; //创建设备名称
UNICODE_STRING devName;
UNICODE_STRING symLinkName; //对devName初始化字串为 "\\Device\\XX_Device"
RtlInitUnicodeString(&devName,L"\\Device\\XX_Device"); //创建设备对象
status = IoCreateDevice(pDriverObject,\
0,\
&devName,\
FILE_DEVICE_UNKNOWN,\
0, TRUE,\
&pDevObj);
if (!NT_SUCCESS(status))
return status; //设置缓冲区通信方式
pDevObj->Flags |= DO_BUFFERED_IO; //创建符号链接
RtlInitUnicodeString(&symLinkName,L"\\??\\XX_Device");
status = IoCreateSymbolicLink( &symLinkName,&devName );
if (!NT_SUCCESS(status))
{
IoDeleteDevice( pDevObj );
return status;
} return STATUS_SUCCESS;
} //参考资料:
//郁金香老师讲课资料整理 */

windows内核编程基础知识的更多相关文章

  1. Windows网络编程基础知识

    1.WinSock的初始化 #include<iostream> #include<WinSock2.h> #include<MSWSock.h> #pragma ...

  2. (转)Windows驱动编程基础教程

    版权声明     本书是免费电子书. 作者保留一切权利.但在保证本书完整性(包括版权声明.前言.正文内容.后记.以及作者的信息),并不增删.改变其中任何文字内容的前提下,欢迎任何读者 以任何形式(包括 ...

  3. TCP与UDP比较 以及并发编程基础知识

    一.tcp比udp真正可靠地原因 1.为什么tcp比udp传输可靠地原因: 我们知道在传输数据的时候,数据是先存在操作系统的缓存中,然后发送给客户端,在客户端也是要经过客户端的操作系统的,因为这个过程 ...

  4. 16第一章 ASP.Net编程基础知识

    第一章        ASP.Net编程基础知识 第一章        ASP.Net编程基础知识 本章首先介绍用ASP.Net技术编制服务器端动态网页所需的网络和HTML标记语言方面的有关知识.然后 ...

  5. SHELL脚本编程基础知识

    SHELL脚本编程基础知识 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. Linux之父Linus有一句话很经典:"Talk is cheap, show me the ...

  6. C#网络编程基础知识

    C#网络编程基础知识一 1.IPAddress类 用于表示一个IP地址.IPAddress默认构造函数 public IPAddress(long address);一般不用 其中Parse()方法最 ...

  7. Jquery真的不难~第一回 编程基础知识

    Jquery真的不难~第一回 编程基础知识   回到目录 前言 说Jquery之前,先来学习一下Javascript(以后简称为JS)语言中的基础知识问题,其时对于每种编程语言来说基础知识都是大同小异 ...

  8. windows内核编程之常用数据结构

    1.返回状态 绝大部分的内核api返回值都是一个返回状态,也就是一个错误代码.这个类型为NTSTATUS.我们自己写的函数也大部分这样做. NTSTATUS MyFunction() { NTSTAT ...

  9. 1.unix网络编程基础知识

    接触网络编程一年多了,最近在系统的学习vnp两本书,对基础知识做一些总结,希望理解的更透彻清晰,希望能有更多的沉淀. 1.套接口地址 针对IPv4和IPv6地址族,分别定义了两种类型的套接口地址:so ...

随机推荐

  1. 鸿蒙的js开发部模式18:鸿蒙的文件上传到python服务器端

    1.首先鸿蒙的js文件上传,设置目录路径为: 构建路径在工程主目录下: 该目录的说明见下面描述: 视图构建如下: 界面代码: <div class="container"&g ...

  2. TransactionScope 事务

    一.TransactionScope是.Net Framework 2.0之后,新增了一个名称空间.它的用途是为数据库访问提供了一个"轻量级"[区别于:SqlTransaction ...

  3. JavaScript数组的几个常用的API

    一. 扁平化嵌套数组/展平和阵列孔--flat() 1.实现效果 var arr1 = [1, 2, [3, 4]]; arr1.flat(); // [1, 2, 3, 4] var arr2 = ...

  4. js 获取树结构的节点深度

    需求:获取树结构的节点深度. 实现util.js: // 获取节点深度 参数为树结构array function getMaxFloor(treeData){ let deep = 0; functi ...

  5. 将表单数据转换成json字符串

    $("#theForm").serialize(); 可以获取表单的数据,但是是json字符串 需要转换成json才能正常使用

  6. BZOJ_1503 [NOI2004]郁闷的出纳员 【Splay树】

    一 题面 [NOI2004]郁闷的出纳员 二 分析 模板题. 对于全部员工的涨工资和跌工资,可以设一个变量存储起来,然后在进行删除时,利用伸展树能把结点旋转到根的特性,能够很方便的删除那些不符合值的点 ...

  7. python多线程参考文章

    1. https://www.jianshu.com/p/c93e630d8089 2.https://www.runoob.com/python/python-multithreading.html ...

  8. Django之缓存、信号和图片验证码、ORM性能

    一. 缓存 1. 介绍 缓存通俗来说:就是把数据先保存在某个地方,下次再读取的时候不用再去原位置读取,让访问速度更快. 缓存机制图解 2.Django中提供了6种缓存方式 1. 开发调试 2. 内存 ...

  9. Mybatis底层源码执行流程

    1.通过类加载器,加载了config.xml文件 2.通过SqlSessionFactoryBuilder.build(resource)这个方法进行了config.xml的解析,解析为Configu ...

  10. 巧用 SVG 滤镜还能制作表情包?

    本文将介绍一些使用 SVG feTurbulence 滤镜实现的一些有趣.大胆的的动效. 系列另外两篇: 有意思!强大的 SVG 滤镜 有意思!不规则边框的生成方案 背景 今天在群里面聊天,看到有人发 ...