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.

4577 lines
129 KiB

  1. /****************************************************************************
  2. Copyright information : Copyright (c) 1998-1999 Microsoft Corporation
  3. File Name : ExecEngine.cpp
  4. Project Name : WMI Command Line
  5. Author Name : Ch. Sriramachandramurthy
  6. Date of Creation (dd/mm/yy) : 27th-September-2000
  7. Version Number : 1.0
  8. Brief Description : This class encapsulates the functionality of
  9. Execution Engine. Obtains the needed information
  10. from CGlobalSwitches and CCommandSwitches of
  11. CParsedInfo and executes needed WMI operations.
  12. The result is sent to Format Engine via
  13. CGlobalSwitches and CCommandSwicthes
  14. of CParsedInfo.
  15. Revision History :
  16. Last Modified By : Ch. Sriramachandramurthy
  17. Last Modified Date : 20th-March-2001
  18. ****************************************************************************/
  19. // include files
  20. #include "Precomp.h"
  21. #include "GlobalSwitches.h"
  22. #include "CommandSwitches.h"
  23. #include "HelpInfo.h"
  24. #include "ErrorLog.h"
  25. #include "ParsedInfo.h"
  26. #include "ErrorInfo.h"
  27. #include "WmiCliXMLLog.h"
  28. #include "FormatEngine.h"
  29. #include "CmdTokenizer.h"
  30. #include "CmdAlias.h"
  31. #include "ParserEngine.h"
  32. #include "ExecEngine.h"
  33. #include "WmiCmdLn.h"
  34. /*------------------------------------------------------------------------
  35. Name :CExecEngine
  36. Synopsis :Constructor, This function initializes the necessary
  37. member variables.
  38. Type :Constructor
  39. Input Parameter(s) :None
  40. Output Parameter(s):None
  41. Return Type :None
  42. Global Variables :None
  43. Calling Syntax :None
  44. Notes :None
  45. ------------------------------------------------------------------------*/
  46. CExecEngine::CExecEngine()
  47. {
  48. m_pITextSrc = NULL;
  49. m_pIWbemLocator = NULL;
  50. m_pITargetNS = NULL;
  51. m_pIContext = NULL;
  52. m_bTrace = FALSE;
  53. m_bNoAssoc = FALSE;
  54. }
  55. /*------------------------------------------------------------------------
  56. Name :~CExecEngine
  57. Synopsis :Destructor, This function call Uninitialize() which
  58. frees memory held by the object.
  59. Type :Destructor
  60. Input Parameter(s) :None
  61. Output Parameter(s):None
  62. Return Type :None
  63. Global Variables :None
  64. Calling Syntax :None
  65. Notes :None
  66. ------------------------------------------------------------------------*/
  67. CExecEngine::~CExecEngine()
  68. {
  69. SAFEIRELEASE(m_pITextSrc);
  70. SAFEIRELEASE(m_pIContext);
  71. SAFEIRELEASE(m_pIWbemLocator);
  72. Uninitialize();
  73. }
  74. /*------------------------------------------------------------------------
  75. Name :Uninitialize
  76. Synopsis :This function uninitializes the member variables.
  77. Type :Member Function
  78. Input Parameter(s):
  79. bFinal - boolean value which when set indicates that the
  80. program
  81. Output Parameter(s):None
  82. Return Type :void
  83. Global Variables :None
  84. Calling Syntax :Uninitialize()
  85. Notes :None
  86. ------------------------------------------------------------------------*/
  87. void CExecEngine::Uninitialize(BOOL bFinal)
  88. {
  89. SAFEIRELEASE(m_pITargetNS);
  90. m_bTrace = FALSE;
  91. m_eloErrLogOpt = NO_LOGGING;
  92. m_bNoAssoc = FALSE;
  93. if (bFinal)
  94. {
  95. SAFEIRELEASE(m_pITextSrc);
  96. SAFEIRELEASE(m_pIContext);
  97. SAFEIRELEASE(m_pIWbemLocator);
  98. }
  99. }
  100. /*------------------------------------------------------------------------
  101. Name :SetLocatorObject
  102. Synopsis :Sets the locator object passed via parameter to member
  103. of the class.
  104. Type :Member Function
  105. Input Parameter(s):
  106. pILocator - Pointer to IWbemLocator
  107. Output Parameter(s):None
  108. Return Type :BOOL
  109. Global Variables :None
  110. Calling Syntax :SetLocatorObject(pILocator)
  111. Notes :None
  112. ------------------------------------------------------------------------*/
  113. BOOL CExecEngine::SetLocatorObject(IWbemLocator* pILocator)
  114. {
  115. static BOOL bFirst = TRUE;
  116. BOOL bRet = TRUE;
  117. if (bFirst)
  118. {
  119. if (pILocator != NULL)
  120. {
  121. SAFEIRELEASE(m_pIWbemLocator);
  122. m_pIWbemLocator = pILocator;
  123. m_pIWbemLocator->AddRef();
  124. }
  125. else
  126. bRet = FALSE;
  127. bFirst = FALSE;
  128. }
  129. return bRet;
  130. }
  131. /*------------------------------------------------------------------------
  132. Name :ExecuteCommand
  133. Synopsis :Executes the command referring to information
  134. available with the CParsedInfo object.
  135. Stores the results in the CParsedInfo object.
  136. Type :Member Function
  137. Input Parameter(s):
  138. rParsedInfo - reference to CParsedInfo class object
  139. Output Parameter(s):
  140. rParsedInfo - reference to CParsedInfo class object
  141. Return Type :BOOL
  142. Global Variables :None
  143. Calling Syntax :ExecuteCommand(rParsedInfo)
  144. Notes :None
  145. ------------------------------------------------------------------------*/
  146. BOOL CExecEngine::ExecuteCommand(CParsedInfo& rParsedInfo)
  147. {
  148. BOOL bRet = TRUE;
  149. HRESULT hr = S_OK;
  150. _TCHAR *pszVerb = NULL;
  151. BOOL bContinue = TRUE;
  152. DWORD dwThreadId = GetCurrentThreadId();
  153. try
  154. {
  155. // Obtain the TRACE flag
  156. m_bTrace = rParsedInfo.GetGlblSwitchesObject().GetTraceStatus();
  157. // Obtain the Logging mode
  158. m_eloErrLogOpt = rParsedInfo.GetErrorLogObject().GetErrLogOption();
  159. // Enable|Disable the privileges
  160. hr = ModifyPrivileges(rParsedInfo.GetGlblSwitchesObject().
  161. GetPrivileges());
  162. if ( m_eloErrLogOpt )
  163. {
  164. WMITRACEORERRORLOG(hr, __LINE__, __FILE__,
  165. _T("ModifyPrivileges(-)"), dwThreadId, rParsedInfo, FALSE);
  166. }
  167. ONFAILTHROWERROR(hr);
  168. // Obtian the verb name
  169. pszVerb = rParsedInfo.GetCmdSwitchesObject().GetVerbName();
  170. if (pszVerb != NULL)
  171. {
  172. // If GET | LIST verb is specified.
  173. if (CompareTokens(pszVerb, CLI_TOKEN_GET) ||
  174. CompareTokens(pszVerb, CLI_TOKEN_LIST))
  175. {
  176. bRet = ProcessSHOWInfo(rParsedInfo);
  177. }
  178. // If SET verb is specified.
  179. else if (CompareTokens(pszVerb, CLI_TOKEN_SET))
  180. {
  181. bRet = ProcessSETVerb(rParsedInfo);
  182. }
  183. // If CALL verb is specified.
  184. else if (CompareTokens(pszVerb, CLI_TOKEN_CALL))
  185. {
  186. bRet = ProcessCALLVerb(rParsedInfo);
  187. }
  188. // If ASSOC verb is specified.
  189. else if (CompareTokens(pszVerb, CLI_TOKEN_ASSOC))
  190. {
  191. bRet = ProcessASSOCVerb(rParsedInfo);
  192. }
  193. // If CREATE verb is specified.
  194. else if (CompareTokens(pszVerb, CLI_TOKEN_CREATE))
  195. {
  196. bRet = ProcessCREATEVerb(rParsedInfo);
  197. }
  198. // If DELETE verb is specified.
  199. else if (CompareTokens(pszVerb, CLI_TOKEN_DELETE))
  200. {
  201. bRet = ProcessDELETEVerb(rParsedInfo);
  202. }
  203. // If user defined verb is specified.
  204. else
  205. bRet = ProcessCALLVerb(rParsedInfo);
  206. }
  207. // If no verb is specified, (default behavior is assumed to be that of
  208. // GET i.e a command like 'w class Win32_Process' go ahead with
  209. // displaying the instance information.
  210. else
  211. {
  212. if (rParsedInfo.GetCmdSwitchesObject().
  213. SetVerbName(_T("GET")))
  214. {
  215. bRet = ProcessSHOWInfo(rParsedInfo);
  216. }
  217. else
  218. bRet = FALSE;
  219. }
  220. }
  221. catch(_com_error& e)
  222. {
  223. // To check unhandled exceptions thrown by _bstr_t objects etc..
  224. rParsedInfo.GetCmdSwitchesObject().SetCOMError(e);
  225. bRet = FALSE;
  226. }
  227. return bRet;
  228. }
  229. /*------------------------------------------------------------------------
  230. Name :ObtainXMLResultSet
  231. Synopsis :Executes query and obtain the result in XML file format.
  232. Refers data in the CCommnadSwicthes object of
  233. CParsedInfo object.
  234. Type :Member Function
  235. Input Parameter(s):
  236. bstrQuery - WQL query
  237. rParsedInfo - reference to CParsedInfo class object
  238. bstrXML - reference to XML result set obtained
  239. bSysProp - boolean flag indicating the presence of system
  240. properties.
  241. bNotAssoc - boolean flag indicating whether the query cotains
  242. ASSOCIATORS OF {xxxx} (or) SELECT * FROM xxx form.
  243. Output Parameter(s):
  244. rParsedInfo - reference to CParsedInfo class object
  245. Return Type :HRESULT
  246. Global Variables :None
  247. Calling Syntax :ObtainXMLResultSet(bstrQuery, rParsedInfo, bstrXML,
  248. bSysProp, bNotAssoc);
  249. Notes :None
  250. ------------------------------------------------------------------------*/
  251. HRESULT CExecEngine::ObtainXMLResultSet(BSTR bstrQuery,
  252. CParsedInfo& rParsedInfo,
  253. _bstr_t& bstrXML,
  254. BOOL bSysProp,
  255. BOOL bNotAssoc)
  256. {
  257. IWbemClassObject *pIObject = NULL;
  258. HRESULT hr = S_OK;
  259. IEnumWbemClassObject *pIEnum = NULL;
  260. ULONG ulReturned = 0;
  261. BSTR bstrInstXML = NULL;
  262. BOOL bInstances = FALSE;
  263. CHString chsMsg;
  264. DWORD dwThreadId = GetCurrentThreadId();
  265. VARIANT vSystem;
  266. try
  267. {
  268. VariantInit(&vSystem);
  269. if ( g_wmiCmd.GetBreakEvent() == FALSE )
  270. {
  271. // Add the <CIM> or <ASSOC.OBJECTARRAY> to the beginning of the
  272. // XML result. This is to facilitate storing of mutiple object
  273. // instances information.
  274. bstrXML = (bNotAssoc) ? MULTINODE_XMLSTARTTAG :
  275. MULTINODE_XMLASSOCSTAG1;
  276. // Create the IWbemContext object, used for suppressing
  277. // the system properties.
  278. if (m_pIContext == NULL)
  279. {
  280. hr = CreateContext(rParsedInfo);
  281. if ( m_eloErrLogOpt )
  282. {
  283. WMITRACEORERRORLOG(hr, __LINE__, __FILE__,
  284. _T("CreateContext(rParsedInfo)"), dwThreadId,
  285. rParsedInfo, FALSE);
  286. }
  287. ONFAILTHROWERROR(hr);
  288. }
  289. // Execute the WQL query
  290. // WBEM_FLAG_FORWARD_ONLY flag Increases the speed of execution
  291. // WBEM_FLAG_RETURN_IMMEDIATELY flag makes semisynchronous call
  292. // Setting these flags in combination saves time, space, and
  293. // improves responsiveness.enumerators can be polled for the
  294. // results of the call.
  295. hr = m_pITargetNS->ExecQuery(_bstr_t(L"WQL"), bstrQuery,
  296. WBEM_FLAG_FORWARD_ONLY |
  297. WBEM_FLAG_RETURN_IMMEDIATELY,
  298. NULL, &pIEnum);
  299. if (m_bTrace || m_eloErrLogOpt)
  300. {
  301. chsMsg.Format(L"IWbemServices::ExecQuery(L\"WQL\", L\"%s\", "
  302. L"0, NULL, -)", (LPWSTR) bstrQuery);
  303. WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg,
  304. dwThreadId, rParsedInfo, m_bTrace);
  305. }
  306. ONFAILTHROWERROR(hr);
  307. // If no system properties are specified adjust the context to
  308. // filter out the system properties.
  309. vSystem.vt = VT_BOOL;
  310. // Filterout the system properties.
  311. if (!bSysProp)
  312. vSystem.boolVal = VARIANT_TRUE;
  313. // Don't filter the system properties.
  314. else
  315. vSystem.boolVal = VARIANT_FALSE;
  316. hr = m_pIContext->SetValue(_bstr_t(EXCLUDESYSPROP), 0, &vSystem);
  317. if (m_bTrace || m_eloErrLogOpt)
  318. {
  319. WMITRACEORERRORLOG(hr, __LINE__, __FILE__,
  320. _T("IWbemContext::SetValue(L\"ExcludeSystemProperties\","
  321. L"0, -)"), dwThreadId, rParsedInfo, m_bTrace);
  322. }
  323. ONFAILTHROWERROR(hr);
  324. VARIANTCLEAR(vSystem);
  325. // Set the interface level security for the IEnumWbemClass object.
  326. hr = SetSecurity(pIEnum,
  327. rParsedInfo.GetGlblSwitchesObject().GetAuthority(),
  328. rParsedInfo.GetNode(),
  329. rParsedInfo.GetUser(),
  330. rParsedInfo.GetPassword(),
  331. rParsedInfo.GetGlblSwitchesObject().
  332. GetAuthenticationLevel(),
  333. rParsedInfo.GetGlblSwitchesObject().
  334. GetImpersonationLevel());
  335. if (m_bTrace || m_eloErrLogOpt)
  336. {
  337. chsMsg.Format(L"CoSetProxyBlanket(-, RPC_C_AUTHN_WINNT,"
  338. L"RPC_C_AUTHZ_NONE, NULL, %d, %d, -, EOAC_NONE)",
  339. rParsedInfo.GetGlblSwitchesObject().
  340. GetAuthenticationLevel(),
  341. rParsedInfo.GetGlblSwitchesObject().
  342. GetImpersonationLevel());
  343. WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg,
  344. dwThreadId, rParsedInfo, m_bTrace);
  345. }
  346. ONFAILTHROWERROR(hr);
  347. // Loop through the available instances
  348. hr = pIEnum->Next(WBEM_INFINITE, 1, &pIObject, &ulReturned);
  349. if (m_bTrace || m_eloErrLogOpt)
  350. {
  351. chsMsg.Format(L"IEnumWbemClassObject->Next"
  352. L"(WBEM_INFINITE, 1, -, -)");
  353. WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg,
  354. dwThreadId, rParsedInfo, m_bTrace);
  355. }
  356. ONFAILTHROWERROR(hr);
  357. while(ulReturned == 1)
  358. {
  359. // Set the instances flag to TRUE
  360. bInstances = TRUE;
  361. // Call the IWbemObjectTextSrc::GetText method, with
  362. // IWbemClassObject as one of the arguments.
  363. hr = m_pITextSrc->GetText(0, pIObject,
  364. WMI_OBJ_TEXT_CIM_DTD_2_0, m_pIContext, &bstrInstXML);
  365. if (m_bTrace || m_eloErrLogOpt)
  366. {
  367. chsMsg.Format(L"IWbemObjectTextSrc::GetText(0, -, "
  368. L"WMI_OBJECT_TEXT_CIM_DTD_2_0, -, -)");
  369. WMITRACEORERRORLOG(hr, __LINE__, __FILE__,
  370. (LPCWSTR)chsMsg, dwThreadId, rParsedInfo, m_bTrace);
  371. }
  372. ONFAILTHROWERROR(hr);
  373. // Associators should be handled separately
  374. if (bNotAssoc == FALSE)
  375. {
  376. // Append the XML node to the XML nodes stream
  377. bstrXML = bstrXML + _bstr_t(MULTINODE_XMLASSOCSTAG2) +
  378. + bstrInstXML + _bstr_t(MULTINODE_XMLASSOCETAG2);
  379. }
  380. else
  381. {
  382. // Append the XML node to the XML nodes stream
  383. bstrXML += bstrInstXML;
  384. }
  385. // Release the memory allocated for bstrInstXML
  386. SAFEBSTRFREE(bstrInstXML);
  387. SAFEIRELEASE(pIObject);
  388. // if break event occurs then terminate the session
  389. if ( g_wmiCmd.GetBreakEvent() == TRUE )
  390. break;
  391. // Move to next instance in the enumeration.
  392. hr = pIEnum->Next(WBEM_INFINITE, 1, &pIObject, &ulReturned);
  393. if (m_bTrace || m_eloErrLogOpt)
  394. {
  395. chsMsg.Format(
  396. L"IEnumWbemClassObject->Next(WBEM_INFINITE, 1, -, -)");
  397. WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg,
  398. dwThreadId, rParsedInfo, m_bTrace);
  399. }
  400. ONFAILTHROWERROR(hr);
  401. }
  402. // If instances are available
  403. if (bInstances)
  404. {
  405. // Add the </CIM> or </ASSOC.OBJECTARRAY> at the end.
  406. bstrXML += (bNotAssoc) ? MULTINODE_XMLENDTAG :
  407. MULTINODE_XMLASSOCETAG1;
  408. // if no break event occured then only set the
  409. // xml result set
  410. if ( g_wmiCmd.GetBreakEvent() == FALSE )
  411. {
  412. if (bNotAssoc)
  413. {
  414. // Store the XML result set
  415. rParsedInfo.GetCmdSwitchesObject().
  416. SetXMLResultSet(bstrXML);
  417. bstrXML = L"";
  418. }
  419. }
  420. }
  421. // no instances
  422. else
  423. {
  424. bstrXML = L"<ERROR>";
  425. _bstr_t bstrMsg;
  426. WMIFormatMessage((bNotAssoc) ?
  427. IDS_I_NO_INSTANCES : IDS_I_NO_ASSOCIATIONS,
  428. 0, bstrMsg, NULL);
  429. if (bNotAssoc)
  430. {
  431. DisplayMessage((LPWSTR)bstrMsg, CP_OEMCP, TRUE, TRUE);
  432. }
  433. else
  434. {
  435. m_bNoAssoc = TRUE;
  436. }
  437. CHString sTemp;
  438. sTemp.Format(_T("<DESCRIPTION>%s</DESCRIPTION>"),
  439. (LPWSTR) bstrMsg);
  440. bstrXML += _bstr_t(sTemp);
  441. bstrXML += L"</ERROR>";
  442. if (bNotAssoc)
  443. {
  444. // Store the XML result set
  445. rParsedInfo.GetCmdSwitchesObject().
  446. SetXMLResultSet(bstrXML);
  447. bstrXML = L"";
  448. }
  449. }
  450. SAFEIRELEASE(pIEnum);
  451. }
  452. }
  453. catch(_com_error& e)
  454. {
  455. SAFEIRELEASE(pIObject);
  456. SAFEIRELEASE(pIEnum);
  457. SAFEBSTRFREE(bstrInstXML);
  458. rParsedInfo.GetCmdSwitchesObject().SetCOMError(e);
  459. hr = e.Error();
  460. }
  461. //trap for CHeap_Exception
  462. catch(CHeap_Exception)
  463. {
  464. SAFEIRELEASE(pIObject);
  465. SAFEIRELEASE(pIEnum);
  466. SAFEBSTRFREE(bstrInstXML);
  467. hr = WBEM_E_OUT_OF_MEMORY;
  468. _com_issue_error(hr);
  469. }
  470. return hr;
  471. }
  472. /*------------------------------------------------------------------------
  473. Name :ExecWMIMethod
  474. Synopsis :Executes a WMI method referring to the information
  475. available with CParsedInfo object.
  476. Type :Member Function
  477. Input Parameter(s):
  478. rParsedInfo - reference to CParsedInfo class object
  479. Output Parameter(s):
  480. rParsedInfo - reference to CParsedInfo class object
  481. Return Type :BOOL
  482. Global Variables :None
  483. Calling Syntax :ExecWMIMethod(rParsedInfo)
  484. Notes :None
  485. ------------------------------------------------------------------------*/
  486. BOOL CExecEngine::ExecWMIMethod(CParsedInfo& rParsedInfo)
  487. {
  488. HRESULT hr = S_OK;
  489. IWbemClassObject *pIClassObj = NULL,
  490. *pIInSign = NULL,
  491. *pIOutSign = NULL,
  492. *pIInParam = NULL;
  493. SAFEARRAY *psaNames = NULL;
  494. BSTR bstrInParam = NULL;
  495. BOOL bContinue = TRUE,
  496. bRet = TRUE,
  497. bMethodDtls = FALSE;
  498. CHString chsMsg;
  499. DWORD dwThreadId = GetCurrentThreadId();
  500. CHARVECTOR::iterator cviUnnamedValue = NULL;
  501. BSTRMAP::iterator bmiNamedValue = NULL;
  502. VARIANT varPut,
  503. varGet,
  504. varTemp;
  505. PROPDETMAP pdmPropDetMap;
  506. PROPDETMAP::iterator itrPropDetMap;
  507. VariantInit(&varPut);
  508. VariantInit(&varGet);
  509. VariantInit(&varTemp);
  510. METHDETMAP mdmMethDet;
  511. METHDETMAP::iterator mdmIterator = NULL;
  512. mdmMethDet = rParsedInfo.GetCmdSwitchesObject().GetMethDetMap();
  513. try
  514. {
  515. _bstr_t bstrClassName("");
  516. // Obtain the parameter details.
  517. if (!mdmMethDet.empty())
  518. {
  519. mdmIterator = mdmMethDet.begin();
  520. pdmPropDetMap = (*mdmIterator).second.Params;
  521. bMethodDtls = TRUE;
  522. }
  523. // Obtain the WMI class name
  524. // If <alias> is not specified
  525. if (rParsedInfo.GetCmdSwitchesObject().GetClassPath() != NULL)
  526. {
  527. bstrClassName = _bstr_t(rParsedInfo.GetCmdSwitchesObject().
  528. GetClassPath());
  529. }
  530. // If <alias> specified
  531. else
  532. {
  533. rParsedInfo.GetCmdSwitchesObject().
  534. GetClassOfAliasTarget(bstrClassName);
  535. }
  536. // Obtain the object schema.
  537. hr = m_pITargetNS->GetObject(bstrClassName,
  538. WBEM_FLAG_USE_AMENDED_QUALIFIERS, NULL,
  539. &pIClassObj, NULL);
  540. if (m_bTrace || m_eloErrLogOpt)
  541. {
  542. chsMsg.Format(L"IWbemServices::GetObject(L\"%s\", 0, NULL, -)",
  543. (LPWSTR) bstrClassName);
  544. WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg,
  545. dwThreadId, rParsedInfo, m_bTrace);
  546. }
  547. ONFAILTHROWERROR(hr);
  548. // Get method information
  549. hr = pIClassObj->GetMethod(_bstr_t(rParsedInfo.GetCmdSwitchesObject()
  550. .GetMethodName()), 0, &pIInSign, &pIOutSign);
  551. if (m_bTrace || m_eloErrLogOpt)
  552. {
  553. chsMsg.Format(L"IWbemClassObject::GetMethod(L\"%s\", 0, -, -)",
  554. rParsedInfo.GetCmdSwitchesObject().GetMethodName() ?
  555. rParsedInfo.GetCmdSwitchesObject().GetMethodName()
  556. : L"<null>");
  557. WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg,
  558. dwThreadId, rParsedInfo, m_bTrace);
  559. }
  560. ONFAILTHROWERROR(hr);
  561. if ( pIInSign != NULL )
  562. {
  563. // Spawn object instance.
  564. hr = pIInSign->SpawnInstance(0, &pIInParam);
  565. if ( m_eloErrLogOpt )
  566. {
  567. WMITRACEORERRORLOG(hr, __LINE__, __FILE__,
  568. _T("IWbemClassObject::SpawnInstance(0, -)"), dwThreadId,
  569. rParsedInfo, FALSE);
  570. }
  571. ONFAILTHROWERROR(hr);
  572. CHARVECTOR cvInParams =
  573. rParsedInfo.GetCmdSwitchesObject().GetPropertyList();
  574. BSTRMAP bmParameterMap =
  575. rParsedInfo.GetCmdSwitchesObject().GetParameterMap();
  576. // If parameter list is TRUE
  577. if (!cvInParams.empty() || !bmParameterMap.empty())
  578. {
  579. // Get the input paramters for this method from the input
  580. // signature object.
  581. hr = pIInSign->GetNames(NULL,
  582. WBEM_FLAG_ALWAYS | WBEM_FLAG_NONSYSTEM_ONLY,
  583. NULL,
  584. &psaNames);
  585. if (m_bTrace || m_eloErrLogOpt)
  586. {
  587. chsMsg.Format(L"IWbemClassObject::GetNames(NULL, "
  588. L"WBEM_FLAG_ALWAYS | WBEM_FLAG_NONSYSTEM_ONLY, "
  589. L"NULL, -)");
  590. WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg,
  591. dwThreadId, rParsedInfo, m_bTrace);
  592. }
  593. ONFAILTHROWERROR(hr);
  594. LONG lLower = 0, lUpper = 0, lIndex = 0;
  595. hr = SafeArrayGetLBound(psaNames, 1, &lLower);
  596. if ( m_eloErrLogOpt )
  597. {
  598. chsMsg.Format(L"SafeArrayGetLBound(-, 1, -)");
  599. WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg,
  600. dwThreadId, rParsedInfo, FALSE);
  601. }
  602. ONFAILTHROWERROR(hr);
  603. hr = SafeArrayGetUBound(psaNames, 1, &lUpper);
  604. if ( m_eloErrLogOpt )
  605. {
  606. chsMsg.Format(L"SafeArrayGetUBound(-, 1, -)");
  607. WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg,
  608. dwThreadId, rParsedInfo, FALSE);
  609. }
  610. ONFAILTHROWERROR(hr);
  611. // Puting param values depend on named param list or not.
  612. BOOL bNamedParamList = rParsedInfo.GetCmdSwitchesObject().
  613. GetNamedParamListFlag();
  614. // Make necessary initializations.
  615. if ( bNamedParamList == FALSE)
  616. cviUnnamedValue = cvInParams.begin();
  617. lIndex = lLower;
  618. // Associate the parameter values specified to the input
  619. // parameters in the order available.
  620. while(TRUE)
  621. {
  622. // Breaking conditions.
  623. if ( lIndex > lUpper )
  624. break;
  625. if ( bNamedParamList == FALSE &&
  626. cviUnnamedValue == cvInParams.end())
  627. break;
  628. hr = SafeArrayGetElement(psaNames, &lIndex, &bstrInParam);
  629. if ( m_eloErrLogOpt )
  630. {
  631. chsMsg.Format(L"SafeArrayGetElement(-, -, -)");
  632. WMITRACEORERRORLOG(hr, __LINE__, __FILE__,
  633. (LPCWSTR)chsMsg, dwThreadId, rParsedInfo, FALSE);
  634. }
  635. ONFAILTHROWERROR(hr);
  636. // Obtain the property details
  637. PROPERTYDETAILS pdPropDet;
  638. GetPropertyAttributes(pIInParam, bstrInParam,
  639. pdPropDet, m_bTrace);
  640. _TCHAR* pszValue = NULL;
  641. if ( bNamedParamList == TRUE )
  642. {
  643. // If in parameter not found in named parameter map.
  644. if (!Find(bmParameterMap, bstrInParam, bmiNamedValue))
  645. {
  646. // If not found in alias verb parameters.
  647. if ( !Find(pdmPropDetMap, bstrInParam,
  648. itrPropDetMap) )
  649. {
  650. lIndex++;
  651. SAFEBSTRFREE(bstrInParam);
  652. continue;
  653. }
  654. else // If found in alias verb parameters.
  655. {
  656. // Value should be taken from Default of alias
  657. // verb parameters.
  658. if (!((*itrPropDetMap).second.Default))
  659. {
  660. lIndex++;
  661. SAFEBSTRFREE(bstrInParam);
  662. continue;
  663. }
  664. else
  665. pszValue = (*itrPropDetMap).second.Default;
  666. }
  667. }
  668. pszValue = (*bmiNamedValue).second;
  669. }
  670. else
  671. pszValue = *cviUnnamedValue;
  672. if (rParsedInfo.GetCmdSwitchesObject().
  673. GetAliasName() == NULL)
  674. {
  675. // Check the parameter value supplied against
  676. // the qualifier information for the parameter.
  677. bRet = CheckQualifierInfo(rParsedInfo, pIInSign,
  678. bstrInParam, pszValue);
  679. }
  680. else
  681. {
  682. // If method and parameter information is available
  683. if (bMethodDtls && !pdmPropDetMap.empty())
  684. {
  685. bRet = CheckAliasQualifierInfo(rParsedInfo,
  686. bstrInParam, pszValue, pdmPropDetMap);
  687. }
  688. }
  689. // The parameter value does not fit into the qualifier
  690. // allowed values.
  691. if (!bRet)
  692. {
  693. bContinue = FALSE;
  694. break;
  695. }
  696. VariantInit(&varTemp);
  697. varTemp.vt = VT_BSTR;
  698. varTemp.bstrVal = SysAllocString(pszValue);
  699. VariantInit(&varPut);
  700. hr = ConvertCIMTYPEToVarType(varPut, varTemp,
  701. (_TCHAR*)pdPropDet.Type);
  702. if ( m_eloErrLogOpt )
  703. {
  704. chsMsg.Format(L"VariantChangeType(-, -, 0, -)");
  705. WMITRACEORERRORLOG(hr, __LINE__, __FILE__,
  706. (LPCWSTR)chsMsg, dwThreadId, rParsedInfo, FALSE);
  707. }
  708. ONFAILTHROWERROR(hr);
  709. hr = pIInParam->Put(bstrInParam, 0, &varPut, 0);
  710. if (m_bTrace || m_eloErrLogOpt)
  711. {
  712. chsMsg.Format(L"IWbemClassObject::Put(L\"%s\", 0,"
  713. L"-, 0)", (LPWSTR) bstrInParam);
  714. WMITRACEORERRORLOG(hr, __LINE__, __FILE__,
  715. (LPCWSTR)chsMsg, dwThreadId, rParsedInfo, m_bTrace);
  716. }
  717. ONFAILTHROWERROR(hr);
  718. VARIANTCLEAR(varPut);
  719. VARIANTCLEAR(varGet);
  720. VARIANTCLEAR(varTemp);
  721. SAFEBSTRFREE(bstrInParam);
  722. // Looping statements.
  723. if ( bNamedParamList == FALSE )
  724. cviUnnamedValue++;
  725. lIndex++;
  726. }
  727. // Free the memory
  728. SAFEADESTROY(psaNames);
  729. if (bContinue)
  730. {
  731. // If insufficient parameters are specified.
  732. if ( bNamedParamList == FALSE &&
  733. cviUnnamedValue != cvInParams.end() )
  734. {
  735. bContinue = FALSE;
  736. rParsedInfo.GetCmdSwitchesObject().SetErrataCode(
  737. IDS_E_INVALID_NO_OF_PARAMS);
  738. bRet = FALSE;
  739. }
  740. }
  741. }
  742. }
  743. else // No input parameters are available for this function.
  744. {
  745. // If unnamed parameters are specified.
  746. if (!rParsedInfo.GetCmdSwitchesObject().GetPropertyList().empty())
  747. {
  748. bContinue = FALSE;
  749. rParsedInfo.GetCmdSwitchesObject().SetErrataCode(
  750. IDS_E_METHOD_HAS_NO_IN_PARAMS);
  751. bRet = FALSE;
  752. }
  753. }
  754. SAFEIRELEASE(pIInSign);
  755. SAFEIRELEASE(pIOutSign);
  756. SAFEIRELEASE(pIClassObj);
  757. if (bContinue)
  758. {
  759. hr = FormQueryAndExecuteMethodOrUtility(rParsedInfo, pIInParam);
  760. ONFAILTHROWERROR(hr);
  761. }
  762. }
  763. catch(_com_error& e)
  764. {
  765. // Free the interface pointers and memory allocated.
  766. SAFEIRELEASE(pIClassObj);
  767. SAFEIRELEASE(pIInSign);
  768. SAFEIRELEASE(pIOutSign);
  769. SAFEIRELEASE(pIInParam);
  770. SAFEADESTROY(psaNames);
  771. SAFEBSTRFREE(bstrInParam);
  772. VARIANTCLEAR(varPut);
  773. VARIANTCLEAR(varGet);
  774. VARIANTCLEAR(varTemp);
  775. // Store the COM error object and set the return value to FALSE
  776. rParsedInfo.GetCmdSwitchesObject().SetCOMError(e);
  777. bRet = FALSE;
  778. }
  779. catch(CHeap_Exception)
  780. {
  781. SAFEIRELEASE(pIClassObj);
  782. SAFEIRELEASE(pIInSign);
  783. SAFEIRELEASE(pIOutSign);
  784. SAFEIRELEASE(pIInParam);
  785. SAFEADESTROY(psaNames);
  786. SAFEBSTRFREE(bstrInParam);
  787. VARIANTCLEAR(varPut);
  788. VARIANTCLEAR(varGet);
  789. VARIANTCLEAR(varTemp);
  790. hr = WBEM_E_OUT_OF_MEMORY;
  791. _com_issue_error(hr);
  792. }
  793. return bRet;
  794. }
  795. /*------------------------------------------------------------------------
  796. Name :ProcessSHOWInfo
  797. Synopsis :Executed the functionality requested by GET|LIST verb
  798. referring to the information available with
  799. CParsedInfo object or to display help in interactive mode
  800. by displaying properties of concernrd instance.
  801. Type :Member Function
  802. Input Parameter(s):
  803. rParsedInfo - reference to CParsedInfo class object
  804. bVerb - Verb or interactive info
  805. pszPath - the Path expression
  806. Output Parameter(s):
  807. rParsedInfo - reference to CParsedInfo class object
  808. Return Type :BOOL
  809. Global Variables :None
  810. Calling Syntax :ProcessSHOWInfo(rParsedInfo, bVerb, pszPath)
  811. Notes :None
  812. ------------------------------------------------------------------------*/
  813. BOOL CExecEngine::ProcessSHOWInfo(CParsedInfo& rParsedInfo, BOOL bVerb,
  814. _TCHAR* pszPath)
  815. {
  816. HRESULT hr = S_OK;
  817. BOOL bPropList = FALSE,
  818. bRet = TRUE,
  819. bSysProp = FALSE;
  820. _TCHAR *pszWhereExpr = NULL,
  821. *pszClassPath = NULL;
  822. CHARVECTOR::iterator theIterator = NULL,
  823. theEndIterator = NULL;
  824. try
  825. {
  826. _bstr_t bstrPropList(""), bstrClassName(""),
  827. bstrQuery(""), bstrXML("");
  828. //Formation of query only once , useful in case /every is specified.
  829. //if(rParsedInfo.GetCmdSwitchesObject().GetFirstQueryFormFlag() )
  830. if(rParsedInfo.GetCmdSwitchesObject().GetFormedQuery() == NULL
  831. || !bVerb)
  832. {
  833. // Obtain the list of properties to be retrieved
  834. if(bVerb)
  835. {
  836. theIterator = rParsedInfo.GetCmdSwitchesObject().
  837. GetPropertyList().begin();
  838. theEndIterator = rParsedInfo.GetCmdSwitchesObject().
  839. GetPropertyList().end();
  840. }
  841. else
  842. {
  843. theIterator = rParsedInfo.GetCmdSwitchesObject().
  844. GetInteractivePropertyList().begin();
  845. theEndIterator = rParsedInfo.GetCmdSwitchesObject().
  846. GetInteractivePropertyList().end();
  847. }
  848. // Loop thru the list of properties specified,form comma seaprated
  849. // string of the properties i.e prop1, prop2, prop3, ....., propn
  850. while (theIterator != theEndIterator)
  851. {
  852. // Set the bPropList to TRUE
  853. bPropList = TRUE;
  854. bstrPropList += _bstr_t(*theIterator);
  855. // If the system properties flag is not set to true
  856. if (!bSysProp)
  857. bSysProp = IsSysProp(*theIterator);
  858. // Move to next property
  859. theIterator++;
  860. if (theIterator != theEndIterator)
  861. bstrPropList += _bstr_t(L", ");
  862. };
  863. // If properties are not specified, then by default retrieve all
  864. // the properties. i.e '*'
  865. if (!bPropList)
  866. bstrPropList = ASTERIX;
  867. // Obtain the alias target class
  868. rParsedInfo.GetCmdSwitchesObject().
  869. GetClassOfAliasTarget(bstrClassName);
  870. // Obtain the class path
  871. pszClassPath = rParsedInfo.GetCmdSwitchesObject().GetClassPath();
  872. BOOL bClass = FALSE;
  873. if(bVerb)
  874. {
  875. if(IsClassOperation(rParsedInfo))
  876. {
  877. bClass = TRUE;
  878. }
  879. }
  880. // If CLASS | PATH expression is specified.
  881. if ( pszClassPath != NULL)
  882. {
  883. if (bVerb && bClass)
  884. {
  885. bstrQuery = _bstr_t(L"SELECT * FROM") +
  886. _bstr_t(" meta_class ");
  887. }
  888. else
  889. bstrQuery = _bstr_t(L"SELECT ") + bstrPropList +
  890. _bstr_t(" FROM ") + _bstr_t(pszClassPath);
  891. }
  892. else
  893. {
  894. bstrQuery = _bstr_t("SELECT ") + bstrPropList +
  895. _bstr_t(" FROM ") + bstrClassName;
  896. }
  897. if(bVerb)
  898. {
  899. if (bClass)
  900. {
  901. _TCHAR pszWhere[MAX_BUFFER] = NULL_STRING;
  902. lstrcpy(pszWhere, _T("__Class = \""));
  903. lstrcat(pszWhere, pszClassPath);
  904. lstrcat(pszWhere, _T("\""));
  905. pszWhereExpr = pszWhere;
  906. }
  907. else
  908. pszWhereExpr = rParsedInfo.GetCmdSwitchesObject().
  909. GetWhereExpression();
  910. }
  911. else if(pszPath)
  912. {
  913. _TCHAR pszWhere[MAX_BUFFER] = NULL_STRING;
  914. bRet = ExtractClassNameandWhereExpr(pszPath,
  915. rParsedInfo, pszWhere);
  916. if(bRet)
  917. pszWhereExpr = pszWhere;
  918. }
  919. if(pszWhereExpr)
  920. {
  921. bstrQuery += _bstr_t(" WHERE ") + _bstr_t(pszWhereExpr);
  922. }
  923. rParsedInfo.GetCmdSwitchesObject().SetFormedQuery(bstrQuery);
  924. rParsedInfo.GetCmdSwitchesObject().SetSysPropFlag(bSysProp);
  925. }
  926. else
  927. {
  928. bstrQuery = rParsedInfo.GetCmdSwitchesObject().GetFormedQuery();
  929. bSysProp = rParsedInfo.GetCmdSwitchesObject().GetSysPropFlag();
  930. }
  931. // Create the object of IWbemObjectTextSrc interface.
  932. if (m_pITextSrc == NULL)
  933. hr = CreateWMIXMLTextSrc(rParsedInfo);
  934. if (SUCCEEDED(hr))
  935. {
  936. // Connect to WMI namespace
  937. if (m_pITargetNS == NULL)
  938. {
  939. if ( IsFailFastAndNodeExist(rParsedInfo) == TRUE )
  940. {
  941. hr = ConnectToTargetNS(rParsedInfo);
  942. ONFAILTHROWERROR(hr);
  943. }
  944. else
  945. hr = -1;
  946. }
  947. if (SUCCEEDED(hr))
  948. {
  949. // Obtain the XML Result set.
  950. hr = ObtainXMLResultSet(bstrQuery, rParsedInfo,
  951. bstrXML, bSysProp, TRUE);
  952. }
  953. if(!bVerb)
  954. {
  955. BOOL bRet = g_wmiCmd.GetFormatObject().
  956. DisplayResults(rParsedInfo, TRUE);
  957. rParsedInfo.GetCmdSwitchesObject().FreeCOMError();
  958. rParsedInfo.GetCmdSwitchesObject().SetErrataCode(0);
  959. rParsedInfo.GetCmdSwitchesObject().SetInformationCode(0);
  960. }
  961. }
  962. bRet = FAILED(hr) ? FALSE : TRUE;
  963. }
  964. catch(_com_error& e)
  965. {
  966. bRet = FALSE;
  967. _com_issue_error(e.Error());
  968. }
  969. return bRet;
  970. }
  971. /*------------------------------------------------------------------------
  972. Name :ProcessCALLVerb
  973. Synopsis :Processes the CALL verb request referring to the
  974. information available with CParsedInfo object.
  975. Type :Member Function
  976. Input Parameter(s):
  977. rParsedInfo - reference to CParsedInfo class object
  978. Output Parameter(s):
  979. rParsedInfo - reference to CParsedInfo class object
  980. Return Type :BOOL
  981. Global Variables :None
  982. Calling Syntax :ProcessCALLVerb(rParsedInfo)
  983. Notes :None
  984. ------------------------------------------------------------------------*/
  985. BOOL CExecEngine::ProcessCALLVerb(CParsedInfo& rParsedInfo)
  986. {
  987. HRESULT hr = S_OK;
  988. BOOL bRet = TRUE;
  989. try
  990. {
  991. // Connect to WMI namespace
  992. if (m_pITargetNS == NULL)
  993. {
  994. if ( IsFailFastAndNodeExist(rParsedInfo) == TRUE )
  995. hr = ConnectToTargetNS(rParsedInfo);
  996. else
  997. bRet = FALSE;
  998. ONFAILTHROWERROR(hr);
  999. }
  1000. if ( bRet == TRUE )
  1001. {
  1002. // Check for the verb type, so as to handle lauching of other
  1003. // commandline utilities from the shell.
  1004. if ( rParsedInfo.GetCmdSwitchesObject().GetVerbType() == CMDLINE )
  1005. {
  1006. if (!ExecOtherCmdLineUtlty(rParsedInfo))
  1007. bRet = FALSE;
  1008. }
  1009. else
  1010. {
  1011. if (!ExecWMIMethod(rParsedInfo))
  1012. bRet = FALSE;
  1013. }
  1014. }
  1015. }
  1016. catch(_com_error& e)
  1017. {
  1018. // Store the COM error and set the return value to FALSE
  1019. rParsedInfo.GetCmdSwitchesObject().SetCOMError(e);
  1020. bRet = FALSE;
  1021. }
  1022. return bRet;
  1023. }
  1024. /*------------------------------------------------------------------------
  1025. Name :ProcessASSOCVerb
  1026. Synopsis :Processes the ASSOC verb request referring to the
  1027. information available with CParsedInfo object.
  1028. Type :Member Function
  1029. Input Parameter(s):
  1030. rParsedInfo - reference to CParsedInfo class object
  1031. Output Parameter(s):
  1032. rParsedInfo - reference to CParsedInfo class object
  1033. Return Type :BOOL
  1034. Global Variables :None
  1035. Calling Syntax :ProcessASSOCVerb(rParsedInfo)
  1036. Notes :None
  1037. ------------------------------------------------------------------------*/
  1038. BOOL CExecEngine::ProcessASSOCVerb(CParsedInfo& rParsedInfo)
  1039. {
  1040. HRESULT hr = S_OK;
  1041. BOOL bRet = TRUE;
  1042. WMICLIINT nReqType = 0;
  1043. BOOL bSwitches = FALSE,
  1044. bClass = TRUE,
  1045. bInstances = FALSE;
  1046. IEnumWbemClassObject *pIEnumObj = NULL;
  1047. IWbemClassObject *pIWbemObj = NULL;
  1048. VARIANT varPath;
  1049. VariantInit(&varPath);
  1050. try
  1051. {
  1052. _bstr_t bstrClassName(""), bstrQuery(""), bstrAssocWhere(""),
  1053. bstrResult(""), bstrXML(""), bstrAggResult("");
  1054. bstrAggResult = MULTINODE_XMLSTARTTAG;
  1055. //If assoc switches are specified, bSwitches is set and correspondingly
  1056. //assoc where clause is framed
  1057. bSwitches =((rParsedInfo.GetCmdSwitchesObject().GetResultClassName())||
  1058. (rParsedInfo.GetCmdSwitchesObject().GetResultRoleName()) ||
  1059. (rParsedInfo.GetCmdSwitchesObject().GetAssocClassName()));
  1060. if(bSwitches)
  1061. {
  1062. bstrAssocWhere += _bstr_t(" WHERE ");
  1063. if((rParsedInfo.GetCmdSwitchesObject().GetResultClassName())
  1064. != NULL )
  1065. {
  1066. bstrAssocWhere += _bstr_t(L" ResultClass = ") +
  1067. _bstr_t(rParsedInfo.GetCmdSwitchesObject().
  1068. GetResultClassName());
  1069. }
  1070. if((rParsedInfo.GetCmdSwitchesObject().GetResultRoleName())
  1071. != NULL)
  1072. {
  1073. bstrAssocWhere += _bstr_t(L" ResultRole = ") +
  1074. _bstr_t(rParsedInfo.GetCmdSwitchesObject().
  1075. GetResultRoleName());
  1076. }
  1077. if((rParsedInfo.GetCmdSwitchesObject().GetAssocClassName())
  1078. != NULL)
  1079. {
  1080. bstrAssocWhere += _bstr_t(L" AssocClass = ") +
  1081. _bstr_t(rParsedInfo.GetCmdSwitchesObject().
  1082. GetAssocClassName());
  1083. }
  1084. }
  1085. //NOTE: nReqType = 2 implies that first get all instances and then
  1086. // find associations for each instance
  1087. // If PATH is specified
  1088. if (rParsedInfo.GetCmdSwitchesObject().GetPathExpression() != NULL)
  1089. {
  1090. // If PATH is specified (with key expression).
  1091. if (!rParsedInfo.GetCmdSwitchesObject().
  1092. GetExplicitWhereExprFlag())
  1093. {
  1094. if (rParsedInfo.GetCmdSwitchesObject().
  1095. GetWhereExpression() == NULL)
  1096. {
  1097. nReqType = 2;
  1098. }
  1099. else
  1100. {
  1101. nReqType = 1;
  1102. bstrQuery = _bstr_t(L"ASSOCIATORS OF {")
  1103. + _bstr_t(rParsedInfo.GetCmdSwitchesObject()
  1104. .GetPathExpression()
  1105. + _bstr_t("}"));
  1106. }
  1107. }
  1108. else
  1109. nReqType = 2;
  1110. }
  1111. // If CLASS expression is specified.
  1112. //associators of the class need to be displayed
  1113. if (rParsedInfo.GetCmdSwitchesObject().GetClassPath() != NULL
  1114. && rParsedInfo.GetCmdSwitchesObject().
  1115. GetPathExpression() == NULL)
  1116. {
  1117. nReqType = 1;
  1118. bstrQuery = _bstr_t(L"ASSOCIATORS OF {")
  1119. + _bstr_t(rParsedInfo.GetCmdSwitchesObject().GetClassPath())
  1120. + _bstr_t("}");
  1121. if (!bSwitches)
  1122. bstrQuery += _bstr_t(L" WHERE SchemaOnly");
  1123. else
  1124. bstrQuery += bstrAssocWhere + _bstr_t(L" SchemaOnly");
  1125. }
  1126. // Check for <alias> or alias and path without keyclause
  1127. if (nReqType != 1)
  1128. {
  1129. // Obtain the alias target class
  1130. if(rParsedInfo.GetCmdSwitchesObject().GetAliasName() != NULL)
  1131. {
  1132. rParsedInfo.GetCmdSwitchesObject().GetClassOfAliasTarget(
  1133. bstrClassName);
  1134. }
  1135. else
  1136. bstrClassName = _bstr_t(rParsedInfo.GetCmdSwitchesObject().
  1137. GetClassPath());
  1138. //obtain the instances corresponding to the alias target class
  1139. bstrQuery = _bstr_t(L"SELECT * FROM ") + bstrClassName;
  1140. //if pwhere expression is specified or where is specified
  1141. if (rParsedInfo.GetCmdSwitchesObject().
  1142. GetWhereExpression() != NULL)
  1143. {
  1144. bstrQuery += _bstr_t(" WHERE ") +_bstr_t(rParsedInfo.
  1145. GetCmdSwitchesObject().GetWhereExpression());
  1146. }
  1147. nReqType = 2;
  1148. }
  1149. // Create the object of IWbemObjectTextSrc interface.
  1150. if (m_pITextSrc == NULL)
  1151. hr = CreateWMIXMLTextSrc(rParsedInfo);
  1152. if (SUCCEEDED(hr))
  1153. {
  1154. // Connect to WMI namespace
  1155. if (m_pITargetNS == NULL)
  1156. {
  1157. if ( IsFailFastAndNodeExist(rParsedInfo) == TRUE )
  1158. {
  1159. hr = ConnectToTargetNS(rParsedInfo);
  1160. ONFAILTHROWERROR(hr);
  1161. }
  1162. else
  1163. hr = -1; // Explicitly set error
  1164. }
  1165. if (SUCCEEDED(hr))
  1166. {
  1167. if(nReqType != 2)
  1168. {
  1169. // Obtain the XML Result Set.
  1170. hr = ObtainXMLResultSet(bstrQuery, rParsedInfo, bstrXML,
  1171. TRUE, FALSE);
  1172. ONFAILTHROWERROR(hr);
  1173. if (m_bNoAssoc)
  1174. {
  1175. _bstr_t bstrMsg;
  1176. WMIFormatMessage(IDS_I_NO_ASSOC, 0, bstrMsg, NULL);
  1177. DisplayMessage((LPWSTR)bstrMsg, CP_OEMCP, TRUE, TRUE);
  1178. m_bNoAssoc = FALSE;
  1179. }
  1180. if (rParsedInfo.GetCmdSwitchesObject().
  1181. GetPathExpression() == NULL)
  1182. {
  1183. bClass = TRUE;
  1184. hr = FrameAssocHeader(rParsedInfo.
  1185. GetCmdSwitchesObject().GetClassPath(),
  1186. bstrResult, bClass);
  1187. ONFAILTHROWERROR(hr);
  1188. }
  1189. else
  1190. {
  1191. bClass = FALSE;
  1192. hr = FrameAssocHeader(
  1193. rParsedInfo.GetCmdSwitchesObject()
  1194. .GetPathExpression(), bstrResult, bClass);
  1195. ONFAILTHROWERROR(hr);
  1196. }
  1197. bstrResult += bstrXML;
  1198. bstrResult += (bClass) ? L"</CLASS>" : L"</INSTANCE>";
  1199. bstrAggResult += bstrResult;
  1200. }
  1201. else
  1202. {
  1203. // Set the class flag to FALSE
  1204. bClass = FALSE;
  1205. ULONG ulReturned = 0;
  1206. CHString chsMsg;
  1207. DWORD dwThreadId =
  1208. GetCurrentThreadId();
  1209. VariantInit(&varPath);
  1210. try
  1211. {
  1212. //enumerate the instances
  1213. hr = m_pITargetNS->ExecQuery(_bstr_t(L"WQL"),
  1214. bstrQuery,
  1215. WBEM_FLAG_FORWARD_ONLY |
  1216. WBEM_FLAG_RETURN_IMMEDIATELY,
  1217. NULL, &pIEnumObj);
  1218. if (m_bTrace || m_eloErrLogOpt)
  1219. {
  1220. chsMsg.Format(L"IWbemServices::ExecQuery(L\"WQL\","
  1221. L"L\"%s\", 0, NULL, -)",
  1222. (LPWSTR)bstrQuery);
  1223. WMITRACEORERRORLOG(hr, __LINE__, __FILE__,
  1224. (LPCWSTR)chsMsg, dwThreadId, rParsedInfo,
  1225. m_bTrace);
  1226. }
  1227. ONFAILTHROWERROR(hr);
  1228. // Set the interface security
  1229. hr = SetSecurity(pIEnumObj,
  1230. rParsedInfo.GetGlblSwitchesObject().
  1231. GetAuthority(),
  1232. rParsedInfo.GetNode(),
  1233. rParsedInfo.GetUser(),
  1234. rParsedInfo.GetPassword(),
  1235. rParsedInfo.GetGlblSwitchesObject().
  1236. GetAuthenticationLevel(),
  1237. rParsedInfo.GetGlblSwitchesObject().
  1238. GetImpersonationLevel());
  1239. if (m_bTrace || m_eloErrLogOpt)
  1240. {
  1241. chsMsg.Format(
  1242. L"CoSetProxyBlanket(-, RPC_C_AUTHN_WINNT, "
  1243. L"RPC_C_AUTHZ_NONE, NULL, %d, %d, -, "
  1244. L"EOAC_NONE)",
  1245. rParsedInfo.GetGlblSwitchesObject().
  1246. GetAuthenticationLevel(),
  1247. rParsedInfo.GetGlblSwitchesObject().
  1248. GetImpersonationLevel());
  1249. WMITRACEORERRORLOG(hr, __LINE__, __FILE__,
  1250. (LPCWSTR)chsMsg, dwThreadId,
  1251. rParsedInfo, m_bTrace);
  1252. }
  1253. ONFAILTHROWERROR(hr);
  1254. // Loop thru the available instances
  1255. hr = pIEnumObj->Next( WBEM_INFINITE, 1, &pIWbemObj,
  1256. &ulReturned );
  1257. if (m_bTrace || m_eloErrLogOpt)
  1258. {
  1259. chsMsg.Format(
  1260. L"IEnumWbemClassObject->Next(WBEM_INFINITE, 1,"
  1261. L"-, -)");
  1262. WMITRACEORERRORLOG(hr, __LINE__, __FILE__,
  1263. (LPCWSTR)chsMsg, dwThreadId, rParsedInfo,
  1264. m_bTrace);
  1265. }
  1266. ONFAILTHROWERROR(hr);
  1267. // Set this property in all objects of the collection
  1268. while (ulReturned == 1)
  1269. {
  1270. bInstances = TRUE;
  1271. VariantInit(&varPath);
  1272. hr = pIWbemObj->Get(L"__PATH", 0, &varPath, 0, 0);
  1273. if (m_bTrace || m_eloErrLogOpt)
  1274. {
  1275. chsMsg.Format(
  1276. L"IWbemClassObject::Get(L\"__PATH\", 0, -,"
  1277. L"0, 0)");
  1278. GetBstrTFromVariant(varPath, bstrResult);
  1279. WMITRACEORERRORLOG(hr, __LINE__, __FILE__,
  1280. (LPCWSTR)chsMsg, dwThreadId, rParsedInfo,
  1281. m_bTrace, 0, bstrResult);
  1282. }
  1283. ONFAILTHROWERROR(hr);
  1284. //form the query for finding the associators
  1285. //of each of the instances
  1286. bstrQuery = _bstr_t(L"ASSOCIATORS OF {")
  1287. + varPath.bstrVal
  1288. + _bstr_t("}") ;
  1289. if (bSwitches)
  1290. bstrQuery += bstrAssocWhere;
  1291. hr = FrameAssocHeader(varPath.bstrVal, bstrResult,
  1292. bClass);
  1293. ONFAILTHROWERROR(hr);
  1294. //Obtain the result set for the associators
  1295. //of the corresponding instance
  1296. hr = ObtainXMLResultSet(bstrQuery, rParsedInfo,
  1297. bstrXML, TRUE, FALSE);
  1298. ONFAILTHROWERROR(hr);
  1299. if (m_bNoAssoc)
  1300. {
  1301. _bstr_t bstrMsg;
  1302. WMIFormatMessage(IDS_I_NO_ASSOCIATIONS, 1,
  1303. bstrMsg, (LPWSTR)varPath.bstrVal);
  1304. DisplayMessage((LPWSTR)bstrMsg, CP_OEMCP,
  1305. TRUE, TRUE);
  1306. m_bNoAssoc = FALSE;
  1307. }
  1308. bstrResult += bstrXML;
  1309. bstrResult += L"</INSTANCE>";
  1310. bstrAggResult += bstrResult;
  1311. //check for ctrl+c
  1312. if ( g_wmiCmd.GetBreakEvent() == TRUE )
  1313. {
  1314. VARIANTCLEAR(varPath);
  1315. SAFEIRELEASE(pIWbemObj);
  1316. break;
  1317. }
  1318. VARIANTCLEAR(varPath);
  1319. SAFEIRELEASE(pIWbemObj);
  1320. if ( bRet == FALSE )
  1321. break;
  1322. // Obtain the next instance in the enumeration.
  1323. hr = pIEnumObj->Next( WBEM_INFINITE, 1, &pIWbemObj,
  1324. &ulReturned);
  1325. if (m_bTrace || m_eloErrLogOpt)
  1326. {
  1327. chsMsg.Format(
  1328. L"IEnumWbemClassObject->Next(WBEM_INFINITE,"
  1329. L"1, -, -)");
  1330. WMITRACEORERRORLOG(hr, __LINE__, __FILE__,
  1331. (LPCWSTR)chsMsg,
  1332. dwThreadId, rParsedInfo, m_bTrace);
  1333. }
  1334. ONFAILTHROWERROR(hr);
  1335. }
  1336. SAFEIRELEASE(pIEnumObj);
  1337. // If no instances are available
  1338. if (bInstances == FALSE)
  1339. {
  1340. _bstr_t bstrMsg;
  1341. WMIFormatMessage(IDS_I_NO_INSTANCES,
  1342. 0, bstrMsg, NULL);
  1343. DisplayMessage((LPWSTR)bstrMsg, CP_OEMCP,
  1344. TRUE, TRUE);
  1345. CHString sTemp;
  1346. sTemp.Format(
  1347. _T("<ERROR><DESCRIPTION>%s</DESCRIPTION></ERROR>"),
  1348. (LPWSTR) bstrMsg);
  1349. bstrAggResult = _bstr_t(sTemp);
  1350. }
  1351. }
  1352. catch(_com_error& e)
  1353. {
  1354. VARIANTCLEAR(varPath);
  1355. SAFEIRELEASE(pIWbemObj);
  1356. SAFEIRELEASE(pIEnumObj);
  1357. rParsedInfo.GetCmdSwitchesObject().SetCOMError(e);
  1358. }
  1359. }
  1360. if (SUCCEEDED(hr))
  1361. {
  1362. if ((nReqType != 2) || ((nReqType == 2) && bInstances))
  1363. {
  1364. bstrAggResult += L"</CIM>";
  1365. rParsedInfo.GetCmdSwitchesObject().
  1366. SetXMLResultSet(bstrAggResult);
  1367. }
  1368. }
  1369. }
  1370. bRet = FAILED(hr) ? FALSE : TRUE;
  1371. }
  1372. }
  1373. catch(_com_error& e)
  1374. {
  1375. VARIANTCLEAR(varPath);
  1376. SAFEIRELEASE(pIWbemObj);
  1377. SAFEIRELEASE(pIEnumObj);
  1378. _com_issue_error(e.Error());
  1379. }
  1380. // trap for CHeap_Exception
  1381. catch(CHeap_Exception)
  1382. {
  1383. VARIANTCLEAR(varPath);
  1384. SAFEIRELEASE(pIWbemObj);
  1385. SAFEIRELEASE(pIEnumObj);
  1386. _com_issue_error(WBEM_E_OUT_OF_MEMORY);
  1387. }
  1388. return bRet;
  1389. }
  1390. /*------------------------------------------------------------------------
  1391. Name :ProcessSETVerb
  1392. Synopsis :Processes the SET verb referring to the information
  1393. available with CParsedInfo object.
  1394. Type :Member Function
  1395. Input Parameter(s):
  1396. rParsedInfo - reference to CParsedInfo class object
  1397. Output Parameter(s):
  1398. rParsedInfo - reference to CParsedInfo class object
  1399. Return Type :BOOL
  1400. Global Variables :None
  1401. Calling Syntax :ProcessSETVerb(rParsedInfo)
  1402. Notes :None
  1403. ------------------------------------------------------------------------*/
  1404. BOOL CExecEngine::ProcessSETVerb(CParsedInfo& rParsedInfo)
  1405. {
  1406. // SET verb processing
  1407. BOOL bRet = TRUE;
  1408. HRESULT hr = S_OK;
  1409. try
  1410. {
  1411. _bstr_t bstrQuery(""), bstrObject(""), bstrClass("");
  1412. // If anyone of the following is specified:
  1413. // a) PATH <path expr>
  1414. // b) PATH <class path expr> WHERE <where expr>
  1415. if (rParsedInfo.GetCmdSwitchesObject().GetPathExpression() != NULL)
  1416. {
  1417. bstrClass = _bstr_t(rParsedInfo.GetCmdSwitchesObject()
  1418. .GetClassPath());
  1419. bstrObject = _bstr_t(rParsedInfo.GetCmdSwitchesObject()
  1420. .GetPathExpression());
  1421. // Form the query
  1422. bstrQuery = _bstr_t(L"SELECT * FROM ") + bstrClass ;
  1423. // If WHERE expresion is given
  1424. if (rParsedInfo.GetCmdSwitchesObject().
  1425. GetWhereExpression() != NULL)
  1426. {
  1427. bstrQuery += _bstr_t(L" WHERE ")
  1428. + _bstr_t(rParsedInfo.GetCmdSwitchesObject()
  1429. .GetWhereExpression());
  1430. }
  1431. }
  1432. // If <alias> WHERE expression is specified.
  1433. else if (rParsedInfo.GetCmdSwitchesObject().GetWhereExpression()
  1434. != NULL)
  1435. {
  1436. rParsedInfo.GetCmdSwitchesObject().
  1437. GetClassOfAliasTarget(bstrObject);
  1438. bstrQuery = _bstr_t(L"SELECT * FROM ")
  1439. + bstrObject
  1440. + _bstr_t(L" WHERE ")
  1441. + _bstr_t(rParsedInfo.GetCmdSwitchesObject()
  1442. .GetWhereExpression());
  1443. bstrClass = bstrObject;
  1444. }
  1445. // If CLASS is specified.
  1446. else if (rParsedInfo.GetCmdSwitchesObject().GetClassPath() != NULL)
  1447. {
  1448. bstrObject = _bstr_t(rParsedInfo.GetCmdSwitchesObject()
  1449. .GetClassPath());
  1450. bstrClass = bstrObject;
  1451. }
  1452. // if only <alias> is specified
  1453. else
  1454. {
  1455. rParsedInfo.GetCmdSwitchesObject().
  1456. GetClassOfAliasTarget(bstrObject);
  1457. bstrQuery = _bstr_t(L"SELECT * FROM ")
  1458. + bstrObject;
  1459. bstrClass = bstrObject;
  1460. }
  1461. // Connect to WMI namespace
  1462. if (m_pITargetNS == NULL)
  1463. {
  1464. if ( IsFailFastAndNodeExist(rParsedInfo) == TRUE )
  1465. {
  1466. hr = ConnectToTargetNS(rParsedInfo);
  1467. ONFAILTHROWERROR(hr);
  1468. }
  1469. else
  1470. hr = -1; // Explicitly set error
  1471. }
  1472. if (SUCCEEDED(hr))
  1473. {
  1474. // Validate the property values against the property
  1475. // qualifier information if available.
  1476. if (rParsedInfo.GetCmdSwitchesObject().GetAliasName() != NULL)
  1477. {
  1478. // Validate the input parameters against the alias
  1479. // qualifier information.
  1480. bRet = ValidateAlaisInParams(rParsedInfo);
  1481. }
  1482. else
  1483. {
  1484. // Validate the input parameters against the class
  1485. // qualifier information
  1486. bRet = ValidateInParams(rParsedInfo, bstrClass);
  1487. }
  1488. if (bRet)
  1489. {
  1490. // Set the values passed as input to the appropriate properties.
  1491. bRet = SetPropertyInfo(rParsedInfo, bstrQuery, bstrObject);
  1492. }
  1493. }
  1494. else
  1495. bRet = FALSE;
  1496. }
  1497. catch(_com_error& e)
  1498. {
  1499. _com_issue_error(e.Error());
  1500. bRet = FALSE;
  1501. }
  1502. return bRet;
  1503. }
  1504. /*------------------------------------------------------------------------
  1505. Name :SetPropertyInfo
  1506. Synopsis :This function updates the property value for the
  1507. given property name and value
  1508. Type :Member Function
  1509. Input Parameter(s):
  1510. rParsedInfo - reference to the CParsedInfo object
  1511. bstrQuery - String consist of WQL query
  1512. bstrObject - String consist of object path
  1513. Output Parameter(s):
  1514. rParsedInfo - reference to the CParsedInfo object
  1515. Return Type :BOOL
  1516. Global Variables :None
  1517. Calling Syntax :SetPropertyInfo(rParsedInfo, bstrQuery, bstrObject)
  1518. Notes :None
  1519. ------------------------------------------------------------------------*/
  1520. BOOL CExecEngine::SetPropertyInfo(CParsedInfo& rParsedInfo,
  1521. _bstr_t& bstrQuery, _bstr_t& bstrObject)
  1522. {
  1523. HRESULT hr = S_OK;
  1524. IEnumWbemClassObject *pIEnumObj = NULL;
  1525. IWbemClassObject *pIWbemObj = NULL;
  1526. ULONG ulReturned = 0;
  1527. BOOL bSuccess = TRUE;
  1528. CHString chsMsg;
  1529. DWORD dwThreadId = GetCurrentThreadId();
  1530. VARIANT varPath;
  1531. VariantInit(&varPath);
  1532. try
  1533. {
  1534. if (bstrQuery == _bstr_t(""))
  1535. {
  1536. // If query is NULL then get the object of WMI Class based on
  1537. // PATH expression
  1538. hr = m_pITargetNS->GetObject(bstrObject,
  1539. 0, NULL, &pIWbemObj, NULL);
  1540. if (m_bTrace || m_eloErrLogOpt)
  1541. {
  1542. chsMsg.Format(L"IWbemServices::GetObject(L\"%s\", 0, "
  1543. L"NULL, -)", (LPWSTR) bstrObject);
  1544. WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg,
  1545. dwThreadId, rParsedInfo, m_bTrace);
  1546. }
  1547. ONFAILTHROWERROR(hr);
  1548. // If instance path is specified then modify the instance
  1549. // properties otherwise modify class properties
  1550. if(rParsedInfo.GetCmdSwitchesObject().GetWhereExpression() == NULL)
  1551. bSuccess = SetProperties(rParsedInfo, pIWbemObj, TRUE);
  1552. else
  1553. bSuccess = SetProperties(rParsedInfo, pIWbemObj, FALSE);
  1554. SAFEIRELEASE(pIWbemObj);
  1555. }
  1556. else
  1557. {
  1558. // Execute the query to get collection of objects
  1559. hr = m_pITargetNS->ExecQuery(_bstr_t(L"WQL"), bstrQuery, 0,
  1560. NULL, &pIEnumObj);
  1561. if (m_bTrace || m_eloErrLogOpt)
  1562. {
  1563. chsMsg.Format(L"IWbemServices::ExecQuery(L\"WQL\","
  1564. L"L\"%s\", 0, NULL, -)", (LPWSTR)bstrQuery);
  1565. WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg,
  1566. dwThreadId, rParsedInfo, m_bTrace);
  1567. }
  1568. ONFAILTHROWERROR(hr);
  1569. // Set the interface security
  1570. hr = SetSecurity(pIEnumObj,
  1571. rParsedInfo.GetGlblSwitchesObject().GetAuthority(),
  1572. rParsedInfo.GetNode(),
  1573. rParsedInfo.GetUser(),
  1574. rParsedInfo.GetPassword(),
  1575. rParsedInfo.GetGlblSwitchesObject().
  1576. GetAuthenticationLevel(),
  1577. rParsedInfo.GetGlblSwitchesObject().
  1578. GetImpersonationLevel());
  1579. if (m_bTrace || m_eloErrLogOpt)
  1580. {
  1581. chsMsg.Format(L"CoSetProxyBlanket(-, RPC_C_AUTHN_WINNT, "
  1582. L"RPC_C_AUTHZ_NONE, NULL, %d, %d, -, EOAC_NONE)",
  1583. rParsedInfo.GetGlblSwitchesObject().
  1584. GetAuthenticationLevel(),
  1585. rParsedInfo.GetGlblSwitchesObject().
  1586. GetImpersonationLevel());
  1587. WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg,
  1588. dwThreadId, rParsedInfo, m_bTrace);
  1589. }
  1590. ONFAILTHROWERROR(hr);
  1591. BOOL bInstances = FALSE;
  1592. // Loop thru the available instances
  1593. hr = pIEnumObj->Next( WBEM_INFINITE, 1, &pIWbemObj, &ulReturned );
  1594. // Set this property in all objects of the collection
  1595. while (ulReturned == 1)
  1596. {
  1597. bInstances = TRUE;
  1598. // If instance updation failed.
  1599. if (!SetProperties(rParsedInfo, pIWbemObj, FALSE))
  1600. {
  1601. bSuccess = FALSE;
  1602. VARIANTCLEAR(varPath);
  1603. SAFEIRELEASE(pIEnumObj);
  1604. SAFEIRELEASE(pIWbemObj);
  1605. break;
  1606. }
  1607. VARIANTCLEAR(varPath);
  1608. SAFEIRELEASE(pIWbemObj);
  1609. // Obtain the next instance in the enumeration.
  1610. hr = pIEnumObj->Next( WBEM_INFINITE, 1,
  1611. &pIWbemObj, &ulReturned);
  1612. }
  1613. SAFEIRELEASE(pIEnumObj);
  1614. // If no instances are available
  1615. if (!bInstances)
  1616. {
  1617. rParsedInfo.GetCmdSwitchesObject().
  1618. SetInformationCode(IDS_I_NO_INSTANCES);
  1619. }
  1620. }
  1621. }
  1622. catch(_com_error& e)
  1623. {
  1624. SAFEIRELEASE(pIEnumObj);
  1625. SAFEIRELEASE(pIWbemObj);
  1626. rParsedInfo.GetCmdSwitchesObject().SetCOMError(e);
  1627. bSuccess = FALSE;
  1628. }
  1629. // trap for CHeap_Exception
  1630. catch(CHeap_Exception)
  1631. {
  1632. SAFEIRELEASE(pIEnumObj);
  1633. SAFEIRELEASE(pIWbemObj);
  1634. _com_issue_error(WBEM_E_OUT_OF_MEMORY);
  1635. }
  1636. return bSuccess;
  1637. }
  1638. /*------------------------------------------------------------------------
  1639. Name :SetProperties
  1640. Synopsis :This function changes the property values for the
  1641. given property names and values in a passed
  1642. IWbemClassObject
  1643. Type :Member Function
  1644. Input Parameter(s):
  1645. rParsedInfo - CParsedInfo object consist of parsed tokens
  1646. pIWbemObj - IWbemClassObject in which property has to be set
  1647. bClass - Flag to indicate whether class object is passed or
  1648. instance is passed
  1649. Output Parameter(s):None
  1650. Return Type :BOOL
  1651. Global Variables :None
  1652. Calling Syntax :SetProperties(rParsedInfo, pIWbemObj, bClass)
  1653. Notes :None
  1654. ------------------------------------------------------------------------*/
  1655. BOOL CExecEngine::SetProperties(CParsedInfo& rParsedInfo,
  1656. IWbemClassObject* pIWbemObj, BOOL bClass)
  1657. {
  1658. HRESULT hr = S_OK;
  1659. IWbemQualifierSet *pIQualSet = NULL;
  1660. BOOL bRet = TRUE,
  1661. bInteractive = FALSE,
  1662. bChange = FALSE;
  1663. CHString chsMsg;
  1664. DWORD dwThreadId = GetCurrentThreadId();
  1665. BSTRMAP::iterator theIterator = NULL;
  1666. VARIANT varValue,
  1667. varDest,
  1668. varSrc,
  1669. varPath,
  1670. varType;
  1671. INTEROPTION interOption = YES;
  1672. VariantInit(&varValue);
  1673. VariantInit(&varDest);
  1674. VariantInit(&varSrc);
  1675. VariantInit(&varPath);
  1676. VariantInit(&varType);
  1677. // Get the proprty name and their corresponding value
  1678. BSTRMAP theMap = rParsedInfo.GetCmdSwitchesObject().GetParameterMap();
  1679. // Set the iterator to the start of the map.
  1680. theIterator = theMap.begin();
  1681. // obtian the verb interactive mode status.
  1682. bInteractive = IsInteractive(rParsedInfo);
  1683. try
  1684. {
  1685. _bstr_t bstrResult;
  1686. // Obtain the __PATH property value
  1687. hr = pIWbemObj->Get(_bstr_t(L"__PATH"), 0, &varPath, 0, 0);
  1688. if (m_bTrace || m_eloErrLogOpt)
  1689. {
  1690. chsMsg.Format(L"IWbemClassObject::Get(L\"__PATH\", 0, -,"
  1691. L"0, 0)");
  1692. GetBstrTFromVariant(varPath, bstrResult);
  1693. WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg,
  1694. dwThreadId, rParsedInfo, m_bTrace, 0, bstrResult);
  1695. }
  1696. ONFAILTHROWERROR(hr);
  1697. // If /INTERACTIVE switch is specified, obtain the user response.
  1698. if (bInteractive)
  1699. {
  1700. _bstr_t bstrMsg;
  1701. while(TRUE)
  1702. {
  1703. if(IsClassOperation(rParsedInfo))
  1704. {
  1705. WMIFormatMessage(IDS_I_UPDATE_PROMPT, 1, bstrMsg,
  1706. (LPWSTR) _bstr_t(varPath.bstrVal));
  1707. interOption = GetUserResponse((LPWSTR)bstrMsg);
  1708. }
  1709. else
  1710. {
  1711. WMIFormatMessage(IDS_I_UPDATE_PROMPT2, 1, bstrMsg,
  1712. (LPWSTR) _bstr_t(varPath.bstrVal));
  1713. interOption = GetUserResponseEx((LPWSTR)bstrMsg);
  1714. }
  1715. if (interOption == YES || interOption == NO)
  1716. break;
  1717. else
  1718. if (interOption == HELP)
  1719. {
  1720. rParsedInfo.GetCmdSwitchesObject().
  1721. SetInformationCode(0);
  1722. ProcessSHOWInfo(rParsedInfo, FALSE,
  1723. (_TCHAR*)_bstr_t(varPath.bstrVal));
  1724. }
  1725. }
  1726. }
  1727. else
  1728. {
  1729. _bstr_t bstrMsg;
  1730. WMIFormatMessage(IDS_I_PROMPT_UPDATING, 1, bstrMsg,
  1731. (LPWSTR) _bstr_t(varPath.bstrVal));
  1732. DisplayMessage((LPWSTR)bstrMsg, CP_OEMCP, FALSE, TRUE);
  1733. }
  1734. VARIANTCLEAR(varPath);
  1735. VariantInit(&varSrc);
  1736. VariantInit(&varDest);
  1737. if (interOption == YES)
  1738. {
  1739. PROPDETMAP pdmPropDetMap = rParsedInfo.GetCmdSwitchesObject().
  1740. GetPropDetMap();
  1741. PROPDETMAP::iterator itrPropDetMap;
  1742. BOOL bPropType = FALSE;
  1743. // Update all properties
  1744. while (theIterator != theMap.end())
  1745. {
  1746. // Get the property names and their corresponding values
  1747. _bstr_t bstrProp = _bstr_t((_TCHAR*)(*theIterator).first);
  1748. // Get the derivation of property name
  1749. if ( Find(pdmPropDetMap, bstrProp, itrPropDetMap) == TRUE )
  1750. {
  1751. if ( !((*itrPropDetMap).second.Derivation) == FALSE )
  1752. bstrProp = (*itrPropDetMap).second.Derivation;
  1753. bPropType = TRUE;
  1754. }
  1755. else
  1756. bPropType = FALSE;
  1757. // Check for the property validity(i.e. does it exist or not?)
  1758. VariantInit(&varValue);
  1759. hr = pIWbemObj->Get(bstrProp, 0, &varValue, 0, 0);
  1760. if (m_bTrace || m_eloErrLogOpt)
  1761. {
  1762. chsMsg.Format(L"IWbemClassObject::Get(L\"%s\", 0, -,"
  1763. L"0, 0)", (LPWSTR) bstrProp);
  1764. if ( bPropType )
  1765. {
  1766. GetBstrTFromVariant(varValue, bstrResult,
  1767. (*itrPropDetMap).second.Type);
  1768. }
  1769. else
  1770. GetBstrTFromVariant(varValue, bstrResult);
  1771. WMITRACEORERRORLOG(hr, __LINE__, __FILE__,
  1772. (LPCWSTR)chsMsg, dwThreadId, rParsedInfo,
  1773. m_bTrace, 0, bstrResult);
  1774. }
  1775. ONFAILTHROWERROR(hr);
  1776. // Set the change flag to TRUE
  1777. bChange = TRUE;
  1778. // If the property content is <empty>
  1779. if ((varValue.vt == VT_EMPTY) || (varValue.vt == VT_NULL))
  1780. {
  1781. // Obtain the property qualifier set for the property
  1782. hr = pIWbemObj->GetPropertyQualifierSet(bstrProp,
  1783. &pIQualSet);
  1784. if (m_bTrace || m_eloErrLogOpt)
  1785. {
  1786. chsMsg.Format(
  1787. L"IWbemClassObject::GetPropertyQualifierSet(L\"%s\","
  1788. L" -)", (LPWSTR)bstrProp);
  1789. WMITRACEORERRORLOG(hr, __LINE__, __FILE__,
  1790. (LPCWSTR)chsMsg, dwThreadId, rParsedInfo, m_bTrace);
  1791. }
  1792. ONFAILTHROWERROR(hr);
  1793. VariantInit(&varType);
  1794. if (pIQualSet)
  1795. {
  1796. // Obtain the CIM type of the property
  1797. hr = pIQualSet->Get(_bstr_t(L"CIMTYPE"), 0L,
  1798. &varType, NULL);
  1799. if (m_bTrace || m_eloErrLogOpt)
  1800. {
  1801. chsMsg.Format(L"IWbemQualifierSet::Get(L\"CIMTYPE\","
  1802. L" 0, -, 0, 0)");
  1803. GetBstrTFromVariant(varType, bstrResult);
  1804. WMITRACEORERRORLOG(hr, __LINE__, __FILE__,
  1805. (LPCWSTR)chsMsg, dwThreadId, rParsedInfo,
  1806. m_bTrace, 0, bstrResult);
  1807. }
  1808. ONFAILTHROWERROR(hr);
  1809. varSrc.vt = VT_BSTR;
  1810. varSrc.bstrVal = SysAllocString(
  1811. (_TCHAR*)(*theIterator).second);
  1812. hr = ConvertCIMTYPEToVarType(varDest, varSrc,
  1813. (_TCHAR*)varType.bstrVal);
  1814. if ( m_eloErrLogOpt )
  1815. {
  1816. chsMsg.Format(L"VariantChangeType(-, -, 0, -)");
  1817. WMITRACEORERRORLOG(hr, __LINE__, __FILE__,
  1818. (LPCWSTR)chsMsg, dwThreadId, rParsedInfo, FALSE);
  1819. }
  1820. ONFAILTHROWERROR(hr);
  1821. VARIANTCLEAR(varType);
  1822. SAFEIRELEASE(pIQualSet);
  1823. }
  1824. }
  1825. // If the property content is not <empty>
  1826. else
  1827. {
  1828. varSrc.vt = VT_BSTR;
  1829. varSrc.bstrVal = SysAllocString(
  1830. (_TCHAR*)(*theIterator).second);
  1831. // If _T("") is the value should be treated as
  1832. // equivalent to <empty>
  1833. if (CompareTokens(varSrc.bstrVal, _T("")))
  1834. hr = VariantChangeType(&varDest, &varSrc, 0, VT_NULL);
  1835. else
  1836. hr = VariantChangeType(&varDest, &varSrc,
  1837. 0, varValue.vt);
  1838. if ( m_eloErrLogOpt )
  1839. {
  1840. chsMsg.Format(L"VariantChangeType(-, -, 0, -)");
  1841. WMITRACEORERRORLOG(hr, __LINE__, __FILE__,
  1842. (LPCWSTR)chsMsg, dwThreadId, rParsedInfo, FALSE);
  1843. }
  1844. ONFAILTHROWERROR(hr);
  1845. }
  1846. // Update the property value
  1847. hr = pIWbemObj->Put(bstrProp, 0, &varDest, 0);
  1848. if (m_bTrace || m_eloErrLogOpt)
  1849. {
  1850. chsMsg.Format(L"IWbemClassObject::Put(L\"%s\", 0, -, 0)",
  1851. (LPWSTR)bstrProp);
  1852. WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg,
  1853. dwThreadId, rParsedInfo, m_bTrace);
  1854. }
  1855. ONFAILTHROWERROR(hr);
  1856. VARIANTCLEAR(varSrc);
  1857. VARIANTCLEAR(varDest);
  1858. VARIANTCLEAR(varValue);
  1859. // Move to next entry
  1860. theIterator++;
  1861. }
  1862. }
  1863. // Write the instance or class object to Windows Management
  1864. // Instrumentation (WMI).
  1865. if (bChange)
  1866. {
  1867. if(bClass)
  1868. {
  1869. // Update the class schema with the changes
  1870. hr = m_pITargetNS->PutClass(pIWbemObj, 0, NULL, NULL);
  1871. if (m_bTrace || m_eloErrLogOpt)
  1872. {
  1873. chsMsg.Format(L"IWbemServices::PutClass(-, 0, "
  1874. L"NULL, NULL)");
  1875. WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg,
  1876. dwThreadId, rParsedInfo, m_bTrace);
  1877. }
  1878. ONFAILTHROWERROR(hr);
  1879. }
  1880. else
  1881. {
  1882. // Update the instance with the changes
  1883. hr = m_pITargetNS->PutInstance(pIWbemObj, WBEM_FLAG_UPDATE_ONLY, NULL, NULL);
  1884. if (m_bTrace || m_eloErrLogOpt)
  1885. {
  1886. chsMsg.Format(L"IWbemServices::PutInstance(-, 0, NULL"
  1887. L", NULL)");
  1888. WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg,
  1889. dwThreadId, rParsedInfo, m_bTrace);
  1890. }
  1891. ONFAILTHROWERROR(hr);
  1892. }
  1893. DisplayString(IDS_I_SET_SUCCESS, CP_OEMCP, NULL, FALSE, TRUE);
  1894. }
  1895. }
  1896. catch(_com_error& e)
  1897. {
  1898. VARIANTCLEAR(varSrc);
  1899. VARIANTCLEAR(varDest);
  1900. VARIANTCLEAR(varValue);
  1901. VARIANTCLEAR(varType);
  1902. SAFEIRELEASE(pIQualSet);
  1903. VARIANTCLEAR(varSrc);
  1904. VARIANTCLEAR(varDest);
  1905. // Store the COM error, and set the return value to FALSE.
  1906. rParsedInfo.GetCmdSwitchesObject().SetCOMError(e);
  1907. bRet = FALSE;
  1908. }
  1909. catch(CHeap_Exception)
  1910. {
  1911. VARIANTCLEAR(varSrc);
  1912. VARIANTCLEAR(varDest);
  1913. VARIANTCLEAR(varValue);
  1914. VARIANTCLEAR(varType);
  1915. SAFEIRELEASE(pIQualSet);
  1916. VARIANTCLEAR(varSrc);
  1917. VARIANTCLEAR(varDest);
  1918. _com_issue_error(WBEM_E_OUT_OF_MEMORY);
  1919. }
  1920. return bRet;
  1921. }
  1922. /*------------------------------------------------------------------------
  1923. Name :ConnectToTargetNS
  1924. Synopsis :This function connects to WMI namespace on the target
  1925. machine with given user credentials.
  1926. Type :Member Function
  1927. Input Parameter(s):
  1928. rParsedInfo - reference to CParsedInfo class object
  1929. Output Parameter(s):
  1930. rParsedInfo - reference to CParsedInfo class object
  1931. Return Type :HRESULT
  1932. Global Variables :None
  1933. Calling Syntax :ConnectToTargetNS(rParsedInfo)
  1934. Notes :None
  1935. ------------------------------------------------------------------------*/
  1936. HRESULT CExecEngine::ConnectToTargetNS(CParsedInfo& rParsedInfo)
  1937. {
  1938. HRESULT hr = S_OK;
  1939. CHString chsMsg;
  1940. DWORD dwThreadId = GetCurrentThreadId();
  1941. try
  1942. {
  1943. SAFEIRELEASE(m_pITargetNS);
  1944. _bstr_t bstrNameSpace = _bstr_t(L"\\\\")
  1945. + _bstr_t(rParsedInfo.GetNode())
  1946. + _bstr_t(L"\\")
  1947. + _bstr_t(rParsedInfo.GetNamespace());
  1948. // Connect to the specified WMI namespace
  1949. hr = Connect(m_pIWbemLocator, &m_pITargetNS,
  1950. bstrNameSpace,
  1951. _bstr_t(rParsedInfo.GetUser()),
  1952. _bstr_t(rParsedInfo.GetPassword()),
  1953. _bstr_t(rParsedInfo.GetLocale()),
  1954. rParsedInfo);
  1955. if (m_bTrace || m_eloErrLogOpt)
  1956. {
  1957. chsMsg.Format(L"IWbemLocator::ConnectServer(L\"%s\", "
  1958. L"L\"%s\", *, L\"%s\", 0L, NULL, NULL, -)",
  1959. (LPWSTR)bstrNameSpace,
  1960. (rParsedInfo.GetUser()) ? rParsedInfo.GetUser() : L"<null>",
  1961. rParsedInfo.GetLocale());
  1962. WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg,
  1963. dwThreadId, rParsedInfo, m_bTrace);
  1964. }
  1965. ONFAILTHROWERROR(hr);
  1966. // Set the interface level security
  1967. hr = SetSecurity(m_pITargetNS,
  1968. rParsedInfo.GetGlblSwitchesObject().GetAuthority(),
  1969. rParsedInfo.GetNode(),
  1970. rParsedInfo.GetUser(),
  1971. rParsedInfo.GetPassword(),
  1972. rParsedInfo.GetGlblSwitchesObject().GetAuthenticationLevel(),
  1973. rParsedInfo.GetGlblSwitchesObject().GetImpersonationLevel());
  1974. if (m_bTrace || m_eloErrLogOpt)
  1975. {
  1976. chsMsg.Format(
  1977. L"CoSetProxyBlanket(-, RPC_C_AUTHN_WINNT, RPC_C_AUTHZ_NONE,"
  1978. L"NULL, %d, %d, -, EOAC_NONE)",
  1979. rParsedInfo.GetGlblSwitchesObject().GetAuthenticationLevel(),
  1980. rParsedInfo.GetGlblSwitchesObject().GetImpersonationLevel());
  1981. WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg,
  1982. dwThreadId, rParsedInfo, m_bTrace);
  1983. }
  1984. ONFAILTHROWERROR(hr);
  1985. }
  1986. catch(_com_error& e)
  1987. {
  1988. rParsedInfo.GetCmdSwitchesObject().SetCOMError(e);
  1989. hr = e.Error();
  1990. }
  1991. catch(CHeap_Exception)
  1992. {
  1993. _com_issue_error(WBEM_E_OUT_OF_MEMORY);
  1994. }
  1995. return hr;
  1996. }
  1997. /*------------------------------------------------------------------------
  1998. Name :CreateWMIXMLTextSrc
  1999. Synopsis :This function creates the IWbemObjectTextSrc instance
  2000. Type :Member Function
  2001. Input Parameter(s):
  2002. rParsedInfo - reference to CParsedInfo class object
  2003. Output Parameter(s):
  2004. rParsedInfo - reference to CParsedInfo class object
  2005. Return Type :HRESULT
  2006. Global Variables :None
  2007. Calling Syntax :CreateWMIXMLTextSrc(rParsedInfo)
  2008. Notes :None
  2009. ------------------------------------------------------------------------*/
  2010. HRESULT CExecEngine::CreateWMIXMLTextSrc(CParsedInfo& rParsedInfo)
  2011. {
  2012. HRESULT hr = S_OK;
  2013. CHString chsMsg;
  2014. DWORD dwThreadId = GetCurrentThreadId();
  2015. try
  2016. {
  2017. hr = CoCreateInstance(CLSID_WbemObjectTextSrc, NULL,
  2018. CLSCTX_INPROC_SERVER,
  2019. IID_IWbemObjectTextSrc,
  2020. (LPVOID*) &m_pITextSrc);
  2021. if (m_bTrace || m_eloErrLogOpt)
  2022. {
  2023. chsMsg.Format(L"CoCreateInstance(CLSID_WbemObjectTextSrc, NULL,"
  2024. L"CLSCTX_INPROC_SERVER, IID_IWbemObjectTextSrc, -)");
  2025. WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg,
  2026. dwThreadId, rParsedInfo, m_bTrace);
  2027. }
  2028. ONFAILTHROWERROR(hr);
  2029. }
  2030. catch(_com_error& e)
  2031. {
  2032. rParsedInfo.GetCmdSwitchesObject().SetCOMError(e);
  2033. hr = e.Error();
  2034. }
  2035. catch(CHeap_Exception)
  2036. {
  2037. _com_issue_error(WBEM_E_OUT_OF_MEMORY);
  2038. }
  2039. return hr;
  2040. }
  2041. /*------------------------------------------------------------------------
  2042. Name :CreateContext
  2043. Synopsis :This function creates the IWbemContext instance
  2044. Type :Member Function
  2045. Input Parameter(s):
  2046. rParsedInfo - reference to CParsedInfo class object
  2047. Output Parameter(s):
  2048. rParsedInfo - reference to CParsedInfo class object
  2049. Return Type :HRESULT
  2050. Global Variables :None
  2051. Calling Syntax :CreateContext(rParsedInfo)
  2052. Calls :CParsedInfo::GetCmdSwitchesObject()
  2053. CCommandSwitches::SetCOMError()
  2054. CoCreateInstance()
  2055. Called by :CExecEngine::ObtainXMLResultSet()
  2056. Notes :None
  2057. ------------------------------------------------------------------------*/
  2058. HRESULT CExecEngine::CreateContext(CParsedInfo& rParsedInfo)
  2059. {
  2060. HRESULT hr = S_OK;
  2061. CHString chsMsg;
  2062. DWORD dwThreadId = GetCurrentThreadId();
  2063. try
  2064. {
  2065. //Create context object
  2066. MULTI_QI mqi = { &IID_IWbemContext, 0, 0 };
  2067. hr = CoCreateInstanceEx(CLSID_WbemContext, NULL,
  2068. CLSCTX_INPROC_SERVER,
  2069. 0, 1, &mqi);
  2070. if (m_bTrace || m_eloErrLogOpt)
  2071. {
  2072. chsMsg.Format(L"CoCreateInstanceEx(CLSID_WbemContext, NULL,"
  2073. L"CLSCTX_INPROC_SERVER, 0, 1, -)");
  2074. WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg,
  2075. dwThreadId, rParsedInfo, m_bTrace);
  2076. }
  2077. ONFAILTHROWERROR(hr);
  2078. m_pIContext = reinterpret_cast<IWbemContext*>(mqi.pItf);
  2079. }
  2080. catch(_com_error& e)
  2081. {
  2082. rParsedInfo.GetCmdSwitchesObject().SetCOMError(e);
  2083. hr = e.Error();
  2084. }
  2085. catch(CHeap_Exception)
  2086. {
  2087. _com_issue_error(WBEM_E_OUT_OF_MEMORY);
  2088. }
  2089. return hr;
  2090. }
  2091. /*-------------------------------------------------------------------------
  2092. Name :ExecuteMethodAndDisplayResults
  2093. Synopsis :This function executes and displays the
  2094. results corresponding to the method. If
  2095. interactive mode is set, the user is prompted
  2096. choose the method
  2097. Type :Member Function
  2098. Input Parameter(s):
  2099. bstrPath - _bstr_t type,Path expression
  2100. rParsedInfo - reference to CParsedInfo class object
  2101. pIInParam - Pointer to the IWbemclassobject
  2102. Output Parameter(s):
  2103. rParsedInfo - reference to CParsedInfo class object
  2104. Return Type :HRESULT
  2105. Global Variables :None
  2106. Calling Syntax :ExecuteMethodAndDisplayResults(bstrPath, rParsedInfo,
  2107. pIInParam)
  2108. Calls :None
  2109. Called by :CExecEngine::ExecWMIMethod()
  2110. Notes :none
  2111. -------------------------------------------------------------------------*/
  2112. HRESULT CExecEngine::ExecuteMethodAndDisplayResults(_bstr_t bstrPath,
  2113. CParsedInfo& rParsedInfo,
  2114. IWbemClassObject* pIInParam)
  2115. {
  2116. _TCHAR *pszMethodName = NULL;
  2117. INTEROPTION interOption = YES;
  2118. IWbemClassObject *pIOutParam = NULL;
  2119. HRESULT hr = S_OK;
  2120. CHString chsMsg;
  2121. DWORD dwThreadId = GetCurrentThreadId();
  2122. VARIANT varTemp;
  2123. VariantInit(&varTemp);
  2124. // Obtain the method name
  2125. pszMethodName = rParsedInfo.GetCmdSwitchesObject().GetMethodName();
  2126. try
  2127. {
  2128. // If /INTERACTIVE switch is specified, obtain the user response.
  2129. if (IsInteractive(rParsedInfo) == TRUE)
  2130. {
  2131. _bstr_t bstrMsg;
  2132. while ( TRUE )
  2133. {
  2134. BOOL bInstanceLevel = TRUE;
  2135. if(IsClassOperation(rParsedInfo))
  2136. {
  2137. bInstanceLevel = FALSE;
  2138. }
  2139. else
  2140. {
  2141. _TCHAR *pszVerbName = rParsedInfo.GetCmdSwitchesObject().
  2142. GetVerbName();
  2143. if(CompareTokens(pszVerbName, CLI_TOKEN_CALL))
  2144. {
  2145. if ( rParsedInfo.GetCmdSwitchesObject().
  2146. GetAliasName() != NULL )
  2147. {
  2148. if (rParsedInfo.GetCmdSwitchesObject().
  2149. GetWhereExpression() == NULL)
  2150. {
  2151. bInstanceLevel = FALSE;
  2152. }
  2153. else
  2154. bInstanceLevel = TRUE;
  2155. }
  2156. else
  2157. {
  2158. if ((rParsedInfo.GetCmdSwitchesObject().
  2159. GetPathExpression() != NULL)
  2160. && (rParsedInfo.GetCmdSwitchesObject().
  2161. GetWhereExpression() == NULL))
  2162. {
  2163. bInstanceLevel = FALSE;
  2164. }
  2165. else
  2166. bInstanceLevel = TRUE;
  2167. }
  2168. }
  2169. else
  2170. bInstanceLevel = TRUE;
  2171. }
  2172. if(bInstanceLevel)
  2173. {
  2174. WMIFormatMessage(IDS_I_METH_EXEC_PROMPT2, 2, bstrMsg,
  2175. (LPWSTR) bstrPath, pszMethodName);
  2176. interOption = GetUserResponseEx((LPWSTR)bstrMsg);
  2177. }
  2178. else
  2179. {
  2180. WMIFormatMessage(IDS_I_METH_EXEC_PROMPT, 2, bstrMsg,
  2181. (LPWSTR) bstrPath, pszMethodName);
  2182. interOption = GetUserResponse((LPWSTR)bstrMsg);
  2183. }
  2184. if ( interOption == YES || interOption == NO )
  2185. break;
  2186. else if(interOption == HELP)
  2187. {
  2188. rParsedInfo.GetCmdSwitchesObject().
  2189. SetInformationCode(0);
  2190. ProcessSHOWInfo(rParsedInfo, FALSE, (LPWSTR)bstrPath);
  2191. }
  2192. }
  2193. }
  2194. if ( interOption == YES )
  2195. {
  2196. if (IsInteractive(rParsedInfo) == FALSE)
  2197. {
  2198. _bstr_t bstrMsg;
  2199. WMIFormatMessage(IDS_I_METH_EXEC_STATUS, 2, bstrMsg,
  2200. (LPWSTR) bstrPath, pszMethodName);
  2201. DisplayMessage((LPWSTR)bstrMsg, CP_OEMCP, FALSE, TRUE);
  2202. }
  2203. // Execute the method with the given input arguments
  2204. hr = m_pITargetNS->ExecMethod(bstrPath,
  2205. _bstr_t(rParsedInfo.GetCmdSwitchesObject()
  2206. .GetMethodName()),
  2207. 0L,
  2208. NULL,
  2209. pIInParam,
  2210. &pIOutParam,
  2211. NULL);
  2212. if (m_bTrace || m_eloErrLogOpt)
  2213. {
  2214. chsMsg.Format(L"IWbemServices::ExecMethod(L\"%s\", L\"%s\", "
  2215. L"0, NULL, -, -, NULL)", (LPWSTR) bstrPath,
  2216. rParsedInfo.GetCmdSwitchesObject().GetMethodName()
  2217. ? rParsedInfo.GetCmdSwitchesObject().GetMethodName()
  2218. : L"<null>");
  2219. WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg,
  2220. dwThreadId, rParsedInfo, m_bTrace);
  2221. }
  2222. ONFAILTHROWERROR(hr);
  2223. DisplayString(IDS_I_CALL_SUCCESS, CP_OEMCP, NULL, FALSE, TRUE);
  2224. // Check the method execution status.
  2225. if(pIOutParam)
  2226. {
  2227. _TCHAR szMsg[BUFFER1024] = NULL_STRING;
  2228. rParsedInfo.GetCmdSwitchesObject().
  2229. SetMethExecOutParam(pIOutParam);
  2230. DisplayMethExecOutput(rParsedInfo);
  2231. }
  2232. SAFEIRELEASE(pIOutParam);
  2233. }
  2234. }
  2235. catch(_com_error& e)
  2236. {
  2237. SAFEIRELEASE(pIOutParam);
  2238. VARIANTCLEAR(varTemp);
  2239. hr = e.Error();
  2240. }
  2241. catch(CHeap_Exception)
  2242. {
  2243. SAFEIRELEASE(pIOutParam);
  2244. VARIANTCLEAR(varTemp);
  2245. _com_issue_error(WBEM_E_OUT_OF_MEMORY);
  2246. }
  2247. return hr;
  2248. }
  2249. /*------------------------------------------------------------------------
  2250. Name :DisplayMethExecOutput
  2251. Synopsis :Displays the result of execution of the method.
  2252. Type :Member Function
  2253. Input Parameter(s):
  2254. rParsedinfo - CParsedInfo object.
  2255. Output Parameter(s):None
  2256. Return Type :void
  2257. Global Variables :None
  2258. Calling Syntax :DisplayMethExecOutput(rParsedInfo)
  2259. Notes :None
  2260. ------------------------------------------------------------------------*/
  2261. void CExecEngine::DisplayMethExecOutput(CParsedInfo& rParsedInfo)
  2262. {
  2263. HRESULT hr = S_OK;
  2264. IWbemClassObject *pIOutParam = NULL;
  2265. CHString chsMsg;
  2266. DWORD dwThreadId = GetCurrentThreadId();
  2267. BSTR pstrMofTextOfObj = NULL;
  2268. VARIANT vtTemp;
  2269. VariantInit(&vtTemp);
  2270. try
  2271. {
  2272. _bstr_t bstrResult;
  2273. pIOutParam = rParsedInfo.GetCmdSwitchesObject().GetMethExecOutParam();
  2274. if ( pIOutParam != NULL )
  2275. {
  2276. hr = pIOutParam->GetObjectText(0, &pstrMofTextOfObj);
  2277. if (m_bTrace || m_eloErrLogOpt)
  2278. {
  2279. chsMsg.Format(L"IWbemClassObject->GetObjectText(0, -)");
  2280. WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg,
  2281. dwThreadId, rParsedInfo, m_bTrace);
  2282. }
  2283. ONFAILTHROWERROR(hr);
  2284. DisplayString(IDS_I_OUT_PARAMS,CP_OEMCP, NULL, FALSE, TRUE);
  2285. DisplayMessage(_bstr_t(pstrMofTextOfObj), CP_OEMCP, FALSE, TRUE);
  2286. DisplayMessage(_T("\n"), CP_OEMCP, TRUE, TRUE);
  2287. SAFEBSTRFREE(pstrMofTextOfObj);
  2288. }
  2289. }
  2290. catch(_com_error& e)
  2291. {
  2292. SAFEBSTRFREE(pstrMofTextOfObj);
  2293. _com_issue_error(e.Error());
  2294. }
  2295. catch(CHeap_Exception)
  2296. {
  2297. SAFEBSTRFREE(pstrMofTextOfObj);
  2298. _com_issue_error(WBEM_E_OUT_OF_MEMORY);
  2299. }
  2300. }
  2301. /*------------------------------------------------------------------------
  2302. Name :ExecOtherCmdLineUtlty
  2303. Synopsis :Invokes other command line utility specified in
  2304. Derivation of Verb if Verb Type is "CommandLine"
  2305. Type :Member Function
  2306. Input Parameter(s):
  2307. rParsedinfo - CParsedInfo object.
  2308. Output Parameter(s):None
  2309. Return Type :BOOL
  2310. Global Variables :None
  2311. Calling Syntax :ExecOtherCmdLineUtlty(rParsedInfo)
  2312. Notes :None
  2313. ------------------------------------------------------------------------*/
  2314. BOOL CExecEngine::ExecOtherCmdLineUtlty(CParsedInfo& rParsedInfo)
  2315. {
  2316. BOOL bRet = TRUE;
  2317. BOOL bInvalidNoOfArgs = FALSE;
  2318. if ( rParsedInfo.GetCmdSwitchesObject().GetNamedParamListFlag() == FALSE )
  2319. {
  2320. METHDETMAP mdpMethDetMap =
  2321. rParsedInfo.GetCmdSwitchesObject().GetMethDetMap();
  2322. METHDETMAP::iterator iMethDetMapItr = mdpMethDetMap.begin();
  2323. METHODDETAILS mdMethDet = (*iMethDetMapItr).second;
  2324. CHARVECTOR cvInParams =
  2325. rParsedInfo.GetCmdSwitchesObject().GetPropertyList();
  2326. PROPDETMAP pdmPropDetMap = mdMethDet.Params;
  2327. if ( !pdmPropDetMap.empty() )
  2328. {
  2329. if ( pdmPropDetMap.size() != cvInParams.size() )
  2330. bInvalidNoOfArgs = TRUE;
  2331. }
  2332. }
  2333. if ( bInvalidNoOfArgs == TRUE )
  2334. {
  2335. rParsedInfo.GetCmdSwitchesObject().SetErrataCode(
  2336. IDS_E_INVALID_NO_OF_PARAMS);
  2337. bRet = FALSE;
  2338. }
  2339. else
  2340. {
  2341. HRESULT hr = FormQueryAndExecuteMethodOrUtility(rParsedInfo);
  2342. bRet = FAILED(hr) ? FALSE : TRUE;
  2343. }
  2344. return bRet;
  2345. }
  2346. /*------------------------------------------------------------------------
  2347. Name :ProcessDELETEVerb
  2348. Synopsis :Processes the DELETE verb referring to the information
  2349. available with CParsedInfo object.
  2350. Type :Member Function
  2351. Input parameter :
  2352. rParsedInfo - reference to CParsedInfo class object
  2353. Output parameters :
  2354. rParsedInfo - reference to CParsedInfo class object
  2355. Return Type :BOOL
  2356. Global Variables :None
  2357. Calling Syntax :ProcessDELETEVerb(rParsedInfo)
  2358. Notes :None
  2359. ------------------------------------------------------------------------*/
  2360. BOOL CExecEngine::ProcessDELETEVerb(CParsedInfo& rParsedInfo)
  2361. {
  2362. // DELETE verb processing
  2363. BOOL bRet = TRUE;
  2364. HRESULT hr = S_OK;
  2365. try
  2366. {
  2367. _bstr_t bstrQuery(""), bstrObject("");
  2368. // If anyone of the following is specified:
  2369. // a) PATH <path expr>
  2370. // b) PATH <class path expr> WHERE <where expr>
  2371. if (rParsedInfo.GetCmdSwitchesObject().GetPathExpression() != NULL)
  2372. {
  2373. _bstr_t bstrClass = _bstr_t(rParsedInfo.GetCmdSwitchesObject()
  2374. .GetClassPath());
  2375. bstrObject = _bstr_t(rParsedInfo.GetCmdSwitchesObject()
  2376. .GetPathExpression());
  2377. // Form the query
  2378. bstrQuery = _bstr_t(L"SELECT * FROM ") + bstrClass ;
  2379. // If WHERE expresion is given
  2380. if (rParsedInfo.GetCmdSwitchesObject().
  2381. GetWhereExpression() != NULL)
  2382. {
  2383. bstrQuery += _bstr_t(L" WHERE ")
  2384. + _bstr_t(rParsedInfo.GetCmdSwitchesObject()
  2385. .GetWhereExpression());
  2386. }
  2387. }
  2388. // If <alias> WHERE expression is specified.
  2389. else if (rParsedInfo.GetCmdSwitchesObject().GetWhereExpression()
  2390. != NULL)
  2391. {
  2392. rParsedInfo.GetCmdSwitchesObject().
  2393. GetClassOfAliasTarget(bstrObject);
  2394. bstrQuery = _bstr_t(L"SELECT * FROM ")
  2395. + bstrObject
  2396. + _bstr_t(L" WHERE ")
  2397. + _bstr_t(rParsedInfo.GetCmdSwitchesObject()
  2398. .GetWhereExpression());
  2399. }
  2400. // If CLASS is specified.
  2401. else if (rParsedInfo.GetCmdSwitchesObject().GetClassPath() != NULL)
  2402. {
  2403. bstrObject = _bstr_t(rParsedInfo.GetCmdSwitchesObject()
  2404. .GetClassPath());
  2405. }
  2406. // if Alias name is specified
  2407. else
  2408. {
  2409. rParsedInfo.GetCmdSwitchesObject().
  2410. GetClassOfAliasTarget(bstrObject);
  2411. bstrQuery = _bstr_t (L"SELECT * FROM ")
  2412. +bstrObject;
  2413. }
  2414. // Connect to WMI namespace
  2415. if (m_pITargetNS == NULL)
  2416. {
  2417. if ( IsFailFastAndNodeExist(rParsedInfo) == TRUE )
  2418. {
  2419. hr = ConnectToTargetNS(rParsedInfo);
  2420. ONFAILTHROWERROR(hr);
  2421. }
  2422. else
  2423. hr = -1; // Explicitly set error
  2424. }
  2425. if (SUCCEEDED(hr))
  2426. bRet = DeleteObjects(rParsedInfo, bstrQuery, bstrObject);
  2427. else
  2428. bRet = FALSE;
  2429. }
  2430. catch(_com_error& e)
  2431. {
  2432. _com_issue_error(e.Error());
  2433. bRet = FALSE;
  2434. }
  2435. return bRet;
  2436. }
  2437. /*------------------------------------------------------------------------
  2438. Name :DeleteObjects
  2439. Synopsis :This function deletes the instances(s) or class
  2440. specified for deletion.
  2441. Type :Member Function
  2442. Input parameter :
  2443. rParsedInfo - reference to the CParsedInfo object
  2444. bstrQuery - String consist of WQL query
  2445. bstrObject - String consist of object path
  2446. Output parameters :
  2447. rParsedInfo - reference to the CParsedInfo object
  2448. Return Type :BOOL
  2449. Global Variables :None
  2450. Calling Syntax :DeleteObjects(rParsedInfo, bstrQuery, bstrObject)
  2451. Notes :None
  2452. ------------------------------------------------------------------------*/
  2453. BOOL CExecEngine::DeleteObjects(CParsedInfo& rParsedInfo,
  2454. _bstr_t& bstrQuery, _bstr_t& bstrObject)
  2455. {
  2456. HRESULT hr = S_OK;
  2457. BOOL bSuccess = TRUE;
  2458. IEnumWbemClassObject *pIEnumObj = NULL;
  2459. IWbemClassObject *pIWbemObj = NULL;
  2460. ULONG ulReturned = 0;
  2461. INTEROPTION interOption = YES;
  2462. CHString chsMsg;
  2463. DWORD dwThreadId = GetCurrentThreadId();
  2464. VARIANT vtPath;
  2465. VariantInit(&vtPath);
  2466. try
  2467. {
  2468. _bstr_t bstrResult;
  2469. if (bstrQuery == _bstr_t(""))
  2470. {
  2471. // If /INTERACTIVE switch is specified, obtain the user response.
  2472. if (IsInteractive(rParsedInfo) == TRUE)
  2473. {
  2474. _bstr_t bstrMsg;
  2475. while ( TRUE )
  2476. {
  2477. if(IsClassOperation(rParsedInfo))
  2478. {
  2479. WMIFormatMessage(IDS_I_DELETE_CLASS_PROMPT, 1, bstrMsg,
  2480. (LPWSTR) bstrObject);
  2481. interOption = GetUserResponse((LPWSTR)bstrMsg);
  2482. }
  2483. else
  2484. {
  2485. WMIFormatMessage(IDS_I_DELETE_CLASS_PROMPT2, 1, bstrMsg,
  2486. (LPWSTR) bstrObject);
  2487. interOption = GetUserResponseEx((LPWSTR)bstrMsg);
  2488. }
  2489. if ( interOption == YES || interOption == NO )
  2490. break;
  2491. else if(interOption == HELP)
  2492. {
  2493. rParsedInfo.GetCmdSwitchesObject().
  2494. SetInformationCode(0);
  2495. ProcessSHOWInfo(rParsedInfo, FALSE,
  2496. (LPWSTR)bstrObject);
  2497. }
  2498. }
  2499. }
  2500. if (interOption == YES)
  2501. {
  2502. // If instance path is specified then delete the instance
  2503. // properties otherwise delete the class
  2504. if(!rParsedInfo.GetCmdSwitchesObject().GetWhereExpression())
  2505. {
  2506. // If WHERE expression is NULL then delete the WMI class
  2507. hr = m_pITargetNS->DeleteClass(bstrObject, 0, NULL, NULL);
  2508. if (m_bTrace || m_eloErrLogOpt)
  2509. {
  2510. chsMsg.Format(L"IWbemServices::DeleteClass"
  2511. L"(L\"%s\", 0, NULL, NULL)", (LPWSTR)bstrObject);
  2512. WMITRACEORERRORLOG(hr, __LINE__, __FILE__,
  2513. (LPCWSTR)chsMsg, dwThreadId, rParsedInfo, m_bTrace);
  2514. }
  2515. ONFAILTHROWERROR(hr);
  2516. DisplayString(IDS_I_DELETE_SUCCESS,CP_OEMCP,
  2517. NULL, FALSE, TRUE);
  2518. }
  2519. else
  2520. {
  2521. // If WHERE expression is not NULL then delete the
  2522. // WMI instance
  2523. DisplayString(IDS_I_DELETING_INSTANCE,
  2524. CP_OEMCP,(LPWSTR)vtPath.bstrVal,
  2525. FALSE, TRUE);
  2526. hr = m_pITargetNS->DeleteInstance(bstrObject,
  2527. 0, NULL, NULL);
  2528. if (m_bTrace || m_eloErrLogOpt)
  2529. {
  2530. chsMsg.Format(L"IWbemServices::DeleteInstance"
  2531. L"(L\"%s\", 0, NULL, NULL)",
  2532. (LPWSTR) bstrObject);
  2533. WMITRACEORERRORLOG(hr, __LINE__, __FILE__,
  2534. (LPCWSTR)chsMsg, dwThreadId, rParsedInfo,
  2535. m_bTrace);
  2536. }
  2537. ONFAILTHROWERROR(hr);
  2538. DisplayString(IDS_I_INSTANCE_DELETE_SUCCESS,
  2539. CP_OEMCP, NULL, FALSE, TRUE);
  2540. }
  2541. }
  2542. }
  2543. else
  2544. {
  2545. // Execute the query to get collection of objects
  2546. hr = m_pITargetNS->ExecQuery(_bstr_t(L"WQL"), bstrQuery,
  2547. 0, NULL, &pIEnumObj);
  2548. if (m_bTrace || m_eloErrLogOpt)
  2549. {
  2550. chsMsg.Format(L"IWbemServices::ExecQuery(L\"WQL\","
  2551. L"L\"%s\", 0, NULL, -)", (LPWSTR)bstrQuery);
  2552. WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg,
  2553. dwThreadId, rParsedInfo, m_bTrace);
  2554. }
  2555. ONFAILTHROWERROR(hr);
  2556. // Set the interface security
  2557. hr = SetSecurity(pIEnumObj,
  2558. rParsedInfo.GetGlblSwitchesObject().GetAuthority(),
  2559. rParsedInfo.GetNode(),
  2560. rParsedInfo.GetUser(),
  2561. rParsedInfo.GetPassword(),
  2562. rParsedInfo.GetGlblSwitchesObject().
  2563. GetAuthenticationLevel(),
  2564. rParsedInfo.GetGlblSwitchesObject().
  2565. GetImpersonationLevel());
  2566. if (m_bTrace || m_eloErrLogOpt)
  2567. {
  2568. chsMsg.Format(L"CoSetProxyBlanket(-, RPC_C_AUTHN_WINNT, "
  2569. L"RPC_C_AUTHZ_NONE, NULL, %d, %d, -, EOAC_NONE)",
  2570. rParsedInfo.GetGlblSwitchesObject().
  2571. GetAuthenticationLevel(),
  2572. rParsedInfo.GetGlblSwitchesObject().
  2573. GetImpersonationLevel());
  2574. WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg,
  2575. dwThreadId, rParsedInfo, m_bTrace);
  2576. }
  2577. ONFAILTHROWERROR(hr);
  2578. BOOL bInstances = FALSE;
  2579. BOOL bInteractive = IsInteractive(rParsedInfo);
  2580. hr = pIEnumObj->Next(WBEM_INFINITE, 1, &pIWbemObj, &ulReturned);
  2581. // Set this property in all objects of the collection
  2582. while (ulReturned == 1)
  2583. {
  2584. INTEROPTION interOption = YES;
  2585. bInstances = TRUE;
  2586. VariantInit(&vtPath);
  2587. // Get the object path.
  2588. hr = pIWbemObj->Get(_bstr_t(L"__PATH"), 0, &vtPath, NULL, NULL);
  2589. if (m_bTrace || m_eloErrLogOpt)
  2590. {
  2591. chsMsg.Format(
  2592. L"IWbemClassObject::Get(L\"__PATH\", 0, -, 0, 0)");
  2593. GetBstrTFromVariant(vtPath, bstrResult);
  2594. WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg,
  2595. dwThreadId, rParsedInfo, m_bTrace, 0, bstrResult);
  2596. }
  2597. ONFAILTHROWERROR(hr);
  2598. // If /INTERACTIVE switch is specified, obtain user response.
  2599. if (IsInteractive(rParsedInfo) == TRUE)
  2600. {
  2601. _bstr_t bstrMsg;
  2602. while ( TRUE )
  2603. {
  2604. if(IsClassOperation(rParsedInfo))
  2605. {
  2606. WMIFormatMessage(IDS_I_DELETE_CLASS_PROMPT,
  2607. 1, bstrMsg, (LPWSTR) vtPath.bstrVal);
  2608. interOption = GetUserResponse((LPWSTR)bstrMsg);
  2609. }
  2610. else
  2611. {
  2612. WMIFormatMessage(IDS_I_DELETE_CLASS_PROMPT2, 1,
  2613. bstrMsg, (LPWSTR) vtPath.bstrVal);
  2614. interOption = GetUserResponseEx((LPWSTR)bstrMsg);
  2615. }
  2616. if ( interOption == YES || interOption == NO )
  2617. break;
  2618. else if(interOption == HELP)
  2619. {
  2620. rParsedInfo.GetCmdSwitchesObject().
  2621. SetInformationCode(0);
  2622. ProcessSHOWInfo(rParsedInfo, FALSE,
  2623. (LPWSTR)vtPath.bstrVal);
  2624. }
  2625. }
  2626. }
  2627. if (interOption == YES)
  2628. {
  2629. DisplayString(IDS_I_DELETING_INSTANCE,
  2630. CP_OEMCP,(LPWSTR)vtPath.bstrVal, FALSE, TRUE);
  2631. hr = m_pITargetNS->DeleteInstance(vtPath.bstrVal,
  2632. 0, NULL, NULL);
  2633. if (m_bTrace || m_eloErrLogOpt)
  2634. {
  2635. chsMsg.Format(L"IWbemServices::DeleteInstance"
  2636. L"(L\"%s\", 0, NULL, NULL)",
  2637. (LPWSTR) vtPath.bstrVal);
  2638. WMITRACEORERRORLOG(hr, __LINE__, __FILE__,
  2639. (LPCWSTR)chsMsg, dwThreadId, rParsedInfo, m_bTrace);
  2640. }
  2641. ONFAILTHROWERROR(hr);
  2642. VARIANTCLEAR(vtPath);
  2643. SAFEIRELEASE(pIWbemObj);
  2644. DisplayString(IDS_I_INSTANCE_DELETE_SUCCESS,CP_OEMCP,
  2645. NULL, FALSE, TRUE);
  2646. }
  2647. hr = pIEnumObj->Next( WBEM_INFINITE, 1, &pIWbemObj,
  2648. &ulReturned);
  2649. }
  2650. SAFEIRELEASE(pIEnumObj);
  2651. // If no instances are available
  2652. if (!bInstances)
  2653. {
  2654. rParsedInfo.GetCmdSwitchesObject().
  2655. SetInformationCode(IDS_I_NO_INSTANCES);
  2656. }
  2657. }
  2658. }
  2659. catch(_com_error& e)
  2660. {
  2661. VARIANTCLEAR(vtPath);
  2662. SAFEIRELEASE(pIEnumObj);
  2663. SAFEIRELEASE(pIWbemObj);
  2664. rParsedInfo.GetCmdSwitchesObject().SetCOMError(e);
  2665. bSuccess = FALSE;
  2666. }
  2667. catch(CHeap_Exception)
  2668. {
  2669. VARIANTCLEAR(vtPath);
  2670. SAFEIRELEASE(pIEnumObj);
  2671. SAFEIRELEASE(pIWbemObj);
  2672. _com_issue_error(WBEM_E_OUT_OF_MEMORY);
  2673. }
  2674. return bSuccess;
  2675. }
  2676. /*------------------------------------------------------------------------
  2677. Name :GetUserResponse
  2678. Synopsis :This function accepts the user response before going
  2679. ahead, when /INTERACTIVE is specified at the verb
  2680. level
  2681. Type :Member Function
  2682. Input parameter :
  2683. pszMsg - message to be displayed.
  2684. Output parameters :None
  2685. Return Type :INTEROPTION
  2686. Global Variables :None
  2687. Calling Syntax :GetUserResponse(pszMsg)
  2688. Notes :None
  2689. ------------------------------------------------------------------------*/
  2690. INTEROPTION CExecEngine::GetUserResponse(_TCHAR* pszMsg)
  2691. {
  2692. INTEROPTION bRet = YES;
  2693. _TCHAR szResp[BUFFER255] = NULL_STRING;
  2694. _TCHAR *pBuf = NULL;
  2695. if (pszMsg == NULL)
  2696. bRet = NO;
  2697. if(bRet != NO)
  2698. {
  2699. // Get the user response, till 'Y' - yes or 'N' - no
  2700. // is keyed in
  2701. while(TRUE)
  2702. {
  2703. DisplayMessage(pszMsg, CP_OEMCP, TRUE, TRUE);
  2704. pBuf = _fgetts(szResp, BUFFER255-1, stdin);
  2705. if(pBuf != NULL)
  2706. {
  2707. LONG lInStrLen = lstrlen(szResp);
  2708. if(szResp[lInStrLen - 1] == _T('\n'))
  2709. szResp[lInStrLen - 1] = _T('\0');
  2710. }
  2711. else if ( g_wmiCmd.GetBreakEvent() != TRUE )
  2712. {
  2713. lstrcpy(szResp, RESPONSE_NO);
  2714. DisplayMessage(_T("\n"), CP_OEMCP, TRUE, TRUE);
  2715. }
  2716. if ( g_wmiCmd.GetBreakEvent() == TRUE )
  2717. {
  2718. g_wmiCmd.SetBreakEvent(FALSE);
  2719. lstrcpy(szResp, RESPONSE_NO);
  2720. DisplayMessage(_T("\n"), CP_OEMCP, TRUE, TRUE);
  2721. }
  2722. if (CompareTokens(szResp, RESPONSE_YES)
  2723. || CompareTokens(szResp, RESPONSE_NO))
  2724. break;
  2725. }
  2726. if (CompareTokens(szResp, RESPONSE_NO))
  2727. bRet = NO;
  2728. }
  2729. return bRet;
  2730. }
  2731. /*------------------------------------------------------------------------
  2732. Name :ProcessCREATEVerb
  2733. Synopsis :Processes the CREATE verb referring to the information
  2734. available with CParsedInfo object.
  2735. Type :Member Function
  2736. Input parameter :
  2737. rParsedInfo - reference to CParsedInfo class object
  2738. Output parameters :
  2739. rParsedInfo - reference to CParsedInfo class object
  2740. Return Type :BOOL
  2741. Global Variables :None
  2742. Calling Syntax :ProcessCREATEVerb(rParsedInfo)
  2743. Notes :None
  2744. ------------------------------------------------------------------------*/
  2745. BOOL CExecEngine::ProcessCREATEVerb(CParsedInfo& rParsedInfo)
  2746. {
  2747. // CREATE verb processing
  2748. BOOL bRet = TRUE;
  2749. INTEROPTION interCreate = YES;
  2750. HRESULT hr = S_OK;
  2751. try
  2752. {
  2753. _bstr_t bstrClass("");
  2754. // If object PATH expression is specified.
  2755. if (rParsedInfo.GetCmdSwitchesObject().GetPathExpression() != NULL)
  2756. {
  2757. bstrClass = _bstr_t(rParsedInfo.GetCmdSwitchesObject()
  2758. .GetClassPath());
  2759. }
  2760. // If CLASS is specified.
  2761. else if (rParsedInfo.GetCmdSwitchesObject().GetClassPath() != NULL)
  2762. {
  2763. bstrClass = _bstr_t(rParsedInfo.GetCmdSwitchesObject()
  2764. .GetClassPath());
  2765. }
  2766. // if Alias name is specified
  2767. else
  2768. {
  2769. rParsedInfo.GetCmdSwitchesObject().
  2770. GetClassOfAliasTarget(bstrClass);
  2771. }
  2772. // Check if interactive mode
  2773. if (IsInteractive(rParsedInfo) == TRUE)
  2774. {
  2775. _bstr_t bstrMsg;
  2776. WMIFormatMessage(IDS_I_CREATE_INST_PROMPT, 1,
  2777. bstrMsg, (LPWSTR) bstrClass);
  2778. // Get the user response.
  2779. interCreate = GetUserResponse((LPWSTR)bstrMsg);
  2780. }
  2781. if (interCreate == YES)
  2782. {
  2783. // Connect to WMI namespace
  2784. if (m_pITargetNS == NULL)
  2785. {
  2786. if ( IsFailFastAndNodeExist(rParsedInfo) == TRUE )
  2787. {
  2788. hr = ConnectToTargetNS(rParsedInfo);
  2789. ONFAILTHROWERROR(hr);
  2790. }
  2791. else
  2792. hr = -1; // Explicitly set error
  2793. }
  2794. if (SUCCEEDED(hr))
  2795. {
  2796. // Validate the property values against the property
  2797. // qualifier information if available.
  2798. if (rParsedInfo.GetCmdSwitchesObject().GetAliasName() != NULL)
  2799. {
  2800. // Validate the input parameters against the alias
  2801. // qualifier information.
  2802. bRet = ValidateAlaisInParams(rParsedInfo);
  2803. }
  2804. else
  2805. {
  2806. // Validate the input parameters against the class
  2807. // qualifier information
  2808. bRet = ValidateInParams(rParsedInfo, bstrClass);
  2809. }
  2810. if (bRet)
  2811. {
  2812. // Set the values passed as input to the appropriate properties.
  2813. bRet = CreateInstance(rParsedInfo, bstrClass);
  2814. }
  2815. }
  2816. else
  2817. bRet = FALSE;
  2818. }
  2819. else
  2820. {
  2821. // Message to be displayed to the user
  2822. rParsedInfo.GetCmdSwitchesObject().
  2823. SetInformationCode(IDS_I_NOCREATE);
  2824. }
  2825. }
  2826. catch(_com_error& e)
  2827. {
  2828. _com_issue_error(e.Error());
  2829. bRet = FALSE;
  2830. }
  2831. return bRet;
  2832. }
  2833. /*------------------------------------------------------------------------
  2834. Name :CreateInstance
  2835. Synopsis :This function creates an instance of the specified
  2836. class
  2837. Type :Member Function
  2838. Input parameter :
  2839. rParsedInfo - reference to the CParsedInfo object
  2840. bstrClass - classname
  2841. Output parameters :
  2842. rParsedInfo - reference to the CParsedInfo object
  2843. Return Type :BOOL
  2844. Global Variables :None
  2845. Calling Syntax :CreateInstance(rParsedInfo, bstrClass)
  2846. Notes :None
  2847. ------------------------------------------------------------------------*/
  2848. BOOL CExecEngine::CreateInstance(CParsedInfo& rParsedInfo, BSTR bstrClass)
  2849. {
  2850. HRESULT hr = S_OK;
  2851. IWbemClassObject *pIWbemObj = NULL;
  2852. IWbemClassObject *pINewInst = NULL;
  2853. IWbemQualifierSet *pIQualSet = NULL;
  2854. BOOL bSuccess = TRUE;
  2855. DWORD dwThreadId = GetCurrentThreadId();
  2856. CHString chsMsg;
  2857. VARIANT varType,
  2858. varSrc,
  2859. varDest;
  2860. VariantInit(&varSrc);
  2861. VariantInit(&varDest);
  2862. VariantInit(&varType);
  2863. // Obtain the list of properties and their associated values
  2864. BSTRMAP theMap = rParsedInfo.GetCmdSwitchesObject().GetParameterMap();
  2865. BSTRMAP::iterator theIterator = NULL;
  2866. theIterator = theMap.begin();
  2867. try
  2868. {
  2869. _bstr_t bstrResult;
  2870. // Get the class definition
  2871. hr = m_pITargetNS->GetObject(bstrClass,
  2872. 0, NULL, &pIWbemObj, NULL);
  2873. if (m_bTrace || m_eloErrLogOpt)
  2874. {
  2875. chsMsg.Format(L"IWbemServices::GetObject(L\"%s\", 0, NULL, -)",
  2876. (LPWSTR) bstrClass);
  2877. WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg,
  2878. dwThreadId, rParsedInfo, m_bTrace);
  2879. }
  2880. ONFAILTHROWERROR(hr);
  2881. // Create a new instance.
  2882. hr = pIWbemObj->SpawnInstance(0, &pINewInst);
  2883. if ( m_eloErrLogOpt )
  2884. {
  2885. chsMsg.Format(L"IWbemClassObject::SpawnInstance(0, -)");
  2886. WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg,
  2887. dwThreadId, rParsedInfo, FALSE);
  2888. }
  2889. ONFAILTHROWERROR(hr);
  2890. PROPDETMAP pdmPropDetMap = rParsedInfo.GetCmdSwitchesObject().
  2891. GetPropDetMap();
  2892. PROPDETMAP::iterator itrPropDetMap;
  2893. // Update all properties
  2894. while (theIterator != theMap.end())
  2895. {
  2896. // Get the propert name and the corresponding value
  2897. _bstr_t bstrProp = _bstr_t((_TCHAR*)(*theIterator).first);
  2898. // Get the derivation of property name
  2899. if ( Find(pdmPropDetMap, bstrProp, itrPropDetMap) == TRUE &&
  2900. !((*itrPropDetMap).second.Derivation) == FALSE )
  2901. bstrProp = (*itrPropDetMap).second.Derivation;
  2902. // Obtain the property qualifier set for the property
  2903. hr = pINewInst->GetPropertyQualifierSet(bstrProp, &pIQualSet);
  2904. if (m_bTrace || m_eloErrLogOpt)
  2905. {
  2906. chsMsg.Format(L"IWbemClassObject::GetPropertyQualifierSet"
  2907. L"(L\"%s\", -)", (LPWSTR) bstrProp);
  2908. WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg,
  2909. dwThreadId, rParsedInfo, m_bTrace);
  2910. }
  2911. ONFAILTHROWERROR(hr);
  2912. VariantInit(&varType);
  2913. if (pIQualSet)
  2914. {
  2915. // Obtain the CIM type of the property
  2916. hr = pIQualSet->Get(_bstr_t(L"CIMTYPE"), 0L, &varType, NULL);
  2917. if (m_bTrace || m_eloErrLogOpt)
  2918. {
  2919. chsMsg.Format(L"IWbemQualifierSet::Get(L\"CIMTYPE\", "
  2920. L"0, -, NULL)");
  2921. GetBstrTFromVariant(varType, bstrResult);
  2922. WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg,
  2923. dwThreadId, rParsedInfo, m_bTrace, 0, bstrResult);
  2924. }
  2925. ONFAILTHROWERROR(hr);
  2926. varSrc.vt = VT_BSTR;
  2927. varSrc.bstrVal = SysAllocString((_TCHAR*)(*theIterator).second);
  2928. hr = ConvertCIMTYPEToVarType(varDest, varSrc,
  2929. (_TCHAR*)varType.bstrVal);
  2930. if ( m_eloErrLogOpt )
  2931. {
  2932. chsMsg.Format(L"VariantChangeType(-, -, 0, -)");
  2933. WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg,
  2934. dwThreadId, rParsedInfo, FALSE);
  2935. }
  2936. ONFAILTHROWERROR(hr);
  2937. VARIANTCLEAR(varType);
  2938. SAFEIRELEASE(pIQualSet);
  2939. }
  2940. // Update the property value
  2941. hr = pINewInst->Put(bstrProp, 0, &varDest, 0);
  2942. if (m_bTrace || m_eloErrLogOpt)
  2943. {
  2944. chsMsg.Format(L"IWbemClassObject::Put(L\"%s\", 0, -, 0)",
  2945. (LPWSTR) bstrProp);
  2946. WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg,
  2947. dwThreadId, rParsedInfo, m_bTrace);
  2948. }
  2949. ONFAILTHROWERROR(hr);
  2950. VARIANTCLEAR(varSrc);
  2951. VARIANTCLEAR(varDest);
  2952. theIterator++;
  2953. }
  2954. // Update the instance with the changes
  2955. hr = m_pITargetNS->PutInstance(pINewInst, WBEM_FLAG_CREATE_ONLY,
  2956. NULL, NULL);
  2957. if (m_bTrace || m_eloErrLogOpt)
  2958. {
  2959. chsMsg.Format(L"IWbemServices::PutInstance(-, "
  2960. L"WBEM_FLAG_CREATE_ONLY, NULL, NULL)");
  2961. WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg,
  2962. dwThreadId, rParsedInfo, m_bTrace);
  2963. }
  2964. ONFAILTHROWERROR(hr);
  2965. SAFEIRELEASE(pINewInst);
  2966. rParsedInfo.GetCmdSwitchesObject().
  2967. SetInformationCode(IDS_I_CREATE_SUCCESS);
  2968. }
  2969. catch(_com_error& e)
  2970. {
  2971. VARIANTCLEAR(varSrc);
  2972. VARIANTCLEAR(varDest);
  2973. VARIANTCLEAR(varType);
  2974. SAFEIRELEASE(pIQualSet);
  2975. SAFEIRELEASE(pIWbemObj);
  2976. SAFEIRELEASE(pINewInst);
  2977. // Store the COM error and set the return value to FALSE
  2978. rParsedInfo.GetCmdSwitchesObject().SetCOMError(e);
  2979. bSuccess = FALSE;
  2980. }
  2981. catch(CHeap_Exception)
  2982. {
  2983. VARIANTCLEAR(varSrc);
  2984. VARIANTCLEAR(varDest);
  2985. VARIANTCLEAR(varType);
  2986. SAFEIRELEASE(pIQualSet);
  2987. SAFEIRELEASE(pIWbemObj);
  2988. SAFEIRELEASE(pINewInst);
  2989. _com_issue_error(WBEM_E_OUT_OF_MEMORY);
  2990. }
  2991. return bSuccess;
  2992. }
  2993. /*------------------------------------------------------------------------
  2994. Name :ValidateInParams
  2995. Synopsis :Validates the property value specified against the
  2996. property qualifiers for that property (i.e checking
  2997. against the contents of following qualifiers if
  2998. available:
  2999. 1. MaxLen,
  3000. 2. ValueMap
  3001. 3. Values
  3002. Type :Member Function
  3003. Input Parameter(s):
  3004. rParsedinfo - CParsedInfo object.
  3005. bstrClass - Bstr type, class name.
  3006. Output Parameter(s):None
  3007. Return Type :BOOL
  3008. Global Variables :None
  3009. Calling Syntax :ValidateInParams(rParsedInfo, bstrClass)
  3010. Notes :None
  3011. ------------------------------------------------------------------------*/
  3012. BOOL CExecEngine::ValidateInParams(CParsedInfo& rParsedInfo, _bstr_t bstrClass)
  3013. {
  3014. HRESULT hr = S_OK;
  3015. IWbemClassObject *pIObject = NULL;
  3016. IWbemQualifierSet *pIQualSet = NULL;
  3017. BOOL bRet = TRUE;
  3018. CHString chsMsg;
  3019. VARIANT varMap,
  3020. varValue,
  3021. varLen;
  3022. VariantInit(&varMap);
  3023. VariantInit(&varValue);
  3024. VariantInit(&varLen);
  3025. BSTRMAP theMap = rParsedInfo.GetCmdSwitchesObject().GetParameterMap();
  3026. BSTRMAP::iterator theIterator = theMap.begin();
  3027. DWORD dwThreadId = GetCurrentThreadId();
  3028. try
  3029. {
  3030. // Obtain the class schema
  3031. hr = m_pITargetNS->GetObject(bstrClass,
  3032. WBEM_FLAG_RETURN_WBEM_COMPLETE |
  3033. WBEM_FLAG_USE_AMENDED_QUALIFIERS,
  3034. NULL,
  3035. &pIObject,
  3036. NULL);
  3037. if (m_bTrace || m_eloErrLogOpt)
  3038. {
  3039. chsMsg.Format(L"IWbemServices::GetObject(L\"%s\", "
  3040. L"WBEM_FLAG_RETURN_WBEM_COMPLETE|WBEM_FLAG_USE_AMENDED_QUALIFIERS,"
  3041. L" 0, NULL, -)", (LPWSTR) bstrClass);
  3042. WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg, dwThreadId,
  3043. rParsedInfo, m_bTrace);
  3044. }
  3045. ONFAILTHROWERROR(hr);
  3046. // Loop through the list of available properties.
  3047. while (theIterator != theMap.end())
  3048. {
  3049. // Get the property name and the corresponding value.
  3050. _bstr_t bstrProp = _bstr_t((_TCHAR*)(*theIterator).first);
  3051. WCHAR* pszValue = (LPWSTR)(*theIterator).second;
  3052. // Check the value against the qualifier information
  3053. bRet = CheckQualifierInfo(rParsedInfo, pIObject,
  3054. bstrProp, pszValue);
  3055. if (bRet)
  3056. {
  3057. // A mapping between 'Values' and 'ValueMaps' is possible,
  3058. // hence update the parameter value to reflect the change.
  3059. rParsedInfo.GetCmdSwitchesObject().
  3060. UpdateParameterValue(bstrProp, _bstr_t(pszValue));
  3061. }
  3062. else
  3063. break;
  3064. theIterator++;
  3065. }
  3066. }
  3067. catch(_com_error& e)
  3068. {
  3069. SAFEIRELEASE(pIObject);
  3070. SAFEIRELEASE(pIQualSet);
  3071. VARIANTCLEAR(varMap);
  3072. VARIANTCLEAR(varValue);
  3073. rParsedInfo.GetCmdSwitchesObject().SetCOMError(e);
  3074. bRet = FALSE;
  3075. }
  3076. catch(CHeap_Exception)
  3077. {
  3078. SAFEIRELEASE(pIObject);
  3079. SAFEIRELEASE(pIQualSet);
  3080. VARIANTCLEAR(varMap);
  3081. VARIANTCLEAR(varValue);
  3082. _com_issue_error(WBEM_E_OUT_OF_MEMORY);
  3083. }
  3084. return bRet;
  3085. }
  3086. /*------------------------------------------------------------------------
  3087. Name :IsInteractive()
  3088. Synopsis :Checks whether user has to be prompted for response
  3089. Type :Member Function
  3090. Input Parameter(s):
  3091. rParsedinfo - reference to CParsedInfo class object.
  3092. Output Parameter(s):None
  3093. Return Type :BOOL
  3094. Global Variables :None
  3095. Calling Syntax :IsInteractive(rParsedInfo)
  3096. Notes :None
  3097. ------------------------------------------------------------------------*/
  3098. BOOL CExecEngine::IsInteractive(CParsedInfo& rParsedInfo)
  3099. {
  3100. BOOL bInteractive = FALSE;
  3101. // Get the status of /INTERACTIVE global switch.
  3102. bInteractive = rParsedInfo.GetGlblSwitchesObject().
  3103. GetInteractiveStatus();
  3104. // If /NOINTERACTIVE specified at the verb level.
  3105. if (rParsedInfo.GetCmdSwitchesObject().
  3106. GetInteractiveMode() == NOINTERACTIVE)
  3107. {
  3108. bInteractive = FALSE;
  3109. }
  3110. else if (rParsedInfo.GetCmdSwitchesObject().
  3111. GetInteractiveMode() == INTERACTIVE)
  3112. {
  3113. bInteractive = TRUE;
  3114. }
  3115. return bInteractive;
  3116. }
  3117. /*------------------------------------------------------------------------
  3118. Name :CheckQualifierInfo
  3119. Synopsis :Validates the parameter value specified against the
  3120. parameter qualifiers for that parameter(i.e checking
  3121. against the contents of following qualifiers if
  3122. available:
  3123. 1. MaxLen,
  3124. 2. ValueMap
  3125. 3. Values
  3126. Type :Member Function
  3127. Input Parameter(s):
  3128. rParsedinfo - CParsedInfo object.
  3129. pIMethodSign - input signature of the method.
  3130. bstrParam - parameter name
  3131. pszValue - new value.
  3132. Output Parameter(s):
  3133. pszValue - new value.
  3134. Return Type :BOOL
  3135. Global Variables :None
  3136. Calling Syntax :CheckQualifierInfo(rParsedInfo, pIMethodSign,
  3137. bstrParam, pszValue)
  3138. Notes :None
  3139. ------------------------------------------------------------------------*/
  3140. BOOL CExecEngine::CheckQualifierInfo(CParsedInfo& rParsedInfo,
  3141. IWbemClassObject *pIObject,
  3142. _bstr_t bstrParam,
  3143. WCHAR*& pszValue)
  3144. {
  3145. HRESULT hr = S_OK;
  3146. IWbemQualifierSet *pIQualSet = NULL;
  3147. BOOL bRet = TRUE;
  3148. CHString chsMsg;
  3149. DWORD dwThreadId = GetCurrentThreadId();
  3150. VARIANT varMap,
  3151. varValue,
  3152. varLen;
  3153. VariantInit(&varMap);
  3154. VariantInit(&varValue);
  3155. VariantInit(&varLen);
  3156. try
  3157. {
  3158. BOOL bFound = FALSE;
  3159. // Obtain the property qualifier set for the parameter.
  3160. hr= pIObject->GetPropertyQualifierSet(bstrParam, &pIQualSet);
  3161. if (m_bTrace || m_eloErrLogOpt)
  3162. {
  3163. chsMsg.Format(L"IWbemClassObject::GetPropertyQualifierSet"
  3164. L"(L\"%s\", -)", (LPWSTR) bstrParam);
  3165. WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg,
  3166. dwThreadId, rParsedInfo, m_bTrace);
  3167. }
  3168. ONFAILTHROWERROR(hr);
  3169. // Check whether the 'Maxlen' qualifier is applicable.
  3170. pIQualSet->Get(_bstr_t(L"MaxLen"), 0, &varLen, NULL);
  3171. if (varLen.vt != VT_EMPTY && varLen.vt != VT_NULL)
  3172. {
  3173. // If the property value length exceeds maximum length
  3174. // allowed set the return value to FALSE
  3175. if (lstrlen(pszValue) > varLen.lVal)
  3176. {
  3177. rParsedInfo.GetCmdSwitchesObject().
  3178. SetErrataCode(IDS_E_VALUE_EXCEEDS_MAXLEN);
  3179. bRet = FALSE;
  3180. }
  3181. }
  3182. VARIANTCLEAR(varLen);
  3183. if (bRet)
  3184. {
  3185. // Obtain the 'ValueMap' qualifier contents if present
  3186. pIQualSet->Get(_bstr_t(L"ValueMap"), 0, &varMap, NULL);
  3187. if (varMap.vt != VT_EMPTY && varMap.vt != VT_NULL)
  3188. {
  3189. // Get lower and upper bounds of Descriptions array
  3190. LONG lUpper = 0, lLower = 0;
  3191. hr = SafeArrayGetLBound(varMap.parray, varMap.parray->cDims,
  3192. &lLower);
  3193. if ( m_eloErrLogOpt )
  3194. {
  3195. chsMsg.Format(L"SafeArrayGetLBound(-, -, -)");
  3196. WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg,
  3197. dwThreadId, rParsedInfo, FALSE);
  3198. }
  3199. ONFAILTHROWERROR(hr);
  3200. hr = SafeArrayGetUBound(varMap.parray, varMap.parray->cDims,
  3201. &lUpper);
  3202. if ( m_eloErrLogOpt )
  3203. {
  3204. chsMsg.Format(L"SafeArrayGetUBound(-, -, -)");
  3205. WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg,
  3206. dwThreadId, rParsedInfo, FALSE);
  3207. }
  3208. ONFAILTHROWERROR(hr);
  3209. for (LONG lIndex = lLower; lIndex <= lUpper; lIndex++)
  3210. {
  3211. void* pv = NULL;
  3212. hr = SafeArrayGetElement(varMap.parray, &lIndex, &pv);
  3213. if ( m_eloErrLogOpt )
  3214. {
  3215. chsMsg.Format(L"SafeArrayGetElement(-, -, -)");
  3216. WMITRACEORERRORLOG(hr, __LINE__, __FILE__,
  3217. (LPCWSTR)chsMsg, dwThreadId, rParsedInfo, FALSE);
  3218. }
  3219. ONFAILTHROWERROR(hr);
  3220. // Check whether the property value is available with the
  3221. // value map entries.
  3222. if (CompareTokens(pszValue, (_TCHAR*)pv))
  3223. {
  3224. bFound = TRUE;
  3225. break;
  3226. }
  3227. }
  3228. bRet = bFound;
  3229. }
  3230. // If not found in the ValueMap
  3231. if (!bRet || !bFound)
  3232. {
  3233. // Obtain the 'Values' qualifier contents if present
  3234. pIQualSet->Get(_bstr_t(L"Values"), 0, &varValue, NULL);
  3235. if (varValue.vt != VT_EMPTY && varValue.vt != VT_NULL)
  3236. {
  3237. // Get lower and upper bounds of Descriptions array
  3238. LONG lUpper = 0, lLower = 0;
  3239. hr = SafeArrayGetLBound(varValue.parray,
  3240. varValue.parray->cDims, &lLower);
  3241. if ( m_eloErrLogOpt )
  3242. {
  3243. chsMsg.Format(L"SafeArrayGetLBound(-, -, -)");
  3244. WMITRACEORERRORLOG(hr, __LINE__, __FILE__,
  3245. (LPCWSTR)chsMsg, dwThreadId, rParsedInfo, FALSE);
  3246. }
  3247. ONFAILTHROWERROR(hr);
  3248. hr = SafeArrayGetUBound(varValue.parray,
  3249. varValue.parray->cDims, &lUpper);
  3250. if ( m_eloErrLogOpt )
  3251. {
  3252. chsMsg.Format(L"SafeArrayGetUBound(-, -, -)");
  3253. WMITRACEORERRORLOG(hr, __LINE__, __FILE__,
  3254. (LPCWSTR)chsMsg, dwThreadId, rParsedInfo, FALSE);
  3255. }
  3256. ONFAILTHROWERROR(hr);
  3257. for (LONG lIndex = lLower; lIndex <= lUpper; lIndex++)
  3258. {
  3259. void *pv = NULL;
  3260. hr = SafeArrayGetElement(varValue.parray,
  3261. &lIndex, &pv);
  3262. if ( m_eloErrLogOpt )
  3263. {
  3264. chsMsg.Format(L"SafeArrayGetElement(-, -, -)");
  3265. WMITRACEORERRORLOG(hr, __LINE__, __FILE__,
  3266. (LPCWSTR)chsMsg, dwThreadId, rParsedInfo, FALSE);
  3267. }
  3268. ONFAILTHROWERROR(hr);
  3269. // Check for any matching entry.
  3270. if (CompareTokens(pszValue, (_TCHAR*)pv))
  3271. {
  3272. void* pmv = NULL;
  3273. if (varMap.vt != VT_EMPTY && varMap.vt != VT_NULL)
  3274. {
  3275. // obtain the correponding ValueMap entry.
  3276. hr = SafeArrayGetElement(varMap.parray,
  3277. &lIndex, &pmv);
  3278. if ( m_eloErrLogOpt )
  3279. {
  3280. chsMsg.Format(
  3281. L"SafeArrayGetElement(-, -, -)");
  3282. WMITRACEORERRORLOG(hr, __LINE__, __FILE__,
  3283. (LPCWSTR)chsMsg, dwThreadId,
  3284. rParsedInfo, FALSE);
  3285. }
  3286. ONFAILTHROWERROR(hr);
  3287. // Modify the current property value
  3288. // (i.e 'Values' to 'ValueMap' content)
  3289. lstrcpy(pszValue, ((_TCHAR*)pmv));
  3290. }
  3291. // Only 'Values' qualifier available
  3292. else
  3293. {
  3294. _TCHAR szTemp[BUFFER255] = NULL_STRING;
  3295. _itot(lIndex, szTemp, 10);
  3296. // Modify the current property value
  3297. // (i.e 'Values' entry to index)
  3298. lstrcpy(pszValue, szTemp);
  3299. }
  3300. bFound = TRUE;
  3301. break;
  3302. }
  3303. }
  3304. // If not match found in 'ValueMap' and 'Values' qualifier
  3305. // list
  3306. if (!bFound)
  3307. {
  3308. rParsedInfo.GetCmdSwitchesObject().
  3309. SetErrataCode(IDS_E_VALUE_NOTFOUND);
  3310. }
  3311. bRet = bFound;
  3312. }
  3313. }
  3314. VARIANTCLEAR(varValue);
  3315. VARIANTCLEAR(varMap);
  3316. }
  3317. }
  3318. catch(_com_error& e)
  3319. {
  3320. SAFEIRELEASE(pIQualSet);
  3321. VARIANTCLEAR(varMap);
  3322. VARIANTCLEAR(varValue);
  3323. rParsedInfo.GetCmdSwitchesObject().SetCOMError(e);
  3324. bRet = FALSE;
  3325. }
  3326. catch(CHeap_Exception)
  3327. {
  3328. SAFEIRELEASE(pIQualSet);
  3329. VARIANTCLEAR(varMap);
  3330. VARIANTCLEAR(varValue);
  3331. _com_issue_error(WBEM_E_OUT_OF_MEMORY);
  3332. }
  3333. return bRet;
  3334. }
  3335. /*------------------------------------------------------------------------
  3336. Name :ValidateAlaisInParams
  3337. Synopsis :Validates the property value specified against the
  3338. property qualifiers available for that property
  3339. from the <alias> definition (i.e checking
  3340. against the contents of following qualifiers if
  3341. available:
  3342. 1. MaxLen,
  3343. 2. ValueMap
  3344. 3. Values
  3345. Type :Member Function
  3346. Input Parameter(s):
  3347. rParsedinfo - reference to CParsedInfo object.
  3348. Output Parameter(s):None
  3349. Return Type :BOOL
  3350. Global Variables :None
  3351. Calling Syntax :ValidateAlaisInParams(rParsedInfo)
  3352. Notes :None
  3353. ------------------------------------------------------------------------*/
  3354. BOOL CExecEngine::ValidateAlaisInParams(CParsedInfo& rParsedInfo)
  3355. {
  3356. BOOL bRet = TRUE;
  3357. //_TCHAR szMsg[BUFFER1024] = NULL_STRING;
  3358. BSTRMAP theParamMap;
  3359. BSTRMAP::iterator theIterator = NULL;
  3360. DWORD dwThreadId = GetCurrentThreadId();
  3361. PROPDETMAP pdmPropDetMap;
  3362. // Get the property details map.
  3363. pdmPropDetMap = rParsedInfo.GetCmdSwitchesObject().GetPropDetMap();
  3364. // If the property details are available
  3365. if (!pdmPropDetMap.empty())
  3366. {
  3367. // Get the parameters map
  3368. theParamMap = rParsedInfo.GetCmdSwitchesObject().GetParameterMap();
  3369. theIterator = theParamMap.begin();
  3370. try
  3371. {
  3372. // Loop through the list of available parameters
  3373. while (theIterator != theParamMap.end())
  3374. {
  3375. // Get the property name and the corresponding value.
  3376. _bstr_t bstrProp = _bstr_t((_TCHAR*)(*theIterator).first);
  3377. WCHAR* pszValue = (LPWSTR)(*theIterator).second;
  3378. // Check the value against the qualifier information
  3379. bRet = CheckAliasQualifierInfo(rParsedInfo, bstrProp,
  3380. pszValue, pdmPropDetMap);
  3381. if (bRet)
  3382. {
  3383. // A mapping between 'Values' and 'ValueMaps' is possible,
  3384. // hence update the parameter value to reflect the change.
  3385. rParsedInfo.GetCmdSwitchesObject().
  3386. UpdateParameterValue(bstrProp, _bstr_t(pszValue));
  3387. }
  3388. else
  3389. break;
  3390. theIterator++;
  3391. }
  3392. }
  3393. catch(_com_error& e)
  3394. {
  3395. _com_issue_error(e.Error());
  3396. bRet = FALSE;
  3397. }
  3398. catch(...)
  3399. {
  3400. bRet = FALSE;
  3401. }
  3402. }
  3403. return bRet;
  3404. }
  3405. /*------------------------------------------------------------------------
  3406. Name :CheckAliasQualifierInfo
  3407. Synopsis :Validates the parameter value specified against the
  3408. parameter qualifiers for that parameter from the
  3409. <alias> definition (i.e checking
  3410. against the contents of following qualifiers if
  3411. available:
  3412. 1. MaxLen,
  3413. 2. ValueMap
  3414. 3. Values
  3415. Type :Member Function
  3416. Input Parameter(s):
  3417. rParsedinfo - CParsedInfo object.
  3418. bstrParam - parameter name
  3419. pszValue - new value.
  3420. pdmPropDetMap - property details map
  3421. Output Parameter(s):
  3422. pszValue - new value
  3423. Return Type :BOOL
  3424. Global Variables :None
  3425. Calling Syntax :CheckAliasQualifierInfo(rParsedInfo, bstrParam,
  3426. pszValue, pdmPropDetMap)
  3427. Notes :None
  3428. ------------------------------------------------------------------------*/
  3429. BOOL CExecEngine::CheckAliasQualifierInfo(CParsedInfo& rParsedInfo,
  3430. _bstr_t bstrParam,
  3431. WCHAR*& pszValue,
  3432. PROPDETMAP pdmPropDetMap)
  3433. {
  3434. BOOL bRet = TRUE,
  3435. bFound = FALSE;
  3436. PROPDETMAP::iterator propItrtrStart = NULL;
  3437. PROPDETMAP::iterator propItrtrEnd = NULL;
  3438. QUALDETMAP qualMap;
  3439. QUALDETMAP::iterator qualDetMap = NULL;
  3440. BSTRVECTOR::iterator qualEntriesStart = NULL;
  3441. BSTRVECTOR::iterator qualEntriesEnd = NULL;
  3442. BSTRVECTOR qualVMEntries;
  3443. BSTRVECTOR qualVEntries;
  3444. BSTRVECTOR qualMEntries;
  3445. propItrtrStart = pdmPropDetMap.begin();
  3446. propItrtrEnd = pdmPropDetMap.end();
  3447. try
  3448. {
  3449. while (propItrtrStart != propItrtrEnd)
  3450. {
  3451. // If the property is found.
  3452. if (CompareTokens( (LPWSTR)bstrParam,
  3453. ((LPWSTR)(*propItrtrStart).first) ))
  3454. {
  3455. // Get the qualifier map
  3456. qualMap = ((*propItrtrStart).second).QualDetMap;
  3457. // Check if the qualifier information is available.
  3458. if (!qualMap.empty())
  3459. {
  3460. // Check for the 'MaxLen' qualifier
  3461. qualDetMap = qualMap.find(_bstr_t(L"MaxLen"));
  3462. // If MaxLen qualifier information is available.
  3463. if (qualDetMap != qualMap.end())
  3464. {
  3465. qualMEntries = (*qualDetMap).second;
  3466. BSTRVECTOR::reference qualRef = qualMEntries.at(0);
  3467. if (lstrlen(pszValue) > _wtoi((LPWSTR)qualRef))
  3468. {
  3469. rParsedInfo.GetCmdSwitchesObject().
  3470. SetErrataCode(IDS_E_VALUE_EXCEEDS_MAXLEN);
  3471. bRet = FALSE;
  3472. }
  3473. }
  3474. if (bRet)
  3475. {
  3476. // Check for the 'ValueMap' qualfiers
  3477. qualDetMap = qualMap.find(_bstr_t(L"ValueMap"));
  3478. // If 'ValueMap' qualifier information is available.
  3479. if (qualDetMap != qualMap.end())
  3480. {
  3481. // Get the qualifier entries vector
  3482. qualVMEntries = (*qualDetMap ).second;
  3483. qualEntriesStart = qualVMEntries.begin();
  3484. qualEntriesEnd = qualVMEntries.end();
  3485. // Loop thru the available 'ValueMap' entries.
  3486. while (qualEntriesStart != qualEntriesEnd)
  3487. {
  3488. // Check whether the property value is
  3489. // available with the value map entries.
  3490. if (CompareTokens(pszValue,
  3491. (_TCHAR*)(*qualEntriesStart)))
  3492. {
  3493. bFound = TRUE;
  3494. break;
  3495. }
  3496. // Move to next entry
  3497. qualEntriesStart++;
  3498. }
  3499. bRet = bFound;
  3500. }
  3501. // If not found in the 'ValueMap' entries
  3502. if (!bRet || !bFound)
  3503. {
  3504. // Check for the 'Values' qualfiers
  3505. qualDetMap = qualMap.find(_bstr_t(L"Values"));
  3506. // If 'Values' qualifier information is available.
  3507. if (qualDetMap != qualMap.end())
  3508. {
  3509. // Get the qualifier entries vector
  3510. qualVEntries = (*qualDetMap).second;
  3511. qualEntriesStart = qualVEntries.begin();
  3512. qualEntriesEnd = qualVEntries.end();
  3513. WMICLIINT nLoop = 0;
  3514. // Loop thru the available 'Values' entries.
  3515. while (qualEntriesStart != qualEntriesEnd)
  3516. {
  3517. // Check whether the property value is
  3518. // available with the value map entries.
  3519. if (CompareTokens(pszValue,
  3520. (_TCHAR*)(*qualEntriesStart)))
  3521. {
  3522. // If 'ValueMap' entries are available.
  3523. if (!qualVMEntries.empty())
  3524. {
  3525. //Get corresponding entry from
  3526. //'ValueMap'
  3527. BSTRVECTOR::reference qualRef =
  3528. qualVMEntries.at(nLoop);
  3529. lstrcpy(pszValue,
  3530. (_TCHAR*)(qualRef));
  3531. }
  3532. bFound = TRUE;
  3533. break;
  3534. }
  3535. // Move to next entry
  3536. qualEntriesStart++;
  3537. nLoop++;
  3538. }
  3539. // If match not found in 'ValueMap' and
  3540. // 'Values' qualifier entries list
  3541. if (!bFound)
  3542. {
  3543. rParsedInfo.GetCmdSwitchesObject().
  3544. SetErrataCode(IDS_E_VALUE_NOTFOUND);
  3545. }
  3546. bRet = bFound;
  3547. }
  3548. }
  3549. }
  3550. }
  3551. break;
  3552. }
  3553. else
  3554. propItrtrStart++;
  3555. }
  3556. }
  3557. catch(_com_error& e)
  3558. {
  3559. _com_issue_error(e.Error());
  3560. bRet = FALSE;
  3561. }
  3562. return bRet;
  3563. }
  3564. /*------------------------------------------------------------------------
  3565. Name :SubstHashAndExecCmdUtility
  3566. Synopsis :Substitute hashes and execute command line utility.
  3567. If pIWbemObj != NULL then utility should be passed
  3568. with appropriate instance values.
  3569. Type :Member Function
  3570. Input Parameter(s):
  3571. rParsedInfo - reference to CParsedInfo object.
  3572. pIWbemObj - pointer to object of type IWbemClassObject.
  3573. Output Parameter(s):None
  3574. Return Type :void
  3575. Global Variables :None
  3576. Calling Syntax :SubstHashAndExecCmdUtility(rParsedInfo, pIWbemObj)
  3577. Notes :None
  3578. ------------------------------------------------------------------------*/
  3579. void CExecEngine::SubstHashAndExecCmdUtility(CParsedInfo& rParsedInfo,
  3580. IWbemClassObject *pIWbemObj)
  3581. {
  3582. size_t nHashPos = 0;
  3583. size_t nAfterVarSpacePos = 0;
  3584. LONG lHashLen = lstrlen(CLI_TOKEN_HASH);
  3585. LONG lSpaceLen = lstrlen(CLI_TOKEN_SPACE);
  3586. CHString chsMsg;
  3587. DWORD dwThreadId = GetCurrentThreadId();
  3588. HRESULT hr = S_OK;
  3589. BOOL bSubstituted = FALSE;
  3590. VARIANT vtInstanceValue;
  3591. VARIANT vtPath;
  3592. try
  3593. {
  3594. _bstr_t bstrResult;
  3595. _bstr_t bstrVerbDerivation =
  3596. _bstr_t(rParsedInfo.GetCmdSwitchesObject().
  3597. GetVerbDerivation());
  3598. if ( bstrVerbDerivation == _bstr_t(CLI_TOKEN_NULL) )
  3599. bstrVerbDerivation = CLI_TOKEN_SPACE;
  3600. STRING strCmdLine(bstrVerbDerivation);
  3601. BOOL bNamedParamList = rParsedInfo.GetCmdSwitchesObject().
  3602. GetNamedParamListFlag();
  3603. // If NamedParamList is specified param=values are in Parameter map
  3604. // Order them as appear in alias verb parameter definition and put
  3605. // them in to cvInParams for further processing.
  3606. CHARVECTOR cvInParams;
  3607. if ( bNamedParamList == TRUE )
  3608. ObtainInParamsFromParameterMap(rParsedInfo, cvInParams);
  3609. else // else params are available in property list.
  3610. cvInParams = rParsedInfo.GetCmdSwitchesObject().GetPropertyList();
  3611. CHARVECTOR::iterator theActParamIterator = NULL;
  3612. try
  3613. {
  3614. // Loop initialization.
  3615. theActParamIterator = cvInParams.begin();
  3616. while( TRUE )
  3617. {
  3618. // Loop condition.
  3619. if (theActParamIterator == cvInParams.end())
  3620. break;
  3621. bSubstituted = FALSE;
  3622. while ( bSubstituted == FALSE )
  3623. {
  3624. nHashPos = strCmdLine.find(CLI_TOKEN_HASH,
  3625. nHashPos, lHashLen);
  3626. if ( nHashPos != STRING::npos )
  3627. {
  3628. // No instance specified.
  3629. if ( pIWbemObj == NULL )
  3630. {
  3631. strCmdLine.replace(nHashPos, lHashLen,
  3632. *theActParamIterator);
  3633. nHashPos = nHashPos + lstrlen(*theActParamIterator);
  3634. bSubstituted = TRUE;
  3635. }
  3636. else
  3637. {
  3638. if ( strCmdLine.compare(nHashPos + 1,
  3639. lSpaceLen,
  3640. CLI_TOKEN_SPACE) == 0 ||
  3641. strCmdLine.compare(nHashPos + 1,
  3642. lstrlen(CLI_TOKEN_SINGLE_QUOTE),
  3643. CLI_TOKEN_SINGLE_QUOTE) == 0 )
  3644. {
  3645. strCmdLine.replace(nHashPos, lHashLen,
  3646. *theActParamIterator);
  3647. nHashPos = nHashPos +
  3648. lstrlen(*theActParamIterator);
  3649. bSubstituted = TRUE;
  3650. }
  3651. else
  3652. {
  3653. nAfterVarSpacePos =
  3654. strCmdLine.find(
  3655. CLI_TOKEN_SPACE, nHashPos + 1,
  3656. lSpaceLen);
  3657. if ( nAfterVarSpacePos == STRING::npos )
  3658. {
  3659. strCmdLine.replace(nHashPos,
  3660. lHashLen, *theActParamIterator);
  3661. nHashPos = nHashPos +
  3662. lstrlen(*theActParamIterator);
  3663. bSubstituted = TRUE;
  3664. }
  3665. }
  3666. }
  3667. }
  3668. else
  3669. {
  3670. strCmdLine.append(_T(" "));
  3671. strCmdLine.append(*theActParamIterator);
  3672. bSubstituted = TRUE;
  3673. }
  3674. if ( bSubstituted == FALSE )
  3675. nHashPos = nHashPos + lHashLen;
  3676. }
  3677. // Loop expression.
  3678. theActParamIterator++;
  3679. }
  3680. if ( pIWbemObj != NULL )
  3681. {
  3682. // Replacing #Variable parameters
  3683. nHashPos = 0;
  3684. while ( TRUE )
  3685. {
  3686. nHashPos = strCmdLine.find(CLI_TOKEN_HASH, nHashPos,
  3687. lHashLen);
  3688. if ( nHashPos == STRING::npos )
  3689. break;
  3690. nAfterVarSpacePos =
  3691. strCmdLine.find(CLI_TOKEN_SPACE,
  3692. nHashPos + 1, lSpaceLen);
  3693. if ( nAfterVarSpacePos == STRING::npos )
  3694. break;
  3695. _bstr_t bstrPropName(strCmdLine.substr(nHashPos + 1,
  3696. nAfterVarSpacePos - (nHashPos + 1)).data());
  3697. VariantInit(&vtInstanceValue);
  3698. hr = pIWbemObj->Get(bstrPropName, 0,
  3699. &vtInstanceValue, 0, 0);
  3700. if (m_bTrace || m_eloErrLogOpt)
  3701. {
  3702. chsMsg.Format(L"IWbemClassObject::Get(%s, 0, "
  3703. L"-, 0, 0)", (LPWSTR)bstrPropName);
  3704. GetBstrTFromVariant(vtInstanceValue, bstrResult);
  3705. WMITRACEORERRORLOG(hr, __LINE__, __FILE__,
  3706. (LPCWSTR)chsMsg,
  3707. dwThreadId, rParsedInfo, m_bTrace, 0, bstrResult);
  3708. }
  3709. ONFAILTHROWERROR(hr);
  3710. _bstr_t bstrInstanceValue;
  3711. GetBstrTFromVariant(vtInstanceValue, bstrInstanceValue);
  3712. strCmdLine.replace(nHashPos, nAfterVarSpacePos - nHashPos ,
  3713. bstrInstanceValue);
  3714. nHashPos = nHashPos + lstrlen(bstrInstanceValue);
  3715. VARIANTCLEAR(vtInstanceValue);
  3716. }
  3717. VariantInit(&vtPath);
  3718. hr = pIWbemObj->Get(L"__PATH", 0, &vtPath, 0, 0);
  3719. if (m_bTrace || m_eloErrLogOpt)
  3720. {
  3721. chsMsg.Format(L"IWbemClassObject::Get(L\"__PATH\", 0, "
  3722. L"-, 0, 0)");
  3723. GetBstrTFromVariant(vtPath, bstrResult);
  3724. WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg,
  3725. dwThreadId, rParsedInfo, m_bTrace, 0, bstrResult);
  3726. }
  3727. ONFAILTHROWERROR(hr);
  3728. }
  3729. INTEROPTION interInvoke = YES;
  3730. _TCHAR szMsg[BUFFER1024] = NULL_STRING;
  3731. // Get the user response if interactive mode is set
  3732. if (IsInteractive(rParsedInfo) == TRUE)
  3733. {
  3734. _bstr_t bstrMsg;
  3735. if ( pIWbemObj != NULL )
  3736. {
  3737. WMIFormatMessage(IDS_I_METH_INVOKE_PROMPT1, 2, bstrMsg,
  3738. (LPWSTR)vtPath.bstrVal,
  3739. (LPWSTR)strCmdLine.data());
  3740. }
  3741. else
  3742. {
  3743. WMIFormatMessage(IDS_I_METH_INVOKE_PROMPT2, 1, bstrMsg,
  3744. (LPWSTR)strCmdLine.data());
  3745. }
  3746. interInvoke = GetUserResponse((LPWSTR)bstrMsg);
  3747. }
  3748. if ( interInvoke == YES )
  3749. {
  3750. DisplayMessage(L"\n", CP_OEMCP, FALSE, TRUE);
  3751. BOOL bResult = _tsystem(strCmdLine.data());
  3752. DisplayMessage(L"\n", CP_OEMCP, FALSE, TRUE);
  3753. }
  3754. VARIANTCLEAR(vtPath);
  3755. }
  3756. catch(_com_error& e)
  3757. {
  3758. VARIANTCLEAR(vtInstanceValue);
  3759. VARIANTCLEAR(vtPath);
  3760. rParsedInfo.GetCmdSwitchesObject().SetCOMError(e);
  3761. }
  3762. }
  3763. catch(_com_error& e)
  3764. {
  3765. _com_issue_error(e.Error());
  3766. }
  3767. catch(CHeap_Exception)
  3768. {
  3769. _com_issue_error(WBEM_E_OUT_OF_MEMORY);
  3770. }
  3771. }
  3772. /*------------------------------------------------------------------------
  3773. Name :FormQueryAndExecuteMethodOrUtility
  3774. Synopsis :Forms query and executes method or command line
  3775. utility.
  3776. Type :Member Function
  3777. Input Parameter(s):
  3778. rParsedInfo - reference to CParsedInfo object.
  3779. pIInParam - pointer to object of type IWbemClassObject.
  3780. Output Parameter(s):None
  3781. Return Type :HRESULT
  3782. Global Variables :None
  3783. Calling Syntax :FormQueryAndExecuteMethodOrUtility(rParsedInfo, pIInParam)
  3784. Notes :None
  3785. ------------------------------------------------------------------------*/
  3786. HRESULT CExecEngine::FormQueryAndExecuteMethodOrUtility(
  3787. CParsedInfo& rParsedInfo,
  3788. IWbemClassObject *pIInParam)
  3789. {
  3790. HRESULT hr = S_OK;
  3791. IEnumWbemClassObject *pIEnumObj = NULL;
  3792. IWbemClassObject *pIWbemObj = NULL;
  3793. CHString chsMsg;
  3794. DWORD dwThreadId = GetCurrentThreadId();
  3795. try
  3796. {
  3797. _bstr_t bstrResult("");
  3798. _bstr_t bstrPath("");
  3799. BOOL bWhereExpr = FALSE;
  3800. // If PATH specified
  3801. if (rParsedInfo.GetCmdSwitchesObject().GetPathExpression() != NULL)
  3802. {
  3803. if(rParsedInfo.GetCmdSwitchesObject().
  3804. GetWhereExpression() != NULL)
  3805. {
  3806. bWhereExpr = TRUE;
  3807. }
  3808. else
  3809. bstrPath = _bstr_t(rParsedInfo.GetCmdSwitchesObject()
  3810. .GetPathExpression());
  3811. }
  3812. else
  3813. {
  3814. // If CLASS specfied
  3815. if (rParsedInfo.GetCmdSwitchesObject().GetClassPath() != NULL)
  3816. {
  3817. bstrPath = _bstr_t(rParsedInfo.GetCmdSwitchesObject().
  3818. GetClassPath());
  3819. }
  3820. else if(rParsedInfo.GetCmdSwitchesObject().
  3821. GetWhereExpression() != NULL)
  3822. {
  3823. bWhereExpr = TRUE;
  3824. }
  3825. else
  3826. rParsedInfo.GetCmdSwitchesObject().
  3827. GetClassOfAliasTarget(bstrPath);
  3828. }
  3829. // If bstrPath is not empty
  3830. if ( !bWhereExpr )
  3831. {
  3832. if ( rParsedInfo.GetCmdSwitchesObject().GetVerbType() == CMDLINE )
  3833. {
  3834. SubstHashAndExecCmdUtility(rParsedInfo);
  3835. }
  3836. else
  3837. {
  3838. hr = ExecuteMethodAndDisplayResults(bstrPath, rParsedInfo,
  3839. pIInParam);
  3840. }
  3841. ONFAILTHROWERROR(hr);
  3842. }
  3843. else
  3844. {
  3845. ULONG ulReturned = 0;
  3846. _bstr_t bstrQuery;
  3847. // Frame the WMI query to be executed.
  3848. if (rParsedInfo.GetCmdSwitchesObject().
  3849. GetPathExpression() != NULL)
  3850. {
  3851. bstrPath = _bstr_t(rParsedInfo.
  3852. GetCmdSwitchesObject().GetClassPath());
  3853. }
  3854. else
  3855. {
  3856. rParsedInfo.GetCmdSwitchesObject()
  3857. .GetClassOfAliasTarget(bstrPath);
  3858. }
  3859. bstrQuery = _bstr_t("SELECT * FROM ") + bstrPath;
  3860. if(rParsedInfo.GetCmdSwitchesObject().
  3861. GetWhereExpression() != NULL)
  3862. {
  3863. bstrQuery += _bstr_t(" WHERE ")
  3864. + _bstr_t(rParsedInfo.GetCmdSwitchesObject().
  3865. GetWhereExpression());
  3866. }
  3867. hr = m_pITargetNS->ExecQuery(_bstr_t(L"WQL"), bstrQuery,
  3868. WBEM_FLAG_FORWARD_ONLY |
  3869. WBEM_FLAG_RETURN_IMMEDIATELY,
  3870. NULL, &pIEnumObj);
  3871. if (m_bTrace || m_eloErrLogOpt)
  3872. {
  3873. chsMsg.Format(L"IWbemServices::ExecQuery(L\"WQL\","
  3874. L" L\"%s\", 0, NULL, -)", (LPWSTR)bstrQuery);
  3875. WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg,
  3876. dwThreadId, rParsedInfo, m_bTrace);
  3877. }
  3878. ONFAILTHROWERROR(hr);
  3879. // Set the interface security
  3880. hr = SetSecurity(pIEnumObj,
  3881. rParsedInfo.GetGlblSwitchesObject().GetAuthority(),
  3882. rParsedInfo.GetNode(),
  3883. rParsedInfo.GetUser(),
  3884. rParsedInfo.GetPassword(),
  3885. rParsedInfo.GetGlblSwitchesObject().
  3886. GetAuthenticationLevel(),
  3887. rParsedInfo.GetGlblSwitchesObject().
  3888. GetImpersonationLevel());
  3889. if (m_bTrace || m_eloErrLogOpt)
  3890. {
  3891. chsMsg.Format(L"CoSetProxyBlanket(-, RPC_C_AUTHN_WINNT, "
  3892. L"RPC_C_AUTHZ_NONE, NULL, %d, %d, -, EOAC_NONE)",
  3893. rParsedInfo.GetGlblSwitchesObject().
  3894. GetAuthenticationLevel(),
  3895. rParsedInfo.GetGlblSwitchesObject().
  3896. GetImpersonationLevel());
  3897. WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg,
  3898. dwThreadId, rParsedInfo, m_bTrace);
  3899. }
  3900. ONFAILTHROWERROR(hr);
  3901. BOOL bNoInstances = TRUE;
  3902. // Loop thru the available instances
  3903. while (((hr = pIEnumObj->Next( WBEM_INFINITE, 1,
  3904. &pIWbemObj, &ulReturned )) == S_OK)
  3905. && (ulReturned == 1))
  3906. {
  3907. bNoInstances = FALSE;
  3908. VARIANT vtPath;
  3909. VariantInit(&vtPath);
  3910. hr = pIWbemObj->Get(L"__PATH", 0, &vtPath, 0, 0);
  3911. if (m_bTrace || m_eloErrLogOpt)
  3912. {
  3913. chsMsg.Format(L"IWbemClassObject::Get(L\"__PATH\", 0, "
  3914. L"-, 0, 0)");
  3915. GetBstrTFromVariant(vtPath, bstrResult);
  3916. WMITRACEORERRORLOG(hr, __LINE__, __FILE__, (LPCWSTR)chsMsg,
  3917. dwThreadId, rParsedInfo, m_bTrace, 0, bstrResult);
  3918. }
  3919. ONFAILTHROWERROR(hr);
  3920. if ( vtPath.vt == VT_BSTR )
  3921. {
  3922. if ( rParsedInfo.GetCmdSwitchesObject().GetVerbType()
  3923. == CMDLINE )
  3924. {
  3925. SubstHashAndExecCmdUtility(rParsedInfo, pIWbemObj);
  3926. }
  3927. else
  3928. {
  3929. hr = ExecuteMethodAndDisplayResults(vtPath.bstrVal,
  3930. rParsedInfo, pIInParam);
  3931. }
  3932. ONFAILTHROWERROR(hr);
  3933. }
  3934. VariantClear(&vtPath);
  3935. SAFEIRELEASE(pIWbemObj);
  3936. }
  3937. // If next fails.
  3938. ONFAILTHROWERROR(hr);
  3939. SAFEIRELEASE(pIEnumObj);
  3940. // If no instances are available
  3941. if ( bNoInstances == TRUE )
  3942. {
  3943. rParsedInfo.GetCmdSwitchesObject().
  3944. SetInformationCode(IDS_I_NO_INSTANCES);
  3945. }
  3946. }
  3947. }
  3948. catch(_com_error& e)
  3949. {
  3950. SAFEIRELEASE(pIEnumObj);
  3951. SAFEIRELEASE(pIWbemObj);
  3952. rParsedInfo.GetCmdSwitchesObject().SetCOMError(e);
  3953. hr = e.Error();
  3954. }
  3955. catch(CHeap_Exception)
  3956. {
  3957. SAFEIRELEASE(pIEnumObj);
  3958. SAFEIRELEASE(pIWbemObj);
  3959. _com_issue_error(WBEM_E_OUT_OF_MEMORY);
  3960. }
  3961. return hr;
  3962. }
  3963. /*----------------------------------------------------------------------------
  3964. Name :ExtractClassNameandWhereExpr
  3965. Synopsis :This function takes the input as a path expression and
  3966. extracts the Class and Where expression part from the
  3967. path expression.
  3968. Type :Member Function
  3969. Input Parameter(s):
  3970. pszPathExpr - the path expression
  3971. rParsedInfo - reference to CParsedInfo class object
  3972. Output Parameter(s):
  3973. rParsedInfo - reference to CParsedInfo class object
  3974. pszWhere - the Where expression
  3975. Return Type :BOOL
  3976. Global Variables :None
  3977. Calling Syntax :ExtractClassNameandWhereExpr(pszPathExpr, rParsedInfo,
  3978. pszWhere)
  3979. Notes :None
  3980. ----------------------------------------------------------------------------*/
  3981. BOOL CExecEngine::ExtractClassNameandWhereExpr(_TCHAR* pszPathExpr,
  3982. CParsedInfo& rParsedInfo,
  3983. _TCHAR* pszWhere)
  3984. {
  3985. // Frame the class name and where expression based on the object path
  3986. BOOL bRet = TRUE;
  3987. _TCHAR* pszToken = NULL;
  3988. BOOL bFirst = TRUE;
  3989. _TCHAR pszPath[MAX_BUFFER] = NULL_STRING;
  3990. if (pszPathExpr == NULL || pszWhere == NULL)
  3991. bRet = FALSE;
  3992. try
  3993. {
  3994. if ( bRet == TRUE )
  3995. {
  3996. lstrcpy(pszPath, pszPathExpr);
  3997. lstrcpy(pszWhere, CLI_TOKEN_NULL);
  3998. pszToken = _tcstok(pszPath, CLI_TOKEN_DOT);
  3999. if (pszToken != NULL)
  4000. {
  4001. if(CompareTokens(pszToken, pszPathExpr))
  4002. bRet = FALSE;
  4003. }
  4004. while (pszToken != NULL)
  4005. {
  4006. pszToken = _tcstok(NULL, CLI_TOKEN_COMMA);
  4007. if (pszToken != NULL)
  4008. {
  4009. if (!bFirst)
  4010. lstrcat(pszWhere, CLI_TOKEN_AND);
  4011. lstrcat(pszWhere, pszToken);
  4012. bFirst = FALSE;
  4013. }
  4014. else
  4015. break;
  4016. }
  4017. }
  4018. }
  4019. catch(...)
  4020. {
  4021. rParsedInfo.GetCmdSwitchesObject().
  4022. SetErrataCode(IDS_E_INVALID_PATH);
  4023. bRet = FALSE;
  4024. }
  4025. return bRet;
  4026. }
  4027. /*------------------------------------------------------------------------
  4028. Name :GetUserResponseEx
  4029. Synopsis :This function accepts the user response before going
  4030. ahead, when /INTERACTIVE is specified at the verb
  4031. level
  4032. Type :Member Function
  4033. Input parameter :
  4034. pszMsg - message to be displayed.
  4035. Output parameters :None
  4036. Return Type :INTEROPTION
  4037. Global Variables :None
  4038. Calling Syntax :GetUserResponseEx(pszMsg)
  4039. Notes :None
  4040. ------------------------------------------------------------------------*/
  4041. INTEROPTION CExecEngine::GetUserResponseEx(_TCHAR* pszMsg)
  4042. {
  4043. INTEROPTION bRet = YES;
  4044. _TCHAR szResp[BUFFER255] = NULL_STRING;
  4045. _TCHAR *pBuf = NULL;
  4046. if (pszMsg == NULL)
  4047. bRet = NO;
  4048. if(bRet != NO)
  4049. {
  4050. // Get the user response, till 'Y' - yes or 'N' - no
  4051. // is keyed in
  4052. while(TRUE)
  4053. {
  4054. DisplayMessage(pszMsg, CP_OEMCP, TRUE, TRUE);
  4055. pBuf = _fgetts(szResp, BUFFER255-1, stdin);
  4056. if(pBuf != NULL)
  4057. {
  4058. LONG lInStrLen = lstrlen(szResp);
  4059. if(szResp[lInStrLen - 1] == _T('\n'))
  4060. szResp[lInStrLen - 1] = _T('\0');
  4061. }
  4062. else if ( g_wmiCmd.GetBreakEvent() != TRUE )
  4063. {
  4064. lstrcpy(szResp, RESPONSE_NO);
  4065. DisplayMessage(_T("\n"), CP_OEMCP, TRUE, TRUE);
  4066. }
  4067. if ( g_wmiCmd.GetBreakEvent() == TRUE )
  4068. {
  4069. g_wmiCmd.SetBreakEvent(FALSE);
  4070. lstrcpy(szResp, RESPONSE_NO);
  4071. DisplayMessage(_T("\n"), CP_OEMCP, TRUE, TRUE);
  4072. }
  4073. if (CompareTokens(szResp, RESPONSE_YES)
  4074. || CompareTokens(szResp, RESPONSE_NO)
  4075. || CompareTokens(szResp, RESPONSE_HELP))
  4076. break;
  4077. }
  4078. if (CompareTokens(szResp, RESPONSE_NO))
  4079. bRet = NO;
  4080. else if (CompareTokens(szResp, RESPONSE_YES))
  4081. bRet = YES;
  4082. else if (CompareTokens(szResp, RESPONSE_HELP))
  4083. bRet = HELP;
  4084. }
  4085. return bRet;
  4086. }
  4087. /*----------------------------------------------------------------------------
  4088. Name :ObtainInParamsFromParameterMap
  4089. Synopsis :This function obtains param values from parameter map
  4090. in the same order as they appear in the alias verb
  4091. definition.
  4092. Type :Member Function
  4093. Input Parameter(s):
  4094. rParsedInfo - reference to CParsedInfo object
  4095. Output Parameter(s):
  4096. cvParamValues - reference to parameter values vector
  4097. Return Type :None
  4098. Global Variables :None
  4099. Calling Syntax :ObtainInParamsFromParameterMap(rParsedInfo, cvParamValues)
  4100. Notes :None
  4101. ----------------------------------------------------------------------------*/
  4102. void CExecEngine::ObtainInParamsFromParameterMap(CParsedInfo& rParsedInfo,
  4103. CHARVECTOR& cvParamValues)
  4104. {
  4105. PROPDETMAP pdmVerbParamsFromAliasDef = (*(rParsedInfo.
  4106. GetCmdSwitchesObject().
  4107. GetMethDetMap().begin())).
  4108. second.Params;
  4109. PROPDETMAP::iterator itrVerbParams;
  4110. BSTRMAP bmNamedParamList = rParsedInfo.GetCmdSwitchesObject().
  4111. GetParameterMap();
  4112. BSTRMAP::iterator itrNamedParamList;
  4113. try
  4114. {
  4115. for ( itrVerbParams = pdmVerbParamsFromAliasDef.begin();
  4116. itrVerbParams != pdmVerbParamsFromAliasDef.end();
  4117. itrVerbParams++ )
  4118. {
  4119. _TCHAR* pszVerbParamName = (*itrVerbParams).first;
  4120. // To remove numbers from Names.
  4121. pszVerbParamName = pszVerbParamName + 5;
  4122. if ( Find(bmNamedParamList, pszVerbParamName, itrNamedParamList)
  4123. == TRUE)
  4124. {
  4125. cvParamValues.push_back(_bstr_t((*itrNamedParamList).second));
  4126. }
  4127. else
  4128. {
  4129. cvParamValues.push_back(
  4130. _bstr_t(((*itrVerbParams).second).Default));
  4131. }
  4132. }
  4133. }
  4134. catch(_com_error& e)
  4135. {
  4136. _com_issue_error(e.Error());
  4137. }
  4138. }
  4139. /*----------------------------------------------------------------------------
  4140. Name :FrameAssocHeader
  4141. Synopsis :This function frames the XML header to be used with
  4142. the ASSOCIATORS output
  4143. Type :Member Function
  4144. Input Parameter(s):
  4145. bstrPath - object/class path
  4146. bClass - TRUE - Indicates class level associators header
  4147. FALSE - Indicates instance level associators header
  4148. Output Parameter(s):
  4149. bstrFrag - fragment string
  4150. Return Type :HRESULT
  4151. Global Variables :None
  4152. Calling Syntax :FrameAssocHeader(bstrPath, bstrFrag, bClass)
  4153. Notes :None
  4154. ----------------------------------------------------------------------------*/
  4155. HRESULT CExecEngine::FrameAssocHeader(_bstr_t bstrPath, _bstr_t& bstrFrag,
  4156. BOOL bClass)
  4157. {
  4158. HRESULT hr = S_OK;
  4159. IWbemClassObject *pIObject = NULL;
  4160. try
  4161. {
  4162. _variant_t vClass, vSClass, vPath,
  4163. vOrigin, vType;
  4164. _bstr_t bstrProp;
  4165. CHString szBuf;
  4166. // Get the Class/instance information.
  4167. hr = m_pITargetNS->GetObject(bstrPath, WBEM_FLAG_USE_AMENDED_QUALIFIERS,
  4168. NULL, &pIObject, NULL);
  4169. ONFAILTHROWERROR(hr);
  4170. // Get the __CLASS property value
  4171. bstrProp = L"__CLASS";
  4172. hr = pIObject->Get(bstrProp, 0, &vClass, 0, 0);
  4173. ONFAILTHROWERROR(hr);
  4174. // Get the __PATH property value
  4175. bstrProp = L"__PATH";
  4176. hr = pIObject->Get(bstrProp, 0, &vPath, 0, 0);
  4177. ONFAILTHROWERROR(hr);
  4178. // If CLASS level associators required
  4179. if (bClass)
  4180. {
  4181. // Get the __SUPERCLASS property value
  4182. bstrProp = L"__SUPERCLASS";
  4183. hr = pIObject->Get(bstrProp, 0, &vSClass, NULL, NULL);
  4184. ONFAILTHROWERROR(hr);
  4185. szBuf.Format(_T("<CLASS NAME=\"%s\" SUPERCLASS=\"%s\"><PROPERTY "
  4186. L"NAME=\"__PATH\" CLASSORIGIN=\"__SYSTEM\" TYPE=\"string\">"
  4187. L"<VALUE>%s</VALUE></PROPERTY>"),
  4188. (vClass.vt != VT_NULL && (LPWSTR)vClass.bstrVal)
  4189. ? (LPWSTR)vClass.bstrVal : L"N/A",
  4190. (vSClass.vt != VT_NULL && (LPWSTR)vSClass.bstrVal)
  4191. ? (LPWSTR)vSClass.bstrVal : L"N/A",
  4192. (vPath.vt != VT_NULL && (LPWSTR)vPath.bstrVal)
  4193. ? (LPWSTR)vPath.bstrVal : L"N/A");
  4194. }
  4195. else
  4196. {
  4197. szBuf.Format(
  4198. _T("<INSTANCE CLASSNAME=\"%s\"><PROPERTY NAME=\"__PATH\""
  4199. L" CLASSORIGIN=\"__SYSTEM\" TYPE=\"string\"><VALUE>%s"
  4200. L"</VALUE></PROPERTY>"),
  4201. (vClass.vt != VT_NULL && (LPWSTR)vClass.bstrVal)
  4202. ? (LPWSTR)vClass.bstrVal : L"N/A",
  4203. (vPath.vt != VT_NULL && (LPWSTR)vPath.bstrVal)
  4204. ? (LPWSTR)vPath.bstrVal : L"N/A");
  4205. }
  4206. SAFEIRELEASE(pIObject);
  4207. bstrFrag = _bstr_t(szBuf);
  4208. }
  4209. catch(_com_error& e)
  4210. {
  4211. SAFEIRELEASE(pIObject);
  4212. hr = e.Error();
  4213. }
  4214. // trap for CHeap_Exception
  4215. catch(CHeap_Exception)
  4216. {
  4217. SAFEIRELEASE(pIObject);
  4218. hr = WBEM_E_OUT_OF_MEMORY;
  4219. }
  4220. return hr;
  4221. }