96 lines
2.3 KiB
C++
96 lines
2.3 KiB
C++
|
/*++
|
||
|
|
||
|
Copyright (c) Microsoft Corporation. All rights reserved.
|
||
|
|
||
|
For Internal use only!
|
||
|
|
||
|
Module Name:
|
||
|
|
||
|
INFSCAN
|
||
|
infscan.cpp
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
Access to private SetupAPI functions
|
||
|
|
||
|
History:
|
||
|
|
||
|
Created July 2001 - JamieHun
|
||
|
|
||
|
--*/
|
||
|
|
||
|
#include "precomp.h"
|
||
|
#pragma hdrstop
|
||
|
|
||
|
SetupPrivate::SetupPrivate()
|
||
|
{
|
||
|
Fn_pSetupGetInfSections = NULL;
|
||
|
Fn_SetupEnumInfSections = NULL;
|
||
|
hSetupAPI = LoadLibrary(TEXT("setupapi.dll"));
|
||
|
if(hSetupAPI) {
|
||
|
Fn_SetupEnumInfSections = (Type_SetupEnumInfSections)GetProcAddress(hSetupAPI,"SetupEnumInfSectionsW");
|
||
|
Fn_pSetupGetInfSections = (Type_pSetupGetInfSections)GetProcAddress(hSetupAPI,"pSetupGetInfSections");
|
||
|
if(!Fn_pSetupGetInfSections) {
|
||
|
Fn_pSetupGetInfSections = (Type_pSetupGetInfSections)GetProcAddress(hSetupAPI,"SetupGetInfSections");
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
SetupPrivate::~SetupPrivate()
|
||
|
{
|
||
|
if(hSetupAPI) {
|
||
|
FreeLibrary(hSetupAPI);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
bool SetupPrivate::GetInfSections(HINF hInf,StringList & sections)
|
||
|
{
|
||
|
if(Fn_SetupEnumInfSections) {
|
||
|
return GetInfSectionsNewWay(hInf,sections);
|
||
|
}
|
||
|
if(Fn_pSetupGetInfSections) {
|
||
|
return GetInfSectionsOldWay(hInf,sections);
|
||
|
}
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
bool SetupPrivate::GetInfSectionsOldWay(HINF hInf,StringList & sections)
|
||
|
{
|
||
|
UINT Size;
|
||
|
UINT SizeNeeded;
|
||
|
if(Fn_pSetupGetInfSections(hInf,NULL,0,&SizeNeeded) || GetLastError() == ERROR_INSUFFICIENT_BUFFER) {
|
||
|
SizeNeeded+=2;
|
||
|
PWSTR text = new WCHAR[SizeNeeded];
|
||
|
if(!text) {
|
||
|
return false;
|
||
|
}
|
||
|
if(!Fn_pSetupGetInfSections(hInf,text,SizeNeeded,NULL)) {
|
||
|
delete [] text;
|
||
|
return false;
|
||
|
}
|
||
|
PWSTR str = text;
|
||
|
sections.clear();
|
||
|
while(*str) {
|
||
|
_wcslwr(str);
|
||
|
sections.push_back(ConvertString(str));
|
||
|
str+=wcslen(str)+1;
|
||
|
}
|
||
|
delete [] text;
|
||
|
return true;
|
||
|
}
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
|
||
|
bool SetupPrivate::GetInfSectionsNewWay(HINF hInf,StringList & sections)
|
||
|
{
|
||
|
WCHAR buf[256];
|
||
|
int inc;
|
||
|
for(inc = 0; Fn_SetupEnumInfSections(hInf,inc,buf,ASIZE(buf),NULL); inc++) {
|
||
|
_wcslwr(buf);
|
||
|
sections.push_back(ConvertString(buf));
|
||
|
}
|
||
|
return inc ? true : false;
|
||
|
}
|
||
|
|