www.pudn.com > Microsoft Windows驱动程序模型设计 源代码.zip > TEST.CPP


// Test.cpp - WMI test program 
// Copyright (C) 1999 by Walter Oney 
// All rights reserved 
 
#include "stdafx.h" 
#include  
#include "..\sys\guids.h" 
 
#define arraysize(p) (sizeof(p)/sizeof((p)[0])) 
 
void ReportError(LPCTSTR fcn, DWORD code); 
void ReportInfo(IWbemServices* services, LPCWSTR classname); 
 
/////////////////////////////////////////////////////////////////////////////// 
 
int main(int argc, LPTSTR argv[]) 
	{							// main 
	// Initialize COM and get a pointer to the WbemLocator interface. We must use 
	// the DCOM flavor of services on a computer where DCOM is installed. WBEMTEST 
	// loads ole32.dll and uses GetProcAddress to learn these addresses. This test 
	// program simply assumes that it's running in a DCOM-enabled environment. 
 
	HRESULT hr = CoInitializeEx(NULL, 0); 
	if (!SUCCEEDED(hr)) 
		{						// can't initialize COM 
		ReportError(_T("CoInitialize"), hr); 
		return 1; 
		}						// can't initialize COM 
 
	hr = CoInitializeSecurity(NULL, -1, NULL, NULL,  
		RPC_C_AUTHN_LEVEL_NONE, RPC_C_IMP_LEVEL_IMPERSONATE,  
		NULL, 0, 0); 
	if (!SUCCEEDED(hr)) 
		{						// can't fix security 
		ReportError(_T("CoInitializeSecurity"), hr); 
		CoUninitialize(); 
		return 1; 
		}						// can't fix security 
 
	IWbemLocator* locator; 
	hr = CoCreateInstance(CLSID_WbemLocator, NULL, CLSCTX_INPROC_SERVER, IID_IWbemLocator, (PVOID*) &locator); 
	if (SUCCEEDED(hr)) 
		{						// found locator 
 
		// Connect to the WMI server on this computer. Note that ConnectServer requires 
		// us to allocate a system string for the namespace argument -- a constant causes 
		// a crash in the WMI server. 
 
		IWbemServices* services; 
		BSTR pnamespace = SysAllocString(L"root\\WMI"); 
		hr = locator->ConnectServer(pnamespace, NULL, NULL, 0, 0, NULL, NULL, &services); 
		SysFreeString(pnamespace); 
		if (SUCCEEDED(hr)) 
			{					// found server 
 
			// Set the interface security to allow the server to impersonate us. Failing to 
			// to do this causes an "access denied" failure in CreateInstanceEnum. 
 
			IClientSecurity* security; 
			hr = services->QueryInterface(IID_IClientSecurity, (PVOID*) &security); 
			if (SUCCEEDED(hr)) 
				{				// set security 
				hr = security->SetBlanket(services, RPC_C_AUTHN_WINNT, RPC_C_AUTHZ_NONE, 
					NULL, RPC_C_AUTHN_LEVEL_CONNECT, RPC_C_IMP_LEVEL_IMPERSONATE, 
					NULL, EOAC_NONE); 
				if (!SUCCEEDED(hr)) 
					ReportError(_T("IClientSecurity::SetBlanket"), hr); 
				security->Release(); 
				}				// set security 
 
			// Report WMI information about the specified class 
 
			ReportInfo(services, L"Wmi42"); 
			services->Release(); 
			}					// found server 
		else 
			ReportError(_T("IWbemLocator::ConnectServer"), hr); 
 
		locator->Release(); 
		}						// found locator 
	else 
		ReportError(_T("CoCreateInstance(WbemLocator)"), hr); 
 
	CoUninitialize(); 
	return 0; 
	}							// main 
 
/////////////////////////////////////////////////////////////////////////////// 
 
