⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tcpip_properties.c

📁 这是一个开放源代码的与WINNT/WIN2K/WIN2003兼容的操作系统
💻 C
📖 第 1 页 / 共 2 页
字号:
    if (rc != ERROR_SUCCESS)
        goto cleanup;
    RegCloseKey(hKey);

    /* Save parameters in HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters */
    rc = RegOpenKey(HKEY_LOCAL_MACHINE, _T("SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters"), &hKey);
    if (rc != ERROR_SUCCESS)
        goto cleanup;
    if (DlgData->Dns1 == INADDR_NONE)
    {
        rc = RegDeleteValue(hKey, _T("NameServer"));
        if (rc != ERROR_SUCCESS && rc != ERROR_FILE_NOT_FOUND)
            goto cleanup;
    }
    else
    {
        if (!GetAddressFromField(Dlg, IDC_DNS1, &Address, &AddressString))
            goto cleanup;
        rc = RegSetValueExA(hKey, "NameServer", 0, REG_SZ, (const BYTE*)AddressString, strlen(AddressString) + 1);
        if (rc != ERROR_SUCCESS)
            goto cleanup;
    }

    // arty ... Not needed anymore ... We update the address live now
    //MessageBox(NULL, TEXT("You need to reboot before the new parameters take effect."), TEXT("Reboot required"), MB_OK | MB_ICONWARNING);
    ret = TRUE;

cleanup:
    if (hKey != NULL)
        RegCloseKey(hKey);
    return ret;
#if 0
    Changed = FALSE;
    if (DlgData->DhcpEnabled) {
        Changed = ! DlgData->OldDhcpEnabled;
        IpChanged = FALSE;
        DhcpAction = 1;
    } else {
        Changed = DlgData->OldDhcpEnabled ||
                  DlgData->IpAddress != DlgData->OldIpAddress ||
                  DlgData->SubnetMask != DlgData->OldSubnetMask;
        IpChanged = DlgData->OldDhcpEnabled ||
                    DlgData->IpAddress != DlgData->OldIpAddress;
        DhcpAction = 2;
    }

    if (Changed) {
        AdapterName = HeapAlloc(GetProcessHeap(), 0,
                                (strlen(DlgData->AdapterName) + 1) *
                                sizeof(WCHAR));
        if (NULL == AdapterName) {
            ShowError(Dlg, IDS_OUT_OF_MEMORY);
            return FALSE;
        }
        MultiByteToWideChar(CP_THREAD_ACP, 0, DlgData->AdapterName, -1,
                            AdapterName, strlen(DlgData->AdapterName) + 1);
        if (0 == DhcpNotifyConfigChange(NULL, AdapterName, IpChanged,
                                        DlgData->AdapterIndex,
                                        DlgData->IpAddress,
                                        DlgData->SubnetMask, DhcpAction)) {
            HeapFree(GetProcessHeap(), 0, AdapterName);
            ShowError(Dlg, IDS_CANNOT_SAVE_CHANGES);
            return FALSE;
        }
        HeapFree(GetProcessHeap(), 0, AdapterName);
    }

    /* FIXME Save default gateway and DNS entries */
    return TRUE;
#endif
}

static INT_PTR CALLBACK
TCPIPPropertyPageProc(HWND Dlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    LPPROPSHEETPAGEW Page;
    PTCPIP_PROPERTIES_DATA DlgData;
    LPNMHDR Nmhdr;

    DlgData = (PTCPIP_PROPERTIES_DATA) GetWindowLongPtrW(Dlg, GWL_USERDATA);
    switch(uMsg) {
    case WM_INITDIALOG:
        Page = (LPPROPSHEETPAGEW) lParam;
        DlgData = (PTCPIP_PROPERTIES_DATA) Page->lParam;
        SetWindowLongPtrW(Dlg, GWL_USERDATA, Page->lParam);

        EnableWindow(GetDlgItem(Dlg, IDC_ADVANCED), FALSE);

        EnableDHCP(Dlg, DlgData->OldDhcpEnabled, 0);

        if (! DlgData->OldDhcpEnabled)
        {
            if (INADDR_NONE != DlgData->OldIpAddress) {
                SendDlgItemMessage(Dlg, IDC_IPADDR, IPM_SETADDRESS, 0,
                                   ntohl(DlgData->OldIpAddress));
            }
            if (INADDR_NONE != DlgData->OldSubnetMask) {
                SendDlgItemMessage(Dlg, IDC_SUBNETMASK, IPM_SETADDRESS, 0,
                                   ntohl(DlgData->OldSubnetMask));
            }
            if (INADDR_NONE != DlgData->OldGateway) {
                SendDlgItemMessage(Dlg, IDC_DEFGATEWAY, IPM_SETADDRESS, 0,
                                   ntohl(DlgData->OldGateway));
            }
        }

        if (INADDR_NONE != DlgData->OldDns1) {
            SendDlgItemMessage(Dlg, IDC_DNS1, IPM_SETADDRESS, 0,
                               ntohl(DlgData->OldDns1));
            if (INADDR_NONE != DlgData->OldDns2) {
                SendDlgItemMessage(Dlg, IDC_DNS2, IPM_SETADDRESS, 0,
                                   ntohl(DlgData->OldDns2));
            }
        }

        if (DlgData->OldDhcpEnabled)
        {
            ManualDNS(Dlg, INADDR_NONE != DlgData->OldDns1, 0);
        }

        break;

    case WM_COMMAND:
        switch(LOWORD(wParam)) {
        case IDC_FIXEDDNS:
            ManualDNS(Dlg, TRUE, LOWORD(wParam));
            return TRUE;

        case IDC_AUTODNS:
            ManualDNS(Dlg, FALSE, LOWORD(wParam));
            return TRUE;

        case IDC_USEDHCP:
            EnableDHCP(Dlg, TRUE, LOWORD(wParam));
            return TRUE;

        case IDC_NODHCP:
            EnableDHCP(Dlg, FALSE, LOWORD(wParam));
            return TRUE;
        }
        break;

    case WM_NOTIFY:
        Nmhdr = (LPNMHDR) lParam;

        switch(Nmhdr->code) {
        case PSN_KILLACTIVE:
            /* Do validation here, must set FALSE to continue */
            SetWindowLongPtrW(Dlg, DWL_MSGRESULT,
                              (LONG_PTR) ! ValidateAndStore(Dlg, DlgData));
            return TRUE;

        case PSN_APPLY:
            /* Set the IP Address and DNS Information so we won't
             * be doing all this for nothing */
            SetWindowLongPtrW(Dlg, DWL_MSGRESULT,
                              InternTCPIPSettings(Dlg, DlgData) ?
                              PSNRET_NOERROR : PSNRET_INVALID);
            return TRUE;
        }
        break;
    }

    return FALSE;
}

