You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
226 lines
7.1 KiB
226 lines
7.1 KiB
//////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Copyright (c) 1999-2000 Microsoft Corporation
|
|
//
|
|
// Module Name:
|
|
// oemconfigdll.cpp
|
|
//
|
|
// Description:
|
|
// Implementation of GetUniqueSuffix function
|
|
// which returns a unique suffix to the caller
|
|
//
|
|
// Author:
|
|
// Alp Onalan Created: Oct 6 2000
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////
|
|
#include "stdafx.h"
|
|
#include "..\saconfig\saconfigcommon.h"
|
|
#include <atlimpl.cpp>
|
|
|
|
const WCHAR REGSTR_VAL_WMICLASSNAME[]=L"WMIClassName";
|
|
const WCHAR REGSTR_VAL_WMIPROPERTYNAME[]=L"WMIPropertyName";
|
|
|
|
const WCHAR WSZ_NAMESPACE[]=L"\\\\.\\root\\cimv2";
|
|
|
|
#define BLOCKSIZE (32 * sizeof(WCHAR))
|
|
#define CVTBUFSIZE (309+40) /* # of digits in max. dp value + slop (this size stolen from cvt.h in c runtime library) */
|
|
|
|
bool GetWMISettings(WCHAR *wszWMIClassName,WCHAR *wszWMIPropertyName)
|
|
{
|
|
|
|
bool fRes=true;
|
|
DWORD dwSize=0;
|
|
CRegKey hConfigKey;
|
|
LONG lRes=0;
|
|
|
|
|
|
do{
|
|
lRes=hConfigKey.Open(HKEY_LOCAL_MACHINE,
|
|
REGKEY_SACONFIG,
|
|
KEY_READ);
|
|
|
|
if(lRes!=ERROR_SUCCESS)
|
|
{
|
|
SATracePrintf("Unable to open saconfig regkey, lRes= %x", lRes);
|
|
fRes=false;
|
|
break;
|
|
}
|
|
|
|
lRes=hConfigKey.QueryValue(NULL,REGSTR_VAL_WMICLASSNAME,&dwSize);
|
|
lRes=hConfigKey.QueryValue(wszWMIClassName,REGSTR_VAL_WMICLASSNAME,&dwSize);
|
|
if(lRes!=ERROR_SUCCESS)
|
|
{
|
|
SATracePrintf("Unable to query WMIClassName regkey lRes= %x",lRes);
|
|
fRes=false;
|
|
break;
|
|
}
|
|
|
|
lRes=hConfigKey.QueryValue(NULL,REGSTR_VAL_WMIPROPERTYNAME,&dwSize);
|
|
lRes=hConfigKey.QueryValue(wszWMIPropertyName,REGSTR_VAL_WMIPROPERTYNAME,&dwSize);
|
|
|
|
if(lRes!=ERROR_SUCCESS)
|
|
{
|
|
SATracePrintf("Unable to query WMIPropertyName regkey lRes= %x",lRes);
|
|
fRes=false;
|
|
break;
|
|
}
|
|
}while(false);
|
|
|
|
if(hConfigKey.m_hKey)
|
|
{
|
|
hConfigKey.Close();
|
|
}
|
|
|
|
return fRes;
|
|
}
|
|
|
|
STDAPI GetUniqueSuffix (WCHAR *wszUniqueSuffix)
|
|
{
|
|
WCHAR *wszWMIClassName=new WCHAR[NAMELENGTH];
|
|
WCHAR *wszWMIPropertyName=new WCHAR[NAMELENGTH];
|
|
|
|
SATraceString("OEMDLL::GetUniqueSuffix called");
|
|
|
|
HRESULT hRes=S_OK;
|
|
hRes=CoInitialize(NULL);
|
|
do
|
|
{
|
|
if(false==GetWMISettings(wszWMIClassName,wszWMIPropertyName))
|
|
{
|
|
SATracePrintf("OEMDLL::GetUniqueSuffix: GetWMISettings failed %x", hRes);
|
|
break;
|
|
}
|
|
|
|
if(hRes!=S_OK)
|
|
{
|
|
// break;
|
|
}
|
|
|
|
hRes = CoInitializeSecurity( NULL, -1, NULL, NULL,
|
|
RPC_C_AUTHN_LEVEL_PKT_PRIVACY,
|
|
RPC_C_IMP_LEVEL_IDENTIFY,
|
|
NULL, EOAC_NONE, 0);
|
|
if(hRes!=S_OK)
|
|
{
|
|
SATracePrintf("OEMDLL::GetUniqueSuffix: CoInitializeSecurity failed, hRes= %x,getlasterr= %x", hRes,GetLastError());
|
|
//break;
|
|
}
|
|
|
|
//
|
|
// Create an instance of the WbemLocator interface.
|
|
//
|
|
CComPtr<IWbemLocator> pIWbemLocator;
|
|
hRes=CoCreateInstance(CLSID_WbemLocator,
|
|
NULL,
|
|
CLSCTX_INPROC_SERVER,
|
|
IID_IWbemLocator,
|
|
(LPVOID *) &pIWbemLocator);
|
|
|
|
if(FAILED(hRes))
|
|
{
|
|
SATracePrintf("OEMDLL::GetUniqueSuffix: CoCreatInstance(IWbemLocator) failed, hRes= %x,getlasterr= %x", hRes,GetLastError());
|
|
break;
|
|
}
|
|
|
|
//
|
|
// Using the locator, connect to CIMOM in the given namespace.
|
|
//
|
|
BSTR bstrNamespace = SysAllocString(WSZ_NAMESPACE);
|
|
|
|
CComPtr<IWbemServices> pIWbemServices;
|
|
hRes=pIWbemLocator->ConnectServer(bstrNamespace,
|
|
NULL, //using current account
|
|
NULL, //using current password
|
|
0L, // locale
|
|
0L, // securityFlags
|
|
NULL, // authority (domain for NTLM)
|
|
NULL, // context
|
|
&pIWbemServices);
|
|
SysFreeString(bstrNamespace);
|
|
|
|
if(hRes!=WBEM_S_NO_ERROR)
|
|
{
|
|
SATracePrintf("OEMDLL::GetUniqueSuffix: ConnectServer failed, hRes= %x,getlasterr= %x", hRes,GetLastError());
|
|
|
|
break;
|
|
}
|
|
|
|
//
|
|
//Create an enumeration of the object(s)
|
|
//
|
|
BSTR bstrClassName;
|
|
bstrClassName = SysAllocString(wszWMIClassName);
|
|
CComPtr<IEnumWbemClassObject> pEnum;
|
|
hRes = pIWbemServices->CreateInstanceEnum(bstrClassName,
|
|
WBEM_FLAG_SHALLOW,
|
|
NULL,
|
|
&pEnum);
|
|
SysFreeString(bstrClassName);
|
|
|
|
if (hRes!=WBEM_S_NO_ERROR)
|
|
{
|
|
SATracePrintf("OEMDLL::GetUniqueSuffix:CreateInstanceEnum failed, hRes= %x,getlasterr= %x", hRes,GetLastError());
|
|
|
|
break;
|
|
}
|
|
|
|
|
|
//
|
|
// Pull the object from the enumeration (there's only one)
|
|
//
|
|
ULONG uReturned = 1;
|
|
CComPtr<IWbemClassObject> pWin32BIOS;
|
|
hRes=pEnum -> Next( WBEM_INFINITE, // timeout value - this one is blocking
|
|
1, // return just one object
|
|
&pWin32BIOS, // pointer to the object
|
|
&uReturned); // number obtained: one or zero
|
|
|
|
if (hRes!=WBEM_S_NO_ERROR)
|
|
{
|
|
SATracePrintf("OEMDLL::GetUniqueSuffix:pEnum->Next failed, hRes= %x,getlasterr= %x", hRes,GetLastError());
|
|
|
|
break;
|
|
}
|
|
|
|
VARIANT varSerialNumber;
|
|
VariantInit(&varSerialNumber);
|
|
//
|
|
// Get the desired property from the object
|
|
//
|
|
hRes = pWin32BIOS->Get(wszWMIPropertyName, 0L, &varSerialNumber, NULL, NULL);
|
|
|
|
if (hRes!=WBEM_S_NO_ERROR)
|
|
{
|
|
SATracePrintf("OEMDLL::GetUniqueSuffix:pWin32BIOS->Get failed, hRes= %x,getlasterr= %x", hRes,GetLastError());
|
|
break;
|
|
}
|
|
|
|
//ValueToString(&varSerialNumber,&wszUniqueSuffix);
|
|
|
|
if( VT_BSTR != V_VT(&varSerialNumber))
|
|
{
|
|
SATraceString("OEMDLL:WMI property is not CIM_STRING.Currently other types are not supported");
|
|
break;
|
|
}
|
|
BSTR bstrSerialNumber=SysAllocString(V_BSTR(&varSerialNumber));
|
|
wcscpy(wszUniqueSuffix,bstrSerialNumber);
|
|
|
|
SysFreeString(bstrSerialNumber);
|
|
VariantClear(&varSerialNumber);
|
|
|
|
|
|
}while(false);
|
|
|
|
CoUninitialize();
|
|
return hRes;
|
|
}
|
|
|
|
|
|
BOOL APIENTRY DllMain( HANDLE hModule,
|
|
DWORD ul_reason_for_call,
|
|
LPVOID lpReserved
|
|
)
|
|
{
|
|
SATraceString("OEMConfigdll.dll loaded");
|
|
return TRUE;
|
|
}
|