装机精灵功能实现猜想(驱动安装)
一、驱动安装
首先利用windows平台下提供的API函数,查询当前机器已经安装的硬件,同时也可以通过查询注册表的方法来获得硬件驱动版本。金山安装精灵将这两部分数据信息发送到服务端,在服务器端查询数据库,将匹配的结果发送到客户端,从而指示进行驱动的下载和安装。金山安装精灵并没有将数据在本地进行查询,
// testDevice.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <stdio.h>
#include <windows.h>
#include <setupapi.h>
#include <devguid.h>
#include <regstr.h>
#pragma comment(lib, "Setupapi.lib ")
void printdata(LPVOID pdata,DWORD datalen,DWORD type);
int _tmain(int argc, _TCHAR* argv[])
{
HDEVINFO hDevInfo;
SP_DEVINFO_DATA DeviceInfoData;
DWORD i;
// Create a HDEVINFO with all present devices.
hDevInfo = SetupDiGetClassDevs(NULL, 0, // Enumerator
0,
DIGCF_PRESENT | DIGCF_ALLCLASSES );
if (hDevInfo == INVALID_HANDLE_VALUE)
{
// Insert error handling here.
return 1;
}
// Enumerate through all devices in Set.
DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
for (i=0;SetupDiEnumDeviceInfo(hDevInfo,i,&DeviceInfoData);i++)
{
DWORD DataT;
LPTSTR buffer = NULL;
DWORD buffersize = 0;
//
// Call function with null to begin with,
// then use the returned buffer size
// to Alloc the buffer. Keep calling until
// success or an unknown failure.
//
while (!SetupDiGetDeviceRegistryProperty(
hDevInfo,
&DeviceInfoData,
SPDRP_DEVICEDESC,
&DataT,
(PBYTE)buffer,
buffersize,
&buffersize))
{
if (GetLastError() ==
ERROR_INSUFFICIENT_BUFFER)
{
// Change the buffer size.
if (buffer) LocalFree(buffer);
buffer = (char*)LocalAlloc(LPTR,buffersize);
}
else
{
// Insert error handling here.
break;
}
}
printf( "SPDRP_DEVICEDESC:[%s]\n ",buffer);
if (buffer) LocalFree(buffer);
buffer =NULL;
buffersize=0;
while (!SetupDiGetDeviceRegistryProperty(
hDevInfo,
&DeviceInfoData,
SPDRP_LOCATION_INFORMATION,
&DataT,
(PBYTE)buffer,
buffersize,
&buffersize))
{
if (GetLastError() ==
ERROR_INSUFFICIENT_BUFFER)
{
// Change the buffer size.
if (buffer) LocalFree(buffer);
buffer = (char*)LocalAlloc(LPTR,buffersize);
}
else
{
// Insert error handling here.
break;
}
}
printf( "SPDRP_LOCATION_INFORMATION:[%s]\n ",buffer);
if (buffer) LocalFree(buffer);
buffer =NULL;
buffersize=0;
while (!SetupDiGetDeviceRegistryProperty(
hDevInfo,
&DeviceInfoData,
SPDRP_ADDRESS,
&DataT,
(PBYTE)buffer,
buffersize,
&buffersize))
{
if (GetLastError() ==
ERROR_INSUFFICIENT_BUFFER)
{
// Change the buffer size.
if (buffer) LocalFree(buffer);
buffer = (char*)LocalAlloc(LPTR,buffersize);
}
else
{
// Insert error handling here.
break;
}
}
printf( "Length:%d,SPDRP_ADDRESS: ",buffersize);
printdata(buffer,buffersize,DataT);
printf( "\n ");
if (buffer) LocalFree(buffer);
}
if ( GetLastError()!=NO_ERROR &&
GetLastError()!=ERROR_NO_MORE_ITEMS )
{
// Insert error handling here.
return 1;
}
// Cleanup
SetupDiDestroyDeviceInfoList(hDevInfo);
return 0;
}
void printdata(LPVOID pdata,DWORD datalen,DWORD type)
{
if(datalen <=0)
return;
switch(type)
{
case REG_DWORD:
{
PDWORD np=(PDWORD)pdata;
printf( "REG_DWORD:%d ",np[0]);
}
break;
case REG_SZ:
printf( "REG_SZ:%d ",(LPCTSTR)pdata);
break;
default:
printf( "other format ");
break;
}
}
装机精灵功能实现猜想(驱动安装)相关推荐
- HP光影精灵3 TPN-Q193显卡驱动安装不上,鲁大师检测不到显卡
CPU:I5-7300HQ 独立显卡:NVIDIA GeForce GTX1050 2g 板号:dag75ambad0 REV:D 拆机查看图纸点位,测量显卡的供电时钟复位均正常,刷BIOS无果,最后 ...
- pci串口驱动安装失败_TSC TTP-243E Pluse装LTP并口驱动无法安装
一.前言描述 接到客户报修说,电脑无法开机,即到哥上门维修立即安排人员到现场查看原因,到现场后,查看的确是电脑系统问题,重新安装系统,安装完成系统后,发现打印机无法使用.这个打印机型号是TSC TTP ...
- 服务器驱动精灵_驱动精灵真的可以帮你安装驱动吗?别再无脑装驱动了
之前和大家讲过一期安装官方纯净系统的方法,戳我查看然后很多人就说重装之后显卡驱动掉了打游戏卡的跟PPT一样.于是很多人在重装系统或是进行了重大硬件更新后,一般会采用第三方驱动管理软件来进行硬件的更新, ...
- 没有网络的计算机怎么装驱动程序,装机后电脑没有网络的情况下,驱动人生6教你首先将网卡驱动安装好...
驱动人生6在管理驱动.更新驱动等方面给童鞋们提供了很多方便,但如果童鞋们的电脑在没联网的情况下,却不能用驱动人生6来更新电脑驱动.驱动人生的工程师们不断努力,日夜开发,带网卡版驱动人生6终于发布官网抢 ...
- ubuntu环境下,ubuntu16.04装机到nvdia显卡驱动安装、cuda8安装、cudnn安装
首先是安装ubuntu16.04 A.制作u盘启动盘(提前准备好.ios文件): 1.安装u盘制作工具unetbootin sudo apt-get install unetbootin 2.格式化u ...
- 罗技mx5000驱动安装,实现所有功能(不用罗技原装接收器)
最近对无线键鼠开始感兴趣,开始本想买普通的2.4G的,结果发现罗技mx5000,这么便宜,于是赶紧就定了一套.上个星期刚到货,结果本来一个简单的驱动安装,搞了我一天,才安好.留下帖子给将要入该套装的网 ...
- 新win7系统死机,打开驱动精灵就卡住,解决方案 安装戴尔DELL Optilex 7040 USB驱动时提示无法定位程序输入点 kernel32.dll,解决方案
新win7系统死机,打开驱动精灵就卡住,解决方案 安装戴尔DELL Optilex 7040 USB驱动时提示无法定位程序输入点 kernel32.dll,解决方案 原因: 新系统打卡驱动精灵卡死其实 ...
- 什么是软件精灵?软件精灵功能介绍
第一次听到软件精灵这个名称,相信应该有朋友跟小编一样纳闷软件精灵是什么东东?其实,每一次改进,每一次新功能模块的加入都是从满足用户的基本需求出发,像最开始推出驱动精灵的初衷也是发现用户查找安装程序不太 ...
- html安装网卡驱动,如何手动安装无线网卡驱动,网卡驱动安装教程
无线网卡怎么用? 其实无线网卡使用方法非常简单,安装驱动精灵后,打开驱动精灵软件会自动检测与扫描电脑中的硬件,当发现有硬件驱动不正常或者没有安装就会给出提示,我们只要按着提示安装下载即可完成无线网卡驱 ...
最新文章
- P5137-polynomial【倍增】
- 实战项目| 7天掌握神经网络预测模型
- 人类遗传变异神库 | ClinVar数据库详解
- Linux怎么添加交换空间,如何在Ubuntu上增加swap交换空间
- android leaks工具,Androidx中ImmLeaksCleaner已经解决了InputMethodManager... - 简书
- baq在聊天中啥意思_职场中的“老实人”如何实现逆袭,得到领导的重用?
- 深入理解Unity刚体(Rigidbody)、碰撞器(Collider)、触发器(Trigger)
- 学习C++项目—— 计算机网络编程基础 和 学习多线程,多进程基础
- php xml与数组的转换函数
- 深度学习自学(二十六):人脸关键点检测
- 应届生面试应答需要注意哪些事项及技巧?
- 《精进》的读后感作文2600字
- 腾讯云离线语音识别sdk
- python远程主机强迫关闭了_[转] python 远程主机强迫关闭了一个现有的连接 socket 超时设置 errno 10054...
- pytorch一小时速成
- 工程实践 | 在 Flutter 中实现一个精准的滑动埋点
- 【转载】KAB春纳 | 一同乘风破浪吧
- 用python画小鸭_python中的鸭子类型(协议)和接口
- 基于Ubuntu9.10 雨林木风Linux Y1.5发布
- 十个优质编程网站,程序员们赶紧看过来!