内核线程

在驱动中生成的线程一般是系统线程。系统线程所在的进程名为“System”。

NTSTATUS

PsCreateSystemThread(

OUT PHANDLE ThreadHandle,

IN ULONG DesiredAccess,

IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,

IN HANDLE ProcessHandle OPTIONAL,

OUT PCLIENT_ID ClientId OPTIONAL,

IN PKSTART_ROUTINE StartRoutine,

IN PVOID StartContext);

线程的结束应该在线程中自己调用PsTerminateSystemThread来完成。此外得到的句柄也必须要用ZwClose来关闭。关闭句柄并不结束线程。

睡眠

#define DELAY_ONE_MICROSECOND (-10)

#define DELAY_ONE_MILLISECOND (DELAY_ONE_MICROSECOND*1000)

VOID MySleep(LONG msec)

{

LARGE_INTEGER my_interval;

my_interval.QuadPart = DELAY_ONE_MILLISECOND;

my_interval.QuadPart *= msec;

KeDelayExecutionThread(KernelMode,0,&my_interval);

}

内核中的事件是一个数据结构。这个结构的指针可以当作一个参数传入一个等待函数中。如果这个事件不被“设置”,则这个等待函数不会返回,这个线程被阻塞。如果这个事件被“设置”,则等待结束,可以继续下去。

事件不需要销毁。

可以发现,关于事件的操作这一部分(如事件的重设,同步等),其原理和MFC中是很类似的,只是MFC中封封装了更好处理的API函数而已。

实际上等待线程结束并不一定要用事件。线程本身也可以当作一个事件来等待。

驱动与设备和请求处理

#include <ntddk.h>

NTSTATUS

DriverEntry (

IN PDRIVER_OBJECT DriverObject,

IN PUNICODE_STRING RegistryPath

)

{

NTSTATUS status = STATUS_UNSUCCESSFUL;

return status;

}

函数DriverEntry是每个驱动程序中必须的。如同Win32应用程序里的WinMain。DriverEntry的第一个参数就是一个 DRIVER_OBJECT的指针。这个DRIVER_OBJECT结构就对应当前编写的驱动程序。其内存是Windows系统已经分配的。

第二个参数RegistryPath是一个字符串。代表一个注册表子键。这个子键是专门分配给这个驱动程序使用的。用于保存驱动配置信息到注册表中。

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;

}

}

NTSTATUS MyDispatchFunction(PDEVICE_OBJECT device,PIRP irp)

{

……

}

VOID MyDriverUnload(PDRIVER_OBJECT driver)

{

……

}

这个函数的地址设置到DriverObject->DriverUnload即可。

如果驱动程序要和应用程序之间通信,则应该生成设备。此外还必须为设备生成应用程序可以访问的符号链接。

“\\.\”意味后面是一个符号链接名。 目前生成设备,请总是生成在\Device\目录下。

应用程序为了和驱动通信,首先必须打开设备。然后发送或者接收信息。最后关闭它。这至少需要三个IRP:第一个是打开请求。第二个发送或者接收信息。第三个是关闭请求。

应用层调用的API 驱动层收到的IRP主功能号

CreateFile IRP_MJ_CREATE

CloseHandle IRP_MJ_CLOSE

DeviceIoControl IRP_MJ_DEVICE_CONTROL

ReadFile IRP_MJ_READ

WriteFile IRP_MJ_WRITE

关于上述几项内容的专题论述,请参见相关文档。[5,6]

