一、驱动安装

首先利用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; 
 } 
}

装机精灵功能实现猜想(驱动安装)相关推荐

  1. HP光影精灵3 TPN-Q193显卡驱动安装不上,鲁大师检测不到显卡

    CPU:I5-7300HQ 独立显卡:NVIDIA GeForce GTX1050 2g 板号:dag75ambad0 REV:D 拆机查看图纸点位,测量显卡的供电时钟复位均正常,刷BIOS无果,最后 ...

  2. pci串口驱动安装失败_TSC TTP-243E Pluse装LTP并口驱动无法安装

    一.前言描述 接到客户报修说,电脑无法开机,即到哥上门维修立即安排人员到现场查看原因,到现场后,查看的确是电脑系统问题,重新安装系统,安装完成系统后,发现打印机无法使用.这个打印机型号是TSC TTP ...

  3. 服务器驱动精灵_驱动精灵真的可以帮你安装驱动吗?别再无脑装驱动了

    之前和大家讲过一期安装官方纯净系统的方法,戳我查看然后很多人就说重装之后显卡驱动掉了打游戏卡的跟PPT一样.于是很多人在重装系统或是进行了重大硬件更新后,一般会采用第三方驱动管理软件来进行硬件的更新, ...

  4. 没有网络的计算机怎么装驱动程序,装机后电脑没有网络的情况下,驱动人生6教你首先将网卡驱动安装好...

    驱动人生6在管理驱动.更新驱动等方面给童鞋们提供了很多方便,但如果童鞋们的电脑在没联网的情况下,却不能用驱动人生6来更新电脑驱动.驱动人生的工程师们不断努力,日夜开发,带网卡版驱动人生6终于发布官网抢 ...

  5. ubuntu环境下,ubuntu16.04装机到nvdia显卡驱动安装、cuda8安装、cudnn安装

    首先是安装ubuntu16.04 A.制作u盘启动盘(提前准备好.ios文件): 1.安装u盘制作工具unetbootin sudo apt-get install unetbootin 2.格式化u ...

  6. 罗技mx5000驱动安装,实现所有功能(不用罗技原装接收器)

    最近对无线键鼠开始感兴趣,开始本想买普通的2.4G的,结果发现罗技mx5000,这么便宜,于是赶紧就定了一套.上个星期刚到货,结果本来一个简单的驱动安装,搞了我一天,才安好.留下帖子给将要入该套装的网 ...

  7. 新win7系统死机,打开驱动精灵就卡住,解决方案 安装戴尔DELL Optilex 7040 USB驱动时提示无法定位程序输入点 kernel32.dll,解决方案

    新win7系统死机,打开驱动精灵就卡住,解决方案 安装戴尔DELL Optilex 7040 USB驱动时提示无法定位程序输入点 kernel32.dll,解决方案 原因: 新系统打卡驱动精灵卡死其实 ...

  8. 什么是软件精灵?软件精灵功能介绍

    第一次听到软件精灵这个名称,相信应该有朋友跟小编一样纳闷软件精灵是什么东东?其实,每一次改进,每一次新功能模块的加入都是从满足用户的基本需求出发,像最开始推出驱动精灵的初衷也是发现用户查找安装程序不太 ...

  9. html安装网卡驱动,如何手动安装无线网卡驱动,网卡驱动安装教程

    无线网卡怎么用? 其实无线网卡使用方法非常简单,安装驱动精灵后,打开驱动精灵软件会自动检测与扫描电脑中的硬件,当发现有硬件驱动不正常或者没有安装就会给出提示,我们只要按着提示安装下载即可完成无线网卡驱 ...

最新文章

  1. P5137-polynomial【倍增】
  2. 实战项目| 7天掌握神经网络预测模型
  3. 人类遗传变异神库 | ClinVar数据库详解
  4. Linux怎么添加交换空间,如何在Ubuntu上增加swap交换空间
  5. android leaks工具,Androidx中ImmLeaksCleaner已经解决了InputMethodManager... - 简书
  6. baq在聊天中啥意思_职场中的“老实人”如何实现逆袭,得到领导的重用?
  7. 深入理解Unity刚体(Rigidbody)、碰撞器(Collider)、触发器(Trigger)
  8. 学习C++项目—— 计算机网络编程基础 和 学习多线程,多进程基础
  9. php xml与数组的转换函数
  10. 深度学习自学(二十六):人脸关键点检测
  11. 应届生面试应答需要注意哪些事项及技巧?
  12. 《精进》的读后感作文2600字
  13. 腾讯云离线语音识别sdk
  14. python远程主机强迫关闭了_[转] python 远程主机强迫关闭了一个现有的连接 socket 超时设置 errno 10054...
  15. pytorch一小时速成
  16. 工程实践 | 在 Flutter 中实现一个精准的滑动埋点
  17. 【转载】KAB春纳 | 一同乘风破浪吧
  18. 用python画小鸭_python中的鸭子类型(协议)和接口
  19. 基于Ubuntu9.10 雨林木风Linux Y1.5发布
  20. 十个优质编程网站,程序员们赶紧看过来!

热门文章

  1. 十进制转二进制转换c语言程序,二进制转十进制c程序_c语言二进制转十进制
  2. 【毕业设计】SSM校园求职招聘系统的设计与实现
  3. csdn设置皮肤背景
  4. 基于深度学习的多特征电力负荷预测(Python代码实现)
  5. Ubuntu常用操作(本人)
  6. XC6VLX240T-1FFG1156小知识
  7. 可以同时合并不同尺寸不同格式视频的视频合并工具
  8. 在vue项目中使用AntV L7地图下钻,异步调用不重复生成
  9. 关键数据结构 -- sk_buff
  10. Oracle中导出TA组织架构