如何安装一个设备驱动程序
2014-10-16 18:44
190 查看
2010-05-28 09:41:34| 分类: Windows内核|举报|字号 订阅
http://wanderwarriorhsiao.blog.hexun.com/19289171_d.html
本质上,安装驱动需要依靠UpdateDriverForPlugAndPlayDevices这个函数。它需要的参数其实不多,主要是INF文件路径等。
执行这个函数相当于在设备管理器右键菜单上点击“扫描检测硬件改动”。它会查找当前已经添加到系统中但可能还没有安装驱动程序的硬件设备。由于没有对应的硬件,因此我们要另想办法,让它能检测到虚拟硬件的存在。
为此,我们需要创建一设备信息块,并将它弄到系统注册表中去。
创建设备信息块的函数是SetupDiCreateDeviceInfo
这 个函数需要7个参数,其他的都好办,无非是设备ID字符串,设备GUID等,还有一个用于输出的结构体,记住填写其中的size字段,其余为0就可以了。 问题是第一个参数HDEVINFO需要用另一个函数SetupDiCreateDeviceInfoList来创建。如果GUID不想写死,想通过INF 读取,则需要另一个函数SetupDiGetINFClass。
以上函数调用的顺序是:SetupDiGetINFClass获取GUID,SetupDiCreateDeviceInfoList创建设备信息块列表,SetupDiCreateDeviceInfo创建设备信息块。完成这些步骤之后,我们就可以注册设备了。首先,我们要调用SetupDiSetDeviceRegistryProperty这个函数来设置设备在系统设备树上的路径,然后通过SetupDiCallClassInstaller这个函数来注册:
这个函数的作用是设置驱动信息块中的信息。对于我们最重要的是其中的硬件ID。这通过给第三个参数以SPDRP_HARDWAREID这个值就可以实现。这时候,第四个参数就是指向硬件ID字符串的指针,第五个参数就是字符串的字节长度。
这个函数第一个参数要用DIF_REGISTERDEVICE填充以便注册设备,第二项填写设备信息块列表,第三项则填写设备信息块。
http://wanderwarriorhsiao.blog.hexun.com/19289171_d.html
本质上,安装驱动需要依靠UpdateDriverForPlugAndPlayDevices这个函数。它需要的参数其实不多,主要是INF文件路径等。
BOOL WINAPI UpdateDriverForPlugAndPlayDevices( HWND hwndParent, LPCTSTR HardwareId, LPCTSTR FullInfPath, DWORD InstallFlags, PBOOL bRebootRequired OPTIONAL );
执行这个函数相当于在设备管理器右键菜单上点击“扫描检测硬件改动”。它会查找当前已经添加到系统中但可能还没有安装驱动程序的硬件设备。由于没有对应的硬件,因此我们要另想办法,让它能检测到虚拟硬件的存在。
为此,我们需要创建一设备信息块,并将它弄到系统注册表中去。
创建设备信息块的函数是SetupDiCreateDeviceInfo
WINSETUPAPI BOOL WINAPI SetupDiCreateDeviceInfo( IN HDEVINFO DeviceInfoSet, IN PCTSTR DeviceName, IN LPGUID ClassGuid, IN PCTSTR DeviceDescription, OPTIONAL IN HWND hwndParent, OPTIONAL IN DWORD CreationFlags, OUT PSP_DEVINFO_DATA DeviceInfoData OPTIONAL );
这 个函数需要7个参数,其他的都好办,无非是设备ID字符串,设备GUID等,还有一个用于输出的结构体,记住填写其中的size字段,其余为0就可以了。 问题是第一个参数HDEVINFO需要用另一个函数SetupDiCreateDeviceInfoList来创建。如果GUID不想写死,想通过INF 读取,则需要另一个函数SetupDiGetINFClass。
HDEVINFO SetupDiCreateDeviceInfoList( IN LPGUID ClassGuid, OPTIONAL IN HWND hwndParent OPTIONAL ); WINSETUPAPI BOOL WINAPI SetupDiGetINFClass( IN PCTSTR InfName, OUT LPGUID ClassGuid, OUT PTSTR ClassName, IN DWORD ClassNameSize, OUT PDWORD RequiredSizeOPTIONAL, );
以上函数调用的顺序是:SetupDiGetINFClass获取GUID,SetupDiCreateDeviceInfoList创建设备信息块列表,SetupDiCreateDeviceInfo创建设备信息块。完成这些步骤之后,我们就可以注册设备了。首先,我们要调用SetupDiSetDeviceRegistryProperty这个函数来设置设备在系统设备树上的路径,然后通过SetupDiCallClassInstaller这个函数来注册:
WINSETUPAPI BOOL WINAPI SetupDiSetDeviceRegistryProperty( IN HDEVINFO DeviceInfoSet, IN OUT PSP_DEVINFO_DATA DeviceInfoData, IN DWORD Property, IN CONST BYTE *PropertyBuffer, IN DWORD PropertyBufferSize );
这个函数的作用是设置驱动信息块中的信息。对于我们最重要的是其中的硬件ID。这通过给第三个参数以SPDRP_HARDWAREID这个值就可以实现。这时候,第四个参数就是指向硬件ID字符串的指针,第五个参数就是字符串的字节长度。
WINSETUPAPI BOOL WINAPI SetupDiCallClassInstaller( IN DI_FUNCTION InstallFunction, IN HDEVINFO DeviceInfoSet, IN PSP_DEVINFO_DATA DeviceInfoData OPTIONAL );
这个函数第一个参数要用DIF_REGISTERDEVICE填充以便注册设备,第二项填写设备信息块列表,第三项则填写设备信息块。
相关文章推荐
- 如何安装一个设备驱动程序[转]
- 如何根据驱动程序及其安装文件来访问该设备[转]
- 如何从内核模式设备驱动程序中打开一个文件以及如何读取或写入文件(来自微软官网)
- 如何从内核模式设备驱动程序中打开一个文件以及如何读取或写入文件
- 如何编写一个简单的linux内核模块和设备驱动程序
- 如何在vmware虚拟机中安装Linux系统后安装各种设备驱动程序呢?
- 安装 LaserJet 1020 时这个设备的驱动程序丢失了一个必需的项,这可能是由于 inf 是为 Windows 95 或更新版本而写的。联系您的硬件供应商。
- 40、开发者如何在同一个设备上安装同一个应用的不同版本
- 如何根据驱动程序及其安装文件来访问该设备呢(Visual C++ or C++ Builder均可以)
- 如何根据驱动程序及其安装文件来访问该设备呢(Visual C++ or C++ Builder均可以) 选择自 kingcaiyao 的 Blog
- 解决安装Intel各种驱动提示“安装程序未能安装一个或多个设备驱动程序”的问题
- 【转帖】如何从内核模式设备驱动程序中打开一个文件以及如何读取或写入文件
- windows中如何安装一个驱动程序
- 如何把多个软件安装程序做成一个安装程序.
- NT DDK的安装以及设备驱动程序的编译
- 如何编写Linux设备驱动程序
- 如何编写Linux的设备驱动程序
- 如何用 NextInstaller 在一个Project中支持多个语言的安装盘
- 如何编写Linux设备驱动程序
- 创建一个强名称密钥文件+ 如何在 Visual C# .NET 中将程序集安装到全局程序集缓存中