Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

549 lines
17 KiB

  1. /*++
  2. Copyright (c) Microsoft Corporation
  3. Module Name:
  4. TRIGGERPROVIDER.H
  5. Abstract:
  6. Contains CTriggerProvider definition.
  7. Author:
  8. Vasundhara .G
  9. Revision History:
  10. Vasundhara .G 9-oct-2k : Created It.
  11. --*/
  12. #ifndef __TRIGGER_PROVIDER_H
  13. #define __TRIGGER_PROVIDER_H
  14. // typedefs
  15. typedef TCHAR STRINGVALUE[ MAX_STRING_LENGTH + 1 ];
  16. #define ERROR_TRIGNAME_ALREADY_EXIST_EX MAKE_HRESULT( SEVERITY_ERROR, FACILITY_ITF, 1 )
  17. #define ERROR_TRIGGER_NOT_DELETED_EX MAKE_HRESULT( SEVERITY_ERROR, FACILITY_ITF, 2 )
  18. #define ERROR_TRIGGER_NOT_FOUND_EX MAKE_HRESULT( SEVERITY_ERROR, FACILITY_ITF, 3 )
  19. #define ERROR_INVALID_USER_EX MAKE_HRESULT( SEVERITY_ERROR, FACILITY_ITF, 4 )
  20. #define WARNING_INVALID_USER_EX MAKE_HRESULT( SEVERITY_ERROR, FACILITY_ITF, 5 )
  21. #define ERROR_TRIGGER_ID_EXCEED_EX MAKE_HRESULT( SEVERITY_ERROR, FACILITY_ITF, 6 )
  22. #define ERROR_TRIGGER_CORRUPTED_EX MAKE_HRESULT( SEVERITY_ERROR, FACILITY_ITF, 7 )
  23. #define ERROR_TRIGNAME_ALREADY_EXIST 1
  24. #define ERROR_TRIGGER_NOT_DELETED 2
  25. #define ERROR_TRIGGER_NOT_FOUND 3
  26. #define WARNING_INVALID_USER 2
  27. #define MAX_TRIGGERNAME_LENGTH 196
  28. #define MAX_TRIGGEID_VALUE 4294967295
  29. #define ERROR_SCHDEULE_TASK_INVALID_USER 0x80041310
  30. #define ERROR_TASK_SCHDEULE_SERVICE_STOP 0x80041315
  31. #define EXE_STRING _T( ".exe" )
  32. #define CREATE_METHOD_NAME _T( "CreateETrigger" )
  33. #define DELETE_METHOD_NAME _T( "DeleteETrigger" )
  34. #define QUERY_METHOD_NAME _T( "QueryETrigger" )
  35. #define CREATE_METHOD_NAME_EX _T( "CreateETriggerEx" )
  36. #define DELETE_METHOD_NAME_EX _T( "DeleteETriggerEx" )
  37. #define QUERY_METHOD_NAME_EX _T( "QueryETriggerEx" )
  38. #define IN_TRIGGER_ID L"TriggerID"
  39. #define IN_TRIGGER_NAME L"TriggerName"
  40. #define IN_TRIGGER_DESC L"TriggerDesc"
  41. #define IN_TRIGGER_ACTION L"TriggerAction"
  42. #define IN_TRIGGER_QUERY L"TriggerQuery"
  43. #define IN_TRIGGER_USER L"RunAsUser"
  44. #define IN_TRIGGER_PWD L"RunAsPwd"
  45. #define IN_TRIGGER_TSCHDULER L"ScheduledTaskName"
  46. #define RETURN_VALUE L"ReturnValue"
  47. #define OUT_RUNAS_USER L"RunAsUser"
  48. #define UNIQUE_TASK_NAME _T( "%s%d%d" )
  49. #define NAMESPACE L"root\\cimv2"
  50. #define CONSUMER_CLASS L"CmdTriggerConsumer"
  51. #define TRIGGER_ID L"TriggerID"
  52. #define TRIGGER_NAME L"TriggerName"
  53. #define TRIGGER_DESC L"TriggerDesc"
  54. #define TRIGGER_ACTION L"Action"
  55. #define TASK_SHEDULER L"ScheduledTaskName"
  56. #define FILTER_CLASS L"__EventFilter"
  57. #define FILTER_NAME L"Name"
  58. #define FILTER_QUERY_LANGUAGE L"QueryLanguage"
  59. #define QUERY_LANGUAGE L"WQL"
  60. #define FILTER_QUERY L"Query"
  61. #define BINDINGCLASS L"__FilterToConsumerBinding"
  62. #define CONSUMER_BIND L"Consumer"
  63. #define FILTER_BIND L"Filter"
  64. #define REL_PATH L"__RELPATH"
  65. #define BIND_CONSUMER_PATH _T( "CmdTriggerConsumer.TriggerID=%d" )
  66. #define TRIGGER_INSTANCE_NAME _T( "SELECT * FROM CmdTriggerConsumer WHERE TriggerName = \"%s\"" )
  67. #define BIND_FILTER_PATH _T( "__EventFilter.Name=\"" )
  68. #define BACK_SLASH L"\""
  69. #define DOUBLE_SLASH L"\\\"\""
  70. #define EQUAL _T( '=' )
  71. #define DOUBLE_QUOTE _T( '"' )
  72. #define END_OF_STRING _T( '\0' )
  73. #define FILTER_PROP _T( "__FilterToConsumerBinding.Consumer=\"%s\",Filter=\"__EventFilter.Name=\\\"" )
  74. #define FILTER_UNIQUE_NAME _T( "CmdTriggerConsumer.%d%d:%d:%d%d/%d/%d" )
  75. #define CONSUMER_QUERY _T("SELECT * FROM CmdTriggerConsumer WHERE TriggerName = \"%s\"")
  76. #define VALID_QUERY _T("__instancecreationevent where targetinstance isa \"win32_ntlogevent\"")
  77. #define EVENT_LOG _T("win32_ntlogevent")
  78. #define INSTANCE_EXISTS_QUERY L"select * from CmdTriggerConsumer"
  79. // provider class
  80. class CTriggerProvider : public IDispatch,
  81. public IWbemEventConsumerProvider,
  82. public IWbemServices, public IWbemProviderInit
  83. {
  84. private:
  85. DWORD m_dwCount; // holds the object reference count
  86. BOOL m_MaxTriggers;
  87. // WMI related stuff
  88. LPWSTR m_pwszLocale;
  89. IWbemContext* m_pContext;
  90. IWbemServices* m_pServices;
  91. // construction / destruction
  92. public:
  93. CTriggerProvider();
  94. ~CTriggerProvider();
  95. // methods
  96. private:
  97. HRESULT
  98. CreateTrigger(
  99. IN VARIANT varTName,
  100. IN VARIANT varTDesc,
  101. IN VARIANT varTAction,
  102. IN VARIANT varTQuery,
  103. IN VARIANT varRUser,
  104. IN VARIANT varRPwd,
  105. OUT HRESULT *phRes = NULL
  106. );
  107. HRESULT
  108. DeleteTrigger(
  109. IN VARIANT varTName,
  110. OUT DWORD *dwTrigId
  111. );
  112. HRESULT
  113. QueryTrigger(
  114. IN VARIANT varScheduledTaskName,
  115. OUT CHString &szRunAsUser
  116. );
  117. HRESULT
  118. ValidateParams(
  119. IN VARIANT varTrigName,
  120. IN VARIANT varTrigAction,
  121. IN VARIANT varTrigQuery,
  122. IN VARIANT varRUser
  123. );
  124. HRESULT
  125. SetUserContext(
  126. IN VARIANT varRUser,
  127. IN VARIANT varRPwd,
  128. IN VARIANT varTAction,
  129. IN CHString &szscheduler
  130. );
  131. HRESULT
  132. DeleteTaskScheduler(
  133. IN CHString strTScheduler
  134. );
  135. HRESULT
  136. CTriggerProvider::GetTaskScheduler(
  137. OUT ITaskScheduler **ppITaskScheduler
  138. );
  139. VOID
  140. GetUniqueTScheduler(
  141. OUT CHString& szScheduler,
  142. IN DWORD dwTrigID,
  143. IN VARIANT varTrigName
  144. );
  145. // [ implementation of ] interfaces members
  146. public:
  147. // IUnknown members
  148. STDMETHODIMP_(ULONG)
  149. AddRef(
  150. VOID
  151. );
  152. STDMETHODIMP_(ULONG)
  153. Release(
  154. VOID
  155. );
  156. STDMETHODIMP
  157. QueryInterface(
  158. IN REFIID riid,
  159. OUT LPVOID* ppv
  160. );
  161. // IDispatch interface
  162. STDMETHOD
  163. ( GetTypeInfoCount )(
  164. OUT THIS_ UINT FAR* pctinfo
  165. )
  166. {
  167. // not implemented at this class level ... handled by base class ( WMI base class )
  168. return WBEM_E_NOT_SUPPORTED;
  169. };
  170. STDMETHOD
  171. ( GetTypeInfo )(
  172. IN THIS_ UINT itinfo,
  173. IN LCID lcid,
  174. OUT ITypeInfo FAR* FAR* pptinfo
  175. )
  176. {
  177. // not implemented at this class level ... handled by base class ( WMI base class )
  178. return WBEM_E_NOT_SUPPORTED;
  179. };
  180. STDMETHOD
  181. ( GetIDsOfNames )(
  182. IN THIS_ REFIID riid,
  183. IN OLECHAR FAR* FAR* rgszNames,
  184. IN UINT cNames,
  185. IN LCID lcid,
  186. OUT DISPID FAR* rgdispid
  187. )
  188. {
  189. // not implemented at this class level ... handled by base class ( WMI base class )
  190. return WBEM_E_NOT_SUPPORTED;
  191. };
  192. STDMETHOD
  193. ( Invoke )(
  194. IN THIS_ DISPID dispidMember,
  195. IN REFIID riid,
  196. IN LCID lcid,
  197. IN WORD wFlags,
  198. IN DISPPARAMS FAR* pdispparams,
  199. OUT VARIANT FAR* pvarResult,
  200. OUT EXCEPINFO FAR* pexcepinfo,
  201. OUT UINT FAR* puArgErr
  202. )
  203. {
  204. // not implemented at this class level ... handled by base class ( WMI base class )
  205. return WBEM_E_NOT_SUPPORTED;
  206. };
  207. // ****
  208. // IWbemProviderInit members
  209. HRESULT
  210. STDMETHODCALLTYPE Initialize(
  211. IN LPWSTR pszUser,
  212. IN LONG lFlags,
  213. IN LPWSTR pszNamespace,
  214. IN LPWSTR pszLocale,
  215. IN IWbemServices *pNamespace,
  216. IN IWbemContext *pCtx,
  217. IN IWbemProviderInitSink *pInitSink
  218. );
  219. // IWbemServices members
  220. HRESULT
  221. STDMETHODCALLTYPE OpenNamespace(
  222. IN const BSTR Namespace,
  223. IN long lFlags,
  224. IN IWbemContext __RPC_FAR *pCtx,
  225. OUT IWbemServices __RPC_FAR *__RPC_FAR *ppWorkingNamespace,
  226. OUT IWbemCallResult __RPC_FAR *__RPC_FAR *ppResult
  227. )
  228. {
  229. // not implemented at this class level ... handled by base class ( WMI base class )
  230. return WBEM_E_NOT_SUPPORTED;
  231. };
  232. HRESULT
  233. STDMETHODCALLTYPE CancelAsyncCall(
  234. IN IWbemObjectSink __RPC_FAR *pSink
  235. )
  236. {
  237. // not implemented at this class level ... handled by base class ( WMI base class )
  238. return WBEM_E_NOT_SUPPORTED;
  239. };
  240. HRESULT
  241. STDMETHODCALLTYPE QueryObjectSink(
  242. IN long lFlags,
  243. OUT IWbemObjectSink __RPC_FAR *__RPC_FAR *ppResponseHandler
  244. )
  245. {
  246. // not implemented at this class level ... handled by base class ( WMI base class )
  247. return WBEM_E_NOT_SUPPORTED;
  248. };
  249. HRESULT
  250. STDMETHODCALLTYPE GetObject(
  251. IN const BSTR ObjectPath,
  252. IN long lFlags,
  253. IN IWbemContext __RPC_FAR *pCtx,
  254. OUT IWbemClassObject __RPC_FAR *__RPC_FAR *ppObject,
  255. OUT IWbemCallResult __RPC_FAR *__RPC_FAR *ppCallResult
  256. )
  257. {
  258. // not implemented at this class level ... handled by base class ( WMI base class )
  259. return WBEM_E_NOT_SUPPORTED;
  260. };
  261. HRESULT
  262. STDMETHODCALLTYPE GetObjectAsync(
  263. IN const BSTR ObjectPath,
  264. IN long lFlags,
  265. IN IWbemContext __RPC_FAR *pCtx,
  266. IN IWbemObjectSink __RPC_FAR *pResponseHandler
  267. )
  268. {
  269. // not implemented at this class level ... handled by base class ( WMI base class )
  270. return WBEM_E_NOT_SUPPORTED;
  271. }
  272. HRESULT
  273. STDMETHODCALLTYPE PutClass(
  274. IN IWbemClassObject __RPC_FAR *pObject,
  275. IN long lFlags,
  276. IN IWbemContext __RPC_FAR *pCtx,
  277. OUT IWbemCallResult __RPC_FAR *__RPC_FAR *ppCallResult
  278. )
  279. {
  280. // not implemented at this class level ... handled by base class ( WMI base class )
  281. return WBEM_E_NOT_SUPPORTED;
  282. };
  283. HRESULT
  284. STDMETHODCALLTYPE PutClassAsync(
  285. IN IWbemClassObject __RPC_FAR *pObject,
  286. IN long lFlags,
  287. IN IWbemContext __RPC_FAR *pCtx,
  288. IN IWbemObjectSink __RPC_FAR *pResponseHandler
  289. )
  290. {
  291. // not implemented at this class level ... handled by base class ( WMI base class )
  292. return WBEM_E_NOT_SUPPORTED;
  293. };
  294. HRESULT
  295. STDMETHODCALLTYPE DeleteClass(
  296. IN const BSTR Class,
  297. IN long lFlags,
  298. IN IWbemContext __RPC_FAR *pCtx,
  299. OUT IWbemCallResult __RPC_FAR *__RPC_FAR *ppCallResult
  300. )
  301. {
  302. // not implemented at this class level ... handled by base class ( WMI base class )
  303. return WBEM_E_NOT_SUPPORTED;
  304. };
  305. HRESULT
  306. STDMETHODCALLTYPE DeleteClassAsync(
  307. IN const BSTR Class,
  308. IN long lFlags,
  309. IN IWbemContext __RPC_FAR *pCtx,
  310. IN IWbemObjectSink __RPC_FAR *pResponseHandler
  311. )
  312. {
  313. // not implemented at this class level ... handled by base class ( WMI base class )
  314. return WBEM_E_NOT_SUPPORTED;
  315. };
  316. HRESULT
  317. STDMETHODCALLTYPE CreateClassEnum(
  318. IN const BSTR Superclass,
  319. IN long lFlags,
  320. IN IWbemContext __RPC_FAR *pCtx,
  321. OUT IEnumWbemClassObject __RPC_FAR *__RPC_FAR *ppEnum
  322. )
  323. {
  324. // not implemented at this class level ... handled by base class ( WMI base class )
  325. return WBEM_E_NOT_SUPPORTED;
  326. };
  327. HRESULT
  328. STDMETHODCALLTYPE CreateClassEnumAsync(
  329. IN const BSTR Superclass,
  330. IN long lFlags,
  331. IN IWbemContext __RPC_FAR *pCtx,
  332. IN IWbemObjectSink __RPC_FAR *pResponseHandler
  333. )
  334. {
  335. // not implemented at this class level ... handled by base class ( WMI base class )
  336. return WBEM_E_NOT_SUPPORTED;
  337. };
  338. HRESULT
  339. STDMETHODCALLTYPE PutInstance(
  340. IN IWbemClassObject __RPC_FAR *pInst,
  341. IN long lFlags,
  342. IN IWbemContext __RPC_FAR *pCtx,
  343. OUT IWbemCallResult __RPC_FAR *__RPC_FAR *ppCallResult
  344. )
  345. {
  346. // not implemented at this class level ... handled by base class ( WMI base class )
  347. return WBEM_E_NOT_SUPPORTED;
  348. };
  349. HRESULT
  350. STDMETHODCALLTYPE PutInstanceAsync(
  351. IN IWbemClassObject __RPC_FAR *pInst,
  352. IN long lFlags,
  353. IN IWbemContext __RPC_FAR *pCtx,
  354. IN IWbemObjectSink __RPC_FAR *pResponseHandler
  355. )
  356. {
  357. // not implemented at this class level ... handled by base class ( WMI base class )
  358. return WBEM_E_NOT_SUPPORTED;
  359. };
  360. HRESULT
  361. STDMETHODCALLTYPE DeleteInstance(
  362. IN const BSTR ObjectPath,
  363. IN long lFlags,
  364. IN IWbemContext __RPC_FAR *pCtx,
  365. OUT IWbemCallResult __RPC_FAR *__RPC_FAR *ppCallResult
  366. )
  367. {
  368. // not implemented at this class level ... handled by base class ( WMI base class )
  369. return WBEM_E_NOT_SUPPORTED;
  370. };
  371. HRESULT
  372. STDMETHODCALLTYPE DeleteInstanceAsync(
  373. IN const BSTR ObjectPath,
  374. IN long lFlags,
  375. IN IWbemContext __RPC_FAR *pCtx,
  376. IN IWbemObjectSink __RPC_FAR *pResponseHandler
  377. )
  378. {
  379. // not implemented at this class level ... handled by base class ( WMI base class )
  380. return WBEM_E_NOT_SUPPORTED;
  381. };
  382. HRESULT
  383. STDMETHODCALLTYPE CreateInstanceEnum(
  384. IN const BSTR Class,
  385. IN long lFlags,
  386. IN IWbemContext __RPC_FAR *pCtx,
  387. OUT IEnumWbemClassObject __RPC_FAR *__RPC_FAR *ppEnum
  388. )
  389. {
  390. // not implemented at this class level ... handled by base class ( WMI base class )
  391. return WBEM_E_NOT_SUPPORTED;
  392. };
  393. HRESULT
  394. STDMETHODCALLTYPE CreateInstanceEnumAsync(
  395. IN const BSTR Class,
  396. IN long lFlags,
  397. IN IWbemContext __RPC_FAR *pCtx,
  398. IN IWbemObjectSink __RPC_FAR *pResponseHandler
  399. )
  400. {
  401. // not implemented at this class level ... handled by base class ( WMI base class )
  402. return WBEM_E_NOT_SUPPORTED;
  403. }
  404. HRESULT
  405. STDMETHODCALLTYPE ExecQuery(
  406. IN const BSTR QueryLanguage,
  407. IN const BSTR Query,
  408. IN long lFlags,
  409. IN IWbemContext __RPC_FAR *pCtx,
  410. OUT IEnumWbemClassObject __RPC_FAR *__RPC_FAR *ppEnum
  411. )
  412. {
  413. // not implemented at this class level ... handled by base class ( WMI base class )
  414. return WBEM_E_NOT_SUPPORTED;
  415. };
  416. HRESULT
  417. STDMETHODCALLTYPE ExecQueryAsync(
  418. IN const BSTR QueryLanguage,
  419. IN const BSTR Query,
  420. IN long lFlags,
  421. IN IWbemContext __RPC_FAR *pCtx,
  422. IN IWbemObjectSink __RPC_FAR *pResponseHandler
  423. )
  424. {
  425. // not implemented at this class level ... handled by base class ( WMI base class )
  426. return WBEM_E_NOT_SUPPORTED;
  427. };
  428. HRESULT
  429. STDMETHODCALLTYPE ExecNotificationQuery(
  430. IN const BSTR QueryLanguage,
  431. IN const BSTR Query,
  432. IN long lFlags,
  433. IN IWbemContext __RPC_FAR *pCtx,
  434. OUT IEnumWbemClassObject __RPC_FAR *__RPC_FAR *ppEnum
  435. )
  436. {
  437. // not implemented at this class level ... handled by base class ( WMI base class )
  438. return WBEM_E_NOT_SUPPORTED;
  439. };
  440. HRESULT
  441. STDMETHODCALLTYPE ExecNotificationQueryAsync(
  442. IN const BSTR QueryLanguage,
  443. IN const BSTR Query,
  444. IN long lFlags,
  445. IN IWbemContext __RPC_FAR *pCtx,
  446. IN IWbemObjectSink __RPC_FAR *pResponseHandler
  447. )
  448. {
  449. // not implemented at this class level ... handled by base class ( WMI base class )
  450. return WBEM_E_NOT_SUPPORTED;
  451. };
  452. HRESULT
  453. STDMETHODCALLTYPE ExecMethod(
  454. IN const BSTR strObjectPath,
  455. IN const BSTR strMethodName,
  456. IN long lFlags,
  457. IN IWbemContext* pCtx,
  458. IN IWbemClassObject* pInParams,
  459. OUT IWbemClassObject** ppOutParams,
  460. OUT IWbemCallResult** ppCallResult
  461. )
  462. {
  463. // not implemented at this class level ... handled by base class ( WMI base class )
  464. return WBEM_E_NOT_SUPPORTED;
  465. }
  466. // *** one of method implemented by this provider under IWbemServices interface ***
  467. HRESULT
  468. STDMETHODCALLTYPE ExecMethodAsync(
  469. IN const BSTR strObjectPath,
  470. IN const BSTR strMethodName,
  471. IN long lFlags,
  472. IN IWbemContext* pCtx,
  473. IN IWbemClassObject* pInParams,
  474. IN IWbemObjectSink* pResponseHandler
  475. );
  476. // ****
  477. // IWbemEventConsumerProvider members
  478. // ( this routine allows you to map the one physical consumer to potentially
  479. // multiple logical consumers. )
  480. STDMETHOD
  481. ( FindConsumer )(
  482. IN IWbemClassObject* pLogicalConsumer,
  483. OUT IWbemUnboundObjectSink** ppConsumer
  484. );
  485. };
  486. #endif // __TRIGGER_PROVIDER_H