void ReportInfo(IWbemServices* services, LPCWSTR classname) 
	{							// ReportInfo 
 
	// Open an instance enumerator for the class. 
 
	IEnumWbemClassObject* enumerator = NULL; 
	BSTR bs = SysAllocString(classname); 
	HRESULT hr = services->CreateInstanceEnum(bs, WBEM_FLAG_SHALLOW | WBEM_FLAG_RETURN_IMMEDIATELY | WBEM_FLAG_FORWARD_ONLY, NULL, &enumerator); 
	SysFreeString(bs); 
 
	if (SUCCEEDED(hr)) 
		{						// enumerate instances 
		while (TRUE) 
			{					// for each instance 
			ULONG junk;				 
			IWbemClassObject* cop = NULL; 
			hr = enumerator->Next(INFINITE, 1, &cop, &junk); // i.e., no timeout, 1 object wanted 
			if (hr == WBEM_S_FALSE) 
				break; 
			if (hr) 
				{ 
				ReportError(_T("IEnumWbemClassObject::Next"), hr); 
				break; 
				} 
 
			VARIANT instname; 
			BSTR propname; 
 
			// Determine the instance name 
 
			propname = SysAllocString(L"InstanceName"); 
			hr = cop->Get(propname, 0, &instname, NULL, NULL); 
			SysFreeString(propname); 
 
			if (!SUCCEEDED(hr)) 
				{				// can't get instance name 
				ReportError(_T("IWbemClassObject::Get(InstanceName)"), hr); 
				cop->Release(); 
				continue; 
				}				// can't get instance name 
 
			// Determine the current value of the property 
			 
			VARIANT answer; 
			propname = SysAllocString(L"TheAnswer"); 
			hr = cop->Get(propname, 0, &answer, NULL, NULL); 
 
			if (!SUCCEEDED(hr)) 
				{				// can't get instance name 
				ReportError(_T("IWbemClassObject::Get(TheAnswer)"), hr); 
				SysFreeString(propname); 
				cop->Release(); 
				continue; 
				}				// can't get instance name 
 
			printf(_T("The answer from %ws was %d\n"), instname.bstrVal, answer.lVal); 
 
			// Change the property value to be one bigger 
 
			++answer.lVal; 
			hr = cop->Put(propname, 0, &answer, 0); 
			if (SUCCEEDED(hr)) 
				{				// update instance 
				hr = services->PutInstance(cop, WBEM_FLAG_UPDATE_ONLY, NULL, NULL); 
				if (!SUCCEEDED(hr)) 
					ReportError(_T("IWbemServices::PutInstance"), hr); 
				}				// update instance 
			else 
				ReportError(_T("IWbemClassObject::Put(TheAnswer)"), hr); 
 
			SysFreeString(propname); 
			VariantClear(&instname); 
			VariantClear(&answer); 
			 
			cop->Release(); 
			} 
		enumerator->Release(); 
		} 
	else 
		ReportError("CreateInstanceEnum", hr); 
	}							// ReportInfo 
 
/////////////////////////////////////////////////////////////////////////////// 
 
