脾虚湿盛吃什么中成药| 阴道壁是什么样的| 什么是假性狐臭| 看睾丸去医院挂什么科| 怀孕吃什么水果最好| 无中生有是什么生肖| 川字加一横是什么字| 草长莺飞是什么生肖| 梗是什么意思| 沾沾喜气什么意思| 传单是什么病| 新生儿黄疸高是什么原因| 肛裂出血和痔疮出血有什么区别| 脑震荡挂什么科| 家里为什么有跳蚤| 好奇害死猫什么意思| 窦性心律是什么| 做梦坐飞机是什么意思| 百年灵手表什么档次| 右眼皮跳是什么原因| 腋下臭是什么原因| 梦到被猪咬是什么意思| 窈窕淑女是什么意思| 胃强脾弱吃什么中成药| 冰箱什么品牌好| 羊驼为什么吐口水| 什么叫庚日| 薇诺娜适合什么年龄| 过敏性皮肤用什么护肤品比较好| 郑州有什么大学| 山药什么季节成熟| 肾积水有什么危害| 五脏是什么| 杏色搭配什么颜色好看| 第二个手指叫什么| 国标舞是什么舞| 脘腹胀满是什么意思| 男人太瘦吃什么可以长胖| 骨密度是检查什么的| 口力念什么| 开通花呗有什么风险| 月经太多是什么原因| 什么是做功| 阴虚内热吃什么中成药| 为什么眼皮会肿| pa是什么元素| 靶向药是什么意思| 狗为什么喜欢吃人屎| 孕妇梦见别人怀孕是什么意思| 宇宙外面是什么| 胆囊是干什么用的| 棱角分明是什么意思| 西游记告诉我们什么道理| 1月28日什么星座| kiko是什么意思| 昔日是什么意思| 樱花什么时候开| 慢性宫颈炎用什么药好| 女大十八变是什么意思| 岁月静好浅笑安然什么意思| 121是什么意思| 罄竹难书的罄什么意思| 为什么手指会发麻| 寒冷的反义词是什么| 退行性病变是什么意思| 女性体寒 吃什么好| 哥文花园女装什么档次| 算计是什么意思| 喜怒无常是什么意思| 碘是什么颜色| min什么意思| 女性看乳房应该挂什么科| 长颈鹿的脖子像什么| 印度什么时候独立的| 什么生肖怕老婆| 铁皮石斛可以治什么病| 阿托品属于什么类药物| ml 什么意思| 鹦鹉鱼能和什么鱼混养| 牛肉含有什么营养成分| 男人吃什么更持久| 腮腺炎挂什么科| 八七年属什么生肖| 喝黑咖啡有什么好处| 什么什么不乐| ct和磁共振有什么区别| 遗精什么意思| v3是什么意思| 属猪的和什么属相最配| 葡萄糖酸钙锌口服溶液什么时候喝| 尿泡多是什么原因| 梵高属于什么画派| 如虎添翼是什么生肖| 女人吃善存有什么好处| 临床医生是什么意思| 为什么不说话| 黄体生成素高是什么原因| 黑脸代表什么| 祖母是什么意思| 花儿为什么这样红简谱| 蓝色和红色混合是什么颜色| 自言自语是什么| 嘴里发咸是什么原因| 碳水是什么| b族维生素什么人不能吃| 焦虑症是什么| 经常自言自语是什么原因| 贫血吃什么药效果好| 什么叫物质女人| 小米粥和什么搭配最好| 什么是健康管理| 扁桃体是什么| 液体套是什么| 腔梗吃什么药| k开头的是什么车| 早上咳嗽是什么原因| 早上七八点是什么时辰| 头孢全名叫什么| 下午4点到5点是什么时辰| 梦见死去的亲人又活了是什么意思| 可乐加味精女人喝了什么效果| 痰是棕色的是什么原因| 玛丽珍鞋是什么意思| 板栗不能和什么一起吃| 40min是什么意思| 什么时候人流| 胃疼挂什么科| 灼口综合症吃什么药| 尿酸高肌酐高是什么原因呢| 嫣然是什么意思| 喜欢蓝色的女人是什么性格| 狗狗流鼻涕吃什么药| 高血压喝什么茶| 今年什么时候过年| 0z是什么单位| 项羽的老婆叫什么| 岁次什么意思| 戒断反应是什么| 懒是什么生肖| 包皮红肿瘙痒用什么药| 离婚证是什么颜色| 脑萎缩吃什么药| 11.20是什么星座| 老年人嗜睡是什么原因| 心律不齐什么症状| 大智若愚什么意思| 嘴唇薄的男人面相代表什么意味| 性质是什么意思| 老年阴道炎用什么药| 默哀是什么意思| 骨肉相连是什么肉| 高糖是什么| 胸膜炎有什么症状| 高处不胜寒是什么意思| 维生素d3什么时候吃最好| 萘是什么| 2007年是什么命| 物流是什么| 精力是什么意思| 蒙字五行属什么| 群星是什么意思| 败血症是什么病| 量贩什么意思| 寡糖是什么| 白细胞低是怎么回事有什么危害| 山楂干泡水喝有什么功效和作用| 2011属什么生肖| 白羊座后面是什么星座| 睾丸长什么样子| 太阳里面有什么| u是什么单位| 25羟基维生素d是什么| 先明后不争什么意思| 脊髓是什么| 蛇冲什么生肖| 什么食物是发物| 头部检查挂什么科| 内向男生适合什么工作| 子嗣是什么意思| 人为什么会发热| 熬夜伤什么器官| ariel是什么意思| 布鲁氏菌病是什么病| 官官相护是什么意思| 什么是热感冒| 上当是什么意思| 白矾是什么| 水压低用什么花洒| 头上出汗是什么原因| 甲沟炎是什么原因引起的| 狗拉肚子吃什么药| 脸上长痘痘用什么药膏效果好| 三个王念什么| 胎盘位于后壁是什么意思| 看心脏病挂什么科| 过敏是什么原因引起的| 石斛主治什么| 突兀什么意思| 孕酮低跟什么有关系| dragon是什么意思| 梦见织毛衣是什么意思| 上发条是什么意思| 什么叫菩提心| 璟字五行属什么| 长期贫血会导致什么严重后果| vodka是什么酒| 痣是什么| 内科查什么| 两班倒是什么意思| 朱顶红什么时候开花| 头痛应该挂什么科| 沸去掉三点水念什么| 行房时硬度不够是什么原因| 扁桃体经常发炎是什么原因| 五行属火适合什么行业| 口字五行属什么| ug是什么| 耳朵老是痒是什么原因| 乳酪是什么东西| 炖猪排骨放什么调料| 端午节有什么活动| 幽门螺旋杆菌用什么药治疗| 鼻梁有横纹是什么原因| 女人脾肾两虚吃什么好| 茼蒿不能和什么一起吃| 过敏性紫癜吃什么药| 神神叨叨是什么意思| 淋巴转移什么意思| 什么是肾癌| 宫腔镜检查主要查什么| 血清胰岛素测定查什么| 驼背是什么原因造成的| 脊柱炎吃什么药| 指甲是白色的是什么原因| 4月10日是什么星座| 农历六月十七是什么日子| 梦见床代表什么预兆| 骏五行属什么| 摩什么擦什么| 马克笔是什么笔| 淋巴细胞百分比低是什么意思| 经理是什么级别| id是什么意思的缩写| 冰毒是什么| 甘甜是什么意思| 什么是肾功能不全| 红枣泡水喝有什么功效| 碳酸钙d3颗粒什么时候吃最好| 澄字五行属什么| 98年属虎的是什么命| 月经黑红色是什么原因| 胃胀吃什么药最有效| 甲胎蛋白是什么| 高兴地什么| 阿罗裤是什么意思| 金球奖什么时候颁发| 右手臂痛是什么预兆| 开心果是什么树的果实| 低压偏高是什么原因引起的| 99年属什么的| 争是什么生肖| 为什么会牙痛| 正方形体积公式是什么| 纳米是什么意思| 百度跳转到内容

