// It is possible for an adapter to have multiple // IPv4 addresses, gateways, and secondary WINS servers // assigned to the adapter. // Note that this sample code only prints out the // first entry for the IP address/mask, gateway, // and secondary WINS server for each adapter. #include "stdafx.h" #include "NetBios.h" #include #include #include #include //#include /* for IP Helper API */ #include // getnameinfo() CNetBios::CNetBios() { } CNetBios::~CNetBios() { } /* int CNetBios::GetDns(NetBiosinfo& info) { //memset(&info, 0x00, sizeof(NetBiosinfo)); DWORD dwRetVal = 0; // get first info PIP_ADAPTER_ADDRESSES pAdapterInfo; ULONG size = sizeof(IP_ADAPTER_ADDRESSES); pAdapterInfo = (PIP_ADAPTER_ADDRESSES) malloc(size); // Make an initial call to GetAdaptersInfo to get // the necessary size into the ulOutBufLen variable while(1) { dwRetVal = GetAdaptersAddresses(AF_INET, GAA_FLAG_SKIP_UNICAST|GAA_FLAG_SKIP_ANYCAST|GAA_FLAG_SKIP_MULTICAST, NULL, pAdapterInfo, &size); if(dwRetVal == ERROR_BUFFER_OVERFLOW) { free(pAdapterInfo); pAdapterInfo = (PIP_ADAPTER_ADDRESSES) malloc (size); continue; } if (dwRetVal == NO_ERROR) { PIP_ADAPTER_ADDRESSES pAdapter = pAdapterInfo; // loop while(pAdapter) { if(strcmp(info.Name, pAdapter->AdapterName) ==0) { // get dns PIP_ADAPTER_DNS_SERVER_ADDRESS dns = pAdapter->FirstDnsServerAddress; SOCKET_ADDRESS address = dns->Address; LPSOCKADDR addr = address.lpSockaddr; char saddr[64]; //strcpy(saddr, inet_ntoa(*(in_addr*)addr->sa_data)); if (getnameinfo(address.lpSockaddr, address.iSockaddrLength, saddr, sizeof(saddr), NULL, 0, NI_NUMERICHOST)) { fprintf(stderr, "can't convert network format to presentation format"); } // set strcpy(info.Dns, saddr); return 1; } pAdapter = pAdapter->Next; } } else { // printf("Call to GetAdaptersInfo failed.\n"); } break; } return 0; } */ int CNetBios::GetDns2(int index, NetBiosinfo& info) { FIXED_INFO *FixedInfo = NULL; ULONG ulOutBufLen = 0; DWORD dwRetVal; //IP_ADDR_STRING *pIPAddr; info.Dns[0] = 0; if(GetNetworkParams(NULL, &ulOutBufLen) == ERROR_BUFFER_OVERFLOW) { //FixedInfo = (FIXED_INFO *)GlobalAlloc(GPTR, ulOutBufLen); FixedInfo = (FIXED_INFO *)malloc(ulOutBufLen); } else { return -11; } if (dwRetVal = GetNetworkParams(FixedInfo, &ulOutBufLen)) { printf("GetNetworkParams() failed: %08x\n", dwRetVal); free(FixedInfo); return -2; } else { int pt = 0; //printf("Host Name: %s\n", FixedInfo->HostName); //printf("Domain Name: %s\n", FixedInfo->DomainName); //printf("DNS Servers:\n" ); //printf("\t%s\n", FixedInfo->DnsServerList.IpAddress.String); IP_ADDR_STRING* addr = &FixedInfo->DnsServerList; while(addr != NULL) { if(pt == index) { strcpy(info.Dns, addr->IpAddress.String); free(FixedInfo); return 1; } addr = addr->Next; pt++; } /* pIPAddr = FixedInfo->DnsServerList.Next; while (pIPAddr ) { printf("\t%s\n", pIPAddr->IpAddress.String); pIPAddr = pIPAddr->Next; } */ } free(FixedInfo); // success return -1; } int CNetBios::GetNetCount() { // memset(&info, 0x00, sizeof(NetBiosinfo)); DWORD dwRetVal = 0; PIP_ADAPTER_INFO pAdapterInfo = (IP_ADAPTER_INFO *)malloc( sizeof(IP_ADAPTER_INFO) ); ULONG ulOutBufLen = sizeof(IP_ADAPTER_INFO); // Make an initial call to GetAdaptersInfo to get // the necessary size into the ulOutBufLen variable if(GetAdaptersInfo( pAdapterInfo, &ulOutBufLen) == ERROR_BUFFER_OVERFLOW) { free(pAdapterInfo); pAdapterInfo = (IP_ADAPTER_INFO *)malloc(ulOutBufLen); } // counting int adapter_count = 0; dwRetVal = GetAdaptersInfo(pAdapterInfo, &ulOutBufLen); if(dwRetVal == NO_ERROR) { PIP_ADAPTER_INFO pAdapter = pAdapterInfo; while(pAdapter) { adapter_count++; pAdapter = pAdapter->Next; } } else { printf("Call to GetAdaptersInfo failed.\n"); } free(pAdapterInfo); return adapter_count; } // ¹Ýȯ°ªÀº ¼º°ø ¿©ºÎ // + : ¼º°ø // -1 : out of index int CNetBios::GetNetBios(int index, NetBiosinfo & info) { memset(&info, 0x00, sizeof(NetBiosinfo)); DWORD dwRetVal = 0; PIP_ADAPTER_INFO pAdapterInfo = (IP_ADAPTER_INFO *) malloc( sizeof(IP_ADAPTER_INFO) ); ULONG ulOutBufLen = sizeof(IP_ADAPTER_INFO); // Make an initial call to GetAdaptersInfo to get // the necessary size into the ulOutBufLen variable if(GetAdaptersInfo( pAdapterInfo, &ulOutBufLen) == ERROR_BUFFER_OVERFLOW) { free(pAdapterInfo); pAdapterInfo = (IP_ADAPTER_INFO *)malloc(ulOutBufLen); } int pt = 0; dwRetVal = GetAdaptersInfo( pAdapterInfo, &ulOutBufLen); if(dwRetVal == NO_ERROR) { PIP_ADAPTER_INFO pAdapter = pAdapterInfo; while(pAdapter) { if(pt == index) { sprintf(info.Name, "%s", pAdapter->AdapterName); sprintf(info.Desc, "%s", pAdapter->Description); for (UINT i = 0; i < pAdapter->AddressLength; i++) { for(int j = 0; j < 6; j++) { sprintf(&info.MAC[j*2], "%02x", pAdapter->Address[j]); } } sprintf(info.Ip, "%s", pAdapter->IpAddressList.IpAddress.String); sprintf(info.Subnet, "%s", pAdapter->IpAddressList.IpMask.String); sprintf(info.Gate, "%s", pAdapter->GatewayList.IpAddress.String); /* printf("\t***\n"); if (pAdapter->DhcpEnabled) { printf("\tDHCP Enabled: Yes\n"); printf("\t\tDHCP Server: \t%s\n", pAdapter->DhcpServer.IpAddress.String); printf("\tLease Obtained: %ld\n", pAdapter->LeaseObtained); } else printf("\tDHCP Enabled: No\n"); if (pAdapter->HaveWins) { printf("\tHave Wins: Yes\n"); printf("\t\tPrimary Wins Server: \t%s\n", pAdapter->PrimaryWinsServer.IpAddress.String); printf("\t\tSecondary Wins Server: \t%s\n", pAdapter->SecondaryWinsServer.IpAddress.String); } else printf("\tHave Wins: No\n"); */ // HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/Tcpip/Parameters/ // Interface/{2C38B514-FE8C-449D-927D-70369C...} // dnsÁ¤º¸¸¦ registry¿¡¼­ ¾ò¾î¿ÀÀÚ. CString key_name; key_name.Format("SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters\\Interfaces\\%s", pAdapter->AdapterName); HKEY hkey; HRESULT hr = RegOpenKeyEx(HKEY_LOCAL_MACHINE, key_name, 0, KEY_QUERY_VALUE, &hkey); if(hr == ERROR_SUCCESS) { DWORD value_size; char value[1024]; DWORD dwType; hr = RegQueryValueEx(hkey, "NameServer", 0, &dwType, (LPBYTE)value, &value_size); if(hr == ERROR_SUCCESS) { value[value_size] = 0; } RegCloseKey(hkey); strcpy(info.Dns, value); } free(pAdapterInfo); return 1; } pAdapter = pAdapter->Next; pt++; } } else { printf("Call to GetAdaptersInfo failed.\n"); } // memory leak - cjy, 08_0528 13:47 free(pAdapterInfo); return 0; }