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.

589 lines
17 KiB

  1. //+-------------------------------------------------------------------------
  2. //
  3. // Microsoft Windows
  4. // Copyright (C) Microsoft Corporation, 1997.
  5. //
  6. // File: events.cxx
  7. //
  8. // Contents:
  9. //
  10. // History: ?-??-?? ??? Created
  11. // 6-17-99 a-sergiv Added event filtering
  12. //
  13. //--------------------------------------------------------------------------
  14. #include "act.hxx"
  15. BOOL
  16. GetTextualSid(
  17. PSID pSid, // binary Sid
  18. LPTSTR TextualSid, // buffer for Textual representaion of Sid
  19. LPDWORD cchSidSize // required/provided TextualSid buffersize
  20. )
  21. {
  22. PSID_IDENTIFIER_AUTHORITY psia;
  23. DWORD dwSubAuthorities;
  24. DWORD dwCounter;
  25. DWORD cchSidCopy;
  26. //
  27. // test if Sid passed in is valid
  28. //
  29. if(!IsValidSid(pSid)) return FALSE;
  30. // obtain SidIdentifierAuthority
  31. psia = GetSidIdentifierAuthority(pSid);
  32. // obtain sidsubauthority count
  33. dwSubAuthorities = *GetSidSubAuthorityCount(pSid);
  34. //
  35. // compute approximate buffer length
  36. // S-SID_REVISION- + identifierauthority- + subauthorities- + NULL
  37. //
  38. cchSidCopy = (15 + 12 + (12 * dwSubAuthorities) + 1) * sizeof(TCHAR);
  39. //
  40. // check provided buffer length.
  41. // If not large enough, indicate proper size and setlasterror
  42. //
  43. if(*cchSidSize < cchSidCopy) {
  44. *cchSidSize = cchSidCopy;
  45. SetLastError(ERROR_INSUFFICIENT_BUFFER);
  46. return FALSE;
  47. }
  48. //
  49. // prepare S-SID_REVISION-
  50. //
  51. cchSidCopy = wsprintf(TextualSid, TEXT("S-%lu-"), SID_REVISION );
  52. //
  53. // prepare SidIdentifierAuthority
  54. //
  55. if ( (psia->Value[0] != 0) || (psia->Value[1] != 0) ) {
  56. cchSidCopy += wsprintf(TextualSid + cchSidCopy,
  57. TEXT("0x%02hx%02hx%02hx%02hx%02hx%02hx"),
  58. (USHORT)psia->Value[0],
  59. (USHORT)psia->Value[1],
  60. (USHORT)psia->Value[2],
  61. (USHORT)psia->Value[3],
  62. (USHORT)psia->Value[4],
  63. (USHORT)psia->Value[5]);
  64. } else {
  65. cchSidCopy += wsprintf(TextualSid + cchSidCopy,
  66. TEXT("%lu"),
  67. (ULONG)(psia->Value[5] ) +
  68. (ULONG)(psia->Value[4] << 8) +
  69. (ULONG)(psia->Value[3] << 16) +
  70. (ULONG)(psia->Value[2] << 24) );
  71. }
  72. //
  73. // loop through SidSubAuthorities
  74. //
  75. for(dwCounter = 0 ; dwCounter < dwSubAuthorities ; dwCounter++) {
  76. cchSidCopy += wsprintf(TextualSid + cchSidCopy, TEXT("-%lu"),
  77. *GetSidSubAuthority(pSid, dwCounter) );
  78. }
  79. //
  80. // tell the caller how many chars we provided, not including NULL
  81. //
  82. *cchSidSize = cchSidCopy;
  83. return TRUE;
  84. }
  85. void
  86. LogRegisterTimeout(
  87. GUID * pClsid,
  88. DWORD clsctx,
  89. CToken * pClientToken
  90. )
  91. {
  92. // Apply event filters
  93. DWORD dwActLogLvl = GetActivationFailureLoggingLevel();
  94. if(dwActLogLvl == 2)
  95. return;
  96. if(dwActLogLvl != 1 && clsctx & CLSCTX_NO_FAILURE_LOG)
  97. return;
  98. // %1 is the clsid
  99. HANDLE LogHandle;
  100. LPWSTR Strings[1]; // array of message strings.
  101. WCHAR wszClsid[GUIDSTR_MAX];
  102. // Get the clsid
  103. wStringFromGUID2( *pClsid, wszClsid, sizeof(wszClsid) );
  104. Strings[0] = wszClsid;
  105. // Get the log handle, then report then event.
  106. LogHandle = RegisterEventSource( NULL,
  107. SCM_EVENT_SOURCE );
  108. if ( LogHandle )
  109. {
  110. ReportEvent( LogHandle,
  111. EVENTLOG_ERROR_TYPE,
  112. 0, // event category
  113. EVENT_RPCSS_SERVER_START_TIMEOUT,
  114. pClientToken ? pClientToken->GetSid() : NULL, // SID
  115. 1, // 1 strings passed
  116. 0, // 0 bytes of binary
  117. (LPCTSTR *)Strings, // array of strings
  118. NULL ); // no raw data
  119. // clean up the event log handle
  120. DeregisterEventSource(LogHandle);
  121. }
  122. }
  123. void
  124. LogServerStartError(
  125. GUID * pClsid,
  126. DWORD clsctx,
  127. CToken * pClientToken,
  128. WCHAR * pwszCommandLine
  129. )
  130. {
  131. // Apply event filters
  132. DWORD dwActLogLvl = GetActivationFailureLoggingLevel();
  133. if(dwActLogLvl == 2)
  134. return;
  135. if(dwActLogLvl != 1 && clsctx & CLSCTX_NO_FAILURE_LOG)
  136. return;
  137. HANDLE LogHandle;
  138. LPWSTR Strings[3]; // array of message strings.
  139. WCHAR wszErrnum[20];
  140. WCHAR wszClsid[GUIDSTR_MAX];
  141. // Save the command line
  142. Strings[0] = pwszCommandLine;
  143. // Save the error number
  144. wsprintf(wszErrnum, L"%lu",GetLastError() );
  145. Strings[1] = wszErrnum;
  146. // Get the clsid
  147. wStringFromGUID2( *pClsid, wszClsid, sizeof(wszClsid) );
  148. Strings[2] = wszClsid;
  149. // Get the log handle, then report then event.
  150. LogHandle = RegisterEventSource( NULL,
  151. SCM_EVENT_SOURCE );
  152. if ( LogHandle )
  153. {
  154. ReportEvent( LogHandle,
  155. EVENTLOG_ERROR_TYPE,
  156. 0, // event category
  157. EVENT_RPCSS_CREATEPROCESS_FAILURE,
  158. pClientToken->GetSid(), // SID
  159. 3, // 3 strings passed
  160. 0, // 0 bytes of binary
  161. (LPCTSTR *)Strings, // array of strings
  162. NULL ); // no raw data
  163. // clean up the event log handle
  164. DeregisterEventSource(LogHandle);
  165. }
  166. }
  167. void
  168. LogRunAsServerStartError(
  169. GUID * pClsid,
  170. DWORD clsctx,
  171. CToken * pClientToken,
  172. WCHAR * pwszCommandLine,
  173. WCHAR * pwszRunAsUser,
  174. WCHAR * pwszRunAsDomain
  175. )
  176. {
  177. // Apply event filters
  178. DWORD dwActLogLvl = GetActivationFailureLoggingLevel();
  179. if(dwActLogLvl == 2)
  180. return;
  181. if(dwActLogLvl != 1 && clsctx & CLSCTX_NO_FAILURE_LOG)
  182. return;
  183. HANDLE LogHandle;
  184. LPWSTR Strings[5];
  185. WCHAR wszErrnum[20];
  186. WCHAR wszClsid[GUIDSTR_MAX];
  187. // for this message,
  188. // %1 is the command line, and %2 is the error number string
  189. // %3 is the CLSID, %4 is the RunAs domain name, %5 is the RunAs Userid
  190. // Save the command line
  191. Strings[0] = pwszCommandLine;
  192. // Save the error number
  193. wsprintf(wszErrnum, L"%lu",GetLastError() );
  194. Strings[1] = wszErrnum;
  195. // Get the clsid
  196. wStringFromGUID2(*pClsid, wszClsid, sizeof(wszClsid));
  197. Strings[2] = wszClsid;
  198. // Put in the RunAs identity
  199. Strings[3] = pwszRunAsDomain;
  200. Strings[4] = pwszRunAsUser;
  201. // Get the log handle, then report then event.
  202. LogHandle = RegisterEventSource( NULL,
  203. SCM_EVENT_SOURCE );
  204. if ( LogHandle )
  205. {
  206. ReportEvent( LogHandle,
  207. EVENTLOG_ERROR_TYPE,
  208. 0, // event category
  209. EVENT_RPCSS_RUNAS_CREATEPROCESS_FAILURE,
  210. pClientToken ? pClientToken->GetSid() : NULL, // SID
  211. 5, // 5 strings passed
  212. 0, // 0 bytes of binary
  213. (LPCTSTR *)Strings, // array of strings
  214. NULL ); // no raw data
  215. // clean up the event log handle
  216. DeregisterEventSource(LogHandle);
  217. }
  218. }
  219. void
  220. LogServiceStartError(
  221. GUID * pClsid,
  222. DWORD clsctx,
  223. CToken * pClientToken,
  224. WCHAR * pwszServiceName,
  225. WCHAR * pwszServiceArgs,
  226. DWORD err
  227. )
  228. {
  229. // Apply event filters
  230. DWORD dwActLogLvl = GetActivationFailureLoggingLevel();
  231. if(dwActLogLvl == 2)
  232. return;
  233. if(dwActLogLvl != 1 && clsctx & CLSCTX_NO_FAILURE_LOG)
  234. return;
  235. HANDLE LogHandle;
  236. LPWSTR Strings[4];
  237. WCHAR wszClsid[GUIDSTR_MAX];
  238. WCHAR wszErrnum[20];
  239. // %1 is the error number
  240. // %2 is the service name
  241. // %3 is the serviceargs
  242. // %4 is the clsid
  243. // Save the error number
  244. wsprintf(wszErrnum, L"%lu",err );
  245. Strings[0] = wszErrnum;
  246. Strings[1] = pwszServiceName;
  247. Strings[2] = pwszServiceArgs;
  248. // Get the clsid
  249. wStringFromGUID2(*pClsid, wszClsid, sizeof(wszClsid));
  250. Strings[3] = wszClsid;
  251. // Get the log handle, then report then event.
  252. LogHandle = RegisterEventSource( NULL,
  253. SCM_EVENT_SOURCE );
  254. if ( LogHandle )
  255. {
  256. ReportEvent( LogHandle,
  257. EVENTLOG_ERROR_TYPE,
  258. 0, // event category
  259. EVENT_RPCSS_START_SERVICE_FAILURE,
  260. pClientToken ? pClientToken->GetSid() : NULL, // SID
  261. 4, // 4 strings passed
  262. 0, // 0 bytes of binary
  263. (LPCTSTR *)Strings, // array of strings
  264. NULL ); // no raw data
  265. // clean up the event log handle
  266. DeregisterEventSource(LogHandle);
  267. }
  268. }
  269. void
  270. LogLaunchAccessFailed(
  271. GUID * pClsid,
  272. DWORD clsctx,
  273. CToken * pClientToken,
  274. BOOL bDefaultLaunchPermission
  275. )
  276. {
  277. // Apply event filters
  278. DWORD dwActLogLvl = GetActivationFailureLoggingLevel();
  279. if(dwActLogLvl == 2)
  280. return;
  281. if(dwActLogLvl != 1 && clsctx & CLSCTX_NO_FAILURE_LOG)
  282. return;
  283. ASSERT(pClientToken);
  284. HANDLE LogHandle;
  285. LPWSTR Strings[4];
  286. PSID pSid = pClientToken->GetSid();
  287. WCHAR wszClsid[GUIDSTR_MAX];
  288. // for this message, %1 is the clsid
  289. // %2 is username
  290. // %3 is domainname
  291. // %4 is textual SID
  292. ///////////////////////////////////////////////////
  293. //
  294. // Get the clsid
  295. //
  296. wStringFromGUID2(*pClsid, wszClsid, sizeof(wszClsid));
  297. Strings[0] = wszClsid;
  298. ///////////////////////////////////////////////////
  299. //
  300. // Get the user name, domain name
  301. //
  302. #define NAMELEN 256
  303. DWORD unamelen = NAMELEN;
  304. DWORD dnamelen = NAMELEN;
  305. SID_NAME_USE sidNameUse;
  306. WCHAR username[NAMELEN] = L"Unavailable";
  307. WCHAR domainname[NAMELEN] = L"Unavailable";
  308. Strings[1] = username;
  309. Strings[2] = domainname;
  310. if (pSid != NULL)
  311. {
  312. LookupAccountSid (NULL, pSid,
  313. username, &unamelen,
  314. domainname, &dnamelen,
  315. &sidNameUse);
  316. }
  317. ///////////////////////////////////////////////////
  318. //
  319. // Get SID as text
  320. //
  321. BOOL worked = FALSE;
  322. DWORD sidLen = NAMELEN;
  323. WCHAR sidAsText[NAMELEN];
  324. if (pSid != NULL)
  325. {
  326. worked = GetTextualSid (pSid, sidAsText, &sidLen);
  327. }
  328. Strings[3] = worked ? sidAsText : L"Unavailable";
  329. // Get the log handle, then report then event.
  330. LogHandle = RegisterEventSource( NULL,
  331. SCM_EVENT_SOURCE );
  332. if ( LogHandle )
  333. {
  334. ReportEvent( LogHandle,
  335. EVENTLOG_ERROR_TYPE,
  336. 0, // event category
  337. bDefaultLaunchPermission ? EVENT_RPCSS_DEFAULT_LAUNCH_ACCESS_DENIED : EVENT_RPCSS_LAUNCH_ACCESS_DENIED,
  338. pClientToken ? pClientToken->GetSid() : NULL, // SID
  339. 4, // 1 strings passed
  340. 0, // 0 bytes of binary
  341. (LPCTSTR *)Strings, // array of strings
  342. NULL ); // no raw data
  343. // clean up the event log handle
  344. DeregisterEventSource(LogHandle);
  345. }
  346. }
  347. void
  348. LogRemoteSideUnavailable(
  349. DWORD clsctx,
  350. WCHAR * pwszServerName )
  351. {
  352. // Apply event filters
  353. DWORD dwActLogLvl = GetActivationFailureLoggingLevel();
  354. if(dwActLogLvl == 2)
  355. return;
  356. if(dwActLogLvl != 1 && clsctx & CLSCTX_NO_FAILURE_LOG)
  357. return;
  358. HANDLE LogHandle;
  359. LPWSTR Strings[1];
  360. CToken * pToken;
  361. RPC_STATUS Status;
  362. // %1 is the remote machine name
  363. Strings[0] = pwszServerName;
  364. // Get the log handle, then report then event.
  365. LogHandle = RegisterEventSource( NULL, SCM_EVENT_SOURCE );
  366. if ( ! LogHandle )
  367. return;
  368. Status = LookupOrCreateTokenForRPCClient( NULL, TRUE, &pToken, NULL );
  369. if ( Status != RPC_S_OK )
  370. return;
  371. ReportEvent( LogHandle,
  372. EVENTLOG_ERROR_TYPE,
  373. 0, // event category
  374. EVENT_RPCSS_REMOTE_SIDE_UNAVAILABLE,
  375. pToken->GetSid(),
  376. 1, // 1 strings passed
  377. 0, // 0 bytes of binary
  378. (LPCTSTR *)Strings, // array of strings
  379. NULL ); // no raw data
  380. // clean up the event log handle
  381. DeregisterEventSource(LogHandle);
  382. pToken->Release();
  383. }
  384. void
  385. LogRemoteSideFailure(
  386. CLSID * pClsid,
  387. DWORD clsctx,
  388. WCHAR * pwszServerName,
  389. WCHAR * pwszPathForServer,
  390. HRESULT hr )
  391. {
  392. // Apply event filters
  393. DWORD dwActLogLvl = GetActivationFailureLoggingLevel();
  394. if(dwActLogLvl == 2)
  395. return;
  396. if(dwActLogLvl != 1 && clsctx & CLSCTX_NO_FAILURE_LOG)
  397. return;
  398. HANDLE LogHandle;
  399. LPWSTR Strings[4];
  400. WCHAR wszClsid[GUIDSTR_MAX];
  401. WCHAR wszErrnum[20];
  402. CToken * pToken;
  403. RPC_STATUS Status;
  404. // %1 is the error number
  405. // %2 is the remote machine name
  406. // %3 is the clsid
  407. // %4 is the PathForServer
  408. // Save the error number
  409. wsprintf(wszErrnum, L"%lu",hr );
  410. Strings[0] = wszErrnum;
  411. Strings[1] = pwszServerName;
  412. // Get the clsid
  413. wStringFromGUID2( *pClsid, wszClsid, sizeof(wszClsid) );
  414. Strings[2] = wszClsid;
  415. Strings[3] = pwszPathForServer;
  416. // Get the log handle, then report then event.
  417. LogHandle = RegisterEventSource( NULL, SCM_EVENT_SOURCE );
  418. if ( ! LogHandle )
  419. return;
  420. Status = LookupOrCreateTokenForRPCClient( NULL, TRUE, &pToken, NULL );
  421. if ( Status != RPC_S_OK )
  422. return;
  423. if ( pwszPathForServer )
  424. {
  425. ReportEvent( LogHandle,
  426. EVENTLOG_ERROR_TYPE,
  427. 0, // event category
  428. EVENT_RPCSS_REMOTE_SIDE_ERROR_WITH_FILE,
  429. pToken->GetSid(),
  430. 4, // 4 strings passed
  431. 0, // 0 bytes of binary
  432. (LPCTSTR *)Strings, // array of strings
  433. NULL ); // no raw data
  434. }
  435. else
  436. {
  437. ReportEvent( LogHandle,
  438. EVENTLOG_ERROR_TYPE,
  439. 0, // event category
  440. EVENT_RPCSS_REMOTE_SIDE_ERROR,
  441. pToken->GetSid(),
  442. 3, // 3 strings passed
  443. 0, // 0 bytes of binary
  444. (LPCTSTR *)Strings, // array of strings
  445. NULL ); // no raw data
  446. }
  447. // clean up the event log handle
  448. DeregisterEventSource(LogHandle);
  449. pToken->Release();
  450. }
  451. void
  452. LogComPlusRemoteDisabled(
  453. DWORD clsctx,
  454. REFCLSID Clsid )
  455. {
  456. // Apply event filters
  457. DWORD dwActLogLvl = GetActivationFailureLoggingLevel();
  458. if(dwActLogLvl == 2)
  459. return;
  460. if(dwActLogLvl != 1 && clsctx & CLSCTX_NO_FAILURE_LOG)
  461. return;
  462. HANDLE LogHandle;
  463. LPWSTR Strings[1];
  464. WCHAR wszClsid[GUIDSTR_MAX];
  465. CToken * pToken;
  466. RPC_STATUS Status;
  467. // %1 is the clsid
  468. // Get the clsid
  469. wStringFromGUID2( Clsid, wszClsid, sizeof(wszClsid) );
  470. Strings[0] = wszClsid;
  471. // Get the log handle, then report then event.
  472. LogHandle = RegisterEventSource( NULL, SCM_EVENT_SOURCE );
  473. if ( ! LogHandle )
  474. return;
  475. Status = LookupOrCreateTokenForRPCClient( NULL, TRUE, &pToken, NULL );
  476. if ( Status != RPC_S_OK )
  477. return;
  478. ReportEvent( LogHandle,
  479. EVENTLOG_ERROR_TYPE,
  480. 0, // event category
  481. EVENT_DCOM_COMPLUS_DISABLED,
  482. pToken->GetSid(),
  483. 1, // 4 strings passed
  484. 0, // 0 bytes of binary
  485. (LPCTSTR *)Strings, // array of strings
  486. NULL ); // no raw data
  487. // clean up the event log handle
  488. DeregisterEventSource(LogHandle);
  489. pToken->Release();
  490. }