【见义勇为】张佳佳:勇斗藏獒救群众于危难的子弟兵

本页使用了标题或全文手工转换
维基百科,自由的百科全书
百度 要狠抓作风建设,驰而不息纠“四风”、改作风,发扬求真务实、苦干实干的精神,提振时不我待、只争朝夕的状态,推动统战工作取得实效。

视窗驱动程序模型Windows Driver Model,简称WDM),是微软视窗操作系统驱动程序设计架构,包括对于各项设备(Device)的支持,如键盘(Keyboard)、鼠标(Mouse)、网卡(Network Driver Interface Specification,Ndis)、通用串行总线(Universal Serial Bus,USB)等。WDM可支持Windows 98, Windows 98 Second Edition, Windows Me, Windows 2000, Windows XP以及Windows Server 2003在x86平台上的建制工作。这个架构分成好几个管理层面:

  • 核心(Kernel)
  • 对象管理(Object Manager)
  • 执行(Executive)
  • 输入输出管理(I/O Manager)
  • 存储器管理(Memory Manager)
  • 行程服务(Process Service)
  • 执行时期函数库(Run-time Library)
  • 电源管理(Power Manager)
  • 即插即用子系统(Plug and Play Subsystem)
  • 视窗管理指令(Windows Management Instrumentation,WMI)
  • 核心流(Kernel Streaming)
  • 硬件抽象层(Hardware Abstraction Layer)

种类

[编辑]