参考
[1] http://www.cnblogs.com/phinecos/archive/2009/02/19/1393803.html
[2] http://www.cnblogs.com/qsilence/archive/2009/06/11/1501511.html
[3 http://msdn.microsoft.com/en-us/library/ff557565%28VS.85%29.aspx
[4] http://www.cnblogs.com/wanghao111/archive/2009/05/25/1489041.html
[5] Windows驱动编程基础教程.doc
[6] 天书夜读-从汇编语言到windows内核编程(改)
[7] Windows DDK

[8] 天书夜读——从汇编语言到Windows内核编程
http://download.csdn.net/source/2754275
http://msdn.microsoft.com/en-us/library/ff557573%28VS.85%29.aspx

转载于:https://www.cnblogs.com/mydomain/archive/2010/10/13/1850686.html

2、从汇编语言到Windows内核编程笔记(2)相关推荐

  1. 寒江独钓Windows内核编程-双机调试1

    今天总结一下关于双机调试,前面一直使用的是DDK包进行NT式与WDM式驱动入门,至今已进入使用WDK包进行编程了,DDK包早已落后我只作为入门因为大体内容变化不大.我使用的书是<寒江独钓Wind ...

  2. Windows内核编程实现拦截Xuetr程序

    Windows内核编程实现拦截Xuetr程序 ----TTL 寒假的时候,开始学习windows内核编程,想走近windows的内部世界.由于微软对于windows并不开源,所以有些人开始质疑:学习w ...

  3. windows内核开发笔记七:内核开发OVERLAPPED结构体详解

    windows内核开发笔记七:内核开发OVERLAPPED结构体详解 typedef struct _OVERLAPPED {   DWORD Internal;   DWORD InternalHi ...

  4. Windows Socket编程笔记之最简单的小Demo

    Windows Socket编程的大致过程: 服务器端: ----过程-------------对应的API-------  0.初始化         |  WSAStartup()  1.创建So ...

  5. linux内核编程笔记【原创】

    以下为本人学习笔记,如有转载请注明出处,谢谢 1. service用法 oneshot DEFINE_MUTEX(buzzer_mutex); mutex_lock(&buzzer_mutex ...

  6. 【Windows内核编程】Win10/Win11通过PspCidTable取得EProcess

    温馨提示 本文的内容均在Windows 11 Enterprise(22000.466)版本下测试 不同版本的部分内容可能存在差异,但万变不离其中 [Upadate 20220803]经测试,本文内容 ...

  7. 【windows内核编程】vs2013+WDK8.1+winDbg+vmware win7虚拟机联调

    [我的]vs2013+WDK8.1+winDbg+vmwarewin7虚拟机联调 作者:zcr214 时间:2016/4/8 内核驱动开发,首先要配置开发环境,目前微软已经出到了vs2015+WDK1 ...

  8. Windows内核编程(三)-内核驱动运行与调试

    内核驱动运行与调试 驱动的运行 驱动的运行通过服务来实现. 微软规定,驱动文件必须经过微软的数字签名后,才可以运行在64位系统上,如果把没有经过签名的驱动直接放在64位操作系统中运行,结果是驱动加载失 ...

  9. Windows核心编程笔记

    1.在内部,当Windows函数检测到错误时,它会使用一种名为"线程本地存储区"(thread-local storage)的机制将相应的错误代码与"主调线程" ...

最新文章

  1. 【转】android电池(四):电池 电量计(MAX17040)驱动分析篇
  2. R语言ggplot2可视化:可视化所有日期不同时段任务的持续时间、将持续时间绘制成一条线(起始时间到结束时间),y轴表示活动发生的日期,x轴表示以小时为单位的时间、适应时间段跨越多天的情况
  3. 震撼!Science:“第三手指”可增强人体功能
  4. html特殊文字效果,HTML几个特殊的属性标签的使用介绍
  5. php 规格,PHP 设计模式系列之 specification规格模式_PHP
  6. java jaxb注解xmlnull_java – 将空值表示为xml jaxb中的空元素
  7. Python获取电脑CPU序列号、主板序列号、BIOS序列号、硬盘序列号列表、网卡MAC地址
  8. Unity3D-GUI初试
  9. oracle9i的erp数据库无法正常关闭的解决方法。
  10. 汽车自动驾驶产业链深度研究报告:自动驾驶驶向何方
  11. VS自带工具:dumpbin的使用查看Lib,dll等
  12. WIN10手动替换系统文件
  13. Tensorflow实例-CNN处理句子相似度(MPCNN)
  14. 前端中的hack是什么意思?常见的hack技术以及以及hack技术的利弊
  15. Hugo创建个人学术主页
  16. 2021第7届中国大学生程序设计竞赛CCPC广州站, 签到题4题
  17. GPS模块运用: 定位测试软件设计(上位机)
  18. 内网安全之:域与域权限判断
  19. 基于SSM框架的民宿预订系统的设计与实现 毕业设计-附源码281118
  20. 十分钟学会pandas《10 Minutes to pandas》

热门文章

  1. Coding Interview Guide--打印两个有序链表的公共部分
  2. python中time模块常用功能
  3. sun.misc.BASE64Encoder在Eclipse中不能直接使用的原因和解决方案
  4. Oracle.ManagedDataAccess.dll 连接Oracle数据库不需要安装客户端
  5. PHP安装laravel(win+linux)
  6. Java学习笔记:内部类/匿名内部类的全面介绍
  7. 用STL给C++充电:第一部分
  8. .NET3.5中的高性能 Socket API
  9. Android开发四年以来的工作难点总结
  10. 第十、十一周项目一-点-圆-圆柱类族的设计(2)