装机精灵功能实现猜想(驱动安装)

一、驱动安装

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

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值