Leaked source code of windows server 2003
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.

597 lines
15 KiB

  1. //***************************************************************************
  2. //
  3. // PodProv.CPP
  4. //
  5. // Module: Sample WMIprovider (SCE attachment)
  6. //
  7. // Purpose: Defines the CPodTestProv class. An object of this class is
  8. // created by the class factory for each connection.
  9. //
  10. // Copyright (c) 1997-1999 Microsoft Corporation
  11. //
  12. //***************************************************************************
  13. #include "podprov.h"
  14. #include "requestobject.h"
  15. // #define _MT
  16. #include <process.h>
  17. CHeap_Exception CPodTestProv::m_he(CHeap_Exception::E_ALLOCATION_ERROR);
  18. //***************************************************************************
  19. //
  20. // CPodTestProv::CPodTestProv
  21. // CPodTestProv::~CPodTestProv
  22. //
  23. //***************************************************************************
  24. CPodTestProv::CPodTestProv()
  25. {
  26. m_cRef=0;
  27. m_pNamespace = NULL;
  28. InterlockedIncrement(&g_cObj);
  29. return;
  30. }
  31. CPodTestProv::~CPodTestProv(void)
  32. {
  33. if(m_pNamespace) m_pNamespace->Release();
  34. InterlockedDecrement(&g_cObj);
  35. return;
  36. }
  37. //***************************************************************************
  38. //
  39. // CPodTestProv::QueryInterface
  40. // CPodTestProv::AddRef
  41. // CPodTestProv::Release
  42. //
  43. // Purpose: IUnknown members for CPodTestProv object.
  44. //***************************************************************************
  45. STDMETHODIMP CPodTestProv::QueryInterface(REFIID riid, PPVOID ppv)
  46. {
  47. *ppv=NULL;
  48. // Since we have dual inheritance, it is necessary to cast the return type
  49. if(riid== IID_IWbemServices)
  50. *ppv=(IWbemServices*)this;
  51. if(IID_IUnknown==riid || riid== IID_IWbemProviderInit)
  52. *ppv=(IWbemProviderInit*)this;
  53. if (NULL!=*ppv) {
  54. AddRef();
  55. return NOERROR;
  56. }
  57. else
  58. return E_NOINTERFACE;
  59. }
  60. STDMETHODIMP_(ULONG) CPodTestProv::AddRef(void)
  61. {
  62. return ++m_cRef;
  63. }
  64. STDMETHODIMP_(ULONG) CPodTestProv::Release(void)
  65. {
  66. ULONG nNewCount = InterlockedDecrement((long *)&m_cRef);
  67. if (0L == nNewCount)
  68. delete this;
  69. return nNewCount;
  70. }
  71. /***********************************************************************
  72. * *
  73. * CPodTestProv::Initialize *
  74. * *
  75. * Purpose: This is the implementation of IWbemProviderInit. The method *
  76. * is need to initialize with CIMOM. *
  77. * *
  78. ***********************************************************************/
  79. STDMETHODIMP CPodTestProv::Initialize(LPWSTR pszUser, LONG lFlags,
  80. LPWSTR pszNamespace, LPWSTR pszLocale,
  81. IWbemServices *pNamespace,
  82. IWbemContext *pCtx,
  83. IWbemProviderInitSink *pInitSink)
  84. {
  85. HRESULT hres;
  86. if(pNamespace){
  87. m_pNamespace = pNamespace;
  88. m_pNamespace->AddRef();
  89. }
  90. //Let CIMOM know you are initialized
  91. //==================================
  92. pInitSink->SetStatus(WBEM_S_INITIALIZED,0);
  93. return WBEM_S_NO_ERROR;
  94. }
  95. //***************************************************************************
  96. //
  97. // CPodTestProv::CreateInstanceEnumAsync
  98. //
  99. // Purpose: Asynchronously enumerates the instances.
  100. //
  101. //***************************************************************************
  102. STDMETHODIMP CPodTestProv::CreateInstanceEnumAsync(const BSTR strClass, long lFlags,
  103. IWbemContext *pCtx, IWbemObjectSink* pSink)
  104. {
  105. //check parameters
  106. //=========================
  107. if(strClass == NULL || pSink == NULL || m_pNamespace == NULL)
  108. return WBEM_E_INVALID_PARAMETER;
  109. // make sure impersonated
  110. //======================================
  111. HRESULT hr=WBEM_S_NO_ERROR;
  112. CRequestObject *pRObj = NULL;
  113. try{
  114. if ( FAILED( CoImpersonateClient() ) ) return WBEM_E_ACCESS_DENIED;
  115. //Create the RequestObject
  116. pRObj = new CRequestObject();
  117. if(!pRObj) throw m_he;
  118. pRObj->Initialize(m_pNamespace);
  119. //Get the requested object(s)
  120. hr = pRObj->CreateObjectEnum(strClass, pSink, pCtx);
  121. pRObj->Cleanup();
  122. delete pRObj;
  123. // Set status
  124. pSink->SetStatus(0, hr, NULL, NULL);
  125. }catch(CHeap_Exception e_HE){
  126. hr = WBEM_E_OUT_OF_MEMORY;
  127. pSink->SetStatus(0 , hr, NULL, NULL);
  128. if(pRObj){
  129. pRObj->Cleanup();
  130. delete pRObj;
  131. }
  132. }catch(HRESULT e_hr){
  133. hr = e_hr;
  134. pSink->SetStatus(0 , hr, NULL, NULL);
  135. if(pRObj){
  136. pRObj->Cleanup();
  137. delete pRObj;
  138. }
  139. }catch(...){
  140. hr = WBEM_E_CRITICAL_ERROR;
  141. pSink->SetStatus(0 , hr, NULL, NULL);
  142. if(pRObj){
  143. pRObj->Cleanup();
  144. delete pRObj;
  145. }
  146. }
  147. return hr;
  148. }
  149. //***************************************************************************
  150. //
  151. // CPodTestProv::GetObjectByPath
  152. // CPodTestProv::GetObjectByPathAsync
  153. //
  154. // Purpose: Creates an instance given a particular path value.
  155. //
  156. //***************************************************************************
  157. SCODE CPodTestProv::GetObjectAsync(const BSTR strObjectPath, long lFlags,
  158. IWbemContext *pCtx, IWbemObjectSink* pSink)
  159. {
  160. //check parameters
  161. //=========================
  162. if(strObjectPath == NULL || pSink == NULL || m_pNamespace == NULL)
  163. return WBEM_E_INVALID_PARAMETER;
  164. HRESULT hr=WBEM_S_NO_ERROR;
  165. CRequestObject *pRObj = NULL;
  166. try{
  167. if ( FAILED( CoImpersonateClient() ) ) return WBEM_E_ACCESS_DENIED;
  168. //Create the RequestObject
  169. pRObj = new CRequestObject();
  170. if(!pRObj) throw m_he;
  171. pRObj->Initialize(m_pNamespace);
  172. //Get the requested object(s)
  173. hr = pRObj->CreateObject(strObjectPath, pSink, pCtx);
  174. pRObj->Cleanup();
  175. delete pRObj;
  176. // Set status
  177. pSink->SetStatus(0, hr, NULL, NULL);
  178. }catch(CHeap_Exception e_HE){
  179. hr = WBEM_E_OUT_OF_MEMORY;
  180. pSink->SetStatus(0 , hr, NULL, NULL);
  181. if(pRObj){
  182. pRObj->Cleanup();
  183. delete pRObj;
  184. }
  185. }catch(HRESULT e_hr){
  186. hr = e_hr;
  187. pSink->SetStatus(0 , hr, NULL, NULL);
  188. if(pRObj){
  189. pRObj->Cleanup();
  190. delete pRObj;
  191. }
  192. }catch(...){
  193. hr = WBEM_E_CRITICAL_ERROR;
  194. pSink->SetStatus(0 , hr, NULL, NULL);
  195. if(pRObj){
  196. pRObj->Cleanup();
  197. delete pRObj;
  198. }
  199. }
  200. return hr;
  201. }
  202. //***************************************************************************
  203. //
  204. // CPodTestProv::PutInstanceAsync
  205. //
  206. // Purpose: Writes an instance.
  207. //
  208. //***************************************************************************
  209. SCODE CPodTestProv::PutInstanceAsync(IWbemClassObject FAR *pInst, long lFlags, IWbemContext *pCtx,
  210. IWbemObjectSink FAR *pSink)
  211. {
  212. HRESULT hr = WBEM_S_NO_ERROR;
  213. CRequestObject *pRObj = NULL;
  214. try{
  215. // Do a check of arguments and make sure we have pointer to Namespace
  216. if(pInst == NULL || pSink == NULL)
  217. return WBEM_E_INVALID_PARAMETER;
  218. if ( FAILED( CoImpersonateClient() ) ) return WBEM_E_ACCESS_DENIED;
  219. //Create the RequestObject
  220. pRObj = new CRequestObject();
  221. if(!pRObj) throw m_he;
  222. pRObj->Initialize(m_pNamespace);
  223. //Put the object
  224. hr = pRObj->PutObject(pInst, pSink, pCtx);
  225. pRObj->Cleanup();
  226. delete pRObj;
  227. // Set Status
  228. pSink->SetStatus(0 ,hr , NULL, NULL);
  229. }catch(CHeap_Exception e_HE){
  230. hr = WBEM_E_OUT_OF_MEMORY;
  231. pSink->SetStatus(0 , hr, NULL, NULL);
  232. if(pRObj){
  233. pRObj->Cleanup();
  234. delete pRObj;
  235. }
  236. }catch(HRESULT e_hr){
  237. hr = e_hr;
  238. pSink->SetStatus(0 , hr, NULL, NULL);
  239. if(pRObj){
  240. pRObj->Cleanup();
  241. delete pRObj;
  242. }
  243. }catch(...){
  244. hr = WBEM_E_CRITICAL_ERROR;
  245. pSink->SetStatus(0 , hr, NULL, NULL);
  246. if(pRObj){
  247. pRObj->Cleanup();
  248. delete pRObj;
  249. }
  250. }
  251. return hr;
  252. }
  253. //***************************************************************************
  254. //
  255. // CPodTestProv::ExecMethodAsync
  256. //
  257. // Purpose: Executes a method on a class
  258. //
  259. //***************************************************************************
  260. SCODE CPodTestProv::ExecMethodAsync(const BSTR ObjectPath, const BSTR Method, long lFlags,
  261. IWbemContext *pCtx, IWbemClassObject *pInParams,
  262. IWbemObjectSink *pResponse)
  263. {
  264. HRESULT hr = WBEM_S_NO_ERROR;
  265. CRequestObject *pRObj = NULL;
  266. try{
  267. // Do a check of arguments and make sure we have pointer to Namespace
  268. if(ObjectPath == NULL || Method == NULL || pResponse == NULL)
  269. return WBEM_E_INVALID_PARAMETER;
  270. if ( FAILED( CoImpersonateClient() ) ) return WBEM_E_ACCESS_DENIED;
  271. //Create the RequestObject
  272. pRObj = new CRequestObject();
  273. if(!pRObj) throw m_he;
  274. pRObj->Initialize(m_pNamespace);
  275. //Execute the method
  276. hr = pRObj->ExecMethod(ObjectPath, Method, pInParams, pResponse, pCtx);
  277. pRObj->Cleanup();
  278. delete pRObj;
  279. // Set Status
  280. pResponse->SetStatus(WBEM_STATUS_COMPLETE ,hr , NULL, NULL);
  281. }catch(CHeap_Exception e_HE){
  282. hr = WBEM_E_OUT_OF_MEMORY;
  283. pResponse->SetStatus(WBEM_STATUS_COMPLETE , hr, NULL, NULL);
  284. if(pRObj){
  285. pRObj->Cleanup();
  286. delete pRObj;
  287. }
  288. }catch(HRESULT e_hr){
  289. hr = e_hr;
  290. pResponse->SetStatus(WBEM_STATUS_COMPLETE , hr, NULL, NULL);
  291. if(pRObj){
  292. pRObj->Cleanup();
  293. delete pRObj;
  294. }
  295. }catch(...){
  296. hr = WBEM_E_CRITICAL_ERROR;
  297. pResponse->SetStatus(WBEM_STATUS_COMPLETE , hr, NULL, NULL);
  298. if(pRObj){
  299. pRObj->Cleanup();
  300. delete pRObj;
  301. }
  302. }
  303. return hr;
  304. }
  305. SCODE CPodTestProv::DeleteInstanceAsync(const BSTR ObjectPath, long lFlags, IWbemContext *pCtx,
  306. IWbemObjectSink *pResponseHandler)
  307. {
  308. HRESULT hr = WBEM_S_NO_ERROR;
  309. CRequestObject *pRObj = NULL;
  310. try{
  311. // Do a check of arguments and make sure we have pointer to Namespace
  312. if(ObjectPath == NULL || pResponseHandler == NULL) return WBEM_E_INVALID_PARAMETER;
  313. if ( FAILED( CoImpersonateClient() ) ) return WBEM_E_ACCESS_DENIED;
  314. //Create the RequestObject
  315. pRObj = new CRequestObject();
  316. if(!pRObj) throw m_he;
  317. pRObj->Initialize(m_pNamespace);
  318. //Delete the requested object
  319. hr = pRObj->DeleteObject(ObjectPath, pResponseHandler, pCtx);
  320. pRObj->Cleanup();
  321. delete pRObj;
  322. // Set Status
  323. pResponseHandler->SetStatus(0 ,hr , NULL, NULL);
  324. }catch(CHeap_Exception e_HE){
  325. hr = WBEM_E_OUT_OF_MEMORY;
  326. pResponseHandler->SetStatus(0 , hr, NULL, NULL);
  327. if(pRObj){
  328. pRObj->Cleanup();
  329. delete pRObj;
  330. }
  331. }catch(HRESULT e_hr){
  332. hr = e_hr;
  333. pResponseHandler->SetStatus(0 , hr, NULL, NULL);
  334. if(pRObj){
  335. pRObj->Cleanup();
  336. delete pRObj;
  337. }
  338. }catch(...){
  339. hr = WBEM_E_CRITICAL_ERROR;
  340. pResponseHandler->SetStatus(0 , hr, NULL, NULL);
  341. if(pRObj){
  342. pRObj->Cleanup();
  343. delete pRObj;
  344. }
  345. }
  346. #ifdef _PRIVATE_DEBUG
  347. if(!HeapValidate(GetProcessHeap(),NULL , NULL)) DebugBreak();
  348. #endif
  349. return hr;
  350. }
  351. HRESULT CPodTestProv::ExecQueryAsync(const BSTR QueryLanguage, const BSTR Query, long lFlags,
  352. IWbemContext __RPC_FAR *pCtx, IWbemObjectSink __RPC_FAR *pResponseHandler)
  353. {
  354. HRESULT hr;
  355. hr = WBEM_E_NOT_SUPPORTED;
  356. return hr;
  357. }
  358. HRESULT CheckAndExpandPath(BSTR bstrIn,
  359. BSTR *bstrOut
  360. )
  361. {
  362. if ( bstrIn == NULL || bstrOut == NULL ) {
  363. return WBEM_E_INVALID_PARAMETER;
  364. }
  365. DWORD Len = SysStringLen(bstrIn);
  366. HRESULT hr=WBEM_S_NO_ERROR;
  367. //
  368. // expand environment variable
  369. //
  370. if ( wcsstr(bstrIn, L"%") ) {
  371. PWSTR pBuf=NULL;
  372. PWSTR pBuf2=NULL;
  373. DWORD dwSize = ExpandEnvironmentStrings(bstrIn,NULL, 0);
  374. if ( dwSize > 0 ) {
  375. //
  376. // allocate buffer big enough to have two \\s
  377. //
  378. pBuf = (PWSTR)LocalAlloc(LPTR, (dwSize+1)*sizeof(WCHAR));
  379. if ( pBuf ) {
  380. pBuf2 = (PWSTR)LocalAlloc(LPTR, (dwSize+256)*sizeof(WCHAR));
  381. if ( pBuf2 ) {
  382. DWORD dwNewSize = ExpandEnvironmentStrings(bstrIn,pBuf, dwSize);
  383. if ( dwNewSize > 0) {
  384. //
  385. // convert the string from one \ to \\ (for use with WMI)
  386. //
  387. PWSTR pTemp1=pBuf, pTemp2=pBuf2;
  388. while ( *pTemp1 != L'\0') {
  389. if ( *pTemp1 != L'\\') {
  390. *pTemp2++ = *pTemp1;
  391. } else if ( *(pTemp1+1) != L'\\') {
  392. // single back slash, add another one
  393. *pTemp2++ = *pTemp1;
  394. *pTemp2++ = L'\\';
  395. } else {
  396. // double back slashs, just copy
  397. *pTemp2++ = *pTemp1++;
  398. *pTemp2++ = *pTemp1;
  399. }
  400. pTemp1++;
  401. }
  402. *bstrOut = SysAllocString(pBuf2);
  403. if ( *bstrOut == NULL ) {
  404. hr = WBEM_E_OUT_OF_MEMORY;
  405. }
  406. }
  407. LocalFree(pBuf2);
  408. pBuf2 = NULL;
  409. } else {
  410. hr = WBEM_E_OUT_OF_MEMORY;
  411. }
  412. LocalFree(pBuf);
  413. pBuf = NULL;
  414. } else {
  415. hr = WBEM_E_OUT_OF_MEMORY;
  416. }
  417. } else {
  418. hr = WBEM_E_FAILED;
  419. }
  420. } else {
  421. *bstrOut = SysAllocString(bstrIn);
  422. if ( *bstrOut == NULL ) {
  423. return WBEM_E_OUT_OF_MEMORY;
  424. }
  425. }
  426. return hr;
  427. }