Source code of Windows XP (NT5)
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.

358 lines
8.7 KiB

  1. ///////////////////////////////////////////////////////////////////////////////////////////////////////
  2. //
  3. // Test app to test the hi perf portion of the WMIPROV.DLL
  4. //
  5. ///////////////////////////////////////////////////////////////////////////////////////////////////////
  6. #include <windows.h>
  7. #include <process.h>
  8. //#include <objbase.h>
  9. #include <stdio.h>
  10. #include <wbemcli.h>
  11. //#include <wbemint.h>
  12. //#include <wbemcomn.h>
  13. //#include <cominit.h>
  14. ///////////////////////////////////////////////////////////////////////////////////////////////////////
  15. HRESULT WbemSetProxyBlanket( IUnknown *pInterface, DWORD dwAuthnSvc, DWORD dwAuthzSvc, OLECHAR *pServerPrincName,
  16. DWORD dwAuthLevel, DWORD dwImpLevel, RPC_AUTH_IDENTITY_HANDLE pAuthInfo,
  17. DWORD dwCapabilities )
  18. {
  19. IUnknown * pUnk = NULL;
  20. IClientSecurity * pCliSec = NULL;
  21. HRESULT sc = pInterface->QueryInterface(IID_IUnknown, (void **) &pUnk);
  22. if(sc != S_OK)
  23. return sc;
  24. sc = pInterface->QueryInterface(IID_IClientSecurity, (void **) &pCliSec);
  25. if(sc != S_OK)
  26. {
  27. pUnk->Release();
  28. return sc;
  29. }
  30. sc = pCliSec->SetBlanket(pInterface, dwAuthnSvc, dwAuthzSvc, pServerPrincName, dwAuthLevel, dwImpLevel, pAuthInfo, dwCapabilities);
  31. pCliSec->Release();
  32. pCliSec = NULL;
  33. sc = pUnk->QueryInterface(IID_IClientSecurity, (void **) &pCliSec);
  34. if(sc == S_OK)
  35. {
  36. sc = pCliSec->SetBlanket(pUnk, dwAuthnSvc, dwAuthzSvc, pServerPrincName, dwAuthLevel, dwImpLevel, pAuthInfo, dwCapabilities);
  37. pCliSec->Release();
  38. }
  39. else if (sc == 0x80004002)
  40. sc = S_OK;
  41. pUnk->Release();
  42. return sc;
  43. }
  44. ///////////////////////////////////////////////////////////////////////////////////////////////////////
  45. //
  46. // Function: main
  47. //
  48. ///////////////////////////////////////////////////////////////////////////////////////////////////////
  49. #define NUMINSTANCES 1
  50. IWbemServices* g_pNameSpace = NULL;
  51. WCHAR g_wcsObjectPath[2048];
  52. DWORD g_dwNumReps = 1;
  53. DWORD g_dwNumThreads = 1;
  54. BOOL g_fAddDel = FALSE;
  55. unsigned __stdcall RefreshThread( void * pvData )
  56. {
  57. DWORD dwThreadId = (DWORD) pvData;
  58. IWbemRefresher* pRefresher = NULL;
  59. IWbemConfigureRefresher* pConfig = NULL;
  60. BOOL fEnum = FALSE;
  61. CoInitializeEx( NULL, COINIT_MULTITHREADED );
  62. HRESULT hr = CoCreateInstance( CLSID_WbemRefresher, NULL, CLSCTX_INPROC_SERVER, IID_IWbemRefresher, (void**) &pRefresher );
  63. if ( SUCCEEDED( hr ) )
  64. {
  65. IWbemConfigureRefresher* pConfig = NULL;
  66. // Need an interface through which we can configure the refresher
  67. hr = pRefresher->QueryInterface( IID_IWbemConfigureRefresher, (void**) &pConfig );
  68. if ( SUCCEEDED( hr ) )
  69. {
  70. IWbemClassObject* pRefreshable = NULL;
  71. IWbemHiPerfEnum* pEnum = NULL;
  72. long lID = 0;
  73. IWbemObjectAccess* pObjAccess = NULL;
  74. IWbemClassObject* pObj = NULL;
  75. // Add an object or an enumerator. If the path to the object contains
  76. // an L'=', then it is an object path, otherwise we assume it is a class
  77. // name and therefore return an enumerator.
  78. if ( NULL != wcschr( g_wcsObjectPath, L'=' ) )
  79. {
  80. if ( !g_fAddDel )
  81. {
  82. hr = pConfig->AddObjectByPath( g_pNameSpace, g_wcsObjectPath, 0, NULL, &pObj, &lID );
  83. if ( SUCCEEDED( hr ) )
  84. {
  85. pObj->QueryInterface( IID_IWbemObjectAccess, (void**) &pObjAccess );
  86. pObj->Release();
  87. }
  88. else
  89. {
  90. printf( "AddObjectByPath() failed, 0x%x\n", hr );
  91. }
  92. }
  93. }
  94. else
  95. {
  96. if ( !g_fAddDel )
  97. {
  98. hr = pConfig->AddEnum( g_pNameSpace, g_wcsObjectPath, 0, NULL, &pEnum, &lID );
  99. if ( FAILED(hr) )
  100. {
  101. printf( "AddEnum() failed, 0x%x\n", hr );
  102. }
  103. }
  104. fEnum = TRUE;
  105. }
  106. // Add an object and then the enumerator
  107. if ( SUCCEEDED( hr ) )
  108. {
  109. DWORD dwNumReturned = NUMINSTANCES;
  110. BOOL fGotHandles = 0;
  111. DWORD dwValue = 0,
  112. dwNumObjects = 0;
  113. WORD wValue = 0;
  114. BYTE bVal = 0;
  115. IWbemObjectAccess** apEnumAccess = NULL;
  116. for ( DWORD x = 0; SUCCEEDED( hr ) && x < g_dwNumReps; x++ )
  117. {
  118. if ( g_fAddDel )
  119. {
  120. if ( fEnum )
  121. {
  122. hr = pConfig->AddEnum( g_pNameSpace, g_wcsObjectPath, 0, NULL, &pEnum, &lID );
  123. }
  124. else
  125. {
  126. hr = pConfig->AddObjectByPath( g_pNameSpace, g_wcsObjectPath, 0, NULL, &pObj, &lID );
  127. if ( SUCCEEDED( hr ) )
  128. {
  129. pObj->QueryInterface( IID_IWbemObjectAccess, (void**) &pObjAccess );
  130. pObj->Release();
  131. }
  132. }
  133. }
  134. // Refresh and if we have an enumerator, retrieve the
  135. // objects and release them
  136. hr = pRefresher->Refresh( 0L );
  137. if ( pEnum )
  138. {
  139. hr = pEnum->GetObjects( 0L, dwNumObjects, apEnumAccess, &dwNumReturned );
  140. if ( FAILED( hr ) && WBEM_E_BUFFER_TOO_SMALL == hr )
  141. {
  142. IWbemObjectAccess** apTempAccess = new IWbemObjectAccess*[dwNumReturned];
  143. if ( NULL != apTempAccess )
  144. {
  145. ZeroMemory( apTempAccess, dwNumReturned * sizeof(IWbemObjectAccess*) );
  146. if ( NULL != apEnumAccess )
  147. {
  148. CopyMemory( apTempAccess, apEnumAccess, dwNumObjects * sizeof(IWbemObjectAccess*) );
  149. delete [] apEnumAccess;
  150. }
  151. // Store the new values and retry
  152. apEnumAccess = apTempAccess;
  153. dwNumObjects = dwNumReturned;
  154. hr = pEnum->GetObjects( 0L, dwNumObjects, apEnumAccess, &dwNumReturned );
  155. }
  156. else
  157. {
  158. hr = WBEM_E_OUT_OF_MEMORY;
  159. }
  160. } // IF Buffer too small
  161. for ( DWORD nCtr = 0; nCtr < dwNumReturned; nCtr++ )
  162. {
  163. apEnumAccess[nCtr]->Release();
  164. }
  165. } // IF refresh succeeded
  166. printf ( "Thread %d Refreshed %d instances of %S from provider: rep# %d\n", dwThreadId, dwNumReturned, g_wcsObjectPath, x );
  167. if ( g_fAddDel )
  168. {
  169. if ( fEnum )
  170. {
  171. pConfig->Remove( lID, 0L );
  172. if (pEnum)
  173. pEnum->Release();
  174. }
  175. else
  176. {
  177. if (pObjAccess)
  178. pObjAccess->Release();
  179. pObjAccess = NULL;
  180. }
  181. }
  182. } // FOR Refresh
  183. // Release anything we got back from the refresher and any
  184. // memory we may have allocated.
  185. if ( fEnum )
  186. {
  187. if ( !g_fAddDel && pEnum )
  188. pEnum->Release();
  189. if ( NULL != apEnumAccess )
  190. {
  191. delete [] apEnumAccess;
  192. }
  193. }
  194. else
  195. {
  196. if ( !g_fAddDel && pObjAccess)
  197. pObjAccess->Release();
  198. }
  199. }
  200. if (pConfig)
  201. pConfig->Release();
  202. }
  203. // Cleanup
  204. g_pNameSpace->Release();
  205. }
  206. if ( NULL != pRefresher )
  207. pRefresher->Release();
  208. CoUninitialize();
  209. return 0;
  210. }
  211. extern "C" int __cdecl main( int argc, char *argv[] )
  212. {
  213. WCHAR wcsSvrName[256];
  214. BOOL fEnum = FALSE;
  215. wcscpy( wcsSvrName, L"." );
  216. CoInitializeEx( NULL, COINIT_MULTITHREADED );
  217. // InitializeSecurity(RPC_C_AUTHN_LEVEL_NONE, RPC_C_IMP_LEVEL_IMPERSONATE );
  218. // See if we were told to go remote or not.
  219. if ( argc > 1 )
  220. {
  221. MultiByteToWideChar( CP_ACP, 0L, argv[1], -1, g_wcsObjectPath, 2048 );
  222. if ( argc > 2 )
  223. {
  224. g_fAddDel = strtoul( argv[2], NULL, 10 );
  225. if ( argc > 3 )
  226. {
  227. g_dwNumReps = strtoul( argv[3], NULL, 10 );
  228. if ( argc > 4 )
  229. {
  230. g_dwNumThreads = strtoul( argv[4], NULL, 10 );
  231. if ( argc > 5 )
  232. {
  233. MultiByteToWideChar( CP_ACP, 0L, argv[5], -1, wcsSvrName, 2048 );
  234. }
  235. }
  236. }
  237. }
  238. }
  239. else
  240. {
  241. printf( "No object path!\n" );
  242. printf( "Usage: refreshertest.exe <object_path> <delete_object> <Num_Refreshes> <Num_threads> <Server - Opt>\n" );
  243. return 0;
  244. }
  245. IWbemLocator* pWbemLocator = NULL;
  246. HRESULT hr = CoCreateInstance( CLSID_WbemLocator, NULL, CLSCTX_INPROC_SERVER, IID_IWbemLocator, (void**) &pWbemLocator );
  247. WCHAR wszNameSpace[255];
  248. swprintf( wszNameSpace, L"\\\\%s\\root\\wmi", wcsSvrName );
  249. // Name space to connect to
  250. BSTR bstrNameSpace = SysAllocString( wszNameSpace );
  251. hr = pWbemLocator->ConnectServer( bstrNameSpace, // NameSpace Name
  252. NULL, // UserName
  253. NULL, // Password
  254. NULL, // Locale
  255. 0L, // Security Flags
  256. NULL, // Authority
  257. NULL, // Wbem Context
  258. &g_pNameSpace // Namespace
  259. );
  260. SysFreeString( bstrNameSpace );
  261. if ( SUCCEEDED( hr ) )
  262. {
  263. WbemSetProxyBlanket(g_pNameSpace, RPC_C_AUTHN_WINNT, RPC_C_AUTHZ_NONE, NULL, RPC_C_AUTHN_LEVEL_CONNECT,
  264. RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE );
  265. HANDLE* ahThreads = new HANDLE[g_dwNumThreads];
  266. for ( DWORD dwCtr = 0; dwCtr < g_dwNumThreads; dwCtr++ )
  267. {
  268. ahThreads[dwCtr] = (HANDLE) _beginthreadex( NULL, 0, RefreshThread, (void*) dwCtr, 0, NULL );
  269. Sleep(1000);
  270. }
  271. // Wait for all the threads to get signalled
  272. WaitForMultipleObjects( g_dwNumThreads, ahThreads, TRUE, INFINITE );
  273. delete [] ahThreads;
  274. }
  275. // Cleanup main objects
  276. if ( NULL != pWbemLocator )
  277. pWbemLocator->Release();
  278. CoUninitialize();
  279. return 0;
  280. }