static BOOL
LoadDataFromInfo(PTCPIP_PROPERTIES_DATA DlgData, IP_ADAPTER_INFO *Info)
{
    IP_ADDR_STRING *pString;
    WCHAR RegKey[MAX_PATH];
    HKEY hKey;
    char Dns[MAX_PATH];
    DWORD Size;
    DWORD Type;
    char *NextDnsServer;

    DlgData->AdapterName = Info->AdapterName;
    DlgData->AdapterIndex = Info->Index;

    DlgData->OldDhcpEnabled = Info->DhcpEnabled;

    pString = &Info->IpAddressList;
    while (NULL != pString->Next) {
        pString = pString->Next;
    }
    DlgData->OldIpAddress = inet_addr(pString->IpAddress.String);
    DlgData->OldSubnetMask = inet_addr(pString->IpMask.String);
    pString = &Info->GatewayList;
    while (NULL != pString->Next) {
        pString = pString->Next;
    }
    DlgData->OldGateway = inet_addr(pString->IpAddress.String);

    DlgData->OldDns1 = INADDR_NONE;
    DlgData->OldDns2 = INADDR_NONE;
    swprintf(RegKey,
             L"SYSTEM\\CurrentControlSet\\Services\\TCPIP\\Parameters\\Interfaces\\%S",
             Info->AdapterName);
    if (ERROR_SUCCESS == RegOpenKeyW(HKEY_LOCAL_MACHINE, RegKey, &hKey)) {
        Size = sizeof(Dns);
        RegQueryValueExA(hKey, "NameServer", NULL, &Type, (BYTE *)Dns,
                         &Size);
        RegCloseKey(hKey);

        if ('\0' != Dns[0]) {
            DlgData->OldDns1 = inet_addr(Dns);
            NextDnsServer = strchr(Dns, ',');
            if (NULL != NextDnsServer && '\0' != *NextDnsServer) {
                DlgData->OldDns2 = inet_addr(NextDnsServer);
            }
        }
    }

    return TRUE;
}

void
DisplayTCPIPProperties(HWND hParent, IP_ADAPTER_INFO *pInfo)
{
    PROPSHEETPAGEW psp[1];
    PROPSHEETHEADERW psh;
    INITCOMMONCONTROLSEX cce;
    TCPIP_PROPERTIES_DATA DlgData;
    LPTSTR tpszCaption = NULL;
    INT StrLen;

    HWND hListBox = GetDlgItem(hParent, IDC_COMPONENTSLIST);
    int iListBoxIndex = (int) SendMessage(hListBox, LB_GETCURSEL, 0, 0);

    if(iListBoxIndex != LB_ERR)
    {
        StrLen = SendMessage(hListBox, LB_GETTEXTLEN, iListBoxIndex, 0);

        if (StrLen != LB_ERR)
        {
            TCHAR suffix[] = _T(" Properties");
            INT HeapSize = ((StrLen + 1) + (_tcslen(suffix) + 1)) * sizeof(TCHAR);
            tpszCaption = (LPTSTR)HeapAlloc(GetProcessHeap(), 0, HeapSize);
            SendMessage(hListBox, LB_GETTEXT, iListBoxIndex, (LPARAM)tpszCaption);
            _tcscat(tpszCaption, suffix);
        }
    }
    
    if (! LoadDataFromInfo(&DlgData, pInfo))
    {
        ShowError(hParent, IDS_CANNOT_LOAD_CONFIG);
        return;
    }

    cce.dwSize = sizeof(INITCOMMONCONTROLSEX);
    cce.dwICC = ICC_INTERNET_CLASSES;
    InitCommonControlsEx(&cce);

    ZeroMemory(&psh, sizeof(PROPSHEETHEADER));
    psh.dwSize = sizeof(PROPSHEETHEADER);
    psh.dwFlags =  PSH_PROPSHEETPAGE | PSH_NOAPPLYNOW;
    psh.hwndParent = hParent;
    psh.hInstance = hApplet;
    psh.hIcon = LoadIcon(hApplet, MAKEINTRESOURCE(IDI_CPLSYSTEM));
    psh.pszCaption = tpszCaption;
    psh.nPages = sizeof(psp) / sizeof(PROPSHEETPAGE);
    psh.nStartPage = 0;
    psh.ppsp = psp;
    psh.pfnCallback = NULL;

    InitPropSheetPage(&psp[0], IDD_TCPIPPROPERTIES, TCPIPPropertyPageProc, (LPARAM) &DlgData);

    if (PropertySheetW(&psh) == -1)
    {
        ShowError(hParent, IDS_CANNOT_CREATE_PROPSHEET);
    }

    if (tpszCaption != NULL)
        HeapFree(GetProcessHeap(), 0, tpszCaption);

    return;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -