/**------------------------------------------------------------------ regress.c ------------------------------------------------------------------**/ // // Includes // #include #include #include #include #include #include #include #include "cmtest.h" // // Private Prototypes // VOID RegressionTest_Range( HWND hDlg ); VOID RegressionTest_Class( HWND hDlg ); VOID RegressionTest_Traverse( HWND hDlg ); VOID RegressionTest_HardwareProfile( HWND hDlg ); VOID RegressionTest_DeviceList( HWND hDlg ); VOID RegressionTest_LogConf( HWND hDlg ); VOID RegressionTest_CreateDevNode( HWND hDlg ); VOID RegressionTest_Properties( HWND hDlg ); VOID RegressionTest_DeviceClass( HWND hDlg ); BOOL DisplayRange( IN HWND hDlg, IN RANGE_LIST rlh ); BOOL TraverseAndCheckParents ( DEVNODE dnParent ); // // Globals // TCHAR szPresentDeviceID[] = TEXT("Test\\Present\\0000"); TCHAR szNonExistantDeviceID[] = TEXT("Test\\XXX\\0000"); TCHAR szInvalidDeviceID[] = TEXT("Test\\0000"); TCHAR szNotFoundDeviceID[] = TEXT("Test\\NotFound\\0000"); TCHAR szMovedDeviceID[] = TEXT("Test\\Moved\\0000"); TCHAR szNoBaseDeviceID[] = TEXT("Test\\NoBaseDevice\\0000"); TCHAR szMissingParentDeviceID[] = TEXT("Test\\ParentMissing\\0000"); TCHAR szNotFoundParentDeviceID[] = TEXT("Test\\ParentNotFound\\0000"); TCHAR szMovedParentDeviceID[] = TEXT("Test\\ParentMoved\\0000"); TCHAR szNoAttachedDeviceID[] = TEXT("Test\\NoAttachedComponents\\0000"); TCHAR szMissingChildDeviceID[] = TEXT("Test\\ChildMissing\\0000"); TCHAR szNotFoundChildDeviceID[] = TEXT("Test\\ChildNotFound\\0000"); TCHAR szMovedChildDeviceID[] = TEXT("Test\\ChildMoved\\0000"); TCHAR szValid2ndChildDeviceID[] = TEXT("Test\\Valid2ndChild\\0000"); TCHAR szMissingSiblingDeviceID[] = TEXT("Test\\SiblingMissing\\0000"); TCHAR szNotFoundSiblingDeviceID[] = TEXT("Test\\SiblingNotFound\\0000"); TCHAR szMovedSiblingDeviceID[] = TEXT("Test\\SiblingMoved\\0000"); TCHAR szValid3rdChildDeviceID[] = TEXT("Test\\Valid3rdChild\\0000"); TCHAR szEnabledDeviceID[] = TEXT("Test\\Enabled\\0000"); TCHAR szDisabledDeviceID[] = TEXT("Test\\Disabled\\0000"); TCHAR szCreateDeviceID[] = TEXT("Test\\Create\\0000"); TCHAR szDoNotCreateDeviceID[] = TEXT("Test\\DoNotCreate\\0000"); TCHAR szPhantomDeviceID[] = TEXT("Test\\Phantom\\0000"); TCHAR szRemoveDeviceID[] = TEXT("Test\\Remove\\0000"); TCHAR szClassGuid_0[] = TEXT("{00000000-0000-0000-0000-000000000000}"); TCHAR szClassGuid_None[] = TEXT("{99999999-9999-9999-9999-999999999999}"); TCHAR szDev_MovedTo[] = TEXT("TEST\\MovedTo\\0000"); TCHAR szDev_MovedFrom[] = TEXT("TEXT\\MovedFrom\\0000"); extern HMACHINE hMachine; /**----------------------------------------------------------------------**/ LRESULT CALLBACK RegressionDlgProc( HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam ) { CONFIGRET Status = CR_SUCCESS; TCHAR szDeviceID[MAX_DEVICE_ID_LEN]; TCHAR szParentID[MAX_DEVICE_ID_LEN]; DEVNODE dnDevNode, dnParentDevNode; ULONG ulFlags; switch (message) { case WM_INITDIALOG: SetDlgItemText(hDlg, ID_ST_PARENT, (LPCTSTR)lParam); CheckDlgButton(hDlg, ID_RD_NORMAL, 1); return TRUE; case WM_COMMAND: switch(LOWORD(wParam)) { case IDOK: EndDialog(hDlg, TRUE); return TRUE; case ID_BT_CLEAR: SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_RESETCONTENT, 0, 0); break; case ID_BT_START: if (IsDlgButtonChecked(hDlg, ID_CHK_RANGE)) { RegressionTest_Range(hDlg); } if (IsDlgButtonChecked(hDlg, ID_CHK_CLASS)) { RegressionTest_Class(hDlg); } if (IsDlgButtonChecked(hDlg, ID_CHK_TRAVERSE)) { RegressionTest_Traverse(hDlg); } if (IsDlgButtonChecked(hDlg, ID_CHK_HWPROF)) { RegressionTest_HardwareProfile(hDlg); } if (IsDlgButtonChecked(hDlg, ID_CHK_DEVLIST)) { RegressionTest_DeviceList(hDlg); } if (IsDlgButtonChecked(hDlg, ID_CHK_LOGCONF)) { RegressionTest_LogConf(hDlg); } if (IsDlgButtonChecked(hDlg, ID_CHK_CREATE)) { RegressionTest_CreateDevNode(hDlg); } if (IsDlgButtonChecked(hDlg, ID_CHK_PROPERTIES)) { RegressionTest_Properties(hDlg); } if (IsDlgButtonChecked(hDlg, ID_CHK_DEVCLASS)) { RegressionTest_DeviceClass(hDlg); } } break; } return FALSE; } // RegressionDlgProc //----------------------------------------------------------------------------- VOID RegressionTest_Range( HWND hDlg ) { CONFIGRET Status = CR_SUCCESS; RANGE_LIST rlh1, rlh2, rlh3; RANGE_ELEMENT rElement; DWORDLONG ullStart, ullEnd; TCHAR szMsg[MAX_PATH], szMsg1[MAX_PATH]; lstrcpy(szMsg, TEXT("1. Create Range List: ")); Status = CM_Create_Range_List(&rlh1, 0); if (Status != CR_SUCCESS) { wsprintf(szMsg1, TEXT("Failed (%xh)"), Status); } else wsprintf(szMsg1, TEXT("Passed (%xh)"), Status); lstrcat(szMsg, szMsg1); SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); //------------------------------------------------------ // Add range test //------------------------------------------------------ lstrcpy(szMsg, TEXT("2. Add Ranges: ")); Status = CM_Add_Range(12, 15, rlh1, CM_ADD_RANGE_ADDIFCONFLICT); if (Status != CR_SUCCESS) { wsprintf(szMsg1, TEXT("(12,15) Failed (%xh)"), Status); goto DoneAddingRanges; } DisplayRange(hDlg, rlh1); Status = CM_Add_Range(7, 9, rlh1, CM_ADD_RANGE_ADDIFCONFLICT); if (Status != CR_SUCCESS) { wsprintf(szMsg1, TEXT("(7,9) Failed (%xh)"), Status); goto DoneAddingRanges; } DisplayRange(hDlg, rlh1); Status = CM_Add_Range(21, 25, rlh1, CM_ADD_RANGE_ADDIFCONFLICT); if (Status != CR_SUCCESS) { wsprintf(szMsg1, TEXT("(21,25) Failed (%xh)"), Status); goto DoneAddingRanges; } DisplayRange(hDlg, rlh1); // A1 Status = CM_Add_Range(4, 5, rlh1, CM_ADD_RANGE_ADDIFCONFLICT); if (Status != CR_SUCCESS) { wsprintf(szMsg1, TEXT("(4,5) Failed (%xh)"), Status); goto DoneAddingRanges; } DisplayRange(hDlg, rlh1); // A2 Status = CM_Add_Range(11, 13, rlh1, CM_ADD_RANGE_ADDIFCONFLICT); if (Status != CR_SUCCESS) { wsprintf(szMsg1, TEXT("(11,13) Failed (%xh)"), Status); goto DoneAddingRanges; } DisplayRange(hDlg, rlh1); // A3 Status = CM_Add_Range(20, 26, rlh1, CM_ADD_RANGE_ADDIFCONFLICT); if (Status != CR_SUCCESS) { wsprintf(szMsg1, TEXT("(20,26) Failed (%xh)"), Status); goto DoneAddingRanges; } DisplayRange(hDlg, rlh1); // B1 Status = CM_Add_Range(6, 8, rlh1, CM_ADD_RANGE_ADDIFCONFLICT); if (Status != CR_SUCCESS) { wsprintf(szMsg1, TEXT("(6,8) Failed (%xh)"), Status); goto DoneAddingRanges; } DisplayRange(hDlg, rlh1); // B2 Status = CM_Add_Range(14, 16, rlh1, CM_ADD_RANGE_ADDIFCONFLICT); if (Status != CR_SUCCESS) { wsprintf(szMsg1, TEXT("(14,16) Failed (%xh)"), Status); goto DoneAddingRanges; } DisplayRange(hDlg, rlh1); // special cases Status = CM_Add_Range(10, 14, rlh1, CM_ADD_RANGE_ADDIFCONFLICT); if (Status != CR_SUCCESS) { wsprintf(szMsg1, TEXT("(10,14) Failed (%xh)"), Status); goto DoneAddingRanges; } DisplayRange(hDlg, rlh1); // add "join" cases DoneAddingRanges: lstrcat(szMsg, szMsg1); SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); // conflict cases Status = CM_Add_Range(2, 4, rlh1, CM_ADD_RANGE_DONOTADDIFCONFLICT); if (Status != CR_FAILURE) { wsprintf(szMsg, TEXT("(2,4) Should've Failed due to conflict")); SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); } Status = CM_Add_Range(20, 22, rlh1, CM_ADD_RANGE_DONOTADDIFCONFLICT); if (Status != CR_FAILURE) { wsprintf(szMsg, TEXT("(20,22) Should've Failed due to conflict")); SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); } Status = CM_Add_Range(10, 12, rlh1, CM_ADD_RANGE_DONOTADDIFCONFLICT); if (Status != CR_FAILURE) { wsprintf(szMsg, TEXT("(10,12) Should've Failed due to conflict")); SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); } Status = CM_Add_Range(26, 28, rlh1, CM_ADD_RANGE_DONOTADDIFCONFLICT); if (Status != CR_FAILURE) { wsprintf(szMsg, TEXT("(26,28) Should've Failed due to conflict")); SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); } Status = CM_Add_Range(18, 30, rlh1, CM_ADD_RANGE_DONOTADDIFCONFLICT); if (Status != CR_FAILURE) { wsprintf(szMsg, TEXT("(18,30) Should've Failed due to conflict")); SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); } //------------------------------------------------------ // Duplicate range list test //------------------------------------------------------ SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)TEXT("_____Duplicate Range List Test__________")); Status = CM_Create_Range_List(&rlh2, 0); if (Status != CR_SUCCESS) { wsprintf(szMsg1, TEXT("CM_Create_Range_List Failed (%xh)"), Status); SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg1); return; } // new range is empty Status = CM_Dup_Range_List(rlh1, rlh2, 0); if (Status != CR_SUCCESS) { SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)TEXT("Dup failed to empty range list")); return; } SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)TEXT("Original Range:")); DisplayRange(hDlg, rlh1); SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)TEXT("Duplicated Range:")); DisplayRange(hDlg, rlh2); // new range is not empty Status = CM_Dup_Range_List(rlh1, rlh2, 0); if (Status != CR_SUCCESS) { SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)TEXT("Dup failed to non-empty range list")); return; } SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)TEXT("Original Range:")); DisplayRange(hDlg, rlh1); SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)TEXT("Duplicated Range:")); DisplayRange(hDlg, rlh2); //------------------------------------------------------ // Delete range list test //------------------------------------------------------ SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)TEXT("_____Delete Range Test__________")); Status = CM_Delete_Range(1,3, rlh2, 0); if (Status != CR_SUCCESS) { wsprintf(szMsg, TEXT("CM_Delete_Range Failed (%xh)"), Status); SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); return; } SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)TEXT("Deleting (1,3)")); DisplayRange(hDlg, rlh2); Status = CM_Delete_Range(17,19, rlh2, 0); if (Status != CR_SUCCESS) { wsprintf(szMsg, TEXT("CM_Delete_Range Failed (%xh)"), Status); SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); return; } SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)TEXT("Deleting (17,19)")); DisplayRange(hDlg, rlh2); Status = CM_Delete_Range(27,30, rlh2, 0); if (Status != CR_SUCCESS) { wsprintf(szMsg, TEXT("CM_Delete_Range Failed (%xh)"), Status); SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); return; } SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)TEXT("Deleting (27,30)")); DisplayRange(hDlg, rlh2); Status = CM_Delete_Range(3,6, rlh2, 0); if (Status != CR_SUCCESS) { wsprintf(szMsg, TEXT("CM_Delete_Range Failed (%xh)"), Status); SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); return; } SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)TEXT("Deleting (3,6)")); DisplayRange(hDlg, rlh2); Status = CM_Delete_Range(13,16, rlh2, 0); if (Status != CR_SUCCESS) { wsprintf(szMsg, TEXT("CM_Delete_Range Failed (%xh)"), Status); SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); return; } SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)TEXT("Deleting (13,16)")); DisplayRange(hDlg, rlh2); Status = CM_Delete_Range(8,10, rlh2, 0); if (Status != CR_SUCCESS) { wsprintf(szMsg, TEXT("CM_Delete_Range Failed (%xh)"), Status); SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); return; } SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)TEXT("Deleting (8,10)")); DisplayRange(hDlg, rlh2); Status = CM_Delete_Range(9,21, rlh2, 0); if (Status != CR_SUCCESS) { wsprintf(szMsg, TEXT("CM_Delete_Range Failed (%xh)"), Status); SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); return; } SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)TEXT("Deleting (9,21)")); DisplayRange(hDlg, rlh2); // special cases Status = CM_Delete_Range(0,DWORD_MAX, rlh2, 0); if (Status != CR_SUCCESS) { wsprintf(szMsg, TEXT("CM_Delete_Range Failed (%xh)"), Status); SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); return; } SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)TEXT("Deleting (0,DWORD_MAX)")); DisplayRange(hDlg, rlh2); // re-dup range list 2 again, it's currently empty CM_Dup_Range_List(rlh1, rlh2, 0); SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)TEXT("Resetting range list to:")); DisplayRange(hDlg, rlh2); Status = CM_Delete_Range(0,DWORDLONG_MAX, rlh2, 0); if (Status != CR_SUCCESS) { wsprintf(szMsg, TEXT("CM_Delete_Range Failed (%xh)"), Status); SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); return; } SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)TEXT("Deleting (0,DWORDLONG_MAX)")); DisplayRange(hDlg, rlh2); //------------------------------------------------------ // Test range available //------------------------------------------------------ SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)TEXT("______Test Range Available____________")); DisplayRange(hDlg, rlh1); Status = CM_Test_Range_Available(0, 2, rlh1, 0); if (Status == CR_SUCCESS) { lstrcpy(szMsg, TEXT("Range (0,2) is available (expected)")); } else { wsprintf(szMsg, TEXT("Range (0,2) not available (%d)"), Status); } SendDlgItemMessage(hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); Status = CM_Test_Range_Available(17, 19, rlh1, 0); if (Status == CR_SUCCESS) { lstrcpy(szMsg, TEXT("Range (17,19) is available (expected)")); } else { wsprintf(szMsg, TEXT("Range (17,19) not available (%d)"), Status); } SendDlgItemMessage(hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); Status = CM_Test_Range_Available(30, 40, rlh1, 0); if (Status == CR_SUCCESS) { lstrcpy(szMsg, TEXT("Range (30,40) is available (expected)")); } else { wsprintf(szMsg, TEXT("Range (30,40) not available (%d)"), Status); } SendDlgItemMessage(hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); Status = CM_Test_Range_Available(3, 4, rlh1, 0); if (Status == CR_SUCCESS) { lstrcpy(szMsg, TEXT("Range (3,4) is available")); } else { wsprintf(szMsg, TEXT("Range (3,4) not available, %d (expected)"), Status); } SendDlgItemMessage(hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); Status = CM_Test_Range_Available(26, 50, rlh1, 0); if (Status == CR_SUCCESS) { lstrcpy(szMsg, TEXT("Range (26,50) is available")); } else { wsprintf(szMsg, TEXT("Range (26,50) not available, %d (expected)"), Status); } SendDlgItemMessage(hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); Status = CM_Test_Range_Available(16, 20, rlh1, 0); if (Status == CR_SUCCESS) { lstrcpy(szMsg, TEXT("Range (16,20) is available")); } else { wsprintf(szMsg, TEXT("Range (16,20) not available, %d (epxected)"), Status); } SendDlgItemMessage(hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); Status = CM_Test_Range_Available(3, 21, rlh1, 0); if (Status == CR_SUCCESS) { lstrcpy(szMsg, TEXT("Range (3,21) is available")); } else { wsprintf(szMsg, TEXT("Range (3,21) not available, %d (expected)"), Status); } SendDlgItemMessage(hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); Status = CM_Test_Range_Available(5, 24, rlh1, 0); if (Status == CR_SUCCESS) { lstrcpy(szMsg, TEXT("Range (5,24) is available")); } else { wsprintf(szMsg, TEXT("Range (5,24) not available, %d (expected)"), Status); } SendDlgItemMessage(hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); Status = CM_Test_Range_Available(24, 25, rlh1, 0); if (Status == CR_SUCCESS) { lstrcpy(szMsg, TEXT("Range (24,25) is available")); } else { wsprintf(szMsg, TEXT("Range (24,25) not available, %d (expected)"), Status); } SendDlgItemMessage(hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); //------------------------------------------------------ // Invert Range test //------------------------------------------------------ Status = CM_Create_Range_List(&rlh3, 0); SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)TEXT("Original range to invert:")); DisplayRange(hDlg, rlh1); Status = CM_Invert_Range_List(rlh1, rlh2, 100, 0); if (Status != CR_SUCCESS) { wsprintf(szMsg, TEXT("CM_Invert_Range Failed (%xh)"), Status); SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); return; } SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)TEXT("Inverting into empty range:")); DisplayRange(hDlg, rlh2); Status = CM_Invert_Range_List(rlh1, rlh2, 25, 0); if (Status != CR_SUCCESS) { wsprintf(szMsg, TEXT("CM_Invert_Range Failed (%xh)"), Status); SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); return; } SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)TEXT("Inverting into non-empty range, MAX=25:")); DisplayRange(hDlg, rlh2); Status = CM_Invert_Range_List(rlh1, rlh2, 50, 0); if (Status != CR_SUCCESS) { wsprintf(szMsg, TEXT("CM_Invert_Range Failed (%xh)"), Status); SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); return; } SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)TEXT("Inverting into non-empty range, MAX=50:")); DisplayRange(hDlg, rlh2); Status = CM_Invert_Range_List(rlh3, rlh2, 1000, 0); if (Status != CR_SUCCESS) { wsprintf(szMsg, TEXT("CM_Invert_Range Failed (%xh)"), Status); SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); return; } SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)TEXT("Inverting from empty range, MAX = 1000:")); DisplayRange(hDlg, rlh2); //------------------------------------------------------ // Free range list test //------------------------------------------------------ Status = CM_Free_Range_List(rlh1, 0); if (Status != CR_SUCCESS) { wsprintf(szMsg, TEXT("CM_Free_Range_List Failed (%xh)"), Status); SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); } Status = CM_Free_Range_List(rlh2, 0); if (Status != CR_SUCCESS) { wsprintf(szMsg, TEXT("CM_Free_Range_List Failed (%xh)"), Status); SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); } Status = CM_Free_Range_List(rlh3, 0); if (Status != CR_SUCCESS) { wsprintf(szMsg, TEXT("CM_Free_Range_List Failed (%xh)"), Status); SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); } Status = CM_Free_Range_List(rlh3, 0); if (Status != CR_INVALID_RANGE_LIST) { lstrcpy(szMsg, TEXT("Error: freeing already free list should have failed")); } else { lstrcpy(szMsg, TEXT("Freeing a freed list caused expected error")); } SendDlgItemMessage(hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); //------------------------------------------------------ // Intersection test //------------------------------------------------------ CM_Create_Range_List(&rlh1, 0); CM_Add_Range(1, 3, rlh1, CM_ADD_RANGE_ADDIFCONFLICT); CM_Add_Range(13, 18, rlh1, CM_ADD_RANGE_ADDIFCONFLICT); CM_Add_Range(25, 27, rlh1, CM_ADD_RANGE_ADDIFCONFLICT); CM_Add_Range(30, 36, rlh1, CM_ADD_RANGE_ADDIFCONFLICT); CM_Add_Range(42, 45, rlh1, CM_ADD_RANGE_ADDIFCONFLICT); CM_Add_Range(48, 52, rlh1, CM_ADD_RANGE_ADDIFCONFLICT); DisplayRange(hDlg, rlh1); CM_Create_Range_List(&rlh2, 0); CM_Add_Range(8, 9, rlh2, CM_ADD_RANGE_ADDIFCONFLICT); CM_Add_Range(12, 14, rlh2, CM_ADD_RANGE_ADDIFCONFLICT); CM_Add_Range(17, 19, rlh2, CM_ADD_RANGE_ADDIFCONFLICT); CM_Add_Range(32, 34, rlh2, CM_ADD_RANGE_ADDIFCONFLICT); CM_Add_Range(40, 50, rlh2, CM_ADD_RANGE_ADDIFCONFLICT); DisplayRange(hDlg, rlh2); CM_Create_Range_List(&rlh3, 0); Status = CM_Intersect_Range_List(rlh1, rlh2, rlh3, 0); if (Status != CR_SUCCESS) { wsprintf(szMsg, TEXT("CM_Intersect_Range_List Failed (%xh)"), Status); SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); } SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)TEXT("Expected intersection: (13,14)(17,18)(32,34)(42,45)(48,50):")); DisplayRange(hDlg, rlh3); //------------------------------------------------------ // Merge (union) test //------------------------------------------------------ // use same rlh1 and rlh2 from the intersection test, non-emptry rlh3 Status = CM_Merge_Range_List(rlh1, rlh2, rlh3, 0); if (Status != CR_SUCCESS) { wsprintf(szMsg, TEXT("CM_Merge_Range_List Failed (%xh)"), Status); SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); } SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)TEXT("Expected union: (1,3)(8,9)(12,19)(25,27)(30,36)(40,52)")); DisplayRange(hDlg, rlh3); // both ranges empty CM_Free_Range_List(rlh1, 0); CM_Free_Range_List(rlh2, 0); CM_Create_Range_List(&rlh1, 0); CM_Create_Range_List(&rlh2, 0); Status = CM_Merge_Range_List(rlh1, rlh2, rlh3, 0); if (Status != CR_SUCCESS) { wsprintf(szMsg, TEXT("CM_Merge_Range_List Failed (%xh)"), Status); SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); } SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)TEXT("Expected union: none")); DisplayRange(hDlg, rlh3); // first range empty CM_Add_Range(8, 9, rlh2, CM_ADD_RANGE_ADDIFCONFLICT); CM_Add_Range(12, 14, rlh2, CM_ADD_RANGE_ADDIFCONFLICT); CM_Add_Range(17, 19, rlh2, CM_ADD_RANGE_ADDIFCONFLICT); CM_Add_Range(32, 34, rlh2, CM_ADD_RANGE_ADDIFCONFLICT); CM_Add_Range(40, 50, rlh2, CM_ADD_RANGE_ADDIFCONFLICT); Status = CM_Merge_Range_List(rlh1, rlh2, rlh3, 0); if (Status != CR_SUCCESS) { wsprintf(szMsg, TEXT("CM_Merge_Range_List Failed (%xh)"), Status); SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); } SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)TEXT("Expected union: (8,9)(12,14)(17,19)(32,34)(40,50)")); DisplayRange(hDlg, rlh3); // second range empty CM_Free_Range_List(rlh2, 0); CM_Create_Range_List(&rlh2, 0); CM_Add_Range(1, 3, rlh1, CM_ADD_RANGE_ADDIFCONFLICT); CM_Add_Range(13, 18, rlh1, CM_ADD_RANGE_ADDIFCONFLICT); CM_Add_Range(25, 27, rlh1, CM_ADD_RANGE_ADDIFCONFLICT); CM_Add_Range(30, 36, rlh1, CM_ADD_RANGE_ADDIFCONFLICT); CM_Add_Range(42, 45, rlh1, CM_ADD_RANGE_ADDIFCONFLICT); CM_Add_Range(48, 52, rlh1, CM_ADD_RANGE_ADDIFCONFLICT); Status = CM_Merge_Range_List(rlh1, rlh2, rlh3, 0); if (Status != CR_SUCCESS) { wsprintf(szMsg, TEXT("CM_Merge_Range_List Failed (%xh)"), Status); SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); } SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)TEXT("Expected union: (1,3)(13,18)(25,27)(30,36)(42,45)(48,52)")); DisplayRange(hDlg, rlh3); CM_Free_Range_List(rlh1, 0); CM_Free_Range_List(rlh2, 0); CM_Free_Range_List(rlh3, 0); //------------------------------------------------------ // Find Range test //------------------------------------------------------ CM_Create_Range_List(&rlh1, 0); // should be a hit on the first try CM_Add_Range(10, 20, rlh1, CM_ADD_RANGE_ADDIFCONFLICT); Status = CM_Find_Range(&ullStart, 256, 512, 0xFFFFFFFFFFFFFFF0, 1024, rlh1, 0); if (Status != CR_SUCCESS) { wsprintf(szMsg, TEXT("CM_Test_Range Failed (%xh)"), Status); SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); return; } wsprintf(szMsg, TEXT("Found Range at %d (expecting 256)"), (DWORD)ullStart); SendDlgItemMessage(hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); // should find it but after skipping one range CM_Add_Range(300, 320, rlh1, CM_ADD_RANGE_ADDIFCONFLICT); Status = CM_Find_Range(&ullStart, 256, 512, 0xFFFFFFFFFFFFFFF0, 1024, rlh1, 0); if (Status != CR_SUCCESS) { wsprintf(szMsg, TEXT("CM_Test_Range Failed (%xh)"), Status); SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); return; } wsprintf(szMsg, TEXT("Found Range at %d (expecting 336)"), (DWORD)ullStart); SendDlgItemMessage(hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); // should fail the find CM_Add_Range(500, 600, rlh1, CM_ADD_RANGE_ADDIFCONFLICT); Status = CM_Find_Range(&ullStart, 256, 512, 0xFFFFFFFFFFFFFFF0, 1024, rlh1, 0); if (Status != CR_FAILURE) { wsprintf(szMsg, TEXT("CM_Test_Range should have Failed (%xh)"), Status); SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); return; } SendDlgItemMessage(hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)TEXT("Test range failed as expected")); CM_Free_Range_List(rlh1, 0); //--------------------------------------------------------------------- // Special Test 1 - error condition found by LeslieF //--------------------------------------------------------------------- CM_Create_Range_List(&rlh1, 0); // Create range list. CM_Add_Range(0, 50, rlh1, CM_ADD_RANGE_ADDIFCONFLICT); // Add range [0-50]. CM_Delete_Range(0, 9, rlh1, 0); // Delete the range [0-9]. CM_Delete_Range(21, 29, rlh1, 0); // Delete the range [21-29]. CM_Delete_Range(41, 50, rlh1, 0); // Delete the range [41-50]. // There should be two ranges left [10-20] and [30-40]. CM_First_Range(rlh1, &ullStart, &ullEnd, &rElement, 0); CM_Next_Range(&rElement, &ullStart, &ullEnd, 0); SendDlgItemMessage(hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)TEXT("Special Test 1, expected (10,20),(30,40)")); DisplayRange(hDlg, rlh1); CM_Free_Range_List(rlh1, 0); //--------------------------------------------------------------------- // Special Test 2 - error condition found by LeslieF //--------------------------------------------------------------------- Status = CM_Dup_Range_List(0, 0,0); if (Status == CR_INVALID_RANGE_LIST) { SendDlgItemMessage(hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)TEXT("Special Test 2 - passed")); } else { SendDlgItemMessage(hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)TEXT("Special Test 2 - failed")); } //--------------------------------------------------------------------- // Special Test 3 - error condition found by LeslieF //--------------------------------------------------------------------- Status = CM_Find_Range(NULL, 0, 0, 0, 0, 0, 0); if (Status == CR_INVALID_RANGE_LIST) { SendDlgItemMessage(hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)TEXT("Special Test 3 - passed")); } else { SendDlgItemMessage(hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)TEXT("Special Test 3 - failed")); } //--------------------------------------------------------------------- // Special Test 4 - error condition found by LeslieF //--------------------------------------------------------------------- CM_Create_Range_List(&rlh1, 0); CM_Free_Range_List(rlh1, 0); CM_Free_Range_List(rlh1, 0); //--------------------------------------------------------------------- // Special Test 5 - error condition found by LeslieF //--------------------------------------------------------------------- CM_Intersect_Range_List(0, 0, 0, 0); CM_Invert_Range_List(0, 0, 0, 0); CM_Merge_Range_List(0, 0, 0, 0); //--------------------------------------------------------------------- // Special Test 6 - error condition found by LeslieF //--------------------------------------------------------------------- CM_Create_Range_List(&rlh1, 0); CM_Create_Range_List(&rlh2, 0); // Add range [10-20]. CM_Add_Range(10, 20, rlh1, CM_ADD_RANGE_ADDIFCONFLICT); // Add range [30-40]. CM_Add_Range(30, 40, rlh1, CM_ADD_RANGE_ADDIFCONFLICT); // Duplicate range list. CM_Dup_Range_List(rlh1, rlh2, 0); // There should be two ranges in rlh2, [10-20] and [30-40]. // Get the first. CM_First_Range(rlh2, &ullStart, &ullEnd, &rElement, 0); // Get the next. CM_Next_Range(&rElement, &ullStart, &ullEnd, 0); // *** Returns CR_FAILURE *** Should return CR_SUCCESS // Free the range lists. CM_Free_Range_List(rlh1, 0); CM_Free_Range_List(rlh2, 0); // Example2: CM_Create_Range_List(&rlh1, 0); CM_Create_Range_List(&rlh2, 0); // Add range [10-20][30-40]. CM_Add_Range(10, 20, rlh1, CM_ADD_RANGE_ADDIFCONFLICT); CM_Add_Range(30, 40, rlh1, CM_ADD_RANGE_ADDIFCONFLICT); // Invert range list. CM_Invert_Range_List(rlh1, rlh2, 40, 0); // There should be two ranges [0-9] and [21-29]. // Get the first. CM_First_Range(rlh2, &ullStart, &ullEnd, &rElement, 0); // Get the next. CM_Next_Range(&rElement, &ullStart, &ullEnd, 0); // *** Returns CR_FAILURE *** Should return CR_SUCCESS // Free the range lists. CM_Free_Range_List(rlh1, 0); CM_Free_Range_List(rlh2, 0); //--------------------------------------------------------------------- // Special Test 7 - error condition found by LeslieF //--------------------------------------------------------------------- CM_Create_Range_List(&rlh1, 0); CM_Add_Range(10, 20, rlh1, CM_ADD_RANGE_ADDIFCONFLICT); CM_Add_Range(30, 40, rlh1, CM_ADD_RANGE_ADDIFCONFLICT); Status = CM_Test_Range_Available(9, 21, rlh1, 0); if (Status != CR_FAILURE) { SendDlgItemMessage(hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)TEXT("Special Test 7 - failed")); } CM_Free_Range_List(rlh1, 0); //--------------------------------------------------------------------- // Special Test 8 - error condition found by Bogdan //--------------------------------------------------------------------- CM_Create_Range_List(&rlh1, 0); CM_Create_Range_List(&rlh2, 0); CM_Add_Range(0, 10, rlh1, CM_ADD_RANGE_ADDIFCONFLICT); CM_First_Range(rlh1, &ullStart, &ullEnd, &rElement, 0); if (ullStart != 0 || ullEnd != 10) { SendDlgItemMessage(hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)TEXT("Special Test 8 - failure 1")); } // As expected, ullStart = 0 and ullEnd = 10 CM_Invert_Range_List(rlh1, rlh2, 20, 0); CM_First_Range(rlh2, &ullStart, &ullEnd, &rElement, 0); // Expected ullStart = 11, ullEnd = 20, but ullStart = 0 and ullEnd = 0xFFFFFFFFFFFFFFFFF // The next range is correct one [11, 20] //CM_Next_Range(&rElement, &ullStart, &ullEnd, 0); CM_Free_Range_List(rlh1, 0); CM_Free_Range_List(rlh2, 0); CM_Free_Range_List(rlh2, 0); // test deleting already deleted range list return; } // RegressionTest_Range //----------------------------------------------------------------------------- VOID RegressionTest_Class( HWND hDlg ) { CONFIGRET Status = CR_SUCCESS; GUID ClassGuid; UUID ClassUuid; TCHAR szClass[MAX_CLASS_NAME_LEN]; DEVNODE dnDevNode; TCHAR szMsg[MAX_PATH], szMsg1[MAX_PATH]; ULONG ulStatus=0, ulProblem=0, ulLength = 0, ulSize = 0, i = 0; PTSTR pBuffer = NULL; HKEY hKey = NULL, hKey1 = NULL; #if 0 i = 0; while (Status == CR_SUCCESS) { Status = CM_Enumerate_Classes_Ex(i, &ClassGuid, 0, hMachine); if (Status == CR_SUCCESS) { ulLength = MAX_CLASS_NAME_LEN; Status = CM_Get_Class_Name(&ClassGuid, szClass, &ulLength, 0); if (Status == CR_SUCCESS) { wsprintf(szMsg, TEXT("Class %d, Name: %s"), i, szClass); SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); } } i++; } return; Status = CM_Locate_DevNode(&dnDevNode, NULL, 0); if (Status != CR_SUCCESS) { MessageBox(hDlg, TEXT("Locate Root failed"), TEXT("Test"), MB_OK); return; } Status = CM_Reenumerate_DevNode(dnDevNode, 0); if (Status != CR_SUCCESS) { MessageBox(hDlg, TEXT("Reenumeration of Root Failed"), TEXT("Test"), MB_OK); } Status = CM_Locate_DevNode(&dnDevNode, TEXT("Test\\A1\\0000"), 0); if (Status != CR_SUCCESS) { return; } lstrcpy(szMsg, TEXT("1. Reenumerate Test\\A1\\0000: ")); Status = CM_Reenumerate_DevNode(dnDevNode, 0); if (Status != CR_SUCCESS) { wsprintf(szMsg1, TEXT("Failed (%xh)"), Status); } else wsprintf(szMsg1, TEXT("Passed (%xh)"), Status); lstrcat(szMsg, szMsg1); SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); Status = CM_Locate_DevNode(&dnDevNode, TEXT("Test\\A2\\0001"), 0); if (Status != CR_SUCCESS) { return; } lstrcpy(szMsg, TEXT("2. QueryRemove SubTree Test\\A2\\0001: ")); Status = CM_Query_Remove_SubTree(dnDevNode, CM_QUERY_REMOVE_UI_OK); if (Status != CR_SUCCESS) { wsprintf(szMsg1, TEXT("Failed (%xh)"), Status); } else wsprintf(szMsg1, TEXT("Passed (%xh)"), Status); lstrcat(szMsg, szMsg1); SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); lstrcpy(szMsg, TEXT("3. Remove SubTree Test\\A2\\0001: ")); Status = CM_Remove_SubTree(dnDevNode, CM_REMOVE_UI_OK); if (Status != CR_SUCCESS) { wsprintf(szMsg1, TEXT("Failed (%xh)"), Status); } else wsprintf(szMsg1, TEXT("Passed (%xh)"), Status); lstrcat(szMsg, szMsg1); SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); #endif lstrcpy(szMsg, TEXT("Test Delete Class Key only, no other keys exist")); UuidFromString(TEXT("00000000-0000-0000-0000-000000000000"), &ClassGuid); Status = CM_Open_Class_Key(&ClassGuid, TEXT("Madeup class"), KEY_ALL_ACCESS, RegDisposition_OpenAlways, &hKey, 0); if (Status != CR_SUCCESS) { wsprintf(szMsg1, TEXT("CM_Open_Class_Key Failed (%xh)"), Status); } else wsprintf(szMsg1, TEXT("CM_Open_Class_Key Passed")); SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg1); RegCloseKey(hKey); Status = CM_Delete_Class_Key(&ClassGuid, CM_DELETE_CLASS_ONLY); if (Status != CR_SUCCESS) { wsprintf(szMsg1, TEXT("Failed (%xh)"), Status); } else wsprintf(szMsg1, TEXT("Passed")); lstrcat(szMsg, szMsg1); SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); lstrcpy(szMsg, TEXT("Test Delete Class Key only, subkeys exist")); UuidFromString(TEXT("00000000-0000-0000-0000-000000000001"), &ClassGuid); Status = CM_Delete_Class_Key(&ClassGuid, CM_DELETE_CLASS_ONLY); if (Status != CR_SUCCESS) { wsprintf(szMsg1, TEXT("Failed (%xh)"), Status); } else wsprintf(szMsg1, TEXT("Passed")); lstrcat(szMsg, szMsg1); SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); lstrcpy(szMsg, TEXT("Test Delete Class Key, subkeys too")); UuidFromString(TEXT("00000000-0000-0000-0000-000000000002"), &ClassGuid); Status = CM_Open_Class_Key(&ClassGuid, NULL, KEY_ALL_ACCESS, RegDisposition_OpenAlways, &hKey, 0); if (Status != CR_SUCCESS) { wsprintf(szMsg1, TEXT("CM_Open_Class_Key Failed (%xh)"), Status); } else wsprintf(szMsg1, TEXT("CM_Open_Class_Key Passed")); SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg1); RegCreateKeyEx(hKey, TEXT("Subkey1"), 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey1, NULL); MessageBox(NULL, TEXT("Does 0000...0002\\SubKey1 exist?"), TEXT("Test"), MB_OK); RegCloseKey(hKey); RegCloseKey(hKey1); Status = CM_Delete_Class_Key(&ClassGuid, CM_DELETE_CLASS_SUBKEYS); if (Status != CR_SUCCESS) { wsprintf(szMsg1, TEXT("Failed (%xh)"), Status); } else wsprintf(szMsg1, TEXT("Passed")); lstrcat(szMsg, szMsg1); SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); Status = CM_Locate_DevNode(&dnDevNode, TEXT("Root\\Device001\\0000"), 0); if (Status != CR_SUCCESS) { return; } lstrcpy(szMsg, TEXT("4. Get Status for Test\\A2\\0001: ")); Status = CM_Get_DevNode_Status(&ulStatus, &ulProblem, dnDevNode, 0); if (Status != CR_SUCCESS) { wsprintf(szMsg1, TEXT("Failed (%xh)"), Status); } else wsprintf(szMsg1, TEXT("Passed, Status=%xh, Problem=%xh"), ulStatus, ulProblem); lstrcat(szMsg, szMsg1); SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); return; } // RegressionTest_Class //----------------------------------------------------------------------------- VOID RegressionTest_Traverse( HWND hDlg ) { CONFIGRET Status = CR_SUCCESS; TCHAR szMsg[MAX_PATH], szMsg1[MAX_PATH]; DEVNODE dnDevNode, dnRootDevNode, dnChildDevNode, dnParentDevNode; TCHAR Buffer[512]; ULONG ulDepth; SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)TEXT("____TRAVERSE REGRESSION TEST_____")); /* lstrcpy(szMsg, TEXT("1. Get parent of invalid devnode: ")); Status = CM_Get_Parent(&dnDevNode, 1, 0); if (Status != CR_INVALID_DEVNODE) { wsprintf(szMsg1, TEXT("Failed (%xh)"), Status); } else wsprintf(szMsg1, TEXT("Passed (%xh)"), Status); lstrcat(szMsg, szMsg1); SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); lstrcpy(szMsg, TEXT("2. Get parent of root: ")); CM_Locate_DevNode(&dnRootDevNode, NULL, 0); Status = CM_Get_Parent(&dnDevNode, dnRootDevNode, 0); if (Status != CR_NO_SUCH_DEVNODE) { wsprintf(szMsg1, TEXT("Failed (%xh)"), Status); } else wsprintf(szMsg1, TEXT("Passed (%xh)"), Status); lstrcat(szMsg, szMsg1); SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); lstrcpy(szMsg, TEXT("3. Get parent with no BaseDevicePath value: ")); CM_Locate_DevNode(&dnDevNode, szNoBaseDeviceID, 0); Status = CM_Get_Parent(&dnDevNode, dnDevNode, 0); if (Status != CR_NO_SUCH_DEVINST) { wsprintf(szMsg1, TEXT("Failed (%xh)"), Status); } else wsprintf(szMsg1, TEXT("Passed (%xh)"), Status); lstrcat(szMsg, szMsg1); SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); lstrcpy(szMsg, TEXT("4. Get parent that doesn't exist in registry: ")); CM_Locate_DevNode(&dnDevNode, szMissingParentDeviceID, 0); Status = CM_Get_Parent(&dnDevNode, dnDevNode, 0); if (Status != CR_NO_SUCH_DEVINST) { wsprintf(szMsg1, TEXT("Failed (%xh)"), Status); } else wsprintf(szMsg1, TEXT("Passed (%xh)"), Status); lstrcat(szMsg, szMsg1); SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); lstrcpy(szMsg, TEXT("5. Get parent that isn't marked as found: ")); CM_Locate_DevNode(&dnDevNode, szNotFoundParentDeviceID, 0); Status = CM_Get_Parent(&dnDevNode, dnDevNode, 0); if (Status != CR_NO_SUCH_DEVNODE) { wsprintf(szMsg1, TEXT("Failed (%xh)"), Status); } else wsprintf(szMsg1, TEXT("Passed (%xh)"), Status); lstrcat(szMsg, szMsg1); SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); wsprintf(szMsg, TEXT("6. Get parent that has been moved: ")); CM_Locate_DevNode(&dnDevNode, szMovedParentDeviceID, 0); Status = CM_Get_Parent(&dnDevNode, dnDevNode, 0); if (Status != CR_NO_SUCH_DEVNODE) { wsprintf(szMsg1, TEXT("Failed (%xh)"), Status); } else wsprintf(szMsg1, TEXT("Passed (%xh)"), Status); lstrcat(szMsg, szMsg1); SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); lstrcpy(szMsg, TEXT("7. Get valid parent: ")); Status = CM_Locate_DevNode(&dnDevNode, szPresentDeviceID, 0); if (Status != CR_SUCCESS) { wsprintf(szMsg1, TEXT("Failed Locate (%xh)"), Status); } else { Status = CM_Get_Parent(&dnParentDevNode, dnDevNode, 0); if (Status != CR_SUCCESS) { wsprintf(szMsg1, TEXT("Failed (%xh)"), Status); } else wsprintf(szMsg1, TEXT("Passed (DevNode=%xh)"), dnDevNode); } lstrcat(szMsg, szMsg1); SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); lstrcpy(szMsg, TEXT("8. Get child of invalid devnode: ")); Status = CM_Get_Child(&dnDevNode, 1, 0); if (Status != CR_INVALID_DEVNODE) { wsprintf(szMsg1, TEXT("Failed (%xh)"), Status); } else wsprintf(szMsg1, TEXT("Passed (%xh)"), Status); lstrcat(szMsg, szMsg1); SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); lstrcpy(szMsg, TEXT("9. Get child with no AttachedComponents: ")); CM_Locate_DevNode(&dnDevNode, szNoAttachedDeviceID, 0); Status = CM_Get_Child(&dnDevNode, dnDevNode, 0); if (Status != CR_NO_SUCH_DEVINST) { wsprintf(szMsg1, TEXT("Failed (%xh)"), Status); } else wsprintf(szMsg1, TEXT("Passed (%xh)"), Status); lstrcat(szMsg, szMsg1); SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); lstrcpy(szMsg, TEXT("10. Get child that doesn't exist in registry: ")); CM_Locate_DevNode(&dnDevNode, szMissingChildDeviceID, 0); Status = CM_Get_Child(&dnDevNode, dnDevNode, 0); if (Status != CR_NO_SUCH_DEVINST) { wsprintf(szMsg1, TEXT("Failed (%xh)"), Status); } else wsprintf(szMsg1, TEXT("Passed (%xh)"), Status); lstrcat(szMsg, szMsg1); SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); lstrcpy(szMsg, TEXT("11. Get child that isn't marked as found: ")); CM_Locate_DevNode(&dnDevNode, szNotFoundChildDeviceID, 0); Status = CM_Get_Child(&dnDevNode, dnDevNode, 0); if (Status != CR_NO_SUCH_DEVNODE) { wsprintf(szMsg1, TEXT("Failed (%xh)"), Status); } else wsprintf(szMsg1, TEXT("Passed (%xh)"), Status); lstrcat(szMsg, szMsg1); SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); lstrcpy(szMsg, TEXT("12. Get child that has been moved: ")); CM_Locate_DevNode(&dnDevNode, szMovedChildDeviceID, 0); Status = CM_Get_Child(&dnDevNode, dnDevNode, 0); if (Status != CR_NO_SUCH_DEVNODE) { wsprintf(szMsg1, TEXT("Failed (%xh)"), Status); } else wsprintf(szMsg1, TEXT("Passed (%xh)"), Status); lstrcat(szMsg, szMsg1); SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); lstrcpy(szMsg, TEXT("13. First child isn't valid: ")); CM_Locate_DevNode(&dnDevNode, szValid2ndChildDeviceID, 0); Status = CM_Get_Child(&dnDevNode, dnDevNode, 0); if (Status != CR_SUCCESS) { wsprintf(szMsg1, TEXT("Failed (%xh)"), Status); } else wsprintf(szMsg1, TEXT("Passed (%xh)"), Status); lstrcat(szMsg, szMsg1); SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); lstrcpy(szMsg, TEXT("14. Get valid child: ")); Status = CM_Get_Child(&dnChildDevNode, dnParentDevNode, 0); if (Status != CR_SUCCESS) { wsprintf(szMsg1, TEXT("Failed (%xh)"), Status); } else wsprintf(szMsg1, TEXT("Passed (%xh)"), Status); lstrcat(szMsg, szMsg1); SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); lstrcpy(szMsg, TEXT("15. Get sibling of invalid devnode: ")); Status = CM_Get_Sibling(&dnDevNode, 1, 0); if (Status != CR_INVALID_DEVNODE) { wsprintf(szMsg1, TEXT("Failed (%xh"), Status); } else wsprintf(szMsg1, TEXT("Passed (%xh)"), Status); lstrcat(szMsg, szMsg1); SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); lstrcpy(szMsg, TEXT("16. Get sibling of Root: ")); Status = CM_Get_Sibling(&dnDevNode, dnRootDevNode, 0); if (Status != CR_NO_SUCH_DEVNODE) { wsprintf(szMsg1, TEXT("Failed (%xh)"), Status); } else wsprintf(szMsg1, TEXT("Passed (%xh)"), Status); lstrcat(szMsg, szMsg1); SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); lstrcpy(szMsg, TEXT("17. Get sibling with no AttachedComponents: ")); CM_Locate_DevNode(&dnDevNode, szNoAttachedDeviceID, 0); Status = CM_Get_Sibling(&dnDevNode, dnDevNode, 0); if (Status != CR_NO_SUCH_DEVINST) { wsprintf(szMsg1, TEXT("Failed (%xh)"), Status); } else wsprintf(szMsg1, TEXT("Passed (%xh)"), Status); lstrcat(szMsg, szMsg1); SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); lstrcpy(szMsg, TEXT("18. Get sibling that doesn't exist in registry: ")); CM_Locate_DevNode(&dnDevNode, szMissingSiblingDeviceID, 0); CM_Get_Child(&dnDevNode, dnDevNode, 0); Status = CM_Get_Sibling(&dnDevNode, dnDevNode, 0); if (Status != CR_NO_SUCH_DEVINST) { wsprintf(szMsg1, TEXT("Failed (%xh)"), Status); } else wsprintf(szMsg1, TEXT("Passed (%xh)"), Status); lstrcat(szMsg, szMsg1); SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); lstrcpy(szMsg, TEXT("19. Get sibling that isn't marked as found: ")); CM_Locate_DevNode(&dnDevNode, szNotFoundSiblingDeviceID, 0); CM_Get_Child(&dnDevNode, dnDevNode, 0); Status = CM_Get_Sibling(&dnDevNode, dnDevNode, 0); if (Status != CR_NO_SUCH_DEVNODE) { wsprintf(szMsg1, TEXT("Failed (%xh)"), Status); } else wsprintf(szMsg1, TEXT("Passed (%xh)"), Status); lstrcat(szMsg, szMsg1); SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); lstrcpy(szMsg, TEXT("20. Get sibling that has been moved: ")); CM_Locate_DevNode(&dnDevNode, szMovedSiblingDeviceID, 0); CM_Get_Child(&dnDevNode, dnDevNode, 0); Status = CM_Get_Sibling(&dnDevNode, dnDevNode, 0); if (Status != CR_NO_SUCH_DEVNODE) { wsprintf(szMsg1, TEXT("Failed (%xh)"), Status); } else wsprintf(szMsg1, TEXT("Passed (%xh)"), Status); lstrcat(szMsg, szMsg1); SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); wsprintf(szMsg, TEXT("21. First sibling isn't valid: ")); CM_Locate_DevNode(&dnDevNode, szValid3rdChildDeviceID, 0); Status = CM_Get_Child(&dnDevNode, dnDevNode, 0); if (Status != CR_SUCCESS) { wsprintf(szMsg1, TEXT("Get Child Failed (%xh)"), Status); } else { Status = CM_Get_Sibling(&dnDevNode, dnDevNode, 0); if (Status != CR_SUCCESS) { wsprintf(szMsg1, TEXT("Failed (%xh)"), Status); } else wsprintf(szMsg1, TEXT("Passed (%xh)"), Status); } lstrcat(szMsg, szMsg1); SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); */ wsprintf(szMsg, TEXT("Finding all children of %s:"), szPresentDeviceID); SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); CM_Locate_DevNode(&dnDevNode, szPresentDeviceID, 0); CM_Get_Child(&dnDevNode, dnDevNode, 0); CM_Get_Device_ID(dnDevNode, Buffer, MAX_PATH, 0); wsprintf(szMsg, TEXT(" Child DeviceID = %s (DevNode = %d)"), Buffer, dnDevNode); SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); while (Status == CR_SUCCESS) { Status = CM_Get_Sibling(&dnDevNode, dnDevNode, 0); if (Status == CR_SUCCESS) { CM_Get_Device_ID(dnDevNode, Buffer, MAX_PATH, 0); wsprintf(szMsg, TEXT(" Sibling DeviceID = %s (DevNode = %d)"), Buffer, dnDevNode); SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); } } if (Status != CR_NO_SUCH_DEVINST) { wsprintf(szMsg, TEXT("CM_Get_Sibling failed (%xh)"), Status); SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); } //---------------------------------------------------------------- // Do recursive traversal test //---------------------------------------------------------------- // Create a new node. Status = CM_Locate_DevNode_Ex(&dnRootDevNode, NULL, 0, hMachine); if (Status == CR_SUCCESS) { if (TraverseAndCheckParents(dnRootDevNode)) { SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)TEXT("Recursive Traversal Test: PASSED")); } else { SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)TEXT("Recursive Traversal Test: FAILED")); } } else { SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)TEXT("Locate Root DevNode: FAILED")); } //---------------------------------------------------------------- // Get Depth Test //---------------------------------------------------------------- lstrcpy(szMsg, TEXT("Get Depth of Root: ")); CM_Locate_DevNode_Ex(&dnDevNode, NULL, 0, hMachine); Status = CM_Get_Depth_Ex(&ulDepth, dnDevNode, 0, hMachine); if (Status != CR_SUCCESS || ulDepth != 0) { wsprintf(szMsg1, TEXT("Failed, Depth = %d (%xh)"), ulDepth, Status); } else wsprintf(szMsg1, TEXT("Passed, Depth = %d (%xh)"), ulDepth, Status); lstrcat(szMsg, szMsg1); SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); lstrcpy(szMsg, TEXT("Get Depth of 1st Level Node: ")); CM_Locate_DevNode_Ex(&dnDevNode, TEXT("Root\\Device001\\0000"), 0, hMachine); Status = CM_Get_Depth_Ex(&ulDepth, dnDevNode, 0, hMachine); if (Status != CR_SUCCESS || ulDepth != 1) { wsprintf(szMsg1, TEXT("Failed, Depth = %d (%xh)"), ulDepth, Status); } else wsprintf(szMsg1, TEXT("Passed, Depth = %d (%xh)"), ulDepth, Status); lstrcat(szMsg, szMsg1); SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); lstrcpy(szMsg, TEXT("Get Depth of 2nd Level Node: ")); CM_Locate_DevNode_Ex(&dnDevNode, TEXT("Root\\Device002\\0000"), 0, hMachine); Status = CM_Get_Depth_Ex(&ulDepth, dnDevNode, 0, hMachine); if (Status != CR_SUCCESS || ulDepth != 2) { wsprintf(szMsg1, TEXT("Failed, Depth = %d (%xh)"), ulDepth, Status); } else wsprintf(szMsg1, TEXT("Passed, Depth = %d (%xh)"), ulDepth, Status); lstrcat(szMsg, szMsg1); SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); return; } // RegressionTest_Traverse //----------------------------------------------------------------------------- VOID RegressionTest_HardwareProfile( HWND hDlg ) { CONFIGRET Status; TCHAR szMsg[MAX_PATH], szMsg1[MAX_PATH]; DEVNODE dnDevNode; TCHAR Buffer[512]; HWPROFILEINFO HWProfileInfo; ULONG ulValue = 0, Index =0; ULONG C0 = CSCONFIGFLAG_DO_NOT_CREATE; ULONG C1 = CSCONFIGFLAG_DO_NOT_START; ULONG C2 = CSCONFIGFLAG_DISABLED; SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)TEXT("____HARDWARE PROFILES REGRESSION TEST_____")); /* lstrcpy(szMsg, TEXT("Get HwProf Flags for Missing Device ID: ")); Status = CM_Get_HW_Prof_Flags(szNonExistantDeviceID, 0, &ulValue, 0); if (Status != CR_SUCCESS) { wsprintf(szMsg1, TEXT("Failed (%xh)"), Status); } else wsprintf(szMsg1, TEXT("Passed (%xh), Flags = %xh"), Status, ulValue); lstrcat(szMsg, szMsg1); SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); lstrcpy(szMsg, TEXT("Get Hw Profile for invalid config: ")); Status = CM_Get_HW_Prof_Flags(TEXT("Root\\Device001\\0000"), 13, &ulValue, 0); if (Status != CR_REGISTRY_ERROR) { wsprintf(szMsg1, TEXT("Failed (%xh)"), Status); } else wsprintf(szMsg1, TEXT("Passed (%xh), Flags = %xh"), Status, ulValue); lstrcat(szMsg, szMsg1); SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); //--------------------------------------------------------------- // Profile 1 //--------------------------------------------------------------- lstrcpy(szMsg, TEXT("Set HwProf Flags for config 1: ")); Status = CM_Set_HW_Prof_Flags(TEXT("Root\\Device001\\0000"), 1, C1, 0); if (Status != CR_SUCCESS) { wsprintf(szMsg1, TEXT("Failed (%xh), Flags = %xh"), Status, C1); } else wsprintf(szMsg1, TEXT("Passed (%xh), Flags = %xh"), Status, C1); lstrcat(szMsg, szMsg1); SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); lstrcpy(szMsg, TEXT("Get Hw Profile for config 1: ")); ulValue = 0; Status = CM_Get_HW_Prof_Flags(TEXT("Root\\Device001\\0000"), 1, &ulValue, 0); if (Status != CR_SUCCESS || C1 != ulValue) { wsprintf(szMsg1, TEXT("Failed (%xh), Flags = %xh"), Status, ulValue); } else wsprintf(szMsg1, TEXT("Passed (%xh), Flags = %xh"), Status, ulValue); lstrcat(szMsg, szMsg1); SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); //--------------------------------------------------------------- // Profile 2 //--------------------------------------------------------------- lstrcpy(szMsg, TEXT("Set HwProf Flags for config 2: ")); Status = CM_Set_HW_Prof_Flags(TEXT("Root\\Device001\\0000"), 2, C2, 0); if (Status != CR_SUCCESS) { wsprintf(szMsg1, TEXT("Failed (%xh), Flags = %xh"), Status, C2); } else wsprintf(szMsg1, TEXT("Passed (%xh), Flags = %xh"), Status, C2); lstrcat(szMsg, szMsg1); SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); lstrcpy(szMsg, TEXT("Get Hw Profile for config 2: ")); ulValue = 0; Status = CM_Get_HW_Prof_Flags(TEXT("Root\\Device001\\0000"), 2, &ulValue, 0); if (Status != CR_SUCCESS || C2 != ulValue) { wsprintf(szMsg1, TEXT("Failed (%xh), Flags = %xh"), Status, ulValue); } else wsprintf(szMsg1, TEXT("Passed (%xh), Flags = %xh"), Status, ulValue); lstrcat(szMsg, szMsg1); SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); //--------------------------------------------------------------- // Current Profile //--------------------------------------------------------------- lstrcpy(szMsg, TEXT("Set HwProf Flags for current config: ")); Status = CM_Set_HW_Prof_Flags(TEXT("Root\\Device001\\0000"), 0, C0, 0); if (Status != CR_SUCCESS) { wsprintf(szMsg1, TEXT("Failed (%xh), Flags = %xh"), Status, C0); } else wsprintf(szMsg1, TEXT("Passed (%xh), Flags = %xh"), Status, C0); lstrcat(szMsg, szMsg1); SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); lstrcpy(szMsg, TEXT("Get Hw Profile for current config: ")); ulValue = 0; Status = CM_Get_HW_Prof_Flags(TEXT("Root\\Device001\\0000"), 0, &ulValue, 0); if (Status != CR_SUCCESS || C0 != ulValue) { wsprintf(szMsg1, TEXT("Failed (%xh), Flags = %xh"), Status, ulValue); } else wsprintf(szMsg1, TEXT("Passed (%xh), Flags = %xh"), Status, ulValue); lstrcat(szMsg, szMsg1); SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); */ //--------------------------------------------------------------- // Test CM_Get_HW_Prof_Info //--------------------------------------------------------------- lstrcpy(szMsg, TEXT("Get HwProf Info test:")); Status = CM_Get_Hardware_Profile_Info_Ex(0xFFFFFFFF, &HWProfileInfo, 0, hMachine); if (Status != CR_SUCCESS) { wsprintf(szMsg1, TEXT("Failed (%xh)"), Status); } else wsprintf(szMsg1, TEXT("Passed (%xh)"), Status); lstrcat(szMsg, szMsg1); SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); wsprintf(szMsg, TEXT(" Current (%u) HW Profile: %s, Flags=%xh"), HWProfileInfo.HWPI_ulHWProfile, HWProfileInfo.HWPI_szFriendlyName, HWProfileInfo.HWPI_dwFlags); SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); Index = 0; Status = CR_SUCCESS; while (Status == CR_SUCCESS) { Status = CM_Get_Hardware_Profile_Info(Index, &HWProfileInfo, 0); if (Status == CR_SUCCESS) { wsprintf(szMsg, TEXT(" HW Profile %u: %s, Flags=%xh"), HWProfileInfo.HWPI_ulHWProfile, HWProfileInfo.HWPI_szFriendlyName, HWProfileInfo.HWPI_dwFlags); SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); } Index++; } // reset to pre-test conditions CM_Set_HW_Prof_Flags(TEXT("Root\\Device001\\0000"), 0, 0, 0); CM_Set_HW_Prof_Flags(TEXT("Root\\Device001\\0000"), 1, 0, 0); CM_Set_HW_Prof_Flags(TEXT("Root\\Device001\\0000"), 2, 0, 0); return; } // RegressionTest_HardwareProfile //----------------------------------------------------------------------------- VOID RegressionTest_DeviceList( HWND hDlg ) { CONFIGRET Status = CR_SUCCESS; PTSTR pBuffer = NULL, p = NULL; ULONG ulSize = 0; TCHAR szMsg[MAX_PATH], szMsg1[MAX_PATH]; TCHAR pDeviceID[MAX_PATH]; GUID InterfaceGuid; TCHAR szAlias[MAX_PATH]; lstrcpy(szMsg, TEXT("Test Device ID List Size:")); Status = CM_Get_Device_ID_List_Size_Ex(&ulSize, NULL, CM_GETIDLIST_FILTER_NONE, hMachine); if (Status != CR_SUCCESS) { wsprintf(szMsg1, TEXT("Failed (%xh)"), Status); } else wsprintf(szMsg1, TEXT("Passed (%xh)"), Status); lstrcat(szMsg, szMsg1); SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); lstrcpy(szMsg, TEXT("Test Device ID List:")); pBuffer = malloc(ulSize * sizeof(TCHAR)); Status = CM_Get_Device_ID_List_Ex(NULL, pBuffer, ulSize, CM_GETIDLIST_FILTER_NONE, hMachine); if (Status != CR_SUCCESS) { wsprintf(szMsg1, TEXT("Failed (%xh)"), Status); } else wsprintf(szMsg1, TEXT("Passed (%xh)"), Status); lstrcat(szMsg, szMsg1); SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); lstrcpy(szMsg, TEXT("Device ID List (small buffer):")); Status = CM_Get_Device_ID_List_Ex(NULL, pBuffer, ulSize/2, CM_GETIDLIST_FILTER_NONE, NULL); if (Status != CR_BUFFER_SMALL) { wsprintf(szMsg1, TEXT("Failed (%xh)"), Status); } else wsprintf(szMsg1, TEXT("Passed (%xh)"), Status); lstrcat(szMsg, szMsg1); SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); free(pBuffer); // initialize device instance and interface guid for tests lstrcpy(pDeviceID, TEXT("Root\\PnPTest\\0000")); UuidFromString(TEXT("aaaaaaa2-e3f0-101b-8488-00aa003e5601"), &InterfaceGuid); // Test 1. No DevNode, Get Present SendDlgItemMessage(hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)TEXT("Test 1 - No Devnode, Get-present")); /* Status = CM_Get_Interface_Device_List_Size(&ulSize, &InterfaceGuid, 0, CM_GET_INTERFACE_DEVICE_LIST_PRESENT); if (Status == CR_SUCCESS) { wsprintf(szMsg, TEXT("Size = %d"), ulSize); } else { wsprintf(szMsg, TEXT("Error getting size, %d"), Status); } SendDlgItemMessage(hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); */ ulSize = 0x53; pBuffer = malloc(ulSize * sizeof(TCHAR)); Status = CM_Get_Device_Interface_List(&InterfaceGuid, 0, pBuffer, ulSize, CM_GET_DEVICE_INTERFACE_LIST_PRESENT); if (Status != CR_SUCCESS) { wsprintf(szMsg, TEXT("Status = %d"), Status); SendDlgItemMessage(hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); } else { for (p = pBuffer; *p; p += lstrlen(pBuffer) + 1) { SendDlgItemMessage(hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)p); } } free(pBuffer); // Test 2. Devnode specified, Get Present SendDlgItemMessage(hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)TEXT("Test 2 - Devnode, Get-present")); Status = CM_Get_Device_Interface_List_Size(&ulSize, &InterfaceGuid, pDeviceID, CM_GET_DEVICE_INTERFACE_LIST_PRESENT); if (Status == CR_SUCCESS) { wsprintf(szMsg, TEXT("Size = %d"), ulSize); } else { wsprintf(szMsg, TEXT("Error getting size, %d"), Status); } SendDlgItemMessage(hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); pBuffer = malloc(ulSize * sizeof(TCHAR)); Status = CM_Get_Device_Interface_List(&InterfaceGuid, pDeviceID, pBuffer, ulSize, CM_GET_DEVICE_INTERFACE_LIST_PRESENT); if (Status != CR_SUCCESS) { wsprintf(szMsg, TEXT("Status = %d"), Status); SendDlgItemMessage(hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); } else { for (p = pBuffer; *p; p += lstrlen(pBuffer) + 1) { SendDlgItemMessage(hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)p); } } free(pBuffer); // Test 3. No Devnode, Get All SendDlgItemMessage(hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)TEXT("Test 3 - No Devnode, Get-all")); Status = CM_Get_Device_Interface_List_Size(&ulSize, &InterfaceGuid, 0, CM_GET_DEVICE_INTERFACE_LIST_ALL_DEVICES); if (Status == CR_SUCCESS) { wsprintf(szMsg, TEXT("Size = %d"), ulSize); } else { wsprintf(szMsg, TEXT("Error getting size, %d"), Status); } SendDlgItemMessage(hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); pBuffer = malloc(ulSize * sizeof(TCHAR)); Status = CM_Get_Device_Interface_List(&InterfaceGuid, 0, pBuffer, ulSize, CM_GET_DEVICE_INTERFACE_LIST_ALL_DEVICES); if (Status != CR_SUCCESS) { wsprintf(szMsg, TEXT("Status = %d"), Status); SendDlgItemMessage(hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); } else { for (p = pBuffer; *p; p += lstrlen(pBuffer) + 1) { SendDlgItemMessage(hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)p); ulSize = MAX_PATH; Status = CM_Get_Device_Interface_Alias(p, &InterfaceGuid, szAlias, &ulSize, 0); if (Status == CR_SUCCESS) { wsprintf(szMsg, TEXT("Alias: %s"), szAlias); SendDlgItemMessage(hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); } else { wsprintf(szMsg, TEXT("Error getting alias, %d"), Status); SendDlgItemMessage(hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); } } } free(pBuffer); // Test 4. Devnode specified, Get All SendDlgItemMessage(hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)TEXT("Test 4 - Devnode, Get-all")); Status = CM_Get_Device_Interface_List_Size(&ulSize, &InterfaceGuid, pDeviceID, CM_GET_DEVICE_INTERFACE_LIST_ALL_DEVICES); if (Status == CR_SUCCESS) { wsprintf(szMsg, TEXT("Size = %d"), ulSize); } else { wsprintf(szMsg, TEXT("Error getting size, %d"), Status); } SendDlgItemMessage(hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); pBuffer = malloc(ulSize * sizeof(TCHAR)); Status = CM_Get_Device_Interface_List(&InterfaceGuid, pDeviceID, pBuffer, ulSize, CM_GET_DEVICE_INTERFACE_LIST_ALL_DEVICES); if (Status != CR_SUCCESS) { wsprintf(szMsg, TEXT("Status = %d"), Status); SendDlgItemMessage(hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); } else { for (p = pBuffer; *p; p += lstrlen(pBuffer) + 1) { SendDlgItemMessage(hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)p); } } free(pBuffer); // Test 5. Get aliases SendDlgItemMessage(hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)TEXT("Test 5 - Get aliases")); CM_Get_Device_Interface_List_Size(&ulSize, &InterfaceGuid, pDeviceID, CM_GET_DEVICE_INTERFACE_LIST_ALL_DEVICES); pBuffer = malloc(ulSize * sizeof(TCHAR)); CM_Get_Device_Interface_List(&InterfaceGuid, pDeviceID, pBuffer, ulSize, CM_GET_DEVICE_INTERFACE_LIST_ALL_DEVICES); for (p = pBuffer; *p; p += lstrlen(pBuffer) + 1) { ulSize = MAX_PATH; Status = CM_Get_Device_Interface_Alias(p, &InterfaceGuid, szAlias, &ulSize, 0); if (Status == CR_SUCCESS) { SendDlgItemMessage(hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szAlias); } else { wsprintf(szMsg, TEXT("Error getting alias, %d"), Status); SendDlgItemMessage(hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); } } free(pBuffer); return; } // RegressionTest_DeviceList //----------------------------------------------------------------------------- VOID RegressionTest_CreateDevNode( HWND hDlg ) { CONFIGRET Status = CR_SUCCESS; DEVNODE dnDevNode, dnParent, dnDevNode1, dnTemp; TCHAR szMsg[MAX_PATH], szMsg1[MAX_PATH], szTemp[MAX_PATH]; ULONG ulSize = 0; SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)TEXT("____CreateDevNode REGRESSION TEST_____")); lstrcpy(szMsg, TEXT("1. Locate Root DevNode: ")); Status = CM_Locate_DevNode(&dnParent, NULL, CM_LOCATE_DEVNODE_NORMAL); if (Status != CR_SUCCESS) { wsprintf(szMsg1, TEXT("Failed (%xh)"), Status); } else wsprintf(szMsg1, TEXT("Passed (%xh)"), Status); lstrcat(szMsg, szMsg1); SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); lstrcpy(szMsg, TEXT("2. Create Root\\CreateTest\\0000: ")); Status = CM_Create_DevNode(&dnDevNode, TEXT("Root\\CreateTest\\0000"), dnParent, 0); if (Status != CR_SUCCESS) { wsprintf(szMsg1, TEXT("Failed (%xh)"), Status); } else wsprintf(szMsg1, TEXT("Passed (%xh)"), Status); lstrcat(szMsg, szMsg1); SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); lstrcpy(szMsg, TEXT("3. Locate Root\\CreateTest\\0000: ")); Status = CM_Locate_DevNode(&dnDevNode, TEXT("Root\\CreateTest\\0000"), CM_LOCATE_DEVNODE_NORMAL); if (Status != CR_SUCCESS) { wsprintf(szMsg1, TEXT("Failed (%xh)"), Status); } else wsprintf(szMsg1, TEXT("Passed (%xh)"), Status); lstrcat(szMsg, szMsg1); SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); lstrcpy(szMsg, TEXT("4. Test generate id with bad device: ")); Status = CM_Create_DevNode(&dnTemp, TEXT("Create\\Test"), dnParent, CM_CREATE_DEVNODE_GENERATE_ID); if (Status != CR_INVALID_DEVICE_ID) { wsprintf(szMsg1, TEXT("Failed (%xh)"), Status); } else wsprintf(szMsg1, TEXT("Passed (%xh)"), Status); lstrcat(szMsg, szMsg1); SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); lstrcpy(szMsg, TEXT("5. Create based on CreateTest1: ")); Status = CM_Create_DevNode(&dnDevNode1, TEXT("CreateTest1"), dnParent, CM_CREATE_DEVNODE_GENERATE_ID); if (Status != CR_SUCCESS) { wsprintf(szMsg1, TEXT("Failed (%xh)"), Status); } else wsprintf(szMsg1, TEXT("Passed (%xh)"), Status); lstrcat(szMsg, szMsg1); SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); lstrcpy(szMsg, TEXT("6. Create Phantom Root\\CreateTest2\\0000: ")); Status = CM_Create_DevNode(&dnTemp, TEXT("Root\\CreateTest2\\0000"), dnParent, CM_CREATE_DEVNODE_PHANTOM); if (Status != CR_SUCCESS) { wsprintf(szMsg1, TEXT("Failed (%xh)"), Status); } else wsprintf(szMsg1, TEXT("Passed (%xh)"), Status); lstrcat(szMsg, szMsg1); SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); lstrcpy(szMsg, TEXT("7. Uninstall phantom Root\\CreateTest2\\0000: ")); Status = CM_Uninstall_DevNode(dnTemp, 0); if (Status != CR_SUCCESS) { wsprintf(szMsg1, TEXT("Failed (%xh)"), Status); } else wsprintf(szMsg1, TEXT("Passed (%xh)"), Status); lstrcat(szMsg, szMsg1); SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); lstrcpy(szMsg, TEXT("8. Uninstall real Root\\CreateTest1\\0000: ")); Status = CM_Uninstall_DevNode(dnDevNode1, 0); if (Status != CR_SUCCESS) { wsprintf(szMsg1, TEXT("Failed (%xh)"), Status); } else wsprintf(szMsg1, TEXT("Passed (%xh)"), Status); lstrcat(szMsg, szMsg1); SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); lstrcpy(szMsg, TEXT("8. Cancel remove or real Root\\CreateTest1\\0000: ")); Status = CM_Locate_DevNode(&dnDevNode1, TEXT("Root\\CreateTest1\\0000"), CM_LOCATE_DEVNODE_CANCELREMOVE); if (Status != CR_SUCCESS) { wsprintf(szMsg1, TEXT("Failed (%xh)"), Status); } else wsprintf(szMsg1, TEXT("Passed (%xh)"), Status); lstrcat(szMsg, szMsg1); SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); lstrcpy(szMsg, TEXT("9. Register device driver for Root\\Device001\\0000: ")); Status = CM_Locate_DevNode(&dnDevNode1, TEXT("Root\\Device001\\0000"), CM_LOCATE_DEVNODE_NORMAL); if (Status != CR_SUCCESS) { wsprintf(szMsg1, TEXT("Failed (%xh)"), Status); } else { Status = CM_Register_Device_Driver(dnDevNode1, CM_REGISTER_DEVICE_DRIVER_DISABLEABLE | CM_REGISTER_DEVICE_DRIVER_REMOVABLE); if (Status != CR_SUCCESS) { wsprintf(szMsg1, TEXT("Failed (%xh)"), Status); } else { wsprintf(szMsg1, TEXT("Passed (%xh)"), Status); } } lstrcat(szMsg, szMsg1); SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); lstrcpy(szMsg, TEXT("REG1. test devnode handle consistency: ")); // create device id with generated instance CM_Create_DevNode(&dnDevNode, TEXT("GenerateID"), dnParent, CM_CREATE_DEVNODE_NORMAL | CM_CREATE_DEVNODE_GENERATE_ID); // Get back the device id CM_Get_Device_ID(dnDevNode, szTemp, MAX_PATH - 1, 0); wsprintf(szMsg, TEXT(" Generated device instance: %s"), szTemp); SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); CM_Locate_DevNode(&dnDevNode1, szTemp, 0); if (dnDevNode != dnDevNode1) { SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)TEXT("Created and located devnode handles don't match (error)")); } else { SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)TEXT("Created and located devnode handles match (expected)")); } // if not generating an instance, the devinst must be a full valid devinst // with the three component parts. lstrcpy(szMsg, TEXT("REG2. Invalid device instance, no generate: ")); Status = CM_Create_DevNode(&dnDevNode, TEXT("BadDevInst"), dnParent, CM_CREATE_DEVNODE_NORMAL); if (Status == CR_INVALID_DEVINST) { lstrcat(szMsg, TEXT("Failed (expected)")); } else { lstrcat(szMsg, TEXT("Error: should've failed")); } SendDlgItemMessage(hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); /* lstrcpy(szMsg, TEXT("9. Move CreateTest\\0000 to CreateTest1\\0000: ")); Status = CM_Move_DevNode(dnDevNode, dnDevNode1, 0); if (Status != CR_SUCCESS) { wsprintf(szMsg1, TEXT("Failed (%xh)"), Status); } else wsprintf(szMsg1, TEXT("Passed (%xh)"), Status); lstrcat(szMsg, szMsg1); SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); */ return; } // RegressionTest_CreateDevNode //----------------------------------------------------------------------------- VOID RegressionTest_Properties( HWND hDlg ) { CONFIGRET Status = CR_SUCCESS; DEVNODE dnDevNode; TCHAR szMsg[MAX_PATH], szMsg1[MAX_PATH], pszString[MAX_PATH]; LPTSTR p = NULL; ULONG ulValue = 0, ulSize = 0, ulType = 0; TCHAR pData[1024]; SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)TEXT("____Properties REGRESSION TEST_____")); Status = CM_Locate_DevNode(&dnDevNode, TEXT("Root\\Device001\\0000"), CM_LOCATE_DEVNODE_NORMAL); if (Status != CR_SUCCESS) { return; } CM_Set_DevNode_Registry_Property(dnDevNode, CM_DRP_FRIENDLYNAME, NULL, 0, 0); lstrcpy(szMsg, TEXT("Set/Get CM_DRP_FRIENDLYNAME: ")); lstrcpy(pszString, TEXT("FriendlyName")); ulSize = (lstrlen(pszString) + 1) * sizeof(TCHAR); Status = CM_Set_DevNode_Registry_Property(dnDevNode, CM_DRP_FRIENDLYNAME, pszString, ulSize, 0); if (Status != CR_SUCCESS) { wsprintf(szMsg1, TEXT("Failed (%xh)"), Status); } else { pszString[0] = '\0'; Status = CM_Get_DevNode_Registry_Property(dnDevNode, CM_DRP_FRIENDLYNAME, &ulType, pszString, &ulSize, 0); if (Status != CR_SUCCESS) { wsprintf(szMsg1, TEXT("Failed (%xh)"), Status); } else wsprintf(szMsg1, TEXT("Passed, %s, %d"), pszString, ulType); } lstrcat(szMsg, szMsg1); SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); CM_Set_DevNode_Registry_Property(dnDevNode, CM_DRP_DEVICEDESC, NULL, 0, 0); lstrcpy(szMsg, TEXT("Set/Get DeviceDesc: ")); lstrcpy(pszString, TEXT("DeviceDesc")); ulSize = (lstrlen(pszString) + 1) * sizeof(TCHAR); Status = CM_Set_DevNode_Registry_Property(dnDevNode, CM_DRP_DEVICEDESC, pszString, ulSize, 0); if (Status != CR_SUCCESS) { wsprintf(szMsg1, TEXT("Failed (%xh)"), Status); } else { pszString[0] = '\0'; Status = CM_Get_DevNode_Registry_Property(dnDevNode, CM_DRP_DEVICEDESC, &ulType, pszString, &ulSize, 0); if (Status != CR_SUCCESS) { wsprintf(szMsg1, TEXT("Failed (%xh)"), Status); } else wsprintf(szMsg1, TEXT("Passed, %s, %d"), pszString, ulType); } lstrcat(szMsg, szMsg1); SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); CM_Set_DevNode_Registry_Property(dnDevNode, CM_DRP_CONFIGFLAGS, NULL, 0, 0); lstrcpy(szMsg, TEXT("Set/Get CM_DRP_CONFIGFLAGS: ")); ulValue = 0x0008; ulSize = sizeof(DWORD); Status = CM_Set_DevNode_Registry_Property(dnDevNode, CM_DRP_CONFIGFLAGS, &ulValue, ulSize, 0); if (Status != CR_SUCCESS) { wsprintf(szMsg1, TEXT("Failed (%xh)"), Status); } else { ulValue = 0; Status = CM_Get_DevNode_Registry_Property(dnDevNode, CM_DRP_CONFIGFLAGS, &ulType, &ulValue, &ulSize, 0); if (Status != CR_SUCCESS) { wsprintf(szMsg1, TEXT("Failed (%xh)"), Status); } else wsprintf(szMsg1, TEXT("Passed, %d, %d"), ulValue, ulType); } lstrcat(szMsg, szMsg1); SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); // // CM_DRP_LOCATION_INFORMATION // lstrcpy(szMsg, TEXT("CM_DRP_LOCATION_INFORMATION: ")); lstrcpy(pszString, TEXT("Madeup location")); ulSize = (lstrlen(pszString) + 1) * sizeof(TCHAR); Status = CM_Set_DevNode_Registry_Property(dnDevNode, CM_DRP_LOCATION_INFORMATION, pszString, ulSize, 0); if (Status != CR_SUCCESS) { wsprintf(szMsg1, TEXT("Failed (%xh)"), Status); } else { pszString[0] = '\0'; Status = CM_Get_DevNode_Registry_Property(dnDevNode, CM_DRP_LOCATION_INFORMATION, &ulType, pszString, &ulSize, 0); if (Status != CR_SUCCESS) { wsprintf(szMsg1, TEXT("Failed (%xh)"), Status); } else { wsprintf(szMsg1, TEXT("Passed, %s, %d"), pszString, ulType); } } lstrcat(szMsg, szMsg1); SendDlgItemMessage(hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); // // CM_DRP_UPPER_FILTERS // lstrcpy(szMsg, TEXT("CM_DRP_LOWERFILTERS: ")); ulSize = MAX_PATH/sizeof(WCHAR); pszString[0] = '\0'; Status = CM_Get_DevNode_Registry_Property(dnDevNode, CM_DRP_LOWERFILTERS, &ulType, pszString, &ulSize, 0); if (Status != CR_SUCCESS) { wsprintf(szMsg1, TEXT("Failed (%xh)"), Status); lstrcat(szMsg, szMsg1); SendDlgItemMessage(hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); } else { wsprintf(szMsg1, TEXT("Passed, %d"), ulType); lstrcat(szMsg, szMsg1); SendDlgItemMessage(hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); for (p = pszString; *p; p += lstrlen(p) + 1) { SendDlgItemMessage(hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)p); } } // // CM_DRP_UPPER_FILTERS // lstrcpy(szMsg, TEXT("CM_DRP_UPPERFILTERS: ")); ulSize = MAX_PATH/sizeof(WCHAR); pszString[0] = '\0'; Status = CM_Get_DevNode_Registry_Property(dnDevNode, CM_DRP_UPPERFILTERS, &ulType, pszString, &ulSize, 0); if (Status != CR_SUCCESS) { wsprintf(szMsg1, TEXT("Failed (%xh)"), Status); lstrcat(szMsg, szMsg1); SendDlgItemMessage(hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); } else { wsprintf(szMsg1, TEXT("Passed, %d"), ulType); lstrcat(szMsg, szMsg1); SendDlgItemMessage(hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); for (p = pszString; *p; p += lstrlen(p) + 1) { SendDlgItemMessage(hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)p); } } // // CM_DRP_CAPABILITIES // lstrcpy(szMsg, TEXT("CM_DRP_CAPABILITIES: ")); ulSize = sizeof(DWORD); ulValue = 0; Status = CM_Get_DevNode_Registry_Property(dnDevNode, CM_DRP_CAPABILITIES, &ulType, &ulValue, &ulSize, 0); if (Status != CR_SUCCESS) { wsprintf(szMsg1, TEXT("Failed (%xh)"), Status); } else { wsprintf(szMsg1, TEXT("Passed, value = %d, %d"), ulValue, ulType); } lstrcat(szMsg, szMsg1); SendDlgItemMessage(hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); // // CM_DRP_UI_NUMBER // lstrcpy(szMsg, TEXT("CM_DRP_UI_NUMBER: ")); ulSize = sizeof(DWORD); ulValue = 0; Status = CM_Get_DevNode_Registry_Property(dnDevNode, CM_DRP_UI_NUMBER, &ulType, &ulValue, &ulSize, 0); if (Status != CR_SUCCESS) { wsprintf(szMsg1, TEXT("Failed (%xh)"), Status); } else { wsprintf(szMsg1, TEXT("Passed, value = %d, %d"), ulValue, ulType); } lstrcat(szMsg, szMsg1); SendDlgItemMessage(hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); // // Another special test, go to a real devnode made by pnptest for this property // since it's not in the registry: CM_DRP_PHYSICAL_DEVICE_OBJECT_NAME // Status = CM_Locate_DevNode(&dnDevNode, TEXT("PnPTest\\Pdo0\\Root&LEGACY_PNPTEST&0000&1111"), CM_LOCATE_DEVNODE_NORMAL); if (Status != CR_SUCCESS) { return; } lstrcpy(szMsg, TEXT("CM_DRP_PHYSICAL_DEVICE_OBJECT_NAME: ")); ulSize = MAX_PATH/sizeof(WCHAR); pszString[0] = '\0'; Status = CM_Get_DevNode_Registry_Property(dnDevNode, CM_DRP_PHYSICAL_DEVICE_OBJECT_NAME, &ulType, pszString, &ulSize, 0); if (Status != CR_SUCCESS) { wsprintf(szMsg1, TEXT("Failed (%xh)"), Status); } else { wsprintf(szMsg1, TEXT("Passed, %s, %d"), pszString, ulType); } lstrcat(szMsg, szMsg1); SendDlgItemMessage(hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); //---------------------------------------------------------------- // Add_ID test //---------------------------------------------------------------- // clear hardware id property CM_Set_DevNode_Registry_Property_Ex(dnDevNode, CM_DRP_HARDWAREID, NULL, 0, 0, hMachine); lstrcpy(szMsg, TEXT("Add Hardware ID (SomeHardwareID\\0001): ")); Status = CM_Add_ID_Ex(dnDevNode, TEXT("SomeHardwareID\\0001"), CM_ADD_ID_HARDWARE, hMachine); if (Status != CR_SUCCESS) { wsprintf(szMsg1, TEXT("Failed (%xh)"), Status); } else { wsprintf(szMsg1, TEXT("Passed (%xh)"), Status); } lstrcat(szMsg, szMsg1); SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); lstrcpy(szMsg, TEXT("Add Hardware ID (AnotherHardwareID\\0002): ")); Status = CM_Add_ID_Ex(dnDevNode, TEXT("AnotherHardwareID\\0002"), CM_ADD_ID_HARDWARE, hMachine); if (Status != CR_SUCCESS) { wsprintf(szMsg1, TEXT("Failed (%xh)"), Status); } else { wsprintf(szMsg1, TEXT("Passed (%xh)"), Status); } lstrcat(szMsg, szMsg1); SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); ulSize = 1024; Status = CM_Get_DevNode_Registry_Property_Ex(dnDevNode, CM_DRP_HARDWAREID, &ulType, pData, &ulSize, 0, hMachine); lstrcpy(szMsg, TEXT("Current HardwareID: ")); for (p = pData; *p; p += lstrlen(p) + 1) { lstrcat(szMsg, p); lstrcat(szMsg, TEXT(" ")); } SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); // clear compatible id property CM_Set_DevNode_Registry_Property_Ex(dnDevNode, CM_DRP_COMPATIBLEIDS, NULL, 0, 0, hMachine); lstrcpy(szMsg, TEXT("Add Compatible ID (SomeCompatibleID\\0001): ")); Status = CM_Add_ID_Ex(dnDevNode, TEXT("SomeCompatibleID\\0001"), CM_ADD_ID_COMPATIBLE, hMachine); if (Status != CR_SUCCESS) { wsprintf(szMsg1, TEXT("Failed (%xh)"), Status); } else { wsprintf(szMsg1, TEXT("Passed (%xh)"), Status); } lstrcat(szMsg, szMsg1); SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); lstrcpy(szMsg, TEXT("Add Compatible ID (AnotherCompatibleID\\0002): ")); Status = CM_Add_ID_Ex(dnDevNode, TEXT("AnotherCompatibleID\\0002"), CM_ADD_ID_COMPATIBLE, hMachine); if (Status != CR_SUCCESS) { wsprintf(szMsg1, TEXT("Failed (%xh)"), Status); } else { wsprintf(szMsg1, TEXT("Passed (%xh)"), Status); } lstrcat(szMsg, szMsg1); SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); ulSize = 1024; Status = CM_Get_DevNode_Registry_Property_Ex(dnDevNode, CM_DRP_COMPATIBLEIDS, &ulType, pData, &ulSize, 0, hMachine); lstrcpy(szMsg, TEXT("Current CompatibleID: ")); for (p = pData; *p; p += lstrlen(p) + 1) { lstrcat(szMsg, p); lstrcat(szMsg, TEXT(" ")); } SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); /* lstrcpy(szMsg, TEXT("Read CM_DRP_DEVICEDESC: ")); ulSize = MAX_PATH; Status = CM_Get_DevNode_Registry_Property( dnDevNode, CM_DRP_DEVICEDESC, &ulType, pszString, &ulSize, 0); if (Status != CR_SUCCESS) { wsprintf(szMsg1, TEXT("Failed (%xh)"), Status); } else wsprintf(szMsg1, TEXT("Passed, %s %d"), pszString, ulType); lstrcat(szMsg, szMsg1); SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); lstrcpy(szMsg, TEXT("2. Read CM_DRP_HARDWAREID: ")); ulSize = MAX_PATH; Status = CM_Get_DevNode_Registry_Property( dnDevNode, CM_DRP_HARDWAREID, &ulType, pszString, &ulSize, 0); if (Status != CR_SUCCESS) { wsprintf(szMsg1, TEXT("Failed (%xh)"), Status); } else { wsprintf(szMsg1, TEXT("Passed, %d, "), ulType); for (p = pszString; *p; p += lstrlen(p)+1) { lstrcat(szMsg1, p); } } lstrcat(szMsg, szMsg1); SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); lstrcpy(szMsg, TEXT("3. Read CM_DRP_COMPATIBLEIDS: ")); ulSize = MAX_PATH; Status = CM_Get_DevNode_Registry_Property( dnDevNode, CM_DRP_COMPATIBLEIDS, &ulType, pszString, &ulSize, 0); if (Status != CR_SUCCESS) { wsprintf(szMsg1, TEXT("Failed (%xh)"), Status); } else { wsprintf(szMsg1, TEXT("Passed, %d, "), ulType); for (p = pszString; *p; p += lstrlen(p)+1) { lstrcat(szMsg1, p); } } lstrcat(szMsg, szMsg1); SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); lstrcpy(szMsg, TEXT("4. Read CM_DRP_CONFIGFLAGS: ")); ulSize = sizeof(ULONG); Status = CM_Get_DevNode_Registry_Property( dnDevNode, CM_DRP_CONFIGFLAGS, &ulType, &ulValue, &ulSize, 0); if (Status != CR_SUCCESS) { wsprintf(szMsg1, TEXT("Failed (%xh)"), Status); } else { wsprintf(szMsg1, TEXT("Passed, %d %d"), ulValue, ulType); } lstrcat(szMsg, szMsg1); SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); */ return; } // RegressionTest_Properties //----------------------------------------------------------------------------- VOID RegressionTest_DeviceClass( HWND hDlg ) { CONFIGRET Status; TCHAR szMsg[MAX_PATH], szMsg1[MAX_PATH]; TCHAR szDevice[MAX_PATH], szReference[MAX_PATH], szInterfaceDevice[MAX_PATH]; DEVNODE dnDevNode; TCHAR Buffer[512]; PTSTR pBuffer = NULL; GUID InterfaceGuid; ULONG ulSize; lstrcpy(szDevice, TEXT("PnPTest\\Pdo0\\Root&LEGACY_PNPTEST&0000&1111")); //UuidFromString(TEXT("aaaaaaa2-e3f0-101b-8488-00aa003e5601"), &InterfaceGuid); UuidFromString(TEXT("11111111-2222-3333-4444-555555555555"), &InterfaceGuid); SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)TEXT("____DEVICE CLASS REGRESSION TEST_____")); // // get a devinst handle for this device instance // Status = CM_Locate_DevNode(&dnDevNode, szDevice, CM_LOCATE_DEVNODE_NORMAL); if (Status != CR_SUCCESS) { return; } // // Register a device class assocation with a ref string // lstrcpy(szReference, TEXT("RefStringA")); ulSize = MAX_PATH; Status = CM_Register_Device_Interface(dnDevNode, &InterfaceGuid, szReference, szInterfaceDevice, &ulSize, 0); if (Status == CR_SUCCESS) { SendDlgItemMessage(hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szInterfaceDevice); } else { wsprintf(szMsg, TEXT("Error registering dev class association, %d"), Status); SendDlgItemMessage(hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); } // // Unregister the device class association // Status = CM_Unregister_Device_Interface(szInterfaceDevice, 0); if (Status != CR_SUCCESS) { wsprintf(szMsg, TEXT("Error unregistering dev class association, %d"), Status); SendDlgItemMessage(hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); } // // Register a device class association without a ref string // ulSize = MAX_PATH; Status = CM_Register_Device_Interface(dnDevNode, &InterfaceGuid, NULL, szInterfaceDevice, &ulSize, 0); if (Status == CR_SUCCESS) { SendDlgItemMessage(hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szInterfaceDevice); } else { wsprintf(szMsg, TEXT("Error registering dev class association, %d"), Status); SendDlgItemMessage(hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); } // // Unregister the device class association // Status = CM_Unregister_Device_Interface(szInterfaceDevice, 0); if (Status != CR_SUCCESS) { wsprintf(szMsg, TEXT("Error unregistering dev class association, %d"), Status); SendDlgItemMessage(hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); } return; } // RegressionTest_DeviceClass BOOL DisplayRange( IN HWND hDlg, IN RANGE_LIST rlh ) { CONFIGRET Status = CR_SUCCESS; DWORDLONG ulStart = 0, ulEnd = 0; TCHAR szMsg[MAX_PATH], szTemp[MAX_PATH]; RANGE_LIST rlh1; RANGE_ELEMENT rlElement; Status = CM_First_Range(rlh, &ulStart, &ulEnd, &rlElement, 0); if (Status != CR_SUCCESS) { wsprintf(szMsg, TEXT("CM_First_Range failed (%xh)"), Status); goto Clean0; } wsprintf(szMsg, TEXT("(%d,%d)"), (DWORD)ulStart, (DWORD)ulEnd); while (Status == CR_SUCCESS) { Status = CM_Next_Range(&rlElement, &ulStart, &ulEnd, 0); if (Status == CR_SUCCESS) { wsprintf(szTemp, TEXT(",(%d,%d)"), (DWORD)ulStart, (DWORD)ulEnd); lstrcat(szMsg, szTemp); } } Clean0: SendDlgItemMessage( hDlg, ID_LB_REGRESSION, LB_ADDSTRING, 0, (LPARAM)(LPTSTR)szMsg); return TRUE; } // DisplayRange BOOL TraverseAndCheckParents ( DEVNODE dnParent ) { CONFIGRET configRet; DEVNODE dnChild, dnDevNode; // Get first child. configRet = CM_Get_Child_Ex(&dnChild, dnParent, 0, hMachine); if ((configRet != CR_SUCCESS) && (configRet != CR_NO_SUCH_DEVNODE)) { MessageBox(NULL, TEXT("CM_Get_Child failed"), TEXT("Traversal Test"), MB_OK); return FALSE; } // Check to see that the parent is correct and iterate thru the siblings. while (configRet == CR_SUCCESS) { configRet = CM_Get_Parent_Ex(&dnDevNode, dnChild, 0, hMachine); if (configRet == CR_SUCCESS) { if (dnDevNode != dnParent) { // No parent, or not the correct parent. MessageBox(NULL, TEXT("Not correct parent"), TEXT("Traversal Test"), MB_OK); return FALSE; } } else { MessageBox(NULL, TEXT("CM_Get_Parent failed"), TEXT("Traversal Test"), MB_OK); return FALSE; } // Recursively traverse the hardware tree. if (!TraverseAndCheckParents(dnChild)) { return FALSE; } // Iterate thru the siblings. configRet = CM_Get_Sibling_Ex(&dnChild, dnChild, 0, hMachine); if ((configRet != CR_SUCCESS) && (configRet != CR_NO_SUCH_DEVNODE)) { MessageBox(NULL, TEXT("CM_Get_Sibling failed"), TEXT("Traversal Test"), MB_OK); return FALSE; } } return TRUE; } // TraverseAndCheckParents