windows-nt/Source/XPSP1/NT/admin/wmi/wbem/winmgmt/hiperstress/hiperstress.cpp
2020-09-26 16:20:57 +08:00

307 lines
5.8 KiB
C++

/*++
Copyright (C) 1998-2001 Microsoft Corporation
Module Name:
Abstract:
History:
--*/
/////////////////////////////////////////////////////////
//
// HiPerStress.cpp
//
// Created by a-dcrews, Oct. 6, 1998
//
/////////////////////////////////////////////////////////
#include "HiPerStress.h"
#include "Main.h"
#include <cominit.h>
long g_lRefThreadCount = 0; // Thread synchronization device
BOOL gbPound = FALSE;
CLocator *g_pLocator;
void test();
void DisplayWbemError(HRESULT hRes);
void UpdateSecurity(IUnknown* pUnk);
void main(int argc, char *argv[ ])
{
// Evaluate command line param's
if (argc > 1)
{
if (!strcmp(argv[1], "/pound"))
gbPound = TRUE;
}
printf(" WBEM Hi Performance Provider Stress Tool\n");
printf("==========================================================\n\n");
//Initialize DCOM
HRESULT hr = InitializeCom();
if (hr != S_OK)
{
printf("Failed to initialize COM\n");
return;
}
//Process level security
hr = InitializeSecurity(RPC_C_AUTHN_LEVEL_NONE, RPC_C_IMP_LEVEL_IMPERSONATE );
if (hr != S_OK)
{
printf("Failed to initialize COM security.\n");
goto end;
}
// Create Locator
g_pLocator = new CLocator;
if(!g_pLocator->Create())
goto end;
if (gbPound)
{
}
else
{
// Run the controled test
CRefTreeMain *pMain = new CRefTreeMain;
pMain->Create(KEY_REFROOT);
pMain->Go();
delete pMain;
}
delete g_pLocator;
end:
CoUninitialize();
}
void test()
{
// Create locator
IWbemLocator *pLoc;
DWORD dwRes = CoCreateInstance (CLSID_WbemLocator, 0,
CLSCTX_INPROC_SERVER,
IID_IWbemLocator, (LPVOID *) &pLoc);
if (FAILED(dwRes))
{
printf("Failed to create locator\n");
return;
}
// Connect to NameSpace
BSTR strNSPath = SysAllocString(L"\\\\a-dcrews1\\root\\default");
IWbemServices *pSvc;
dwRes = pLoc->ConnectServer (strNSPath, NULL, NULL, 0, 0, 0, 0, &pSvc);
SysFreeString(strNSPath);
if (FAILED(dwRes))
{
printf("Failed to create service\n");
return;
}
// Create an empty refresher.
IWbemRefresher *pRef;
IWbemConfigureRefresher *pCfg;
dwRes = CoCreateInstance(CLSID_WbemRefresher, 0, CLSCTX_SERVER,
IID_IWbemRefresher, (LPVOID *) &pRef);
if (FAILED(dwRes))
{
printf("Failed to create the refresher.\n");
return;
}
// Create the refresher manager.
dwRes = pRef->QueryInterface(IID_IWbemConfigureRefresher,
(LPVOID *) &pCfg);
if (FAILED(dwRes))
{
printf("**ERROR** Failed to create the refresher manager.");
return;
}
// Create an empty child-refresher.
IWbemRefresher *pChildRef;
IWbemConfigureRefresher *pChildCfg;
dwRes = CoCreateInstance(CLSID_WbemRefresher, 0, CLSCTX_SERVER,
IID_IWbemRefresher, (LPVOID *) &pChildRef);
if (FAILED(dwRes))
{
printf("Failed to create the Child refresher.\n");
return;
}
// Create the refresher manager.
dwRes = pChildRef->QueryInterface(IID_IWbemConfigureRefresher,
(LPVOID *) &pChildCfg);
if (FAILED(dwRes))
{
printf("**ERROR** Failed to create the Child refresher manager.");
return;
}
//Add object to child refresher
IWbemClassObject *pObj;
LONG lID;
dwRes = pChildCfg->AddObjectByPath(pSvc, L"Win32_Nt5PerfTest.Name=\"Inst_0\"", 0, 0,
&pObj, &lID);
if (FAILED(dwRes))
{
printf("**ERROR** Failed to add object to refresher");
return;
}
// Add the child to the parent refresher
dwRes = pCfg->AddRefresher(pChildRef, 0, &lID);
if (FAILED(dwRes))
{
printf("**ERROR** Failed to add refresher to refresher");
return;
}
BSTR strName = SysAllocString(L"Counter2");
VARIANT v;
VariantInit(&v);
LONG vt, flavor;
dwRes = pObj->Get(strName, 0, &v, &vt, &flavor);
if (FAILED(dwRes))
{
printf("Could not get counter value");
return;
}
printf("Initial counter value: %S\n", V_BSTR(&v));
VariantClear(&v);
// Refresh!
pRef->Refresh(0);
dwRes = pObj->Get(strName, 0, &v, &vt, &flavor);
if (FAILED(dwRes))
{
printf("Could not get counter value");
return;
}
printf("Final counter value: %S\n", V_BSTR(&v));
VariantClear(&v);
SysFreeString(strNSPath);
pChildRef->Release();
pChildCfg->Release();
pRef->Release();
pCfg->Release();
pSvc->Release();
pLoc->Release();
}
void UpdateSecurity(IUnknown* pUnk)
{
HRESULT hRes;
wprintf(L"\nUpdating Server Security...\n");
//Get Security Interface
IClientSecurity *pSecurity = 0;
hRes = pUnk->QueryInterface(IID_IClientSecurity, (LPVOID*)&pSecurity);
if (S_OK != hRes)
{
wprintf(L"Client Security Interface error.\n");
return;
}
//Change security states - echo pre- & post-change states of security
// TestSecurity(pSecurity, pUnk);
hRes = pSecurity->SetBlanket(pUnk,
RPC_C_AUTHN_WINNT,
RPC_C_AUTHZ_NONE,
NULL,
RPC_C_AUTHN_LEVEL_CONNECT,
RPC_C_IMP_LEVEL_IMPERSONATE,
NULL,
EOAC_NONE);
if (S_OK == hRes)
{
wprintf(L"Security Level Modified.\n");
// TestSecurity(pSecurity, pUnk);
}
else
wprintf(L"Security Modification Failed.\n");
pSecurity->Release();
return;
}
void DisplayWbemError(HRESULT hRes)
{
switch (hRes)
{
case WBEM_S_NO_ERROR:
break;
case WBEM_E_ACCESS_DENIED:
wprintf(L"WBEM_E_ACCESS_DENIED\n");
break;
case WBEM_E_FAILED:
wprintf(L"WBEM_E_FAILED\n");
break;
case WBEM_E_INVALID_CLASS:
wprintf(L"WBEM_E_INVALID_CLASS\n");
break;
case WBEM_E_INVALID_PARAMETER:
wprintf(L"WBEM_E_INVALID_PARAMETER\n");
break;
case WBEM_E_INVALID_OBJECT_PATH:
wprintf(L"WBEM_E_INVALID_OBJECT_PATH\n");
break;
case WBEM_E_NOT_FOUND:
wprintf(L"WBEM_E_NOT_FOUND\n");
break;
case WBEM_E_OUT_OF_MEMORY:
wprintf(L"WBEM_E_OUT_OF_MEMORY\n");
break;
case WBEM_E_TRANSPORT_FAILURE:
wprintf(L"WBEM_E_TRANSPORT_FAILURE\n");
break;
default:
wprintf(L"Unknown WBEM Error\n");
}
return;
}