驱动程序的种类有总线驱动程序(bus driver)、功能驱动程序(function driver)、筛选驱动程序(filter driver)三种:

  • 总线驱动程序(bus drivers)
    • 虚拟总线驱动程序(Virtual bus drivers):调用IoInvalidateDeviceRelations通知PnP Manager。
  • 功能驱动程序(function drivers)
    • 微端口型驱动程序(miniport drivers):属于USB, Audio, SCSI以及network的转换器(adapters)。
    • 虚拟设备驱动程序(Virtual device drivers)
    • 类型驱动程序(Class drivers)
  • 筛选性驱动程序(filter drivers)
    • 上层筛选性驱动程序(upper-filter drivers)
    • 下层筛选性驱动程序(lower-filter drivers)

程序进入点

[编辑]

如同许多语言从main函数开始,WDM驱动程序的加载(Loading)乃至于动作,以及其卸载(Unload)行为,都有其步骤与规则。WDM驱动程序可以动态式的加载与卸载,当侦测到设备(Device)插入的时候,依据“PnP Manager”会自动地加载相对应的设备驱动程序,然后成为“Driver Object”,并调用DriverEntry函数。所有的WDM驱动程序,都必须拥有这个DriverEntry例程(routine),而且“此一名称不可改变”的,所有的驱动程序也是从这里开始执行的,I/O Manager首先调用驱动程序的DriverEntry()。DriverEntry在DDK Compiler编译出来的输出符号表是“DriverEntry@8”,原因是微软的C编译器把stdcall函示(例如VcDCall)的名称加上“记号”,加上一个@符号,在附上参数的总字节个数,8指此function的所有参数所占的byte数。

DriverEntry函数有两个参数,其中第一个参数PDRIVER_OBJECT DriverObject是指向该驱动程序对应的对象指针;PUNICODE_STRING RegistryPath,驱动程序的服务主要键码,这个参数的使用时机并不多。以下是一个简单而标准的DriverEntry基本实现:

 NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING pRegistryString)
 {
   //PDEVICE_OBJECT DriverObject;
   UNICODE_STRING deviceName;
   RtlInitUnicodeString( &deviceName, DEVICE_NAME );
       
   status = IoCreateDevice( DriverObject, 0, &deviceName, 
      FILE_DEVICE_UNKNOWN, FILE_DEVICE_SECURE_OPEN, true, &pDeviceObj );
 
   UNICODE_STRING linkName;
   RtlInitUnicodeString( &linkName, LINK_NAME );
   status = IoCreateSymbolicLink( &linkName, &deviceName );
 
   DriverObject->DriverUnload = DriverUnload;
   DriverObject->MajorFunction[IRP_MJ_CREATE] =
   DriverObject->MajorFunction[IRP_MJ_CLOSE] =
   DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = xxDriverDispatch;
   DriverObject->DriverUnload = xxUnload;
 
   return STATUS_SUCCESS;
 }

IRQL

[编辑]

DriverEntry运作在IRQL = PASSIVE_LEVEL等级,所以可以使用标签页内存。WDM有数个经常实现的PASSIVE_LEVEL等级如下:

  • DriverEntry
  • Dispatch Function:DispatchXxx
  • Unload:UnloadXxx
  • AddDevice: XxxAddDevice
  • Reinitialize: XxxReinitialize

另外还有几个DISPATCH_LEVEL等级的函数如下:

  • StartIo
  • AdapterControl
  • ControllerControl
  • IoTimer
  • Dpc(延迟程序调用,Deferred Procedure Call)

派送行程

[编辑]

DriverEntry函数完成对象的初始化与系统注册之后,接下来的重点便会落在Dispatch Function身上。每当I/O Manager得到一个请求时(例如按键,移动鼠标),它使用请求的函数代码(IoControlCode)调用驱动程序中几个Dispatch行程。

 NTSTATUS xxDispatch (IN PDEVICE_OBJECT DeviceObject,IN PIRP pIrp)
 { 
    NTSTATUS ntStatus = STATUS_SUCCESS;
    ULONG IoControlCodes = 0;             
    PIO_STACK_LOCATION IrpStack=NULL;   
 
    pIrp->IoStatus.Status = STATUS_SUCCESS;
    pIrp->IoStatus.Information = 0;
 
    IrpStack = IoGetCurrentIrpStackLocation(pIrp);    
 
    switch (IrpStack->MajorFunction)
    { 
        case IRP_MJ_CREATE:
            break;
        case IRP_MJ_CLOSE:
            break;
        case IRP_MJ_DEVICE_CONTROL:
            IoControlCodes=IrpStack->Parameters.DeviceIoControl.IoControlCode;
            switch (IoControlCodes)
            { 
                case IOCTL_1:
                    break;
                case IOCTL_2:
                    break;
                default:
                    pIrp->IoStatus.Status = STATUS_INVALID_PARAMETER;
                    break;
            }
            break;
        default:
            break;
    }
    ntStatus=pIrp->IoStatus.Status;
 
    IoCompleteRequest(pIrp,IO_NO_INCREMENT);
 
    return ntStatus;
 }

