Window Driver 安装

http://huapingjiang.blogcn.com/diary,9089662.shtml

Window Driver 安装 
 

                                                 Windows driver安装

关于setup class

Windows driver的安装是比较复杂的,需要写很多注册表的参数。有些参数是在inf文件里设定,有些是Windows安装程序默认帮你写到注册表里面的。卸载的时候同样也必须卸载掉注册表中driver相关信息。

Inf文件里面一个非常重要的GUID是安装类GUIID(setup class GUID)。它跟driver中定义的GUID,称为接口GUIDInterface GUID)。Interface GUIDdriver提供给application,使得application可以跟driver通信。而Setup class GUID是表示设备所属的类的,比如你的设备是USB设备类的,或者modem类的。例如我写了一个modem driver,在它的inf文件里我要指定它的setup class GUID4D36E96D-E325-11CE-BFC1-08002BE10318,这样modem driver安装以后就会在HLM/SYSTEM/CurrentControlSet/Control/Class/4D36E96D-E325-11CE-BFC1-08002BE10318下面看到modem driver的一个子建,里面记录虚拟的COM口,moden的初始化命令,inf文件的path等等信息。有些时候卸载不完全,这里就会有残留的记录。多次安装过驱动程序,或者安装过很多版本的的驱动,有些时候新版本的驱动就安装不上了。这时就需要去这里看看有没有残留。

我就有一次遇到了问题,设备插上去之后发现安装不上,设备管理器里面就是没有响应(因为我做了class coinstall,所以不会弹出发现新硬件的对话框),发现里面有很多版本的驱动的残留,我清除了这些之后,驱动就可以安装了。

 

关于Co-installer

co-installer的认识是从一个老外那里开始的,他是一个senior engineer。当时我们的设备是一个多接口的USB设备,所以会出现多个新设备的安装。为了简化安装过程,需要写一个coinstaller,原来我们打算安装DDK里面关于co-installer的说明来写的。后来证明不能那样做。我们就写了一个application来把所有需要的sys文件和inf文件复制到system目录下,inf文件还做了转化。因为Windows如果在注册表中找不到驱动信息,先回去system目录下搜索驱动的pnf文件(inf文件的二进制表示)。

这样我们的application就起作用了,安装起来就比较方便。Application执行完之后只要插上设备就可以了,但是由于我们的driver没过WHQL认证,所以在WINDOW 2K下面OK,而在WINDOWS XP下面不行。

由于Windows XP在发现没有认证过的驱动之后,在弹出“发现新硬件”之前,会依次调用class co-installerdevice co-installer,而且会把SP_DRVINFO_DATA结构里面的Rank值指定为非0(通过认证它的值是0),后来我们就写了一个class co-installer来修改Rank的值为0。相关处理代码如下:

  case DIF_SELECTBESTCOMPATDRV:

        DbgOut("DIF_SELECTBESTCOMPATDRV");

        if (DeviceInfoData)

        {

            SP_DRVINFO_DATA sDrvInfoData;

            DWORD MemberIndex = 0;

            BOOL bRet = FALSE;

            memset((void*)&sDrvInfoData, 0,  sizeof(SP_DRVINFO_DATA));

            sDrvInfoData.cbSize =  sizeof(SP_DRVINFO_DATA);

            bRet = SetupDiEnumDriverInfo(DeviceInfoSet, DeviceInfoData, SPDIT_COMPATDRIVER, MemberIndex++, &sDrvInfoData);

            if (bRet)

            {

                SP_DRVINSTALL_PARAMS sDrvInstallParams;

                memset((void*)&sDrvInstallParams, 0,  sizeof(SP_DRVINSTALL_PARAMS));

                sDrvInstallParams.cbSize =  sizeof(SP_DRVINSTALL_PARAMS);

                OutputDebugString(sDrvInfoData.Description);

                SetupDiGetDriverInstallParams(DeviceInfoSet, DeviceInfoData, &sDrvInfoData, &sDrvInstallParams);

                sDrvInstallParams.Rank = 0;

                SetupDiSetDriverInstallParams(DeviceInfoSet, DeviceInfoData, &sDrvInfoData, &sDrvInstallParams);

            }

        }

        else

        {DbgOut("DeviceInfoData is null!");

        }

        break;

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: driver.window_handles是Selenium中的一个方法,用于获取当前浏览器窗口的句柄列表。具体来说,它返回一个包含所有窗口句柄的列表,每个句柄对应一个浏览器窗口。通过这个方法,我们可以在多个窗口之间进行切换和操作。 ### 回答2: driver.window_handles 是 Selenium WebDriver 提供的一个方法,用于获取所有打开窗口(tab)的句柄(handle)。在使用 Selenium 进行自动化测试时,经常需要进行窗口切换或者获取某个窗口的相关信息,此时就需要用到 window_handles 方法。 在一个浏览器窗口中打开新的 tab 时,每个 tab 会拥有独立的句柄。通过 driver.window_handles 方法可以获取所有打开的 tab 的句柄,将句柄保存在一个列表中。可以通过列表索引访问某个窗口的句柄,然后使用 driver.switch_to.window 方法切换到该窗口,达到操作不同窗口的目的。 在实际应用中,window_handles 方法常常和其他 Selenium WebDriver 方法一起使用,比如定位元素或者获取页面源代码等,这些方法需要在某个具体的窗口中执行,因此要先使用 window_handles 方法获取所需窗口的句柄,然后再使用 switch_to 方法切换到该窗口。 总之,driver.window_handles 方法是 Selenium WebDriver 中非常常用的一个方法,它为自动化测试提供了灵活的窗口控制方式,能极大地提高测试效率。 ### 回答3: driver.window_handles是Selenium中的一个方法,用于返回浏览器中所有当前打开的窗口的句柄列表。在Selenium中有些操作需要切换窗口,例如点击一个链接或者打开一个弹窗后需要在新的窗口中操作。此时就需要使用driver.window_handles方法获取所有窗口的句柄列表,然后根据需要切换到特定的窗口。 该方法返回的是一个句柄列表,其中每个句柄对应一个打开的窗口。通过遍历句柄列表,可以分别获取每个窗口的句柄,然后使用driver.switch_to.window()方法切换到对应的窗口。 需要注意的是,Selenium只能在同一个浏览器进程中进行窗口切换。因此,如果要在不同的浏览器进程中打开窗口,则需要使用多个WebDriver实例,每个实例对应一个浏览器进程。 总之,driver.window_handles方法是Selenium中非常实用的方法,可以用于获取所有窗口的句柄列表,方便进行窗口的切换和操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值