void ReportError(LPCTSTR fcn, DWORD code) 
	{							// ReportError 
	static struct {DWORD code; LPTSTR text;} wmierrors[] = { 
		{WBEM_S_FALSE, _T("WBEM_S_FALSE")}, 
		{WBEM_S_ALREADY_EXISTS, _T("WBEM_S_ALREADY_EXISTS")}, 
		{WBEM_S_RESET_TO_DEFAULT, _T("WBEM_S_RESET_TO_DEFAULT")}, 
		{WBEM_S_DIFFERENT, _T("WBEM_S_DIFFERENT")}, 
		{WBEM_S_TIMEDOUT, _T("WBEM_S_TIMEDOUT")}, 
		{WBEM_S_NO_MORE_DATA, _T("WBEM_S_NO_MORE_DATA")}, 
		{WBEM_S_OPERATION_CANCELLED, _T("WBEM_S_OPERATION_CANCELLED")}, 
		{WBEM_S_PENDING, _T("WBEM_S_PENDING")}, 
		{WBEM_S_DUPLICATE_OBJECTS, _T("WBEM_S_DUPLICATE_OBJECTS")}, 
		{WBEM_E_FAILED, _T("WBEM_E_FAILED")}, 
		{WBEM_E_NOT_FOUND, _T("WBEM_E_NOT_FOUND")}, 
		{WBEM_E_ACCESS_DENIED, _T("WBEM_E_ACCESS_DENIED")}, 
		{WBEM_E_PROVIDER_FAILURE, _T("WBEM_E_PROVIDER_FAILURE")}, 
		{WBEM_E_TYPE_MISMATCH, _T("WBEM_E_TYPE_MISMATCH")}, 
		{WBEM_E_OUT_OF_MEMORY, _T("WBEM_E_OUT_OF_MEMORY")}, 
		{WBEM_E_INVALID_CONTEXT, _T("WBEM_E_INVALID_CONTEXT")}, 
		{WBEM_E_INVALID_PARAMETER, _T("WBEM_E_INVALID_PARAMETER")}, 
		{WBEM_E_NOT_AVAILABLE, _T("WBEM_E_NOT_AVAILABLE")}, 
		{WBEM_E_CRITICAL_ERROR, _T("WBEM_E_CRITICAL_ERROR")}, 
		{WBEM_E_INVALID_STREAM, _T("WBEM_E_INVALID_STREAM")}, 
		{WBEM_E_NOT_SUPPORTED, _T("WBEM_E_NOT_SUPPORTED")}, 
		{WBEM_E_INVALID_SUPERCLASS, _T("WBEM_E_INVALID_SUPERCLASS")}, 
		{WBEM_E_INVALID_NAMESPACE, _T("WBEM_E_INVALID_NAMESPACE")}, 
		{WBEM_E_INVALID_OBJECT, _T("WBEM_E_INVALID_OBJECT")}, 
		{WBEM_E_INVALID_CLASS, _T("WBEM_E_INVALID_CLASS")}, 
		{WBEM_E_PROVIDER_NOT_FOUND, _T("WBEM_E_PROVIDER_NOT_FOUND")}, 
		{WBEM_E_INVALID_PROVIDER_REGISTRATION, _T("WBEM_E_INVALID_PROVIDER_REGISTRATION")}, 
		{WBEM_E_PROVIDER_LOAD_FAILURE, _T("WBEM_E_PROVIDER_LOAD_FAILURE")}, 
		{WBEM_E_INITIALIZATION_FAILURE, _T("WBEM_E_INITIALIZATION_FAILURE")}, 
		{WBEM_E_TRANSPORT_FAILURE, _T("WBEM_E_TRANSPORT_FAILURE")}, 
		{WBEM_E_INVALID_OPERATION, _T("WBEM_E_INVALID_OPERATION")}, 
		{WBEM_E_INVALID_QUERY, _T("WBEM_E_INVALID_QUERY")}, 
		{WBEM_E_INVALID_QUERY_TYPE, _T("WBEM_E_INVALID_QUERY_TYPE")}, 
		{WBEM_E_ALREADY_EXISTS, _T("WBEM_E_ALREADY_EXISTS")}, 
		{WBEM_E_OVERRIDE_NOT_ALLOWED, _T("WBEM_E_OVERRIDE_NOT_ALLOWED")}, 
		{WBEM_E_PROPAGATED_QUALIFIER, _T("WBEM_E_PROPAGATED_QUALIFIER")}, 
		{WBEM_E_PROPAGATED_PROPERTY, _T("WBEM_E_PROPAGATED_PROPERTY")}, 
		{WBEM_E_UNEXPECTED, _T("WBEM_E_UNEXPECTED")}, 
		{WBEM_E_ILLEGAL_OPERATION, _T("WBEM_E_ILLEGAL_OPERATION")}, 
		{WBEM_E_CANNOT_BE_KEY, _T("WBEM_E_CANNOT_BE_KEY")}, 
		{WBEM_E_INCOMPLETE_CLASS, _T("WBEM_E_INCOMPLETE_CLASS")}, 
		{WBEM_E_INVALID_SYNTAX, _T("WBEM_E_INVALID_SYNTAX")}, 
		{WBEM_E_NONDECORATED_OBJECT, _T("WBEM_E_NONDECORATED_OBJECT")}, 
		{WBEM_E_READ_ONLY, _T("WBEM_E_READ_ONLY")}, 
		{WBEM_E_PROVIDER_NOT_CAPABLE, _T("WBEM_E_PROVIDER_NOT_CAPABLE")}, 
		{WBEM_E_CLASS_HAS_CHILDREN, _T("WBEM_E_CLASS_HAS_CHILDREN")}, 
		{WBEM_E_CLASS_HAS_INSTANCES, _T("WBEM_E_CLASS_HAS_INSTANCES")}, 
		{WBEM_E_QUERY_NOT_IMPLEMENTED, _T("WBEM_E_QUERY_NOT_IMPLEMENTED")}, 
		{WBEM_E_ILLEGAL_NULL, _T("WBEM_E_ILLEGAL_NULL")}, 
		{WBEM_E_INVALID_QUALIFIER_TYPE, _T("WBEM_E_INVALID_QUALIFIER_TYPE")}, 
		{WBEM_E_INVALID_PROPERTY_TYPE, _T("WBEM_E_INVALID_PROPERTY_TYPE")}, 
		{WBEM_E_VALUE_OUT_OF_RANGE, _T("WBEM_E_VALUE_OUT_OF_RANGE")}, 
		{WBEM_E_CANNOT_BE_SINGLETON, _T("WBEM_E_CANNOT_BE_SINGLETON")}, 
		{WBEM_E_INVALID_CIM_TYPE, _T("WBEM_E_INVALID_CIM_TYPE")}, 
		{WBEM_E_INVALID_METHOD, _T("WBEM_E_INVALID_METHOD")}, 
		{WBEM_E_INVALID_METHOD_PARAMETERS, _T("WBEM_E_INVALID_METHOD_PARAMETERS")}, 
		{WBEM_E_SYSTEM_PROPERTY, _T("WBEM_E_SYSTEM_PROPERTY")}, 
		{WBEM_E_INVALID_PROPERTY, _T("WBEM_E_INVALID_PROPERTY")}, 
		{WBEM_E_CALL_CANCELLED, _T("WBEM_E_CALL_CANCELLED")}, 
		{WBEM_E_SHUTTING_DOWN, _T("WBEM_E_SHUTTING_DOWN")}, 
		{WBEM_E_PROPAGATED_METHOD, _T("WBEM_E_PROPAGATED_METHOD")}, 
		{WBEM_E_UNSUPPORTED_PARAMETER, _T("WBEM_E_UNSUPPORTED_PARAMETER")}, 
		{WBEM_E_MISSING_PARAMETER_ID, _T("WBEM_E_MISSING_PARAMETER_ID")}, 
		{WBEM_E_INVALID_PARAMETER_ID, _T("WBEM_E_INVALID_PARAMETER_ID")}, 
		{WBEM_E_NONCONSECUTIVE_PARAMETER_IDS, _T("WBEM_E_NONCONSECUTIVE_PARAMETER_IDS")}, 
		{WBEM_E_PARAMETER_ID_ON_RETVAL, _T("WBEM_E_PARAMETER_ID_ON_RETVAL")}, 
		{WBEM_E_INVALID_OBJECT_PATH, _T("WBEM_E_INVALID_OBJECT_PATH")}, 
		{WBEM_E_OUT_OF_DISK_SPACE, _T("WBEM_E_OUT_OF_DISK_SPACE")}, 
		{WBEMESS_E_REGISTRATION_TOO_BROAD, _T("WBEMESS_E_REGISTRATION_TOO_BROAD")}, 
		{WBEMESS_E_REGISTRATION_TOO_PRECISE, _T("WBEMESS_E_REGISTRATION_TOO_PRECISE")}, 
		}; 
 
	LPTSTR msg = NULL; 
 
	if (FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, 
		NULL, code, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), 
		(LPTSTR) &msg, 0, NULL)) 
 
		_tprintf(_T("Error %8.8lX in %s: %s\n"), code, fcn, msg); 
	else 
		{						// not a standard message 
		for (int i = 0; i < arraysize(wmierrors); ++i) 
			if (wmierrors[i].code == code) 
				break; 
		if (i < arraysize(wmierrors)) 
			_tprintf(_T("Error %8.8lX in %s: %s\n"), code, fcn, wmierrors[i].text); 
		else 
			_tprintf(_T("Error %8.8lX in %s\n"), code, fcn); 
		}						// not a standard message 
 
	if (msg) 
		LocalFree((LPVOID) msg); 
	}							// ReportError