int system_getdns(const char* name, char primary[40], char secondary[40]) { ULONG idx = 0; DWORD dwRetVal = 0; ULONG outBufLen = 0; WCHAR wAdapterName[256] = {0}; PIP_PER_ADAPTER_INFO pPerAdapterInfo; MultiByteToWideChar(CP_ACP, 0, name, -1, wAdapterName, 256); if(NO_ERROR!=GetAdapterIndex(wAdapterName, &idx)) return -1; outBufLen = sizeof(IP_PER_ADAPTER_INFO); pPerAdapterInfo = (PIP_PER_ADAPTER_INFO)malloc(outBufLen); if(ERROR_BUFFER_OVERFLOW==GetPerAdapterInfo(idx, pPerAdapterInfo, &outBufLen)) { free(pPerAdapterInfo); pPerAdapterInfo = (PIP_PER_ADAPTER_INFO)malloc(outBufLen); } if ((dwRetVal = GetPerAdapterInfo(idx, pPerAdapterInfo, &outBufLen)) == ERROR_SUCCESS) { secondary[0] = '\0'; strncpy(primary, pPerAdapterInfo->DnsServerList.IpAddress.String, 39); if(pPerAdapterInfo->DnsServerList.Next) strncpy(secondary, pPerAdapterInfo->DnsServerList.Next->IpAddress.String, 39); } free(pPerAdapterInfo); return dwRetVal==ERROR_SUCCESS?0:-(int)dwRetVal; }
BOOL GetNetConfig::FindDNSAddress(PIP_ADAPTER_INFO pAdapter) { if (pAdapter->Index <= 0) { return FALSE; } ULONG outBufLen = 0; GetPerAdapterInfo(pAdapter->Index, NULL, &outBufLen); if (outBufLen <= 0) { return FALSE; } IP_PER_ADAPTER_INFO* pPerAdapterInfo = (IP_PER_ADAPTER_INFO*) malloc(outBufLen); DWORD dwResult = GetPerAdapterInfo(pAdapter->Index, pPerAdapterInfo, &outBufLen); if (dwResult != ERROR_SUCCESS) { free(pPerAdapterInfo); return FALSE; } IP_ADDR_STRING* pDns = &pPerAdapterInfo->DnsServerList; // loop through all DNS IPs while (pDns) { if (strcmp(m_szCheck_DNS_Address, pDns->IpAddress.String) == 0) { free(pPerAdapterInfo); return TRUE; } pDns = pDns->Next; } free(pPerAdapterInfo); return FALSE; }
void GetNetConfig::PrintDNSAddress(void) { if ((m_nOptions & pt_dns) != pt_dns) { return; } if (m_pAdapter->Index <= 0) { return; } ULONG outBufLen = 0; GetPerAdapterInfo(m_pAdapter->Index, NULL, &outBufLen); if (outBufLen <= 0) { return; } IP_PER_ADAPTER_INFO* pPerAdapterInfo = (IP_PER_ADAPTER_INFO*) malloc(outBufLen); DWORD dwResult = GetPerAdapterInfo(m_pAdapter->Index, pPerAdapterInfo, &outBufLen); if (dwResult != ERROR_SUCCESS) { free(pPerAdapterInfo); return; } if (m_bTitle == TRUE) { printf("\tDNS Address: \t"); } IP_ADDR_STRING* pDns = &pPerAdapterInfo->DnsServerList; // loop through all DNS IPs int i = 0; while (pDns) { if (i > 0) { printf(", "); } printf("%s", pDns->IpAddress.String); pDns = pDns->Next; i++; } printf("\n"); free(pPerAdapterInfo); }
STSysCfgInfo& CSystemInfo::GetSysCfgInfo(SOCKET hSocket) { GetComputerName(); GetOptSystem(); //首先取得连接上服务器的socket的本机ip stdex::tString strIP; sockaddr_in addr = {0}; int nSize = sizeof(addr); if (SOCKET_ERROR == getsockname(hSocket, (PSOCKADDR)&addr, &nSize)) return m_stSysCfgInfo; strIP = (LPCTSTR)_bstr_t(inet_ntoa(addr.sin_addr)); IP_ADAPTER_INFO Adapter[10] = {0}; PIP_ADAPTER_INFO pAdapter = Adapter; nSize = sizeof(Adapter); if (ERROR_SUCCESS != GetAdaptersInfo(Adapter, (PULONG)&nSize)) pAdapter = NULL; while (strIP.size() && pAdapter != NULL) { _IP_ADDR_STRING* pIpAddress = &pAdapter->IpAddressList; while (pIpAddress != NULL) { if (std::string(CT2A(strIP.c_str())) == pIpAddress->IpAddress.String) goto do_next; pIpAddress = pIpAddress->Next; } pAdapter = pAdapter->Next; } do_next: if (pAdapter != NULL) { tstrcpy(m_stCltHardInfo.szNIC, MAX_PATH, CA2T(pAdapter->Description)); m_stSysCfgInfo.dwIP = inet_addr(CT2A(strIP.c_str())); m_stSysCfgInfo.dwGate = inet_addr(pAdapter->GatewayList.IpAddress.String); m_stSysCfgInfo.dwSubMask = inet_addr(pAdapter->IpAddressList.IpMask.String); tsprintf(m_stSysCfgInfo.szMacAddr, MAX_PATH, TEXT("%02X-%02X-%02X-%02X-%02X-%02X"), pAdapter->Address[0], pAdapter->Address[1], pAdapter->Address[2], pAdapter->Address[3], pAdapter->Address[4], pAdapter->Address[5]); IP_PER_ADAPTER_INFO perAdapter[10] = {0}; nSize = sizeof(perAdapter); if (ERROR_SUCCESS == GetPerAdapterInfo(pAdapter->Index, perAdapter, (PULONG)&nSize)) { m_stSysCfgInfo.dwDns0 = inet_addr(perAdapter->DnsServerList.IpAddress.String); if (perAdapter->DnsServerList.Next != NULL) { m_stSysCfgInfo.dwDns1 = inet_addr(perAdapter->DnsServerList.Next->IpAddress.String); } } } return m_stSysCfgInfo; }
INT_PTR CALLBACK LANStatusUiDetailsDlg( HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam ) { LANSTATUSUI_CONTEXT * pContext; LVITEMW li; WCHAR szBuffer[100]; PIP_ADAPTER_INFO pAdapterInfo, pCurAdapter; PIP_PER_ADAPTER_INFO pPerAdapter; DWORD dwSize; HWND hDlgCtrl; RECT rect; switch (uMsg) { case WM_INITDIALOG: pContext = (LANSTATUSUI_CONTEXT*)lParam; hDlgCtrl = GetDlgItem(hwndDlg, IDC_DETAILS); /* get client rect */ GetClientRect(hDlgCtrl, &rect); /* calculate column width */ dwSize = rect.right / 2; InsertColumnToListView(hDlgCtrl, IDS_PROPERTY, 0, dwSize); InsertColumnToListView(hDlgCtrl, IDS_VALUE, 1, dwSize); dwSize = 0; pCurAdapter = NULL; pAdapterInfo = NULL; if (GetAdaptersInfo(NULL, &dwSize) == ERROR_BUFFER_OVERFLOW) { pAdapterInfo = static_cast<PIP_ADAPTER_INFO>(CoTaskMemAlloc(dwSize)); if (pAdapterInfo) { if (GetAdaptersInfo(pAdapterInfo, &dwSize) == NO_ERROR) { pCurAdapter = pAdapterInfo; while (pCurAdapter && pCurAdapter->Index != pContext->dwAdapterIndex) pCurAdapter = pCurAdapter->Next; if (pCurAdapter->Index != pContext->dwAdapterIndex) pCurAdapter = NULL; } } } ZeroMemory(&li, sizeof(LVITEMW)); li.mask = LVIF_TEXT; li.iSubItem = 1; li.pszText = szBuffer; if (pCurAdapter) { li.iItem = InsertItemToListView(hDlgCtrl, IDS_PHYSICAL_ADDRESS); if (li.iItem >= 0) { swprintf(szBuffer, L"%02x-%02x-%02x-%02x-%02x-%02x",pCurAdapter->Address[0], pCurAdapter->Address[1], pCurAdapter->Address[2], pCurAdapter->Address[3], pCurAdapter->Address[4], pCurAdapter->Address[5]); SendMessageW(hDlgCtrl, LVM_SETITEMW, 0, (LPARAM)&li); } li.iItem = InsertItemToListView(hDlgCtrl, IDS_IP_ADDRESS); if (li.iItem >= 0) if (MultiByteToWideChar(CP_ACP, 0, pCurAdapter->IpAddressList.IpAddress.String, -1, szBuffer, sizeof(szBuffer)/sizeof(WCHAR))) SendMessageW(hDlgCtrl, LVM_SETITEMW, 0, (LPARAM)&li); li.iItem = InsertItemToListView(hDlgCtrl, IDS_SUBNET_MASK); if (li.iItem >= 0) if (MultiByteToWideChar(CP_ACP, 0, pCurAdapter->IpAddressList.IpMask.String, -1, szBuffer, sizeof(szBuffer)/sizeof(WCHAR))) SendMessageW(hDlgCtrl, LVM_SETITEMW, 0, (LPARAM)&li); li.iItem = InsertItemToListView(hDlgCtrl, IDS_DEF_GATEWAY); if (li.iItem >= 0 && pCurAdapter->GatewayList.IpAddress.String[0] != '0') { if (MultiByteToWideChar(CP_ACP, 0, pCurAdapter->GatewayList.IpAddress.String, -1, szBuffer, sizeof(szBuffer)/sizeof(WCHAR))) SendMessageW(hDlgCtrl, LVM_SETITEMW, 0, (LPARAM)&li); } #if 0 li.iItem = InsertItemToListView(hDlgCtrl, IDS_LEASE_OBTAINED); li.iItem = InsertItemToListView(hDlgCtrl, IDS_LEASE_EXPIRES); #endif } dwSize = 0; if (GetPerAdapterInfo(pContext->dwAdapterIndex, NULL, &dwSize) == ERROR_BUFFER_OVERFLOW) { pPerAdapter = static_cast<PIP_PER_ADAPTER_INFO>(CoTaskMemAlloc(dwSize)); if (pPerAdapter) { if (GetPerAdapterInfo(pContext->dwAdapterIndex, pPerAdapter, &dwSize) == ERROR_SUCCESS) { li.iItem = InsertItemToListView(hDlgCtrl, IDS_DNS_SERVERS); if (li.iItem >= 0) AddIPAddressToListView(hDlgCtrl, &pPerAdapter->DnsServerList, li.iItem); } CoTaskMemFree(pPerAdapter); } } #if 0 if (pCurAdapter) { li.iItem = InsertItemToListView(hDlgCtrl, IDS_WINS_SERVERS); AddIPAddressToListView(hDlgCtrl, &pCurAdapter->PrimaryWinsServer, li.iItem); AddIPAddressToListView(hDlgCtrl, &pCurAdapter->SecondaryWinsServer, li.iItem+1); } #endif CoTaskMemFree(pAdapterInfo); break; case WM_COMMAND: if (LOWORD(wParam) == IDC_CLOSE) { EndDialog(hwndDlg, FALSE); break; } } return FALSE; }
void CAdaptInfoDlg::ShowAdaptersInfo() { PIP_ADAPTER_INFO pAdapterInfo; PIP_ADAPTER_INFO pAdapter = NULL; DWORD errValue = 0; ULONG ulOutBufLen = sizeof(IP_ADAPTER_INFO); pAdapterInfo = (IP_ADAPTER_INFO *)malloc(sizeof(IP_ADAPTER_INFO)); if (!pAdapterInfo)//malloc失败 return; if (GetAdaptersInfo(pAdapterInfo, &ulOutBufLen) == ERROR_BUFFER_OVERFLOW) //空间不够,重新分配 { free(pAdapterInfo); pAdapterInfo = (IP_ADAPTER_INFO *)malloc(ulOutBufLen); if (!pAdapterInfo) //malloc失败 return; } CString info; if ((errValue = GetAdaptersInfo(pAdapterInfo, &ulOutBufLen)) == NO_ERROR) { pAdapter = pAdapterInfo; while (pAdapter) { info += CString(_T("Adapter Name:")) + CString(pAdapter->AdapterName) + CString(_T("\r\n"));//名字 info += CString(_T("Adapter Desc:")) + CString(pAdapter->Description) + CString(_T("\r\n"));//描述 CString mac; mac.Format(_T("%02X%02X%02X%02X%02X%02X"), pAdapter->Address[0], pAdapter->Address[1], \ pAdapter->Address[2], pAdapter->Address[3], pAdapter->Address[4], pAdapter->Address[5]); info += CString(_T("Adapter Mac:")) + mac + CString(_T("\r\n"));//MAC地址 CString type; switch (pAdapter->Type) //类型,列举了几种 { case MIB_IF_TYPE_OTHER: type = _T("其他"); break; case MIB_IF_TYPE_ETHERNET: type = _T("以太网接口"); break; case IF_TYPE_ISO88025_TOKENRING: type = _T("ISO88025令牌环"); break; case MIB_IF_TYPE_PPP: type = _T("PPP接口"); break; case MIB_IF_TYPE_LOOPBACK: type = _T("软件回路接口"); break; case MIB_IF_TYPE_SLIP: type = _T("ATM网络接口"); break; case IF_TYPE_IEEE80211: type = _T("无线网络接口"); break; default: type = _T("未知接口"); break; } info += CString(_T("网卡类型:")) + type + CString(_T("\r\n")); info += CString(_T("IP地址:")) + CString(pAdapter->IpAddressList.IpAddress.String) + CString(_T("\r\n")); info += CString(_T("子网掩码:")) + CString(pAdapter->IpAddressList.IpMask.String) + CString(_T("\r\n")); info += CString(_T("默认网关:")) + CString(pAdapter->GatewayList.IpAddress.String) + CString(_T("\r\n")); info += CString(_T("是否DHCP:")) + CString(pAdapter->DhcpEnabled ? _T("是") : _T("否")) + CString(_T("\r\n")); info += CString(_T("DHCP地址:")) + CString(pAdapter->DhcpServer.IpAddress.String) + CString(_T("\r\n")); //Dns IP_PER_ADAPTER_INFO* pPerAdapt = NULL; ULONG ulLen = 0; int err = GetPerAdapterInfo(pAdapter->Index, pPerAdapt, &ulLen); if (err == ERROR_BUFFER_OVERFLOW) { pPerAdapt = (IP_PER_ADAPTER_INFO*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, ulLen); err = GetPerAdapterInfo(pAdapter->Index, pPerAdapt, &ulLen); if (err == ERROR_SUCCESS) { IP_ADDR_STRING* pNext = &(pPerAdapt->DnsServerList); if (pNext && strcmp(pNext->IpAddress.String, "") != 0)//手动DNS { info = info + CString(_T("DNS:")) + CString(pNext->IpAddress.String) + _T("\r\n"); if (pNext->Next) { pNext = pNext->Next; info = info + CString(_T("备用DNS:")) + CString(pNext->IpAddress.String) + _T("\r\n"); } } } HeapFree(GetProcessHeap(), HEAP_ZERO_MEMORY, pPerAdapt); } info += "\r\n"; pAdapter = pAdapter->Next; } } else { CString s; s.Format(_T("GetAdaptersInfo failed with error: %d\r\n"), errValue); info += s; } if (pAdapterInfo) free(pAdapterInfo); SetDlgItemText(IDC_EDIT, info); }
IPSTATE GetIPState(LPCTSTR pszAdapter, LPTSTR pszAddress, UINT cchAddress) { HRESULT hr = S_OK; IPSTATE state = IPSTATE_DHCP; ULONG ulAdapterIndex; PIP_ADAPTER_INFO paiBuffer = NULL; ULONG cbBuffer = 0; DWORD dwError; PIP_ADAPTER_INFO paiCurrent; PIP_PER_ADAPTER_INFO pper = NULL; // Check inputs CBRAEx(NULL != pszAdapter, E_INVALIDARG); // Get the adapter index CBR(NO_ERROR == GetAdapterIndex(const_cast<LPWSTR>(pszAdapter), &ulAdapterIndex)); // Get the status of all connected adapters cbBuffer = sizeof(IP_ADAPTER_INFO); paiBuffer = (PIP_ADAPTER_INFO)LocalAlloc(LMEM_FIXED, cbBuffer); CPR(paiBuffer); while (ERROR_BUFFER_OVERFLOW == (dwError = GetAdaptersInfo(paiBuffer, &cbBuffer))) { PIP_ADAPTER_INFO paiTemp = (PIP_ADAPTER_INFO)LocalReAlloc(paiBuffer, cbBuffer, LMEM_MOVEABLE); CPR(paiTemp); paiBuffer = paiTemp; } CBR(NO_ERROR == dwError); // Find our adapter index for (paiCurrent = paiBuffer; paiCurrent; paiCurrent = paiCurrent->Next) { if (paiCurrent->Index == ulAdapterIndex) { break; } } CBR(NULL != paiCurrent); // did we find it? CBR(NULL != paiCurrent->CurrentIpAddress); // Is this adapter using DHCP? if (!paiCurrent->DhcpEnabled) { state = IPSTATE_CONNECTED; } else { // Get the per-adapter info cbBuffer = sizeof(IP_PER_ADAPTER_INFO); pper = (PIP_PER_ADAPTER_INFO)LocalAlloc(LMEM_FIXED, cbBuffer); CPR(pper); while (ERROR_BUFFER_OVERFLOW == (dwError = GetPerAdapterInfo(ulAdapterIndex, pper, &cbBuffer))) { PIP_PER_ADAPTER_INFO pperTemp = (PIP_PER_ADAPTER_INFO)LocalReAlloc(pper, cbBuffer, LMEM_MOVEABLE); CPR(pperTemp); pper = pperTemp; } CBR(NO_ERROR == dwError); // Are we using an automatic IP? if (pper->AutoconfigActive || IsAutoIPAddr(paiCurrent->CurrentIpAddress->IpAddress.String)) { state = IPSTATE_AUTOIP; } } // Optionally copy the IP address string to the output if (NULL != pszAddress && 0 != cchAddress) { UINT cchInput = strlen(paiCurrent->CurrentIpAddress->IpAddress.String); if (cchInput >= cchAddress) { cchInput = cchAddress - 1; } MultiByteToWideChar(CP_ACP, 0, paiCurrent->CurrentIpAddress->IpAddress.String, cchInput, pszAddress, cchAddress); pszAddress[cchAddress-1] = TEXT('\0'); } Error: LocalFree(pper); LocalFree(paiBuffer); return (SUCCEEDED(hr) ? state : IPSTATE_DISCONNECTED); }