卸载

[编辑]

Unload负责在驱动程序被停止前做一些必要的处理动作,如释放资源,记录最后状态等。

 VOID DriverUnLoad (IN PDRIVER_OBJECT DriverObject)
 { 
   if (DeviceObject) {
   IoUnregisterFileSystem(DeviceObject);
   IoDeleteDevice(DeviceObject);
   //DeviceObject = 0;
 }

编译

[编辑]

驱动程序的编译需要使用DDK(Device Driver Kit)中的build指令,它是一道命令行程序,一般会在后面加上参数:-ceZ。例如:

 C:\driver sample>build.exe -ceZ

DDK可用于建立用于 Windows 2000、Windows XP、Microsoft Windows Server 2003、Vista的建置环境,但在Windows操作系统并非默认的功能,必须另行安装。安装完成后你会看到Build Enviroment,free是指release版,check则是debug版

  • Windows XP checked 64 Bit Build Environment
  • Windows XP checked Build Environment
  • Windows XP free 64 Bit Build Environment
  • Windows XP free Build Environment

build指令一开始调用Build.exe编译链接器,从系统“环境变量”(Environment Variable)Include中得到引用文件的地址,然后调用Visual C++的编译链接器Nmake.exe进行实际的编译链接工作。在编译过程中遇到的错误,遇到的警告,会记录到buildxxx.log,buildxxx.wrn,buildxxx.err等文件中。

安装

[编辑]

安装过程分成两个步骤:

  • 首先将编译成的.sys文件复制到Windows NT的System32\\Drivers\\目录下;
  • 接着在Registry的HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\下建立和.sys文件同名的键,然后在之下建立名为Start、Type、ErrorControl的三种REG_DWORD类型的键值。

示例

[编辑]

Microsoft DDK提供了大量的WDM示例(samples)参考,这些示例随着DDK的安装,会进驻我们的系统之中(WINDDK\xx00\src)。一般人不大可能从轮子造起一个新的驱动程序,大部分要靠“既有的示例”来改良一个新的驱动程序。

  • 1394
  • Audio
  • AVStream
  • filesys
  • general
  • hid
  • input
  • ir
  • kernel

批评

[编辑]
  • WDM学习曲线过长。
  • 电源管理(power management)事件与即插即用(Plug-and-play)差异太大。导致系统的睡眠(sleep)与清醒(wake up)状态容易产生问题。
  • I/O cancellation几乎不可能达成。
  • 每支驱动程序动辄要撰写数千行的代码。
  • 不支持纯用户模式(pure user-mode)驱动程序。

相关条目

[编辑]

外部链接

[编辑]

参考

[编辑]
  • Walter Oney,《Windows Driver Model》
吃什么补充膝盖润滑液 18k金是什么意思 外阴白斑是什么 CAT是什么 9点到11点是什么经络
憩是什么意思 为什么手上会长小水泡 不能晒太阳是什么病 为什么不建议年轻人做肠镜 拉稀拉水吃什么药管用
槟子是什么水果 胸口疼挂什么科室 1953年属蛇的是什么命 湖北古代叫什么 那悲歌总会在梦中惊醒是什么歌
ova什么意思 阑尾炎疼吃什么药 手脚软无力是什么原因引起的 四五月份是什么星座 世界上最深的湖是什么
深海鱼油的作用是什么hcv8jop6ns4r.cn 贝壳吃什么食物hcv9jop1ns1r.cn 辣皮子是什么kuyehao.com 狗皮肤溃烂用什么药xianpinbao.com redline是什么牌子xscnpatent.com
ex是什么意思hcv9jop1ns6r.cn 为什么要打破伤风hcv7jop6ns7r.cn 梦见自己鞋子破了是什么意思hcv8jop7ns8r.cn 意淫什么意思hcv8jop9ns9r.cn 三七有什么功效qingzhougame.com
甲状腺属于什么系统hcv9jop7ns5r.cn 涤塔夫是什么面料hcv9jop4ns7r.cn 田可以加什么偏旁hcv8jop9ns7r.cn 恶心想吐吃什么药好hcv8jop4ns4r.cn 开颅手术有什么后遗症hcv8jop7ns5r.cn
肝内胆管结石有什么症状表现hcv8jop8ns0r.cn 过敏性结膜炎用什么药hcv9jop7ns9r.cn 肩膀麻木是什么原因引起的hcv9jop5ns0r.cn 治疗宫颈炎用什么药好得快zhiyanzhang.com 1987年属什么今年多大fenrenren.com
百度