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.

1193 lines
43 KiB

  1. /*****************************************************************************
  2. Copyright (c) Microsoft Corporation
  3. Module Name:
  4. ETQuery.CPP
  5. Abstract:
  6. This module is intended to have the functionality for EVENTTRIGGERS.EXE
  7. with -query parameter.
  8. This will Query WMI and shows presently available Event Triggers.
  9. Author:
  10. Akhil Gokhale 03-Oct.-2000 (Created it)
  11. Revision History:
  12. ******************************************************************************/
  13. #include "pch.h"
  14. #include "ETCommon.h"
  15. #include "resource.h"
  16. #include "ShowError.h"
  17. #include "ETQuery.h"
  18. #include "WMI.h"
  19. #define DEFAULT_USER L"NT AUTHORITY\\SYSTEM"
  20. #define DBL_SLASH L"\\\\";
  21. // Defines local to this file
  22. #define SHOW_WQL_QUERY L"select * from __instancecreationevent where"
  23. #define QUERY_STRING_AND L"select * from __instancecreationevent where \
  24. targetinstance isa \"win32_ntlogevent\" AND"
  25. #define BLANK_LINE L"\n"
  26. // ***************************************************************************
  27. // Routine Description:
  28. // Class default constructor.
  29. //
  30. // Arguments:
  31. // None
  32. // Return Value:
  33. // None
  34. //
  35. //***************************************************************************
  36. CETQuery::CETQuery()
  37. {
  38. // init to defaults
  39. m_bNeedDisconnect = FALSE;
  40. m_pszServerName = NULL;
  41. m_pszUserName = NULL;
  42. m_pszPassword = NULL;
  43. m_pszFormat = NULL;
  44. m_bVerbose = FALSE;
  45. m_bNoHeader = FALSE;
  46. m_pszEventDesc = NULL;
  47. m_pszTask = NULL;
  48. m_bNeedPassword = FALSE;
  49. m_bUsage = FALSE;
  50. m_bQuery = FALSE;
  51. m_pWbemLocator = NULL;
  52. m_pWbemServices = NULL;
  53. m_pAuthIdentity = NULL;
  54. m_pObj = NULL;
  55. m_pTriggerEventConsumer = NULL;
  56. m_pEventFilter = NULL;
  57. m_arrColData = NULL;
  58. m_pszBuffer = NULL;
  59. m_pszEventQuery = NULL;
  60. m_pszTaskUserName = NULL;
  61. m_bIsCOMInitialize = FALSE;
  62. m_hStdHandle = NULL;
  63. m_pClass = NULL;
  64. m_pInClass = NULL;
  65. m_pInInst = NULL;
  66. m_pOutInst = NULL;
  67. m_lHostNameColWidth = WIDTH_HOSTNAME;
  68. m_lTriggerIDColWidth = WIDTH_TRIGGER_ID;
  69. m_lETNameColWidth = WIDTH_TRIGGER_NAME;
  70. m_lTaskColWidth = WIDTH_TASK;
  71. m_lQueryColWidth = WIDTH_EVENT_QUERY;
  72. m_lDescriptionColWidth = WIDTH_DESCRIPTION;
  73. m_lWQLColWidth = 0;
  74. m_lTaskUserName = WIDTH_TASK_USERNAME;
  75. }
  76. // ***************************************************************************
  77. // Routine Description:
  78. // Class constructor.
  79. //
  80. // Arguments:
  81. // None
  82. // Return Value:
  83. // None
  84. //
  85. //***************************************************************************
  86. CETQuery::CETQuery(LONG lMinMemoryReq,BOOL bNeedPassword)
  87. {
  88. // init to defaults
  89. m_bNeedDisconnect = FALSE;
  90. m_pszServerName = NULL;
  91. m_pszUserName = NULL;
  92. m_pszPassword = NULL;
  93. m_pszFormat = NULL;
  94. m_bVerbose = FALSE;
  95. m_bNoHeader = FALSE;
  96. m_pszEventDesc = NULL;
  97. m_pszTask = NULL;
  98. m_bIsCOMInitialize = FALSE;
  99. m_hStdHandle = NULL;
  100. m_bNeedPassword = bNeedPassword;
  101. m_bUsage = FALSE;
  102. m_bQuery = FALSE;
  103. m_lMinMemoryReq = lMinMemoryReq;
  104. m_pClass = NULL;
  105. m_pInClass = NULL;
  106. m_pInInst = NULL;
  107. m_pOutInst = NULL;
  108. m_pWbemLocator = NULL;
  109. m_pWbemServices = NULL;
  110. m_pAuthIdentity = NULL;
  111. m_arrColData = NULL;
  112. m_pszBuffer = NULL;
  113. m_pObj = NULL;
  114. m_pTriggerEventConsumer = NULL;
  115. m_pEventFilter = NULL;
  116. m_pszTaskUserName = NULL;
  117. m_pszEventQuery = NULL;
  118. m_lHostNameColWidth = WIDTH_HOSTNAME;
  119. m_lTriggerIDColWidth = WIDTH_TRIGGER_ID;
  120. m_lETNameColWidth = WIDTH_TRIGGER_NAME;
  121. m_lTaskColWidth = WIDTH_TASK;
  122. m_lQueryColWidth = WIDTH_EVENT_QUERY;
  123. m_lDescriptionColWidth = WIDTH_DESCRIPTION;
  124. m_lWQLColWidth = 0;
  125. m_lTaskUserName = WIDTH_TASK_USERNAME;
  126. }
  127. // ***************************************************************************
  128. // Routine Description:
  129. // Class desctructor. It frees memory which is allocated during instance
  130. // creation.
  131. //
  132. // Arguments:
  133. // None
  134. // Return Value:
  135. // None
  136. //
  137. //***************************************************************************
  138. CETQuery::~CETQuery()
  139. {
  140. RELEASE_MEMORY_EX(m_pszServerName);
  141. RELEASE_MEMORY_EX(m_pszUserName);
  142. RELEASE_MEMORY_EX(m_pszPassword);
  143. RELEASE_MEMORY_EX(m_pszFormat);
  144. RELEASE_MEMORY_EX(m_pszBuffer);
  145. RELEASE_MEMORY_EX(m_pszEventDesc);
  146. RELEASE_MEMORY_EX(m_pszTask);
  147. RELEASE_MEMORY_EX(m_pszTaskUserName);
  148. DESTROY_ARRAY(m_arrColData);
  149. SAFE_RELEASE_INTERFACE(m_pWbemLocator);
  150. SAFE_RELEASE_INTERFACE(m_pWbemServices);
  151. SAFE_RELEASE_INTERFACE(m_pObj);
  152. SAFE_RELEASE_INTERFACE(m_pTriggerEventConsumer);
  153. SAFE_RELEASE_INTERFACE(m_pEventFilter);
  154. SAFE_RELEASE_INTERFACE(m_pClass);
  155. SAFE_RELEASE_INTERFACE(m_pInClass);
  156. SAFE_RELEASE_INTERFACE(m_pInInst);
  157. SAFE_RELEASE_INTERFACE(m_pOutInst);
  158. RELEASE_MEMORY_EX(m_pszEventQuery);
  159. // Uninitialize COM only when it is initialized.
  160. if(m_bIsCOMInitialize == TRUE)
  161. {
  162. CoUninitialize();
  163. }
  164. }
  165. // ***************************************************************************
  166. // Routine Description:
  167. // This function will prepare column structure for DoParseParam Function.
  168. //
  169. // Arguments:
  170. // none
  171. // Return Value:
  172. // none
  173. // ***************************************************************************
  174. void CETQuery::PrepareCMDStruct()
  175. {
  176. // -delete
  177. lstrcpy(cmdOptions[ ID_Q_QUERY ].szOption,OPTION_QUERY);
  178. cmdOptions[ ID_Q_QUERY ].dwFlags = CP_MAIN_OPTION;
  179. cmdOptions[ ID_Q_QUERY ].dwCount = 1;
  180. cmdOptions[ ID_Q_QUERY ].dwActuals = 0;
  181. cmdOptions[ ID_Q_QUERY ].pValue = &m_bQuery;
  182. lstrcpy(cmdOptions[ ID_Q_QUERY ].szValues,NULL_STRING);
  183. cmdOptions[ ID_Q_QUERY ].pFunction = NULL;
  184. cmdOptions[ ID_Q_QUERY ].pFunctionData = NULL;
  185. cmdOptions[ ID_Q_QUERY ].pFunctionData = NULL;
  186. // -s (servername)
  187. lstrcpy(cmdOptions[ ID_Q_SERVER ].szOption,OPTION_SERVER);
  188. cmdOptions[ ID_Q_SERVER ].dwFlags = CP_TYPE_TEXT|CP_VALUE_MANDATORY;
  189. cmdOptions[ ID_Q_SERVER ].dwCount = 1;
  190. cmdOptions[ ID_Q_SERVER ].dwActuals = 0;
  191. cmdOptions[ ID_Q_SERVER ].pValue = m_pszServerName;
  192. lstrcpy(cmdOptions[ ID_Q_SERVER ].szValues,NULL_STRING);
  193. cmdOptions[ ID_Q_SERVER ].pFunction = NULL;
  194. cmdOptions[ ID_Q_SERVER ].pFunctionData = NULL;
  195. // -u (username)
  196. lstrcpy(cmdOptions[ ID_Q_USERNAME ].szOption,OPTION_USERNAME);
  197. cmdOptions[ ID_Q_USERNAME ].dwFlags = CP_TYPE_TEXT|CP_VALUE_MANDATORY;
  198. cmdOptions[ ID_Q_USERNAME ].dwCount = 1;
  199. cmdOptions[ ID_Q_USERNAME ].dwActuals = 0;
  200. cmdOptions[ ID_Q_USERNAME ].pValue = m_pszUserName;
  201. lstrcpy(cmdOptions[ ID_Q_USERNAME ].szValues,NULL_STRING);
  202. cmdOptions[ ID_Q_USERNAME ].pFunction = NULL;
  203. cmdOptions[ ID_Q_USERNAME ].pFunctionData = NULL;
  204. // -p (password)
  205. lstrcpy(cmdOptions[ ID_Q_PASSWORD ].szOption,OPTION_PASSWORD);
  206. cmdOptions[ ID_Q_PASSWORD ].dwFlags = CP_TYPE_TEXT|CP_VALUE_OPTIONAL;
  207. cmdOptions[ ID_Q_PASSWORD ].dwCount = 1;
  208. cmdOptions[ ID_Q_PASSWORD ].dwActuals = 0;
  209. cmdOptions[ ID_Q_PASSWORD ].pValue = m_pszPassword;
  210. lstrcpy(cmdOptions[ ID_Q_PASSWORD ].szValues,NULL_STRING);
  211. cmdOptions[ ID_Q_PASSWORD ].pFunction = NULL;
  212. cmdOptions[ ID_Q_PASSWORD ].pFunctionData = NULL;
  213. // -fo
  214. lstrcpy(cmdOptions[ ID_Q_FORMAT].szOption,OPTION_FORMAT);
  215. cmdOptions[ ID_Q_FORMAT].dwFlags = CP_TYPE_TEXT|CP_VALUE_MANDATORY|
  216. CP_MODE_VALUES;
  217. cmdOptions[ ID_Q_FORMAT].dwCount = 1;
  218. cmdOptions[ ID_Q_FORMAT].dwActuals = 0;
  219. cmdOptions[ ID_Q_FORMAT].pValue = m_pszFormat;
  220. lstrcpy(cmdOptions[ID_Q_FORMAT].szValues,GetResString(IDS_FORMAT_OPTIONS));
  221. cmdOptions[ ID_Q_FORMAT].pFunction = NULL;
  222. cmdOptions[ ID_Q_FORMAT].pFunctionData = NULL;
  223. // -nh
  224. lstrcpy(cmdOptions[ ID_Q_NOHEADER].szOption,OPTION_NOHEADER);
  225. cmdOptions[ ID_Q_NOHEADER].dwFlags = 0;
  226. cmdOptions[ ID_Q_NOHEADER].dwCount = 1;
  227. cmdOptions[ ID_Q_NOHEADER].dwActuals = 0;
  228. cmdOptions[ ID_Q_NOHEADER].pValue = &m_bNoHeader;
  229. lstrcpy(cmdOptions[ ID_Q_NOHEADER].szValues,NULL_STRING);
  230. cmdOptions[ ID_Q_NOHEADER].pFunction = NULL;
  231. cmdOptions[ ID_Q_NOHEADER].pFunctionData = NULL;
  232. // verbose
  233. lstrcpy(cmdOptions[ ID_Q_VERBOSE].szOption,OPTION_VERBOSE);
  234. cmdOptions[ ID_Q_VERBOSE ].dwFlags = 0;
  235. cmdOptions[ ID_Q_VERBOSE ].dwCount = 1;
  236. cmdOptions[ ID_Q_VERBOSE ].dwActuals = 0;
  237. cmdOptions[ ID_Q_VERBOSE ].pValue = &m_bVerbose;
  238. cmdOptions[ ID_Q_VERBOSE ].pFunction = NULL;
  239. cmdOptions[ ID_Q_VERBOSE ].pFunctionData = NULL;
  240. }
  241. // ***************************************************************************
  242. // Routine Description:
  243. // This function will process/parce the command line options.
  244. //
  245. // Arguments:
  246. // [ in ] argc : argument(s) count specified at the command prompt
  247. // [ in ] argv : argument(s) specified at the command prompt
  248. //
  249. // Return Value:
  250. // TRUE : On Successful
  251. // FALSE : On Error
  252. //
  253. // ***************************************************************************
  254. void
  255. CETQuery::ProcessOption(DWORD argc, LPCTSTR argv[])
  256. {
  257. // local variable
  258. BOOL bReturn = TRUE;
  259. CHString szTempString;
  260. PrepareCMDStruct ();
  261. // init the password variable with '*'
  262. if ( m_pszPassword != NULL )
  263. lstrcpy( m_pszPassword, _T( "*" ) );
  264. // do the actual parsing of the command line arguments and check the result
  265. bReturn = DoParseParam( argc, argv, MAX_COMMANDLINE_Q_OPTION, cmdOptions );
  266. if(bReturn==FALSE)
  267. throw CShowError(MK_E_SYNTAX);
  268. // empty Server is not valid
  269. szTempString = m_pszServerName;
  270. szTempString.TrimRight();
  271. lstrcpy(m_pszServerName,(LPCWSTR)szTempString);
  272. if ( (cmdOptions[ID_Q_SERVER].dwActuals != 0) &&
  273. (lstrlen( m_pszServerName) == 0 ))
  274. {
  275. throw CShowError(IDS_ERROR_SERVERNAME_EMPTY);
  276. }
  277. // "-u" should not be specified without "-s"
  278. if ( cmdOptions[ ID_Q_SERVER ].dwActuals == 0 &&
  279. cmdOptions[ ID_Q_USERNAME ].dwActuals != 0 )
  280. {
  281. throw CShowError(IDS_ERROR_USERNAME_BUT_NOMACHINE);
  282. }
  283. // empty user is not valid
  284. szTempString = m_pszUserName;
  285. szTempString.TrimRight();
  286. lstrcpy(m_pszUserName,(LPCWSTR)szTempString);
  287. if ( (cmdOptions[ID_Q_USERNAME].dwActuals != 0) &&
  288. (lstrlen( m_pszUserName) == 0 ))
  289. {
  290. throw CShowError(IDS_ERROR_USERNAME_EMPTY);
  291. }
  292. // "-p" should not be specified without -u
  293. if ( (cmdOptions[ID_Q_USERNAME].dwActuals == 0) &&
  294. (cmdOptions[ID_Q_PASSWORD].dwActuals != 0 ))
  295. {
  296. // invalid syntax
  297. throw CShowError(IDS_USERNAME_REQUIRED);
  298. }
  299. // check whether caller should accept the password or not
  300. // if user has specified -s (or) -u and no "-p", then utility should accept
  301. // password the user will be prompter for the password only if establish
  302. // connection is failed without the credentials information
  303. if ( cmdOptions[ ID_Q_PASSWORD ].dwActuals != 0 &&
  304. m_pszPassword != NULL && lstrcmp( m_pszPassword, _T( "*" ) ) == 0 )
  305. {
  306. // user wants the utility to prompt for the password before trying to connect
  307. m_bNeedPassword = TRUE;
  308. }
  309. else if ( cmdOptions[ ID_Q_PASSWORD ].dwActuals == 0 &&
  310. ( cmdOptions[ ID_Q_SERVER ].dwActuals != 0 || cmdOptions[ ID_Q_USERNAME ].dwActuals != 0 ) )
  311. {
  312. // -s, -u is specified without password ...
  313. // utility needs to try to connect first and if it fails then prompt for the password
  314. m_bNeedPassword = TRUE;
  315. if ( m_pszPassword != NULL )
  316. {
  317. lstrcpy( m_pszPassword, _T( "" ) );
  318. }
  319. }
  320. if((m_bNoHeader == TRUE) &&
  321. ((lstrcmpi(m_pszFormat,GetResString(IDS_STRING_LIST))==0)))
  322. {
  323. throw CShowError(IDS_HEADER_NOT_ALLOWED);
  324. }
  325. }
  326. // ***************************************************************************
  327. // Routine Description:
  328. // This function will allocate memory to variables and also checks it and
  329. // fills variable with value ZERO.
  330. //
  331. // Arguments:
  332. // None
  333. // Return Value:
  334. // None
  335. //
  336. //***************************************************************************
  337. void
  338. CETQuery::Initialize()
  339. {
  340. // local variable
  341. LONG lTemp = 0;
  342. // if at all any occurs, we know that is 'coz of the
  343. // failure in memory allocation ... so set the error
  344. SetLastError( E_OUTOFMEMORY );
  345. SaveLastError();
  346. // allocate memory at least MAX_COMPUTER_NAME_LENGTH+1 (its windows )
  347. // constant
  348. lTemp = (m_lMinMemoryReq>MAX_COMPUTERNAME_LENGTH)?
  349. m_lMinMemoryReq:MAX_COMPUTERNAME_LENGTH+1;
  350. m_pszServerName = new TCHAR[lTemp+1];
  351. CheckAndSetMemoryAllocation (m_pszServerName,lTemp);
  352. // allocate memory at least MAX_USERNAME_LENGTH+1 (its windows )
  353. // constant
  354. lTemp = (m_lMinMemoryReq>MAX_USERNAME_LENGTH)?
  355. m_lMinMemoryReq:MAX_USERNAME_LENGTH+1;
  356. m_pszUserName = new TCHAR[lTemp+1];
  357. CheckAndSetMemoryAllocation (m_pszUserName,lTemp);
  358. // Allocate memory for Run As Username
  359. m_pszTaskUserName = new TCHAR[MAX_RES_STRING+1];
  360. CheckAndSetMemoryAllocation(m_pszTaskUserName,MAX_RES_STRING);
  361. // allocate memory at least MAX_PASSWORD_LENGTH+1 (its windows )
  362. // constant
  363. lTemp = (m_lMinMemoryReq>MAX_PASSWORD_LENGTH)?
  364. m_lMinMemoryReq:MAX_PASSWORD_LENGTH+1;
  365. m_pszPassword = new TCHAR[lTemp+1];
  366. CheckAndSetMemoryAllocation (m_pszPassword,lTemp);
  367. m_pszFormat = new TCHAR[MAX_RES_STRING+1];
  368. CheckAndSetMemoryAllocation (m_pszFormat,MAX_RES_STRING);
  369. m_pszBuffer = new TCHAR[(MAX_RES_STRING*4)+1];
  370. CheckAndSetMemoryAllocation (m_pszBuffer,(MAX_RES_STRING*4));
  371. m_pszEventDesc = new TCHAR[(m_lDescriptionColWidth)+1];
  372. CheckAndSetMemoryAllocation (m_pszEventDesc,(m_lDescriptionColWidth));
  373. m_pszEventQuery = new TCHAR[(m_lQueryColWidth)+1];
  374. CheckAndSetMemoryAllocation (m_pszEventQuery,(m_lQueryColWidth));
  375. m_pszTask = new TCHAR[(m_lTaskColWidth)+1];
  376. CheckAndSetMemoryAllocation (m_pszTask,(m_lTaskColWidth));
  377. m_arrColData = CreateDynamicArray();
  378. if(m_arrColData==NULL)
  379. {
  380. throw CShowError(E_OUTOFMEMORY);
  381. }
  382. // initialization is successful
  383. SetLastError( NOERROR ); // clear the error
  384. SetReason( NULL_STRING ); // clear the reason
  385. }
  386. // ***************************************************************************
  387. // Routine Description:
  388. // Function will allocate memory to a string
  389. //
  390. // Arguments:
  391. // [in][out] pszStr : String variable to which memory to be allocated
  392. // [in] : Number of bytes to be allocated.
  393. // Return Value:
  394. // NONE
  395. //
  396. //***************************************************************************
  397. void CETQuery::CheckAndSetMemoryAllocation(LPTSTR pszStr, LONG lSize)
  398. {
  399. if(pszStr == NULL)
  400. {
  401. throw CShowError(E_OUTOFMEMORY);
  402. }
  403. // init to ZERO's
  404. ZeroMemory( pszStr, lSize * sizeof( TCHAR ) );
  405. return;
  406. }
  407. // ***************************************************************************
  408. // Routine Description:
  409. // This function will execute query. This will enumerate classes from WMI
  410. // to get required data.
  411. //
  412. // Arguments:
  413. // None
  414. // Return Value:
  415. // None
  416. //
  417. //***************************************************************************
  418. BOOL
  419. CETQuery::ExecuteQuery()
  420. {
  421. // Local variables
  422. HRESULT hr = S_OK; // Holds values returned by COM functions
  423. BOOL bReturn = TRUE; // status of Return value of this function.
  424. BOOL bSearchNTEventLogConsumer = FALSE;//status whether searching in all
  425. //instances of NTEventLogConsumer is
  426. //successful or not
  427. BOOL bSearchEventFilter = FALSE;// status whether searching in all
  428. // instances of EventFilter is successful
  429. //or not
  430. DWORD dwFormatType; // stores FORMAT status values to show results
  431. // COM related pointer variable. their usage is well understood by their
  432. //names.
  433. IEnumWbemClassObject *pEnumFilterToConsumerBinding = NULL;
  434. IWbemServices *pLocatorTriggerEventConsumer = NULL;
  435. VARIANT vVariant; // variable used to get values from COM functions
  436. // Variables to store query results....
  437. TCHAR szHostName[MAX_RES_STRING+1];
  438. TCHAR szEventTriggerName[MAX_RES_STRING+1];
  439. DWORD dwEventId = 0;
  440. DWORD dwRowCount = 0; // store Row number.
  441. BOOL bAtLeastOneEvent = FALSE;
  442. LPTSTR pstrTemp1 = NULL;
  443. BSTR bstrConsumer = NULL;
  444. BSTR bstrFilter = NULL;
  445. BSTR bstrCmdTrigger = NULL;
  446. LONG lTemp = 0;
  447. try
  448. {
  449. m_hStdHandle = GetStdHandle(STD_ERROR_HANDLE);
  450. if(m_hStdHandle!=NULL)
  451. {
  452. GetConsoleScreenBufferInfo(m_hStdHandle,&m_ScreenBufferInfo);
  453. }
  454. InitializeCom(&m_pWbemLocator);
  455. m_bIsCOMInitialize = TRUE;
  456. {
  457. CHString szTempUser = m_pszUserName; // Temp. variabe to store user
  458. // name.
  459. CHString szTempPassword = m_pszPassword;// Temp. variable to store
  460. // password.
  461. m_bLocalSystem = TRUE;
  462. // Connect remote / local WMI.
  463. BOOL bResult = ConnectWmiEx( m_pWbemLocator,
  464. &m_pWbemServices,
  465. m_pszServerName,
  466. szTempUser,
  467. szTempPassword,
  468. &m_pAuthIdentity,
  469. m_bNeedPassword,
  470. WMI_NAMESPACE_CIMV2,
  471. &m_bLocalSystem);
  472. if(bResult == FALSE)
  473. {
  474. TCHAR szErrorMsg[MAX_RES_STRING+1];
  475. DISPLAY_MESSAGE2( stderr, szErrorMsg, L"%s %s", TAG_ERROR,
  476. GetReason());
  477. return FALSE;
  478. }
  479. // check the remote system version and its compatiblity
  480. if ( m_bLocalSystem == FALSE )
  481. {
  482. DWORD dwVersion = 0;
  483. dwVersion = GetTargetVersionEx( m_pWbemServices, m_pAuthIdentity );
  484. if ( dwVersion <= 5000 ) // to block win2k versions
  485. {
  486. TCHAR szErrorMsg[MAX_RES_STRING+1];
  487. SetReason( ERROR_OS_INCOMPATIBLE );
  488. DISPLAY_MESSAGE2( stderr, szErrorMsg, L"%s %s", TAG_ERROR,
  489. GetReason());
  490. return FALSE;
  491. }
  492. }
  493. // check the local credentials and if need display warning
  494. if ( m_bLocalSystem && (lstrlen(m_pszUserName)!=0) )
  495. {
  496. CHString str;
  497. WMISaveError( WBEM_E_LOCAL_CREDENTIALS );
  498. str.Format( L"%s %s", TAG_WARNING, GetReason() );
  499. ShowMessage( stdout, str );
  500. }
  501. }
  502. // Show wait message...............
  503. m_hStdHandle = GetStdHandle(STD_ERROR_HANDLE);
  504. if(m_hStdHandle!=NULL)
  505. {
  506. GetConsoleScreenBufferInfo(m_hStdHandle,&m_ScreenBufferInfo);
  507. }
  508. PrintProgressMsg(m_hStdHandle,GetResString(IDS_MSG_EVTRIG_Q),m_ScreenBufferInfo);
  509. //Following method will creates an enumerator that returns the
  510. // instances of a specified __FilterToConsumerBinding class
  511. bstrConsumer = SysAllocString(CLS_FILTER_TO_CONSUMERBINDING);
  512. hr = m_pWbemServices->
  513. CreateInstanceEnum(bstrConsumer,
  514. WBEM_FLAG_SHALLOW,
  515. NULL,
  516. &pEnumFilterToConsumerBinding);
  517. SAFE_RELEASE_BSTR(bstrConsumer);
  518. ON_ERROR_THROW_EXCEPTION(hr);
  519. hr = SetInterfaceSecurity( pEnumFilterToConsumerBinding,
  520. m_pAuthIdentity );
  521. ON_ERROR_THROW_EXCEPTION(hr);
  522. // retrieves CmdTriggerConsumer class
  523. bstrCmdTrigger = SysAllocString(CLS_TRIGGER_EVENT_CONSUMER);
  524. hr = m_pWbemServices->GetObject(bstrCmdTrigger,
  525. 0, NULL, &m_pClass, NULL);
  526. RELEASE_BSTR(bstrCmdTrigger);
  527. ON_ERROR_THROW_EXCEPTION(hr);
  528. // Gets information about the "QueryETrigger( " method of
  529. // "cmdTriggerConsumer" class
  530. bstrCmdTrigger = SysAllocString(FN_QUERY_ETRIGGER);
  531. hr = m_pClass->GetMethod(bstrCmdTrigger,
  532. 0, &m_pInClass, NULL);
  533. RELEASE_BSTR(bstrCmdTrigger);
  534. ON_ERROR_THROW_EXCEPTION(hr);
  535. // create a new instance of a class "TriggerEventConsumer ".
  536. hr = m_pInClass->SpawnInstance(0, &m_pInInst);
  537. ON_ERROR_THROW_EXCEPTION(hr);
  538. while(1)
  539. {
  540. ULONG uReturned = 0; // holds no. of object returns from Next
  541. //mathod
  542. BSTR bstrTemp = NULL;
  543. CHString strTemp;
  544. // set the security at the interface level also
  545. hr = SetInterfaceSecurity( pEnumFilterToConsumerBinding,
  546. m_pAuthIdentity );
  547. ON_ERROR_THROW_EXCEPTION(hr);
  548. // Get one object starting at the current position in an
  549. //enumeration
  550. hr = pEnumFilterToConsumerBinding->Next(WBEM_INFINITE,
  551. 1,&m_pObj,&uReturned);
  552. ON_ERROR_THROW_EXCEPTION(hr);
  553. if(uReturned == 0)
  554. {
  555. SAFE_RELEASE_INTERFACE(m_pObj);
  556. break;
  557. }
  558. VariantInit(&vVariant);
  559. SAFE_RELEASE_BSTR(bstrTemp);
  560. bstrTemp = SysAllocString(L"Consumer");
  561. hr = m_pObj->Get(bstrTemp, 0, &vVariant, 0, 0);
  562. SAFE_RELEASE_BSTR(bstrTemp);
  563. ON_ERROR_THROW_EXCEPTION(hr);
  564. bstrConsumer =SysAllocString( vVariant.bstrVal);
  565. hr = VariantClear(&vVariant);
  566. ON_ERROR_THROW_EXCEPTION(hr);
  567. // Search for trggereventconsumer string as we are interested to
  568. // get object from this class only
  569. strTemp = bstrConsumer;
  570. if(strTemp.Find(CLS_TRIGGER_EVENT_CONSUMER)==-1)
  571. continue;
  572. hr = SetInterfaceSecurity( m_pWbemServices,
  573. m_pAuthIdentity );
  574. ON_ERROR_THROW_EXCEPTION(hr);
  575. hr = m_pWbemServices->GetObject(bstrConsumer,
  576. 0,
  577. NULL,
  578. &m_pTriggerEventConsumer,
  579. NULL);
  580. SAFE_RELEASE_BSTR(bstrConsumer);
  581. if(FAILED(hr))
  582. {
  583. if(hr==WBEM_E_NOT_FOUND)
  584. continue;
  585. ON_ERROR_THROW_EXCEPTION(hr);
  586. }
  587. bstrTemp = SysAllocString(L"Filter");
  588. hr = m_pObj->Get(bstrTemp, 0, &vVariant, 0, 0);
  589. SAFE_RELEASE_BSTR(bstrTemp);
  590. ON_ERROR_THROW_EXCEPTION(hr);
  591. bstrFilter = SysAllocString(vVariant.bstrVal);
  592. hr = VariantClear(&vVariant);
  593. ON_ERROR_THROW_EXCEPTION(hr);
  594. hr = m_pWbemServices->GetObject(
  595. bstrFilter,
  596. 0,
  597. NULL,
  598. &m_pEventFilter,
  599. NULL);
  600. SAFE_RELEASE_BSTR(bstrFilter);
  601. if(FAILED(hr))
  602. {
  603. if(hr==WBEM_E_NOT_FOUND)
  604. continue;
  605. ON_ERROR_THROW_EXCEPTION(hr);
  606. }
  607. //retrieves the 'TriggerID' value if exits
  608. bstrTemp = SysAllocString(FPR_TRIGGER_ID);
  609. hr = m_pTriggerEventConsumer->Get(bstrTemp,
  610. 0, &vVariant, 0, 0);
  611. if(FAILED(hr))
  612. {
  613. if(hr==WBEM_E_NOT_FOUND)
  614. continue;
  615. ON_ERROR_THROW_EXCEPTION(hr);
  616. }
  617. SAFE_RELEASE_BSTR(bstrTemp);
  618. dwEventId = vVariant.lVal ;
  619. hr = VariantClear(&vVariant);
  620. ON_ERROR_THROW_EXCEPTION(hr);
  621. //retrieves the 'Action' value if exits
  622. bstrTemp = SysAllocString(L"Action");
  623. hr = m_pTriggerEventConsumer->Get(bstrTemp, 0, &vVariant, 0, 0);
  624. ON_ERROR_THROW_EXCEPTION(hr);
  625. SAFE_RELEASE_BSTR(bstrTemp);
  626. lstrcpy(m_pszBuffer,(_TCHAR*)_bstr_t(vVariant.bstrVal));
  627. lTemp = lstrlen(m_pszBuffer);
  628. lTemp += 4; // for the safer size for allocation of memory.
  629. // allocates memory only if new task length is greate than previous one.
  630. if(lTemp > m_lTaskColWidth)
  631. {
  632. // first free it (if previously allocated)
  633. RELEASE_MEMORY_EX(m_pszTask);
  634. m_pszTask = new TCHAR[lTemp+1];
  635. CheckAndSetMemoryAllocation(m_pszTask,lTemp);
  636. }
  637. lstrcpy(m_pszTask,m_pszBuffer);
  638. hr = VariantClear(&vVariant);
  639. ON_ERROR_THROW_EXCEPTION(hr);
  640. //retrieves the 'TriggerDesc' value if exits
  641. bstrTemp = SysAllocString(FPR_TRIGGER_DESC);
  642. hr = m_pTriggerEventConsumer->Get(bstrTemp, 0, &vVariant, 0, 0);
  643. ON_ERROR_THROW_EXCEPTION(hr);
  644. SAFE_RELEASE_BSTR(bstrTemp);
  645. lstrcpy(m_pszBuffer,(_TCHAR*)_bstr_t(vVariant.bstrVal));
  646. lTemp = lstrlen(m_pszBuffer);
  647. if(lTemp == 0)// Means description is not available make it N/A.
  648. {
  649. lstrcpy(m_pszBuffer,GetResString(IDS_ID_NA));
  650. lTemp = lstrlen(m_pszBuffer);
  651. }
  652. lTemp += 4; // for the safer size for allocation of memory.
  653. // allocates memory only if new Description length is greate than
  654. // previous one.
  655. if(lTemp > m_lDescriptionColWidth)
  656. {
  657. // first free it (if previously allocated)
  658. RELEASE_MEMORY_EX(m_pszEventDesc);
  659. m_pszEventDesc = new TCHAR[lTemp+1];
  660. CheckAndSetMemoryAllocation(m_pszEventDesc,lTemp);
  661. }
  662. lstrcpy(m_pszEventDesc,m_pszBuffer);
  663. hr = VariantClear(&vVariant);
  664. ON_ERROR_THROW_EXCEPTION(hr);
  665. // TriggerName
  666. //retrieves the 'TriggerName' value if exits
  667. bstrTemp = SysAllocString(FPR_TRIGGER_NAME);
  668. hr = m_pTriggerEventConsumer->Get(bstrTemp, 0, &vVariant, 0, 0);
  669. ON_ERROR_THROW_EXCEPTION(hr);
  670. SAFE_RELEASE_BSTR(bstrTemp);
  671. wsprintf(szEventTriggerName,_T("%s"),vVariant.bstrVal);
  672. hr = VariantClear(&vVariant);
  673. ON_ERROR_THROW_EXCEPTION(hr);
  674. // Host Name
  675. //retrieves the '__SERVER' value if exits
  676. bstrTemp = SysAllocString(L"__SERVER");
  677. hr = m_pTriggerEventConsumer->Get(bstrTemp, 0, &vVariant, 0, 0);
  678. ON_ERROR_THROW_EXCEPTION(hr);
  679. SAFE_RELEASE_BSTR(bstrTemp);
  680. wsprintf(szHostName,_T("%s"),vVariant.bstrVal);
  681. hr = VariantClear(&vVariant);
  682. ON_ERROR_THROW_EXCEPTION(hr);
  683. bstrTemp = SysAllocString(L"Query");
  684. hr = m_pEventFilter->Get(bstrTemp, 0, &vVariant, 0, 0);
  685. SAFE_RELEASE_BSTR(bstrTemp);
  686. ON_ERROR_THROW_EXCEPTION(hr);
  687. lstrcpy(m_pszBuffer,(_TCHAR*)_bstr_t(vVariant.bstrVal));
  688. hr = VariantClear(&vVariant);
  689. ON_ERROR_THROW_EXCEPTION(hr);
  690. FindAndReplace(&m_pszBuffer,QUERY_STRING_AND,SHOW_WQL_QUERY);
  691. FindAndReplace(&m_pszBuffer,L"targetinstance.LogFile",L"Log");
  692. FindAndReplace(&m_pszBuffer,L"targetinstance.Type",L"Type");
  693. FindAndReplace(&m_pszBuffer,L"targetinstance.EventCode",L"Id");
  694. FindAndReplace(&m_pszBuffer,
  695. L"targetinstance.SourceName",L"Source");
  696. FindAndReplace(&m_pszBuffer,L" ",L" ");//to remove extra spaces
  697. FindAndReplace(&m_pszBuffer,L" ",L" ");//to remove extra spaces
  698. lTemp = lstrlen(m_pszBuffer);
  699. lTemp += 4; // for the safer size for allocation of memory.
  700. // allocates memory only if new WQL is greate than previous one.
  701. if(lTemp > m_lWQLColWidth)
  702. {
  703. // first free it (if previously allocated)
  704. RELEASE_MEMORY_EX(m_pszEventQuery);
  705. m_pszEventQuery = new TCHAR[lTemp+1];
  706. CheckAndSetMemoryAllocation(m_pszEventQuery,lTemp);
  707. }
  708. lTemp = m_lWQLColWidth;
  709. CalcColWidth(lTemp,&m_lWQLColWidth,m_pszBuffer);
  710. // Now manipulate the WQL string to get EventQuery....
  711. FindAndReplace(&m_pszBuffer,SHOW_WQL_QUERY,
  712. GetResString(IDS_EVENTS_WITH));
  713. FindAndReplace(&m_pszBuffer,L" ",L" ");//to remove extra spaces
  714. FindAndReplace(&m_pszBuffer,L" ",L" ");//to remove extra spaces
  715. lstrcpy(m_pszEventQuery,m_pszBuffer);
  716. // Retrieves the "TaskScheduler" information
  717. bstrTemp = SysAllocString(L"ScheduledTaskName");
  718. hr = m_pTriggerEventConsumer->Get(bstrTemp, 0, &vVariant, 0, 0);
  719. ON_ERROR_THROW_EXCEPTION(hr);
  720. SAFE_RELEASE_BSTR(bstrTemp);
  721. GetRunAsUserName((LPCWSTR)_bstr_t(vVariant.bstrVal));
  722. hr = VariantClear(&vVariant);
  723. ON_ERROR_THROW_EXCEPTION(hr);
  724. //////////////////////////////////////////
  725. // Now Shows the results on screen
  726. // Appends for in m_arrColData array
  727. dwRowCount = DynArrayAppendRow( m_arrColData, NO_OF_COLUMNS );
  728. // Fills Results in m_arrColData data structure
  729. DynArraySetString2(m_arrColData,dwRowCount,HOST_NAME,szHostName,0);
  730. DynArraySetDWORD2(m_arrColData ,dwRowCount,TRIGGER_ID,dwEventId);
  731. DynArraySetString2(m_arrColData,dwRowCount,TRIGGER_NAME,szEventTriggerName,0);
  732. DynArraySetString2(m_arrColData,dwRowCount,TASK,m_pszTask,0);
  733. DynArraySetString2(m_arrColData,dwRowCount,EVENT_QUERY,m_pszEventQuery,0);
  734. DynArraySetString2(m_arrColData,dwRowCount,EVENT_DESCRIPTION,m_pszEventDesc,0);
  735. DynArraySetString2(m_arrColData,dwRowCount,TASK_USERNAME,m_pszTaskUserName,0);
  736. bAtLeastOneEvent = TRUE;
  737. // Calculatate new column width for each column
  738. lTemp = m_lHostNameColWidth;
  739. CalcColWidth(lTemp,&m_lHostNameColWidth,szHostName);
  740. lTemp = m_lETNameColWidth;
  741. CalcColWidth(lTemp,&m_lETNameColWidth,szEventTriggerName);
  742. lTemp = m_lTaskColWidth;
  743. CalcColWidth(lTemp,&m_lTaskColWidth,m_pszTask);
  744. lTemp = m_lQueryColWidth;
  745. CalcColWidth(lTemp,&m_lQueryColWidth,m_pszEventQuery);
  746. lTemp = m_lDescriptionColWidth;
  747. CalcColWidth(lTemp,&m_lDescriptionColWidth,m_pszEventDesc);
  748. // Resets current containts..if any
  749. lstrcpy((szHostName),NULL_STRING);
  750. dwEventId = 0;
  751. lstrcpy((szEventTriggerName),NULL_STRING);
  752. lstrcpy((m_pszTask),NULL_STRING);
  753. lstrcpy((m_pszEventQuery),NULL_STRING);
  754. lstrcpy((m_pszEventDesc),NULL_STRING);
  755. SAFE_RELEASE_INTERFACE(m_pObj);
  756. SAFE_RELEASE_INTERFACE(m_pTriggerEventConsumer);
  757. SAFE_RELEASE_INTERFACE(m_pEventFilter);
  758. } // End of while
  759. if(StringCompare(m_pszFormat,GetResString(IDS_STRING_TABLE),TRUE,5)==0)
  760. {
  761. dwFormatType = SR_FORMAT_TABLE;
  762. }
  763. else if (StringCompare(m_pszFormat,GetResString(IDS_STRING_LIST),
  764. TRUE,4)==0)
  765. {
  766. dwFormatType = SR_FORMAT_LIST;
  767. }
  768. else if (StringCompare(m_pszFormat,GetResString(IDS_STRING_CSV),
  769. TRUE,3)==0)
  770. {
  771. dwFormatType = SR_FORMAT_CSV;
  772. }
  773. else // Default
  774. {
  775. dwFormatType = SR_FORMAT_TABLE;
  776. }
  777. if(m_bNoHeader == TRUE)
  778. {
  779. dwFormatType |=SR_NOHEADER;
  780. }
  781. PrintProgressMsg(m_hStdHandle,NULL_STRING,m_ScreenBufferInfo);
  782. if(bAtLeastOneEvent==TRUE)
  783. {
  784. // Show Final Query Results on screen
  785. PrepareColumns ();
  786. ShowMessage(stdout,BLANK_LINE);
  787. ShowResults(NO_OF_COLUMNS,mainCols,dwFormatType,m_arrColData);
  788. }
  789. else
  790. {
  791. // Show Message
  792. ShowMessage(stdout,GetResString(IDS_NO_EVENT_FOUNT));
  793. }
  794. }
  795. catch(_com_error &e)
  796. {
  797. TCHAR szErrorMsg[MAX_RES_STRING+1];
  798. PrintProgressMsg(m_hStdHandle,NULL_STRING,m_ScreenBufferInfo);
  799. if(hr == 0x80041002)// WMI returns string for this hr value is
  800. // "Not Found." which is not user friendly. So
  801. // changing the message text.
  802. {
  803. ShowMessage( stderr,GetResString(IDS_CLASS_NOT_REG));
  804. }
  805. else
  806. {
  807. DISPLAY_MESSAGE2( stderr, szErrorMsg, L"%s %s" , TAG_ERROR,
  808. GetReason() );
  809. }
  810. return FALSE;
  811. }
  812. return TRUE;
  813. }
  814. // ***************************************************************************
  815. // Routine Description:
  816. // This function will prepare/fill structure which will be used to show
  817. // output data.
  818. //
  819. // Arguments:
  820. // None
  821. // Return Value:
  822. // None
  823. //
  824. //***************************************************************************
  825. void
  826. CETQuery::PrepareColumns()
  827. {
  828. // local variable
  829. // If non verbose output, some column should be hide.
  830. DWORD dwMask = m_bVerbose?0:SR_HIDECOLUMN;
  831. // For non verbose mode output, column width is predefined else
  832. // use dynamically calculated column width.
  833. m_lETNameColWidth = m_bVerbose?m_lETNameColWidth:V_WIDTH_TRIG_NAME;
  834. m_lTaskColWidth = m_bVerbose?m_lTaskColWidth:V_WIDTH_TASK;
  835. m_lTriggerIDColWidth = m_bVerbose?m_lTriggerIDColWidth:V_WIDTH_TRIG_ID;
  836. lstrcpy(mainCols[HOST_NAME].szColumn,COL_HOSTNAME);
  837. mainCols[HOST_NAME].dwWidth = m_lHostNameColWidth;
  838. if(m_bVerbose==TRUE)
  839. mainCols[HOST_NAME].dwFlags = SR_TYPE_STRING;
  840. else
  841. mainCols[HOST_NAME].dwFlags = SR_HIDECOLUMN|SR_TYPE_STRING;
  842. lstrcpy(mainCols[HOST_NAME].szFormat,L"%s");
  843. mainCols[HOST_NAME].pFunction = NULL;
  844. mainCols[HOST_NAME].pFunctionData = NULL;
  845. lstrcpy(mainCols[TRIGGER_ID].szColumn,COL_TRIGGER_ID);
  846. mainCols[TRIGGER_ID].dwWidth = m_lTriggerIDColWidth;
  847. mainCols[TRIGGER_ID].dwFlags = SR_TYPE_NUMERIC;
  848. lstrcpy(mainCols[TRIGGER_ID].szFormat,L"%d");
  849. mainCols[TRIGGER_ID].pFunction = NULL;
  850. mainCols[TRIGGER_ID].pFunctionData = NULL;
  851. lstrcpy(mainCols[TRIGGER_NAME].szColumn,COL_TRIGGER_NAME);
  852. mainCols[TRIGGER_NAME].dwWidth = m_lETNameColWidth;
  853. mainCols[TRIGGER_NAME].dwFlags = SR_TYPE_STRING;
  854. lstrcpy(mainCols[TRIGGER_NAME].szFormat,L"%s");
  855. mainCols[TRIGGER_NAME].pFunction = NULL;
  856. mainCols[TRIGGER_NAME].pFunctionData = NULL;
  857. lstrcpy(mainCols[TASK].szColumn,COL_TASK);
  858. mainCols[TASK].dwWidth = m_lTaskColWidth;
  859. mainCols[TASK].dwFlags = SR_TYPE_STRING;
  860. lstrcpy(mainCols[TASK].szFormat,L"%s");
  861. mainCols[TASK].pFunction = NULL;
  862. mainCols[TASK].pFunctionData = NULL;
  863. lstrcpy(mainCols[EVENT_QUERY].szColumn,COL_EVENT_QUERY);
  864. mainCols[EVENT_QUERY].dwWidth = m_lQueryColWidth;
  865. if(m_bVerbose==TRUE)
  866. mainCols[EVENT_QUERY].dwFlags = SR_TYPE_STRING;
  867. else
  868. mainCols[EVENT_QUERY].dwFlags = SR_HIDECOLUMN|SR_TYPE_STRING;
  869. lstrcpy(mainCols[EVENT_QUERY].szFormat,L"%s");
  870. mainCols[EVENT_QUERY].pFunction = NULL;
  871. mainCols[EVENT_QUERY].pFunctionData = NULL;
  872. lstrcpy(mainCols[EVENT_DESCRIPTION].szColumn,COL_DESCRIPTION);
  873. mainCols[EVENT_DESCRIPTION].dwWidth = m_lDescriptionColWidth;
  874. if(m_bVerbose == TRUE)
  875. mainCols[EVENT_DESCRIPTION].dwFlags = SR_TYPE_STRING;
  876. else
  877. mainCols[EVENT_DESCRIPTION].dwFlags = SR_HIDECOLUMN|SR_TYPE_STRING;
  878. // Task Username
  879. lstrcpy(mainCols[TASK_USERNAME].szFormat,L"%s");
  880. mainCols[TASK_USERNAME].pFunction = NULL;
  881. mainCols[TASK_USERNAME].pFunctionData = NULL;
  882. lstrcpy(mainCols[TASK_USERNAME].szColumn,COL_TASK_USERNAME);
  883. mainCols[TASK_USERNAME].dwWidth = m_lTaskUserName;
  884. if(m_bVerbose == TRUE)
  885. mainCols[TASK_USERNAME].dwFlags = SR_TYPE_STRING;
  886. else
  887. mainCols[TASK_USERNAME].dwFlags = SR_HIDECOLUMN|SR_TYPE_STRING;
  888. lstrcpy(mainCols[TASK_USERNAME].szFormat,L"%s");
  889. mainCols[TASK_USERNAME].pFunction = NULL;
  890. mainCols[TASK_USERNAME].pFunctionData = NULL;
  891. }
  892. /******************************************************************************
  893. Routine Description:
  894. This function Will Find a string (lpszFind) in source string (lpszSource)
  895. and replace it with replace string (lpszReplace) for all occurences.
  896. Arguments:
  897. [in/out] lpszSource : String on which Find-Replace operation to be
  898. performed
  899. [in] lpszFind : String to be find
  900. [in] lpszReplace : String to be replaced.
  901. Return Value:
  902. 0 - if Unsucessful
  903. else returns length of lpszSource.
  904. ******************************************************************************/
  905. LONG
  906. CETQuery::FindAndReplace(LPTSTR *lpszSource, LPCTSTR lpszFind,
  907. LPCTSTR lpszReplace)
  908. {
  909. LONG lSourceLen = lstrlen(lpszFind);
  910. LONG lReplacementLen = lstrlen(lpszReplace);
  911. LONG lMainLength = lstrlen(*lpszSource);
  912. LPTSTR pszMainSafe= new TCHAR[lstrlen(*lpszSource)+1];
  913. // loop once to figure out the size of the result string
  914. LONG nCount = 0;
  915. LPTSTR lpszStart = NULL;
  916. lpszStart = *lpszSource;
  917. LPTSTR lpszEnd = NULL;
  918. lpszEnd = lpszStart + lMainLength;
  919. LPTSTR lpszTarget=NULL;
  920. if ((lSourceLen == 0)||(pszMainSafe==NULL))
  921. {
  922. RELEASE_MEMORY_EX(pszMainSafe);
  923. return 0;
  924. }
  925. while (lpszStart < lpszEnd)
  926. {
  927. while ((lpszTarget = _tcsstr(lpszStart, lpszFind)) != NULL)
  928. {
  929. nCount++;
  930. lpszStart = lpszTarget + lSourceLen;
  931. }
  932. lpszStart += lstrlen(lpszStart) + 1;
  933. }
  934. // if any changes were made, make them
  935. if (nCount > 0)
  936. {
  937. lstrcpy(pszMainSafe,*lpszSource);
  938. LONG lOldLength = lMainLength;
  939. // if the buffer is too small, just
  940. // allocate a new buffer (slow but sure)
  941. int nNewLength = lMainLength + (lReplacementLen-lSourceLen)*nCount;
  942. if(lMainLength < nNewLength)
  943. {
  944. if(*lpszSource!=NULL)
  945. {
  946. delete *lpszSource;
  947. }
  948. *lpszSource = new TCHAR[ (nNewLength*sizeof(TCHAR))+sizeof(TCHAR)];
  949. if( *lpszSource == NULL )
  950. {
  951. RELEASE_MEMORY_EX(pszMainSafe);
  952. return 0;
  953. }
  954. memcpy((LPTSTR)*lpszSource,pszMainSafe, lMainLength*sizeof(TCHAR));
  955. }
  956. // else, we just do it in-place
  957. lpszStart= *lpszSource;
  958. lpszEnd = lpszStart +lstrlen(*lpszSource);
  959. // loop again to actually do the work
  960. while (lpszStart < lpszEnd)
  961. {
  962. while ( (lpszTarget = _tcsstr(lpszStart, lpszFind)) != NULL)
  963. {
  964. #ifdef _WIN64
  965. __int64 lBalance ;
  966. #else
  967. LONG lBalance;
  968. #endif
  969. lBalance = lOldLength - (lpszTarget - lpszStart + lSourceLen);
  970. memmove(lpszTarget + lReplacementLen, lpszTarget + lSourceLen,
  971. (size_t) lBalance * sizeof(TCHAR));
  972. memcpy(lpszTarget, lpszReplace, lReplacementLen*sizeof(TCHAR));
  973. lpszStart = lpszTarget + lReplacementLen;
  974. lpszStart[lBalance] = NULL_CHAR;
  975. lOldLength += (lReplacementLen - lSourceLen);
  976. }
  977. lpszStart += lstrlen(lpszStart) + 1;
  978. }
  979. }
  980. RELEASE_MEMORY_EX(pszMainSafe);
  981. return lstrlen(*lpszSource);
  982. }
  983. /******************************************************************************
  984. Routine Description:
  985. Calculates the width required for column
  986. Arguments:
  987. [in] lOldLength : Previous length
  988. [out] plNewLength : New Length
  989. [in] pszString : String .
  990. Return Value:
  991. none
  992. ******************************************************************************/
  993. void
  994. CETQuery::CalcColWidth(LONG lOldLength,LONG *plNewLength,LPTSTR pszString)
  995. {
  996. LONG lStrLength = lstrlen(pszString)+2;
  997. //Any way column width should not be greater than MAX_COL_LENGTH
  998. // Stores the maximum of WQL length.
  999. if(lStrLength > lOldLength)
  1000. *plNewLength = lStrLength;
  1001. else
  1002. *plNewLength = lOldLength;
  1003. }
  1004. /******************************************************************************
  1005. Routine Description:
  1006. Get User Name from Task Scheduler
  1007. Arguments:
  1008. [in] pszTaskName : Task Name
  1009. Return Value:
  1010. HRESULT
  1011. ******************************************************************************/
  1012. HRESULT
  1013. CETQuery::GetRunAsUserName(LPCWSTR pszScheduleTaskName)
  1014. {
  1015. // if pszSheduleTaskName is null or 0 length just return N/A.
  1016. HRESULT hr = S_OK;
  1017. BSTR bstrTemp = NULL;
  1018. VARIANT vVariant;
  1019. if(lstrlen(pszScheduleTaskName)==0)
  1020. {
  1021. lstrcpy(m_pszTaskUserName,DEFAULT_USER);
  1022. return S_OK;
  1023. }
  1024. lstrcpy(m_pszTaskUserName,GetResString(IDS_ID_NA));
  1025. // Put input parameter for QueryETrigger method
  1026. hr = PropertyPut(m_pInInst,FPR_TASK_SCHEDULER,_bstr_t(pszScheduleTaskName));
  1027. ON_ERROR_THROW_EXCEPTION(hr);
  1028. // All The required properties sets, so
  1029. // executes DeleteETrigger method to delete eventtrigger
  1030. hr = m_pWbemServices->ExecMethod(_bstr_t(CLS_TRIGGER_EVENT_CONSUMER),
  1031. _bstr_t(FN_QUERY_ETRIGGER),
  1032. 0, NULL, m_pInInst,&m_pOutInst,NULL);
  1033. ON_ERROR_THROW_EXCEPTION(hr);
  1034. bstrTemp = SysAllocString(FPR_RUN_AS_USER);
  1035. VariantInit(&vVariant);
  1036. hr = m_pOutInst->Get(bstrTemp, 0, &vVariant, 0, 0);
  1037. SAFE_RELEASE_BSTR(bstrTemp);
  1038. ON_ERROR_THROW_EXCEPTION(hr);
  1039. wsprintf(m_pszTaskUserName,_T("%s"),vVariant.bstrVal);
  1040. hr = VariantClear(&vVariant);
  1041. ON_ERROR_THROW_EXCEPTION(hr);
  1042. if(lstrlen(m_pszTaskUserName)==0)
  1043. {
  1044. lstrcpy(m_pszTaskUserName,GetResString(IDS_ID_NA));
  1045. }
  1046. return S_OK;
  1047. }