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.

612 lines
14 KiB

  1. //
  2. // Driver Verifier UI
  3. // Copyright (c) Microsoft Corporation, 1999
  4. //
  5. //
  6. //
  7. // module: FLPage.cpp
  8. // author: DMihai
  9. // created: 11/1/00
  10. //
  11. // Description:
  12. //
  13. #include "stdafx.h"
  14. #include "verifier.h"
  15. #include "FLPage.h"
  16. #include "VrfUtil.h"
  17. #include "VGlobal.h"
  18. #ifdef _DEBUG
  19. #define new DEBUG_NEW
  20. #undef THIS_FILE
  21. static char THIS_FILE[] = __FILE__;
  22. #endif
  23. //
  24. // Help IDs
  25. //
  26. static DWORD MyHelpIds[] =
  27. {
  28. IDC_FLSETT_LIST, IDH_DV_SettingsEnabled_TestType_FullList,
  29. 0, 0
  30. };
  31. /////////////////////////////////////////////////////////////////////////////
  32. // CFullListSettingsPage property page
  33. IMPLEMENT_DYNCREATE(CFullListSettingsPage, CVerifierPropertyPage)
  34. CFullListSettingsPage::CFullListSettingsPage()
  35. : CVerifierPropertyPage(CFullListSettingsPage::IDD)
  36. {
  37. //{{AFX_DATA_INIT(CFullListSettingsPage)
  38. //}}AFX_DATA_INIT
  39. m_nSortColumnIndex = 1;
  40. m_bAscendSortSelected = FALSE;
  41. m_bAscendSortName = TRUE;
  42. m_bIoVerif = FALSE;
  43. m_bIrqLevel = FALSE;
  44. m_bLowRes = FALSE;
  45. m_bPoolTrack = FALSE;
  46. m_bSPool = FALSE;
  47. m_bDeadlock = FALSE;
  48. m_bDMA = FALSE;
  49. m_bEnhIoVerif = FALSE;
  50. }
  51. CFullListSettingsPage::~CFullListSettingsPage()
  52. {
  53. }
  54. void CFullListSettingsPage::DoDataExchange(CDataExchange* pDX)
  55. {
  56. CVerifierPropertyPage::DoDataExchange(pDX);
  57. //{{AFX_DATA_MAP(CFullListSettingsPage)
  58. DDX_Control(pDX, IDC_FLSETT_LIST, m_SettingsList);
  59. DDX_Control(pDX, IDC_FLSETT_NEXT_DESCR_STATIC, m_NextDescription);
  60. //}}AFX_DATA_MAP
  61. }
  62. BEGIN_MESSAGE_MAP(CFullListSettingsPage, CVerifierPropertyPage)
  63. //{{AFX_MSG_MAP(CFullListSettingsPage)
  64. ON_NOTIFY(LVN_COLUMNCLICK, IDC_FLSETT_LIST, OnColumnclickFlsettList)
  65. ON_WM_CONTEXTMENU()
  66. ON_MESSAGE( WM_HELP, OnHelp )
  67. //}}AFX_MSG_MAP
  68. END_MESSAGE_MAP()
  69. /////////////////////////////////////////////////////////////////////////////
  70. VOID CFullListSettingsPage::SetupListHeader()
  71. {
  72. CString strTitle;
  73. CRect rectWnd;
  74. LVCOLUMN lvColumn;
  75. //
  76. // The list's rectangle
  77. //
  78. m_SettingsList.GetClientRect( &rectWnd );
  79. ZeroMemory( &lvColumn,
  80. sizeof( lvColumn ) );
  81. lvColumn.mask = LVCF_FMT | LVCF_SUBITEM | LVCF_TEXT | LVCF_WIDTH;
  82. lvColumn.fmt = LVCFMT_LEFT;
  83. //
  84. // Column 0
  85. //
  86. VERIFY( strTitle.LoadString( IDS_ENABLED_QUESTION ) );
  87. lvColumn.iSubItem = 0;
  88. lvColumn.pszText = strTitle.GetBuffer( strTitle.GetLength() + 1 );
  89. lvColumn.cx = (int)( rectWnd.Width() * 0.12 );
  90. VERIFY( m_SettingsList.InsertColumn( 0, &lvColumn ) != -1 );
  91. strTitle.ReleaseBuffer();
  92. //
  93. // Column 1
  94. //
  95. VERIFY( strTitle.LoadString( IDS_SETTING ) );
  96. lvColumn.iSubItem = 1;
  97. lvColumn.pszText = strTitle.GetBuffer( strTitle.GetLength() + 1 );
  98. lvColumn.cx = (int)( rectWnd.Width() * 0.87 );
  99. VERIFY( m_SettingsList.InsertColumn( 1, &lvColumn ) != -1 );
  100. strTitle.ReleaseBuffer();
  101. }
  102. /////////////////////////////////////////////////////////////////////////////
  103. VOID CFullListSettingsPage::FillTheList()
  104. {
  105. //
  106. // N.B.
  107. //
  108. // If you change the first parameter (verifier bit index)
  109. // then you need to change GetNewVerifierFlags as well
  110. //
  111. AddListItem( 0, IDS_SPECIAL_POOL );
  112. AddListItem( 1, IDS_POOL_TRACKING );
  113. AddListItem( 2, IDS_FORCE_IRQL_CHECKING );
  114. AddListItem( 3, IDS_IO_VERIFICATION );
  115. AddListItem( 4, IDS_ENH_IO_VERIFICATION );
  116. AddListItem( 5, IDS_DEADLOCK_DETECTION );
  117. AddListItem( 6, IDS_DMA_CHECHKING );
  118. AddListItem( 7, IDS_LOW_RESOURCE_SIMULATION );
  119. }
  120. /////////////////////////////////////////////////////////////////////////////
  121. BOOL CFullListSettingsPage::GetNewVerifierFlags()
  122. {
  123. //
  124. // N.B.
  125. //
  126. // If you change this order then you need to
  127. // change FillTheList as well
  128. //
  129. m_bSPool = GetCheckFromItemData( 0 );
  130. m_bPoolTrack = GetCheckFromItemData( 1 );
  131. m_bIrqLevel = GetCheckFromItemData( 2 );
  132. m_bIoVerif = GetCheckFromItemData( 3 );
  133. m_bEnhIoVerif = GetCheckFromItemData( 4 );
  134. m_bDeadlock = GetCheckFromItemData( 5 );
  135. m_bDMA = GetCheckFromItemData( 6 );
  136. m_bLowRes = GetCheckFromItemData( 7 );
  137. return TRUE;
  138. }
  139. /////////////////////////////////////////////////////////////////////////////
  140. BOOL CFullListSettingsPage::GetCheckFromItemData( INT nItemData )
  141. {
  142. BOOL bChecked = FALSE;
  143. INT nItemIndex;
  144. LVFINDINFO FindInfo;
  145. ZeroMemory( &FindInfo, sizeof( FindInfo ) );
  146. FindInfo.flags = LVFI_PARAM;
  147. FindInfo.lParam = nItemData;
  148. nItemIndex = m_SettingsList.FindItem( &FindInfo );
  149. if( nItemIndex >= 0 )
  150. {
  151. bChecked = m_SettingsList.GetCheck( nItemIndex );
  152. }
  153. return bChecked;
  154. }
  155. /////////////////////////////////////////////////////////////////////////////
  156. BOOL CFullListSettingsPage::GetBitNameFromItemData( LPARAM lParam,
  157. TCHAR *szName,
  158. ULONG uNameBufferLength )
  159. {
  160. BOOL bSuccess = FALSE;
  161. INT nItemIndex;
  162. LVFINDINFO FindInfo;
  163. LVITEM lvItem;
  164. ZeroMemory( &FindInfo, sizeof( FindInfo ) );
  165. FindInfo.flags = LVFI_PARAM;
  166. FindInfo.lParam = lParam;
  167. nItemIndex = m_SettingsList.FindItem( &FindInfo );
  168. if( nItemIndex >= 0 )
  169. {
  170. //
  171. // Found it
  172. //
  173. ZeroMemory( &lvItem, sizeof( lvItem ) );
  174. lvItem.mask = LVIF_TEXT;
  175. lvItem.iItem = nItemIndex;
  176. lvItem.iSubItem = 1;
  177. lvItem.pszText = szName;
  178. lvItem.cchTextMax = uNameBufferLength;
  179. bSuccess = m_SettingsList.GetItem( &lvItem );
  180. if( FALSE == bSuccess )
  181. {
  182. //
  183. // Could not get the current item's attributes?!?
  184. //
  185. ASSERT( FALSE );
  186. }
  187. }
  188. return bSuccess;
  189. }
  190. /////////////////////////////////////////////////////////////////////////////
  191. VOID CFullListSettingsPage::AddListItem( INT nItemData,
  192. ULONG uIdResourceString )
  193. {
  194. INT nActualIndex;
  195. LVITEM lvItem;
  196. CString strName;
  197. ZeroMemory( &lvItem, sizeof( lvItem ) );
  198. //
  199. // LVITEM's member pszText is not a const pointer
  200. // so we need to GetBuffer here :-(
  201. //
  202. //
  203. // Sub-item 0 - enabled/diabled - empty text and a checkbox
  204. //
  205. lvItem.pszText = g_szVoidText;
  206. lvItem.mask = LVIF_TEXT | LVIF_PARAM;
  207. lvItem.lParam = nItemData;
  208. lvItem.iItem = m_SettingsList.GetItemCount();
  209. nActualIndex = m_SettingsList.InsertItem( &lvItem );
  210. if( nActualIndex < 0 )
  211. {
  212. //
  213. // Could not add an item in the list - give up
  214. //
  215. goto Done;
  216. }
  217. m_SettingsList.SetCheck( nActualIndex, FALSE );
  218. //
  219. // Sub-item 1 - feature name
  220. //
  221. VERIFY( strName.LoadString( uIdResourceString ) );
  222. lvItem.pszText = strName.GetBuffer( strName.GetLength() + 1 );
  223. if( NULL == lvItem.pszText )
  224. {
  225. goto Done;
  226. }
  227. lvItem.mask = LVIF_TEXT;
  228. lvItem.iItem = nActualIndex;
  229. lvItem.iSubItem = 1;
  230. VERIFY( m_SettingsList.SetItem( &lvItem ) );
  231. strName.ReleaseBuffer();
  232. Done:
  233. //
  234. // All done
  235. //
  236. NOTHING;
  237. }
  238. /////////////////////////////////////////////////////////////
  239. VOID CFullListSettingsPage::SortTheList()
  240. {
  241. if( 0 != m_nSortColumnIndex )
  242. {
  243. //
  244. // Sort by settings name
  245. //
  246. m_SettingsList.SortItems( StringCmpFunc, (LPARAM)this );
  247. }
  248. else
  249. {
  250. //
  251. // Sort by selected status
  252. //
  253. m_SettingsList.SortItems( CheckedStatusCmpFunc, (LPARAM)this );
  254. }
  255. }
  256. /////////////////////////////////////////////////////////////
  257. int CALLBACK CFullListSettingsPage::StringCmpFunc( LPARAM lParam1,
  258. LPARAM lParam2,
  259. LPARAM lParamSort)
  260. {
  261. int nCmpRez = 0;
  262. BOOL bSuccess;
  263. TCHAR szBitName1[ _MAX_PATH ];
  264. TCHAR szBitName2[ _MAX_PATH ];
  265. CFullListSettingsPage *pThis = (CFullListSettingsPage *)lParamSort;
  266. ASSERT_VALID( pThis );
  267. ASSERT( 0 != pThis->m_nSortColumnIndex );
  268. //
  269. // Get the first name
  270. //
  271. bSuccess = pThis->GetBitNameFromItemData( lParam1,
  272. szBitName1,
  273. ARRAY_LENGTH( szBitName1 ) );
  274. if( FALSE == bSuccess )
  275. {
  276. goto Done;
  277. }
  278. //
  279. // Get the second name
  280. //
  281. bSuccess = pThis->GetBitNameFromItemData( lParam2,
  282. szBitName2,
  283. ARRAY_LENGTH( szBitName2 ) );
  284. if( FALSE == bSuccess )
  285. {
  286. goto Done;
  287. }
  288. //
  289. // Compare the names
  290. //
  291. nCmpRez = _tcsicmp( szBitName1, szBitName2 );
  292. if( FALSE != pThis->m_bAscendSortName )
  293. {
  294. nCmpRez *= -1;
  295. }
  296. Done:
  297. return nCmpRez;
  298. }
  299. /////////////////////////////////////////////////////////////
  300. int CALLBACK CFullListSettingsPage::CheckedStatusCmpFunc( LPARAM lParam1,
  301. LPARAM lParam2,
  302. LPARAM lParamSort)
  303. {
  304. int nCmpRez = 0;
  305. INT nItemIndex;
  306. BOOL bVerified1;
  307. BOOL bVerified2;
  308. LVFINDINFO FindInfo;
  309. CFullListSettingsPage *pThis = (CFullListSettingsPage *)lParamSort;
  310. ASSERT_VALID( pThis );
  311. ASSERT( 0 == pThis->m_nSortColumnIndex );
  312. //
  313. // Find the first item
  314. //
  315. ZeroMemory( &FindInfo, sizeof( FindInfo ) );
  316. FindInfo.flags = LVFI_PARAM;
  317. FindInfo.lParam = lParam1;
  318. nItemIndex = pThis->m_SettingsList.FindItem( &FindInfo );
  319. if( nItemIndex < 0 )
  320. {
  321. ASSERT( FALSE );
  322. goto Done;
  323. }
  324. bVerified1 = pThis->m_SettingsList.GetCheck( nItemIndex );
  325. //
  326. // Find the second item
  327. //
  328. FindInfo.flags = LVFI_PARAM;
  329. FindInfo.lParam = lParam2;
  330. nItemIndex = pThis->m_SettingsList.FindItem( &FindInfo );
  331. if( nItemIndex < 0 )
  332. {
  333. ASSERT( FALSE );
  334. goto Done;
  335. }
  336. bVerified2 = pThis->m_SettingsList.GetCheck( nItemIndex );
  337. //
  338. // Compare them
  339. //
  340. if( bVerified1 != bVerified2 )
  341. {
  342. if( FALSE != bVerified1 )
  343. {
  344. nCmpRez = 1;
  345. }
  346. else
  347. {
  348. nCmpRez = -1;
  349. }
  350. if( FALSE != pThis->m_bAscendSortSelected )
  351. {
  352. nCmpRez *= -1;
  353. }
  354. }
  355. Done:
  356. return nCmpRez;
  357. }
  358. /////////////////////////////////////////////////////////////////////////////
  359. // CFullListSettingsPage message handlers
  360. LRESULT CFullListSettingsPage::OnWizardNext()
  361. {
  362. LRESULT lNextPageId;
  363. //
  364. // Let's assume we cannot continue
  365. //
  366. lNextPageId = -1;
  367. if( GetNewVerifierFlags() == TRUE )
  368. {
  369. if( FALSE == m_bIoVerif &&
  370. FALSE == m_bIrqLevel &&
  371. FALSE == m_bLowRes &&
  372. FALSE == m_bPoolTrack &&
  373. FALSE == m_bSPool &&
  374. FALSE == m_bDeadlock &&
  375. FALSE == m_bDMA &&
  376. FALSE == m_bEnhIoVerif )
  377. {
  378. //
  379. // No tests are currently selected - we cannot continue
  380. //
  381. VrfErrorResourceFormat( IDS_NO_TESTS_SELECTED );
  382. }
  383. else
  384. {
  385. //
  386. // Set our data according to the GUI
  387. //
  388. ASSERT( CSettingsBits::SettingsTypeCustom ==
  389. g_NewVerifierSettings.m_SettingsBits.m_SettingsType );
  390. g_NewVerifierSettings.m_SettingsBits.m_bSpecialPoolEnabled = m_bSPool;
  391. g_NewVerifierSettings.m_SettingsBits.m_bForceIrqlEnabled = m_bIrqLevel;
  392. g_NewVerifierSettings.m_SettingsBits.m_bLowResEnabled = m_bLowRes;
  393. g_NewVerifierSettings.m_SettingsBits.m_bPoolTrackingEnabled = m_bPoolTrack;
  394. g_NewVerifierSettings.m_SettingsBits.m_bIoEnabled = m_bIoVerif;
  395. g_NewVerifierSettings.m_SettingsBits.m_bDeadlockDetectEnabled = m_bDeadlock;
  396. g_NewVerifierSettings.m_SettingsBits.m_bDMAVerifEnabled = m_bDMA;
  397. g_NewVerifierSettings.m_SettingsBits.m_bEnhIoEnabled = m_bEnhIoVerif;
  398. //
  399. // Go to the next page
  400. //
  401. lNextPageId = IDD_DRVSET_PAGE;
  402. }
  403. }
  404. GoingToNextPageNotify( lNextPageId );
  405. return lNextPageId;
  406. }
  407. /////////////////////////////////////////////////////////////////////////////
  408. BOOL CFullListSettingsPage::OnInitDialog()
  409. {
  410. CVerifierPropertyPage::OnInitDialog();
  411. //
  412. // setup the list
  413. //
  414. m_SettingsList.SetExtendedStyle(
  415. LVS_EX_FULLROWSELECT | LVS_EX_CHECKBOXES | m_SettingsList.GetExtendedStyle() );
  416. SetupListHeader();
  417. FillTheList();
  418. VrfSetWindowText( m_NextDescription, IDS_FLSETT_PAGE_NEXT_DESCR );
  419. return TRUE; // return TRUE unless you set the focus to a control
  420. // EXCEPTION: OCX Property Pages should return FALSE
  421. }
  422. /////////////////////////////////////////////////////////////////////////////
  423. void CFullListSettingsPage::OnColumnclickFlsettList(NMHDR* pNMHDR, LRESULT* pResult)
  424. {
  425. NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
  426. if( 0 != pNMListView->iSubItem )
  427. {
  428. //
  429. // Clicked on the name column
  430. //
  431. if( m_nSortColumnIndex == pNMListView->iSubItem )
  432. {
  433. //
  434. // Change the current ascend/descend order for this column
  435. //
  436. m_bAscendSortName = !m_bAscendSortName;
  437. }
  438. }
  439. else
  440. {
  441. //
  442. // Clicked on the selected status column
  443. //
  444. if( m_nSortColumnIndex == pNMListView->iSubItem )
  445. {
  446. //
  447. // Change the current ascend/descend order for this column
  448. //
  449. m_bAscendSortSelected = !m_bAscendSortSelected;
  450. }
  451. }
  452. m_nSortColumnIndex = pNMListView->iSubItem;
  453. SortTheList();
  454. *pResult = 0;
  455. }
  456. /////////////////////////////////////////////////////////////
  457. LONG CFullListSettingsPage::OnHelp( WPARAM wParam, LPARAM lParam )
  458. {
  459. LONG lResult = 0;
  460. LPHELPINFO lpHelpInfo = (LPHELPINFO)lParam;
  461. ::WinHelp(
  462. (HWND) lpHelpInfo->hItemHandle,
  463. g_szVerifierHelpFile,
  464. HELP_WM_HELP,
  465. (DWORD_PTR) MyHelpIds );
  466. return lResult;
  467. }
  468. /////////////////////////////////////////////////////////////////////////////
  469. void CFullListSettingsPage::OnContextMenu(CWnd* pWnd, CPoint point)
  470. {
  471. ::WinHelp(
  472. pWnd->m_hWnd,
  473. g_szVerifierHelpFile,
  474. HELP_CONTEXTMENU,
  475. (DWORD_PTR) MyHelpIds );
  476. }