一、驱动安装
首先利用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;
}
}