驱动笔记115

REMARK

wdk7用于vs2010
wdk8用于vs2012
wdk8.1用于vs2013
装了低版本的,没法整合高版本到vs的了。还有最好自己去vs默认的地方下载,免得手动下载出错

函数

OBJ_CASE_INSENSITIVE不区分大小写,进行字符比对寻找驱动

ObDereferenceObeject减少对读取到的引用计数,一般是Reference函数,都要减少。
IoGetDeviceObjectPointer查阅msdn发现也要用它来减少,以后对设备的打开都要用它来进行减少。 只有减少到0才能被系统所卸载销毁。

DO_POWER_PAGABLE:如果IRP_MJ_POWER请求的派遣函数必须运行在PASSIVE_LEVEL级别,你需要设置DO_POWER_PAGABLE标志。该标志的名称含有相关的含义,因为只有在PASSIVE_LEVEL级上才允许分页操作。如果你把该标志设置为0,则电源管理器可以在DISPATCH_LEVEL级上向你发送电源管理请求
(更多关于设备对象的type可以去看张帆89上面的)

IoCreateDevice
设备对象名:字符串必须是”\Device[设备名]”(UNICODE)
如:C盘(\Device\HarddiskVolume1)D盘(\Device\HarddiskVolume2)。如果不指定名字,会默认给一个数字来当做名。然而“c:,d:”这一类的是符号链接字符。

这个函数的倒数第二个参数,表示产生的对象是用于内核模式还是用户模式。在内核模式下,符号链接是以”\??\”(或者\DosDevices)开头。在用户模式下,是以”\.\”开头
注意,再看下它第二个参数。大小是扩展项的大小,不然后面强制转换扩展项会越界,并发生泄漏。

DO_DIRECT_IO和DO_BUFFERED_IO 自己去保存页看吧。。

inf

看下inf结构:

Version Section
SourceDisksNames Section
SourceDisksFiles Section
ClassInstall32 Section(可选)
ClassInstall32.Services Section(可选)
DestinationDirs Section
ControlFlags Section
Manufacturer Section
    Models Section (per Manufacturer entry)
        DDInstall Section (per Models entry)
        DDInstall.Services Section
        DDInstall.HW Section
        DDInstall.CoInstallers Section
        DDInstall.FactDef Section
        DDInstall.LogConfigOverride Section
        DDInstall.Interfaces Section
InterfaceInstall32 Section
DefaultInstall Section
DefaultInstall.Services Section
Strings Section

DestinationDirs安装目录(用代号表示)

SourceDisksNames 源文件目录。如果忽略,就会从inf文件目录找。可以设置为inf相对目录或者绝对目录。

class这个字段会在指定的设备名添加

ClassInstall当加载自定义的驱动时候,用这个。它会新建一个设备,就不是从已有设备做过滤啥的。(官方:A ClassInstall32 section installs a new device setup class (and possibly a class installer) for devices in the new class.)

https://msdn.microsoft.com/zh-cn/library/windows/hardware/ff546335 这里有它必须包含的字段

DefaultInstall 当右键“安装”时候访问(没有字段却点击会报错)(section is accessed if a user selects the “Install” menu item after right-clicking on the INF file name.)

通过remarks知道,这个字段不能用来当做设备驱动安装,仅用于类过滤驱动,类共同安装,文件系统过滤驱动,内核驱动服务程序等不与设备驱动关联的服务。
数字签名不能使用这个字段
Unlike a DDInstall section, a DefaultInstall section cannot contain DriverVer or LogConfig directives.(和ddinstall的不同)

ddinstall 每个DDInstall Section包含一个可选项DriverVer指令,adreg好像也是必选
从marks知道,它用于安装段名(自定义),指定有或没有平台。(详细看https://msdn.microsoft.com/zh-cn/library/windows/hardware/ff547344)
所以Manufacturer是安装入口(这个必选联系理解,下面就说它,)

Manufacturer:官方的name我有点不懂就跳过,讲点大众的。

%strkey%=models-section-name [,TargetOSVersion] [,TargetOSVersion] ...  (Windows XP and later versions of Windows)

strkey是string段里面的被代替为name

models-section-name 这里理解为另一个节(section翻译都行)

version最后的是平台,可以选择多个平台,但是也就意味着相应的model节也必需匹配平台信息。(有时会有个主版本号和副版本号,我们用它来确定系统xpwin7)

如:%MFGNAME% = MyDevice_WinUSB,NTx86,NTamd64后面就必需有
[MyDevice_WinUSB.NTx86]和[MyDevice_WinUSB.NTamd64]节

Models

device-description=install-section-name[,hw-id][,compatible-id…]

desciption:是个string节的id(中文就是设备描述)

section-name:
然后,这个就是ddinstall的模块了。

hw-id:指定一个设备制造商定义的硬件ID串(hardware ID string)。PnP管理器用这个项来找匹配的INF文件

compatible-id:指定一个设备制造商定义的兼容ID字符串(compatible ID string)。同时可以指定多个compatible-id,之间用逗号隔开
后面俩个不是很理解,以后来更新。

INF 三键

硬件子键:
这里是对设备的键值修饰,“我的电脑”右键“管理”,指的便是这里的硬件设备。当然可以通过classinstall添加一个设备,或是虚拟设备
在这个里面内容主要是厂家设备信息(msdn就说过通过models的俩个id给设备增添加服务),然后为了唯一性有个类子键(classguid管理),服务性有个服务子键(加载的具体驱动服务,sys,几个type)

类子键:
一个类键管理一个设备。
(以下自己理解,有待修改)
“我的电脑”右键“管理”这么多个设备被格子guid标识,当厂家要在某个设备下添加驱动时,就把class和classguid弄上去,但Manufacturer是厂家自己的信息,当驱动更新时,系统会更快通过这些信息更新。
所以一个设备下可能有很多个驱动。

服务子键:
俩个type和错误type,和sys文件路径

// //