恋爱的犀牛 发表于 2017-6-1 13:34:36

驱动是如何运行的

<ul class="text" style="margin:0px; padding:0px; list-style:none; font-size:14px; word-wrap:break-word; color:rgb(63,62,60); font-family:'Hiragino Sans GB',微软雅黑,黑体,Arial,sans-serif">

已我所知
1.创建一个服务(通过注册表)
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\XXX
(ps:通过枚举这个表可以得到所有服务 还能知道他们的类型)
其中GROUP与Start决定了驱动加载的早晚
若Start相同 则根据在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\GroupOrderList顺序驱动
GROUP的值就是HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\GroupOrderList下的键名

启动Start
Start:
0==由核心装载器装载 1==由I/O子系统装载 2==自动启动 3==手工启动 4==禁止启动
Start 值分0、1、2、3、4,数值越小就越早启动,SERVICE_BOOT_START(0)是内核刚刚初始化之后,此时加载的都是与系统核心有关的重要的驱动程序,例如磁盘驱动;SERVICE_SYSTEM_START(1)稍晚一些;
SERVICE_AUTO_START(2)是在登录界面出现的时候开始,如果登录较快,很可能驱动还没有加载就登录进去了;
SERVICE_DEMAND_START(3)是在需要的时候动态加载;SERVICE_DISABLED(4)是不加载,要加载之前必须把Start值改为小于4的值。

Type:如下 应用程序一般10(百度),1驱动模块

/*
“DisplayName”,字符串值,对应服务名称;
  “Descrīption”,字符串值,对应服务描述;
  “ImagePath”,字符串值,对应该服务程序所在的路径;
  “ObjectName”,字符串值,值为“LocalSystem”,表示本地登录;
  “ErrorControl”,DWORD值,值为“1”;
  “Start”,DWORD值,值为2表示自动运行,值为3表示手动运行,值为4表示禁止;
  “Type”,DWORD值,应用程序对应10,其他对应20。

类型如下:
#define SERVICE_KERNEL_DRIVER 0×00000001 //内核模块
#define SERVICE_FILE_SYSTEM_DRIVER 0×00000002 //文件系统驱动
#define SERVICE_ADAPTER 0×00000004 //保留
#define SERVICE_RECOGNIZER_DRIVER 0×00000008 //保留

以下来自百度
SERVICE_WIN32_OWN_PROCESS
0×00000010
运行于独立进程的服务程序
SERVICE_WIN32_SHARE_PROCESS
0×00000020
被多个进程共享的服务程序。
若使用了SERVICE_WIN32_OWN_PROCESS 或 SERVICE_WIN32_SHARE_PROCESS且使用LocalSystem帐号来运行该服务程序,则还可以附加使用下面的值:

含义
SERVICE_INTERACTIVE_PROCESS
0×00000100
该服务可以与桌面程序进行交互操作。
*/

2.对象管理器生成驱动对象(DriverObject)并传递给DriverEntry(),执行DriverEntry入口函数
3.创建控制设备对象
4.创建控制设备符号链接(对RING3可见)
5.如果是过滤驱动,创建过滤设备对象,绑定
5.注册分发函数
6其它初始化动作
页: [1]
查看完整版本: 驱动是如何运行的