//---------------------------------------------------------------------------- // // Copyright (c) 1997-1999 Microsoft Corporation // All rights reserved. // // File Name: // numcards.c // // Description: // This file contains the dialog procedure for the number of network // cards page (IDD_NUMBERNETCARDS). // //---------------------------------------------------------------------------- #include "pch.h" #include "resource.h" #define NET_SPIN_CONTROL_MIN 2 #define NET_SPIN_CONTROL_MAX 20 //---------------------------------------------------------------------------- // // Function: DeleteList // // Purpose: // // Arguments: // // Returns: // //---------------------------------------------------------------------------- VOID DeleteList( IN OUT NETWORK_ADAPTER_NODE *pNetworkAdapterList ) { NETWORK_ADAPTER_NODE *head; head = pNetworkAdapterList; while( head != NULL ) { pNetworkAdapterList = pNetworkAdapterList->next; free( head ); head = pNetworkAdapterList; } pNetworkAdapterList = NULL; } //---------------------------------------------------------------------------- // // Function: InstallDefaultNetComponents // // Purpose: Marks these three network components as installed and all other // network components as NOT installed // 1. Client for MS networks // 2. File and Print Sharing // 3. TCP/IP protocol // // Arguments: VOID // // Returns: VOID // //---------------------------------------------------------------------------- VOID InstallDefaultNetComponents( VOID ) { NETWORK_COMPONENT *pNetComponent; for( pNetComponent = NetSettings.NetComponentsList; pNetComponent; pNetComponent = pNetComponent->next ) { if( pNetComponent->iPosition == MS_CLIENT_POSITION || pNetComponent->iPosition == FILE_AND_PRINT_SHARING_POSITION || pNetComponent->iPosition == TCPIP_POSITION ) { pNetComponent->bInstalled = TRUE; } else { pNetComponent->bInstalled = FALSE; } } } //---------------------------------------------------------------------------- // // Function: ResetNetworkAdapter // // Purpose: Sets all network card (specified by the formal argument) settings // to their default values // // Arguments: // // Returns: // //---------------------------------------------------------------------------- VOID ResetNetworkAdapter( OUT NETWORK_ADAPTER_NODE *pNetworkCard ) { // ISSUE-2002/02/28-stelo- make sure every network card var is reset here if( pNetworkCard != NULL ) { pNetworkCard->next = NULL; pNetworkCard->previous = NULL; pNetworkCard->szPlugAndPlayID[0] = _T('\0'); pNetworkCard->bObtainIPAddressAutomatically = TRUE; pNetworkCard->szDNSDomainName[0] = _T('\0'); // initialize NetBIOS to "Use value generated by DHCP" option pNetworkCard->iNetBiosOption = 0; ResetNameList( &pNetworkCard->Tcpip_IpAddresses ); ResetNameList( &pNetworkCard->Tcpip_SubnetMaskAddresses ); ResetNameList( &pNetworkCard->Tcpip_GatewayAddresses ); ResetNameList( &pNetworkCard->Tcpip_DnsAddresses ); ResetNameList( &pNetworkCard->Tcpip_WinsAddresses ); lstrcpyn( pNetworkCard->szFrameType, _T("0xFF"), AS(pNetworkCard->szFrameType) ); lstrcpyn( pNetworkCard->szNetworkNumber, _T("00000000"), AS(pNetworkCard->szNetworkNumber) ); } } //---------------------------------------------------------------------------- // // Function: CreateListWithDefaults // // Purpose: // // Arguments: // // Returns: // //---------------------------------------------------------------------------- VOID CreateListWithDefaults( OUT NETWORK_ADAPTER_NODE *pNetworkAdapter ) { NETWORK_COMPONENT *pNetComponent; // // Initialize all the namelists to 0s // ZeroOut( pNetworkAdapter ); ResetNetworkAdapter( pNetworkAdapter ); // // Initialize the entire list to be NOT installed // for( pNetComponent = NetSettings.NetComponentsList; pNetComponent; pNetComponent = pNetComponent->next ) { pNetComponent->bInstalled = FALSE; } } //---------------------------------------------------------------------------- // // Function: ZeroOut // // Purpose: fill the namelists with zero's // this is necessary to do on namelists before they are used // // Arguments: OUT NETWORK_ADAPTER_NODE *pNetworkNode - the node that contains // the namelists to be Zeroed // // Returns: VOID // //---------------------------------------------------------------------------- VOID ZeroOut( OUT NETWORK_ADAPTER_NODE *pNetworkNode) { ZeroMemory( &pNetworkNode->Tcpip_IpAddresses, sizeof( NAMELIST ) ); ZeroMemory( &pNetworkNode->Tcpip_SubnetMaskAddresses, sizeof( NAMELIST ) ); ZeroMemory( &pNetworkNode->Tcpip_GatewayAddresses, sizeof( NAMELIST ) ); ZeroMemory( &pNetworkNode->Tcpip_DnsAddresses, sizeof( NAMELIST ) ); ZeroMemory( &pNetworkNode->Tcpip_WinsAddresses, sizeof( NAMELIST ) ); } //---------------------------------------------------------------------------- // // Function: AddNewNetworkAdapterNode // // Purpose: Adds a new Network Adapter Node (initialized to its default values) // onto the list given as the input arg // // This function only adds to the end of a list. If you do not pass // it the end of the list, the result is undefined. // // Arguments: IN OUT NETWORK_ADAPTER_NODE *pCurrentAdapter - node to add the // new node to // // Returns: VOID // //---------------------------------------------------------------------------- VOID AddNewNetworkAdapterNode( IN OUT NETWORK_ADAPTER_NODE *pCurrentAdapter ) { pCurrentAdapter->next = malloc( sizeof( NETWORK_ADAPTER_NODE ) ); if (pCurrentAdapter->next == NULL) { TerminateTheWizard(IDS_ERROR_OUTOFMEMORY); } CreateListWithDefaults( pCurrentAdapter->next ); InstallDefaultNetComponents(); pCurrentAdapter->next->next = NULL; pCurrentAdapter->next->previous = pCurrentAdapter; } //---------------------------------------------------------------------------- // // Function: AdjustNetworkCardMemory // // Purpose: examines the Global list NetSettings.NetworkCardList // if more network cards are necessary, it allocates more lists // if fewer network cards are necessary, it deallocates the // appropriate number of lists // if they are equal, then do nothing // Therefore, when the function returns, the length of // NetSettings.NetworkCardList is equal to the new number of // network cards // // Arguments: IN int NewNumberOfNetworkCards - // IN int OldNumberOfNetworkCards - // // Returns: VOID // //---------------------------------------------------------------------------- VOID AdjustNetworkCardMemory( IN int NewNumberOfNetworkCards, IN int OldNumberOfNetworkCards ) { INT i; NetSettings.pCurrentAdapter = NetSettings.NetworkAdapterHead; if( NewNumberOfNetworkCards > OldNumberOfNetworkCards ) { // // NewNumberOfNetworkCards-1, the -1 because there is always // at least 1 network adapter list // for( i = 0; i < NewNumberOfNetworkCards-1; i++ ) { // // Allocate more lists, if necessary // if( NetSettings.pCurrentAdapter->next == NULL ) { AddNewNetworkAdapterNode( NetSettings.pCurrentAdapter ); } // // Advance to the next node // NetSettings.pCurrentAdapter = NetSettings.pCurrentAdapter->next; } } else if( NewNumberOfNetworkCards < OldNumberOfNetworkCards ) { NETWORK_ADAPTER_NODE* pTempNode; // used to hold the current position NETWORK_ADAPTER_NODE* pTempNode2; // used delete the list // // Advance to the last network list we are keeping and delete all // the ones after that // for( i = 0; i < (NewNumberOfNetworkCards - 1); i++ ) { NetSettings.pCurrentAdapter = NetSettings.pCurrentAdapter->next; } // // save the pointer to the rest of the list // pTempNode = NetSettings.pCurrentAdapter->next; NetSettings.pCurrentAdapter->next = NULL; for( ; i < NewNumberOfNetworkCards; i++ ) { pTempNode2 = pTempNode; pTempNode = pTempNode->next; // // deallocate the rest of the list // DeleteList( pTempNode2 ); } } // // Reset NetSettings.pCurrentNetworkList to the first node in the list // NetSettings.pCurrentAdapter = NetSettings.NetworkAdapterHead; } //---------------------------------------------------------------------------- // // Function: EnableNetCardControls // // Purpose: Greys or ungreys the 3 controls that let the user change the // number of network cards installed // // Arguments: // // Returns: VOID // //---------------------------------------------------------------------------- VOID EnableNetCardControls( IN HWND hwnd, IN BOOL bState ) { // // Grab handles to each of the controls // HWND hHowManyText = GetDlgItem( hwnd, IDC_HOWMANY_STATIC ); HWND hCountEditBox = GetDlgItem( hwnd, IDC_NUM_CONNECT ); HWND hSpinControl = GetDlgItem( hwnd, IDC_NUMBERNETADAPTERS_SPIN ); // // Grey or ungrey them appropriately // EnableWindow( hHowManyText, bState ); EnableWindow( hCountEditBox, bState ); EnableWindow( hSpinControl, bState ); // // Set the initial value of the spin control // if( bState && NetSettings.iNumberOfNetworkCards > 1 ) { TCHAR szNumberOfNetCards[3]; _itow( NetSettings.iNumberOfNetworkCards, szNumberOfNetCards, 10 ); SetWindowText( hCountEditBox, szNumberOfNetCards ); } } //---------------------------------------------------------------------------- // // Function: OnNumCardsInitDialog // // Purpose: // // Arguments: IN HWND hwnd - handle to the dialog // // Returns: VOID // //---------------------------------------------------------------------------- VOID OnNumCardsInitDialog( IN HWND hwnd ) { // // Set the range on the spin control: NET_SPIN_CONTROL_MIN to // NET_SPIN_CONTROL_MAX // SendDlgItemMessage( hwnd, IDC_NUMBERNETADAPTERS_SPIN, UDM_SETRANGE32, NET_SPIN_CONTROL_MIN, NET_SPIN_CONTROL_MAX ); // // Set the default value for the spin control // SendDlgItemMessage( hwnd, IDC_NUMBERNETADAPTERS_SPIN, UDM_SETPOS, 0, NET_SPIN_CONTROL_MIN ); } //---------------------------------------------------------------------------- // // Function: OnNumberNetCardsSetActive // // Purpose: // // Arguments: IN HWND hwnd - handle to the dialog // // Returns: VOID // //---------------------------------------------------------------------------- VOID OnNumberNetCardsSetActive( IN HWND hwnd ) { if( NetSettings.iNumberOfNetworkCards < 2 ) { // // One network adapter radio button chosen // CheckRadioButton( hwnd, IDC_ONENETWORKADAPTER, IDC_MULTIPLENETWORKADPTERS, IDC_ONENETWORKADAPTER ); // // The controls under the multiple adapters greyed-out // EnableNetCardControls( hwnd, FALSE ); } else { // // We are in the multiple adapter case // // // Multiple network adapter radio button chosen // CheckRadioButton( hwnd, IDC_ONENETWORKADAPTER, IDC_MULTIPLENETWORKADPTERS, IDC_MULTIPLENETWORKADPTERS ); // // The controls under the multiple adapters enabled // EnableNetCardControls( hwnd, TRUE ); } PropSheet_SetWizButtons( GetParent(hwnd), PSWIZB_BACK | PSWIZB_NEXT ); } //---------------------------------------------------------------------------- // // Function: OnWizNextNumCards // // Purpose: // // Arguments: IN HWND hwnd - handle to the dialog // // Returns: VOID // //---------------------------------------------------------------------------- VOID OnWizNextNumCards( IN HWND hwnd ) { if( IsDlgButtonChecked( hwnd, IDC_ONENETWORKADAPTER ) == BST_CHECKED ) { // // Single network adapter case // NetSettings.iNumberOfNetworkCards = 1; } else { // // Multiple network adapter case // TCHAR szNumber[3]; INT NewNumberOfNetworkCards; // // Convert the string number to an int // GetWindowText( GetDlgItem( hwnd, IDC_NUM_CONNECT ), szNumber, 3 ); NewNumberOfNetworkCards = _ttoi( szNumber ); // // Ensure the number of network cards stays within its appropriate // range // if( NewNumberOfNetworkCards < NET_SPIN_CONTROL_MIN ) { NewNumberOfNetworkCards = NET_SPIN_CONTROL_MIN; } else if( NewNumberOfNetworkCards > NET_SPIN_CONTROL_MAX ) { NewNumberOfNetworkCards = NET_SPIN_CONTROL_MAX; } // // Adjust memory for the network lists accordingly // AdjustNetworkCardMemory( NewNumberOfNetworkCards, NetSettings.iNumberOfNetworkCards ); NetSettings.iNumberOfNetworkCards = NewNumberOfNetworkCards; } } //---------------------------------------------------------------------------- // // Function: DlgNumberNetCardsPage // // Purpose: // // Arguments: standard Win32 dialog proc arguments // // Returns: standard Win32 dialog proc return value // //---------------------------------------------------------------------------- INT_PTR CALLBACK DlgNumberNetCardsPage( IN HWND hwnd, IN UINT uMsg, IN WPARAM wParam, IN LPARAM lParam) { BOOL bStatus = TRUE; switch( uMsg ) { case WM_INITDIALOG: { OnNumCardsInitDialog( hwnd ); break; } case WM_COMMAND: { switch ( LOWORD(wParam) ) { case IDC_ONENETWORKADAPTER: if ( HIWORD(wParam) == BN_CLICKED ) { EnableNetCardControls( hwnd, FALSE ); } break; case IDC_MULTIPLENETWORKADPTERS: if ( HIWORD(wParam) == BN_CLICKED ) { EnableNetCardControls( hwnd, TRUE ); } break; } break; } case WM_NOTIFY: { LPNMHDR pnmh = (LPNMHDR)lParam; switch( pnmh->code ) { case PSN_QUERYCANCEL: CancelTheWizard(hwnd); break; case PSN_SETACTIVE: OnNumberNetCardsSetActive( hwnd ); break; case PSN_WIZBACK: bStatus = FALSE; break; case PSN_WIZNEXT: OnWizNextNumCards( hwnd ); break; default: break; } break; } default: bStatus = FALSE; break; } return bStatus; }