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.

623 lines
18 KiB

  1. #include "stdafx.h"
  2. #include "WmiGateway.h"
  3. #include "util.h"
  4. #ifndef DIAGNOSTICS_H
  5. #define DIAGNOSTICS_H
  6. class CDglogsCom;
  7. // Field types. Describes the field
  8. //
  9. #define TYPE_PING 0x01
  10. #define TYPE_CONNECT 0x02
  11. #define TYPE_SUBNET 0x04
  12. #define TYPE_TEXT 0x08
  13. #define TYPE_HIDE 0x10
  14. #define TYPE_IP 0x20
  15. // Flags indicating what type of data should be displayed
  16. //
  17. #define FLAG_VERBOSE_LOW 0x01
  18. #define FLAG_VERBOSE_MEDIUM 0x02
  19. #define FLAG_VERBOSE_HIGH 0x04
  20. #define FLAG_CMD_PING 0x08
  21. #define FLAG_CMD_SHOW 0x10
  22. #define FLAG_CMD_CONNECT 0x20
  23. #define CMD_SHOW 0x01
  24. #define CMD_PING 0x02
  25. #define CMD_CONNECT 0x04
  26. class CDiagnostics
  27. {
  28. public:
  29. BOOL m_bDiagInit;
  30. public:
  31. BOOL
  32. IsInvalidIPAddress(
  33. IN LPCSTR pszHostName
  34. );
  35. BOOL
  36. IsInvalidIPAddress(
  37. IN LPCWSTR pszHostName
  38. );
  39. inline BOOL ShouldTerminate();
  40. void SetCancelOption(HANDLE hTerminateThread)
  41. {
  42. m_hTerminateThread = hTerminateThread;
  43. m_bTerminate;
  44. }
  45. void CDiagnostics::ClearQuery();
  46. private:
  47. HANDLE m_hTerminateThread;
  48. BOOL m_bTerminate;
  49. BOOL m_bWinsockInit;
  50. private:
  51. void
  52. CDiagnostics::FillIcmpData(
  53. IN OUT CHAR *pIcmp,
  54. IN DWORD dwDataSize
  55. );
  56. DWORD
  57. CDiagnostics::DecodeResponse(
  58. IN PCHAR pBuf,
  59. IN int nBytes,
  60. IN struct sockaddr_in *pFrom,
  61. IN int nIndent
  62. );
  63. USHORT
  64. CDiagnostics::CheckSum(
  65. IN USHORT *pBuffer,
  66. IN DWORD dwSize
  67. );
  68. int
  69. CDiagnostics::Ping(
  70. IN LPCTSTR pszwHostName,
  71. IN int nIndent
  72. );
  73. int
  74. CDiagnostics::Ping2(WCHAR *warg);
  75. void
  76. CDiagnostics::print_statistics( );
  77. BOOL
  78. CDiagnostics::Connect(
  79. IN LPCTSTR pszwHostName,
  80. IN DWORD dwPort
  81. );
  82. public:
  83. CDiagnostics();
  84. BOOLEAN m_bAdaterHasIPAddress;
  85. void SetMachine(WCHAR *pszMachine)
  86. {
  87. m_WmiGateway.SetMachine(pszMachine);
  88. }
  89. wstring &CDiagnostics::Escape(LPCTSTR pszw);
  90. void SetInterface(INTERFACE_TYPE bInterface);
  91. BOOLEAN Initialize(INTERFACE_TYPE bInterface);
  92. void SetQuery(WCHAR *pszwCatagory = NULL, BOOL bFlag = NULL, WCHAR *pszwParam1 = NULL, WCHAR *pszwParam2 = NULL);
  93. BOOLEAN ExecQuery(WCHAR *pszwCatagory = NULL, BOOL bFlag = NULL, WCHAR *pszwParam1 = NULL, WCHAR *pszwParam2 = NULL);
  94. BOOLEAN ExecClientQuery(WCHAR *pszwInstance);
  95. BOOLEAN ExecModemQuery(WCHAR *pszwInstance);
  96. BOOLEAN RemoveInvalidAdapters(EnumWbemProperty & PropList);
  97. BOOLEAN ExecAdapterQuery(WCHAR *pszwInstance);
  98. BOOLEAN ExecDNSQuery(WCHAR *pszwInstance);
  99. BOOLEAN ExecIPQuery(WCHAR *pszwInstance);
  100. BOOLEAN ExecWinsQuery(WCHAR *pszwInstance);
  101. BOOLEAN ExecGatewayQuery(WCHAR *pszwInstance);
  102. BOOLEAN ExecDhcpQuery(WCHAR *pszwInstance);
  103. BOOLEAN ExecComputerQuery();
  104. BOOLEAN ExecOSQuery();
  105. BOOLEAN ExecVersionQuery();
  106. BOOLEAN ExecProxyQuery();
  107. BOOLEAN ExecNewsQuery();
  108. BOOLEAN ExecMailQuery();
  109. BOOLEAN ExecLoopbackQuery();
  110. BOOLEAN CDiagnostics::ExecIPHost(WCHAR *pszwHostName,WCHAR *pszwHostPort);
  111. BOOLEAN IsLocked()
  112. {
  113. }
  114. WCHAR m_wszCaption[MAX_PATH+1];
  115. _bstr_t m_bstrCaption;
  116. template<class t>
  117. WCHAR * GetCaption(list<t> &l, DWORD nInstance)
  118. {
  119. list<t>::iterator iter;
  120. if( lstrcmp((WCHAR *)m_bstrCaption, L"") != 0 )
  121. {
  122. return (WCHAR *)m_bstrCaption;
  123. }
  124. for( iter = l.begin(); iter != l.end(); iter++)
  125. {
  126. if( lstrcmp(iter->pszwName,m_pszwCaption) == 0 )
  127. {
  128. if( iter->bFlags & TYPE_TEXT )
  129. {
  130. return m_pszwCaption;
  131. }
  132. if( nInstance < iter->Value.size() )
  133. {
  134. return iter->Value[nInstance].bstrVal;
  135. }
  136. return NULL;
  137. }
  138. }
  139. return NULL;
  140. }
  141. template<class t>
  142. DWORD GetNumberOfInstances(list<t> &l)
  143. {
  144. list<t>::iterator iter;
  145. if( l.empty() )
  146. {
  147. return 0;
  148. }
  149. iter = l.begin();
  150. return iter->Value.size();
  151. }
  152. template<class t>
  153. BOOLEAN FormatEnum(list<t> &l, WCHAR *pszwInstance = NULL, BOOLEAN bPass = 2)
  154. {
  155. WCHAR *pszwCaption = NULL;
  156. list<t>::iterator iter;
  157. WCHAR szwStatus[MAX_PATH+1];
  158. LONG nPercent;
  159. m_nIndex = 0;
  160. m_nInstance = GetNumberOfInstances(l);
  161. m_bCaptionDisplayed = FALSE;
  162. m_bHeaderStatus = 2;
  163. m_bValueStatus = 2;
  164. m_bCaptionStatus = bPass;
  165. if( ShouldTerminate() ) return FALSE;
  166. lstrcmp(szwStatus,L"");
  167. if( !m_WmiGateway.m_wstrWbemError.empty() )
  168. {
  169. XMLHeader(TRUE,m_szwHeader,ids(IDS_WMIERROR),m_szwCategory);
  170. NetShHeader(TRUE,m_szwHeader,ids(IDS_WMIERROR));
  171. XMLCaption(TRUE,NULL);
  172. NetShCaption(TRUE,NULL);
  173. XMLField(TRUE,NULL);
  174. NetShField(TRUE,NULL);
  175. if( (m_bFlags & FLAG_VERBOSE_LOW)==0 )
  176. {
  177. XMLProperty(TRUE,(WCHAR *)m_WmiGateway.m_wstrWbemError.c_str());
  178. NetShProperty(TRUE,(WCHAR *)m_WmiGateway.m_wstrWbemError.c_str());
  179. }
  180. XMLProperty(FALSE,NULL);
  181. NetShProperty(FALSE,NULL);
  182. XMLField(FALSE,NULL);
  183. NetShField(FALSE,NULL);
  184. XMLCaption(FALSE);
  185. NetShCaption(FALSE);
  186. XMLHeader(FALSE,ids(IDS_FAILED));
  187. NetShHeader(FALSE,ids(IDS_FAILED));
  188. return FALSE;
  189. }
  190. if( m_nInstance <= 1 )
  191. {
  192. pszwCaption = GetCaption(l,0);
  193. }
  194. XMLHeader(TRUE,m_szwHeader,pszwCaption,m_szwCategory);
  195. NetShHeader(TRUE,m_szwHeader,pszwCaption);
  196. if( m_nCatagoriesRequested && m_nInstance)
  197. {
  198. nPercent = 97/(m_nCatagoriesRequested * m_nInstance);
  199. }
  200. else
  201. {
  202. nPercent = 3;
  203. }
  204. m_bHeaderStatus = bPass; //2;
  205. for( DWORD i = 0; i < m_nInstance; i++)
  206. {
  207. m_bCaptionStatus = 2;
  208. if( ShouldTerminate() ) return FALSE;
  209. ReportStatus(m_szwHeader,nPercent);
  210. m_nIndex++;
  211. FormatInstance(l, i,pszwInstance);
  212. m_bCaptionDisplayed = FALSE;
  213. }
  214. if( m_bHeaderStatus == TRUE )
  215. {
  216. lstrcpy(szwStatus,ids(IDS_PASSED));
  217. }
  218. else
  219. if( m_bHeaderStatus == FALSE )
  220. {
  221. lstrcpy(szwStatus,ids(IDS_FAILED));
  222. }
  223. else
  224. {
  225. lstrcpy(szwStatus,L"");
  226. }
  227. XMLHeader(FALSE,szwStatus);
  228. NetShHeader(FALSE,szwStatus);
  229. return TRUE;
  230. }
  231. template<class t>
  232. BOOLEAN FormatInstance(list<t> &l, DWORD nInstance, WCHAR *pszwInstance)
  233. {
  234. list<t>::iterator iter;
  235. WCHAR *pszwCaption = GetCaption(l,nInstance);
  236. WCHAR szwStatus[MAX_PATH+1] = L"";
  237. m_bAdaterHasIPAddress = FALSE;
  238. for( iter = l.begin(); iter != l.end(); iter++)
  239. {
  240. if( lstrcmp(iter->pszwName,L"IPAddress") == 0 )
  241. {
  242. int nIndex = 0;
  243. _bstr_t bstr;
  244. while( SUCCEEDED(GetVariant(iter->Value[nInstance],nIndex,bstr)) && m_bAdaterHasIPAddress == FALSE)
  245. {
  246. if( lstrcmp((WCHAR *)bstr,L"0.0.0.0") != 0 && lstrcmp((WCHAR *)bstr,L"") != 0)
  247. {
  248. m_bAdaterHasIPAddress = TRUE;
  249. }
  250. nIndex++;
  251. }
  252. }
  253. }
  254. //m_bAdaterHasIPAddress = FALSE;
  255. m_bCaptionStatus = 2;
  256. if( pszwInstance )
  257. {
  258. if( IsNumber(pszwInstance) )
  259. {
  260. if( m_nIndex != wcstol(pszwInstance,NULL,10) )
  261. {
  262. return 2;
  263. }
  264. }
  265. else
  266. if( !IsContained(pszwCaption,pszwInstance) )
  267. {
  268. return 2;
  269. }
  270. }
  271. if( m_bFlags & FLAG_VERBOSE_LOW )
  272. {
  273. XMLCaption(TRUE,pszwCaption);
  274. NetShCaption(TRUE,pszwCaption);
  275. }
  276. else
  277. {
  278. for( iter = l.begin(); iter != l.end(); iter++)
  279. {
  280. m_bFieldStatus = 2;
  281. if( ShouldTerminate() ) return FALSE;
  282. if( iter->bFlags & TYPE_TEXT )
  283. {
  284. XMLCaption(TRUE,pszwCaption);
  285. XMLField(TRUE,NULL);
  286. XMLProperty(TRUE,iter->pszwName);
  287. XMLProperty(FALSE,NULL);
  288. XMLField(FALSE,NULL);
  289. NetShCaption(TRUE,pszwCaption);
  290. NetShField(TRUE,NULL);
  291. NetShProperty(TRUE,iter->pszwName);
  292. NetShProperty(FALSE,NULL);
  293. NetShField(FALSE,NULL);
  294. }
  295. else
  296. if( nInstance < iter->Value.size() && Filter(iter->Value[nInstance],iter->bFlags) )
  297. {
  298. XMLCaption(TRUE,pszwCaption);
  299. NetShCaption(TRUE,pszwCaption);
  300. XMLField(TRUE,iter->pszwName);
  301. NetShField(TRUE,iter->pszwName);
  302. FormatProperty(l,nInstance,iter->Value[nInstance], iter->bFlags);
  303. switch(m_bFieldStatus)
  304. {
  305. case TRUE:
  306. lstrcpy(szwStatus,ids(IDS_PASSED));
  307. break;
  308. case FALSE:
  309. lstrcpy(szwStatus,ids(IDS_FAILED));
  310. break;
  311. default:
  312. lstrcpy(szwStatus,L"");
  313. break;
  314. }
  315. XMLField(FALSE,szwStatus);
  316. NetShField(FALSE,szwStatus);
  317. }
  318. }
  319. }
  320. if( m_bCaptionStatus == TRUE )
  321. {
  322. lstrcpy(szwStatus,ids(IDS_PASSED));
  323. }
  324. else if( m_bCaptionStatus == FALSE )
  325. {
  326. lstrcpy(szwStatus,ids(IDS_FAILED));
  327. }
  328. else
  329. {
  330. lstrcpy(szwStatus,L"");
  331. }
  332. XMLCaption(FALSE,szwStatus);
  333. NetShCaption(FALSE,szwStatus);
  334. return 0;
  335. }
  336. template<class t>
  337. BOOLEAN FormatProperty(list<t> &l, DWORD nInstance, _variant_t &vValue, BOOLEAN bFlags)
  338. {
  339. _bstr_t bstrValue;
  340. LPCTSTR pszwData = NULL;
  341. LPCTSTR pszwComment = NULL;
  342. WCHAR szwStatus[MAX_PATH+1];
  343. WCHAR szwComment[MAX_PATH+1];
  344. DWORD nIndex = 0;
  345. INT nValue =0;
  346. //BOOLEAN bStatus = 2;
  347. while( SUCCEEDED(GetVariant(vValue,nIndex++,bstrValue)) )
  348. {
  349. nValue++;
  350. m_bValueStatus = 2;
  351. if( ShouldTerminate() ) return FALSE;
  352. pszwData = NULL;
  353. lstrcpy(szwStatus,L"");
  354. lstrcpy(szwComment,L"");
  355. if( lstrcmp((WCHAR *)bstrValue,L"") == 0)
  356. {
  357. bstrValue = ids(IDS_EMPTY);
  358. NetShProperty(TRUE,bstrValue,szwComment);
  359. }
  360. else
  361. {
  362. if( ((bFlags & TYPE_SUBNET) || (bFlags & TYPE_PING)) && IsInvalidIPAddress((WCHAR*)bstrValue))
  363. {
  364. // Should we report an error i.e. invalid IP address?
  365. //
  366. lstrcpy(szwComment,ids(IDS_INVALIDIP));
  367. NetShProperty(TRUE,bstrValue,szwComment);
  368. }
  369. else
  370. {
  371. if( (bFlags & TYPE_SUBNET) )
  372. {
  373. if( IsSameSubnet(Get(l,L"IPAddress",nInstance),Get(l,L"IPSubnet",nInstance),(WCHAR *)bstrValue) )
  374. {
  375. lstrcpy(szwComment,ids(IDS_SAMESUBNET));
  376. }
  377. else
  378. {
  379. lstrcpy(szwComment,ids(IDS_DIFFERENTSUBNET));
  380. }
  381. }
  382. NetShProperty(TRUE,bstrValue,szwComment);
  383. if( (bFlags & TYPE_PING) && (m_bFlags & FLAG_CMD_PING))
  384. {
  385. if( IsInvalidIPAddress((WCHAR*)bstrValue) )
  386. {
  387. lstrcpy(szwComment,ids(IDS_INVALIDIP));
  388. }
  389. else
  390. {
  391. WCHAR szw[MAX_PATH+1];
  392. _snwprintf(szw,MAX_PATH,ids(IDS_PINGING_STATUS),(WCHAR *)bstrValue);
  393. ReportStatus(szw,0);
  394. if( Ping2(bstrValue) )
  395. {
  396. m_bHeaderStatus = m_bHeaderStatus == FALSE ? FALSE : TRUE;
  397. m_bCaptionStatus = m_bCaptionStatus == FALSE ? FALSE : TRUE;
  398. m_bFieldStatus = m_bFieldStatus == FALSE ? FALSE : TRUE;
  399. m_bValueStatus = TRUE;
  400. }
  401. else
  402. {
  403. m_bHeaderStatus = FALSE;
  404. m_bCaptionStatus = FALSE;
  405. m_bFieldStatus = FALSE;
  406. m_bValueStatus = FALSE;
  407. }
  408. pszwData = m_wstrPing.c_str();
  409. }
  410. }
  411. }
  412. }
  413. if( m_bValueStatus == TRUE )
  414. {
  415. lstrcpy(szwStatus,ids(IDS_PASSED));
  416. }
  417. else if( m_bValueStatus == FALSE )
  418. {
  419. lstrcpy(szwStatus,ids(IDS_FAILED));
  420. }
  421. else
  422. {
  423. lstrcpy(szwStatus,L"");
  424. }
  425. XMLProperty(TRUE,bstrValue,pszwData,szwComment);
  426. XMLProperty(FALSE,szwStatus);
  427. NetShProperty(FALSE,szwStatus);
  428. }
  429. if( nValue == 0 )
  430. {
  431. NetShProperty(TRUE,ids(IDS_EMPTY),L"");
  432. NetShProperty(FALSE,L"");
  433. }
  434. return 0; //bStatus;
  435. }
  436. template<class t>
  437. void HideAll(list<t> &l)
  438. {
  439. list<t>::iterator iter;
  440. for(iter = l.begin(); iter != l.end(); iter++)
  441. {
  442. iter->bFlags = TYPE_HIDE;
  443. }
  444. }
  445. BOOLEAN FormatPing(WCHAR * pszwText);
  446. BOOLEAN Filter(_variant_t &vValue, BOOLEAN bFlags);
  447. void RequestStatusReport(BOOLEAN bReportStatus, CDglogsCom *pDglogsCom)
  448. {
  449. m_bReportStatus = bReportStatus;
  450. m_pDglogsCom = pDglogsCom;
  451. }
  452. void ReportStatus(LPCTSTR pszwMsg, LONG lValue);
  453. ~CDiagnostics();
  454. public:
  455. wstring m_wstrXML;
  456. wstring m_wstrText;
  457. wstring m_wstrPing;
  458. private:
  459. wstring m_wstrEscapeXml;
  460. INTERFACE_TYPE m_bInterface;
  461. CWmiGateway m_WmiGateway;
  462. WCHAR * m_pszwCaption;
  463. WCHAR m_szwHeader[MAX_PATH + 1];
  464. WCHAR m_szwCategory[MAX_PATH + 1];
  465. BOOLEAN m_bCaptionDisplayed;
  466. DWORD m_nInstance;
  467. BOOLEAN m_bStatus;
  468. private:
  469. PWCHAR m_pszwCatagory;
  470. BOOL m_bFlags;
  471. PWCHAR m_pszwParam1;
  472. PWCHAR m_pszwParam2;
  473. public:
  474. CDglogsCom *m_pDglogsCom;
  475. private:
  476. void EventCall(LPCTSTR pszwStatusReport, LONG lPercent);
  477. private:
  478. BOOLEAN m_IsNetdiagDisplayed;
  479. BOOLEAN m_IsContainerDisplayed;
  480. BOOLEAN m_IsPropertyListDisplayed;
  481. BOOLEAN m_IsPropertyDisplayed;
  482. BOOLEAN m_IsValueDisplayed;
  483. DWORD m_nPropertyLegth;
  484. DWORD m_nValueIndex;
  485. DWORD m_nIndent;
  486. DWORD m_nIndex;
  487. BOOLEAN m_bReportStatus;
  488. WCHAR m_szwStatusReport[MAX_PATH + 1];
  489. LONG m_lTotalWork;
  490. LONG m_lWorkDone;
  491. LONG m_nCatagoriesRequested;
  492. BOOLEAN m_bHeaderStatus;
  493. BOOLEAN m_bCaptionStatus;
  494. BOOLEAN m_bFieldStatus;
  495. BOOLEAN m_bPropertyStatus;
  496. BOOLEAN m_bValueStatus;
  497. private:
  498. void XMLNetdiag(BOOLEAN bStartTag, LPCTSTR pszwValue = NULL);
  499. void XMLHeader(BOOLEAN bStartTag, WCHAR *pszwHeader = NULL, WCHAR *pszwCaption = NULL, WCHAR *pszwCategory = NULL);
  500. void XMLCaption(BOOLEAN bStartTag, WCHAR *pszwCaption = NULL);
  501. void XMLField(BOOLEAN bStartTag, WCHAR *pszwField = NULL);
  502. void XMLProperty(BOOLEAN bStartTag, WCHAR *pszwProperty = NULL, LPCTSTR pszwData = NULL, LPCTSTR pszwComment = NULL);
  503. private:
  504. void NetShNetdiag(BOOLEAN bStartTag, LPCTSTR pszwValue = NULL);
  505. void NetShHeader(BOOLEAN bStartTag,LPCTSTR pszwValue = NULL,LPCTSTR pszwCaption = NULL);
  506. void NetShCaption(BOOLEAN bStartTag,LPCTSTR pszwValue = NULL);
  507. void NetShField(BOOLEAN bStartTag,LPCTSTR pszwValue = NULL);
  508. void NetShProperty(BOOLEAN bStartTag,LPCTSTR pszwValue = NULL,LPCTSTR pszwComment = NULL,BOOL bFlags = 0);
  509. };
  510. #endif