bluehacker

windows2k的设备安装

0
阅读(2317)

这几天为公司的一个项目写安装程序,对于wdm驱动程序的安装程序我还是第一次写.一般我都是用添加新硬件向导安装设备的.但经理说为了给客户更大的方便,要求我写个傻瓜型的安装程序.这几天看了看ddk document种关于设备安装的部分.对windows2k下的设备安装过程有了个比较清楚的了解.


windows2k 下设备的安装主要涉及到几个组件的相互操作.当用户在计算机种插入新硬件后,首先是总线驱动程序检测它所管理的总线上有无新硬件插入.这是由 kernel mode pnp manager向bus driver发送IRP_MN_QUERY_DEVICE_RELATIONS的pnp请求实现的,bus driver通过回送总线上新的设备列表来响应这个请求,kernel mode pnp manager通过比较前后两个设备列表来确定是否有新硬件插入.


在发现有新硬件插入后,kernel mode pnp manager再向bus driver发送 IRP_MN_QUERY_ID和IRP_MN_QUERY_CAPABILITIES来得到新硬件的有关信息,如hardware id.然后, kernel mode pnp manager通知上层的user mode pnp manager有新设备加入, user mode pnp manager接着就尝试安装这个设备,首先它启动全自动的server side installation,如果这个设备的驱动没有通过微软的数字签名认证或者其他一些原因不能完成这种自动的安装,那么user mode pnp manager就启动添加设备向导调用 SetupDiBuildDriverInfoList创建一个驱动的列表,如果这个列表为空,则要求用户做出选择.然后 user mode pnp manager再次调用SetupDiBuildDriverInfoList创建列表.创建成功后, pnp manager会调用class installer和co-installer(如果有的话).


然后控制重新转入kernel mode pnp manager,它完成文件的拷贝,设备借口注册等,接着就加载驱动调用driver entry,如果成功则紧接着发送start device irp启动设备.


在这个过程中一个关键的文件是 inf文件,它包含关于设备的重要信息.安装程序通过setup api来打开读取inf文件,根据其中的文件内容安装设备.


我先写的一个安装程序,莫名其妙的将设备安装在root下而不是pci enum下,找了两天原因才发现是调用 SetupDiCallClassInstaller时候传递的一个参数有问题.改正后就一切OK了.但是却发现另一个古怪的问题,就是卸载程序在完成卸载后如果不重新启动机器才能再次安装设备,否则再次运行安装程序总是报找不到inf文件,最后搞的没办法只好在卸载完成后调用ExitWindowsEx 强制reboot.