Cześć napisałem sobie program (wraz z pomocą dokumentacji z mdsn), który ma dodawac wpis do tablicy arp.
Generalnie działa ok, (tylko z uprawnieniami administratora :( ), jednakże, mam problem ze zrozumieniem kawałka kodu. Poniżej dodaje całość. Zaznaczony fragment zaczyna się od start, a kończy na stop. Jeżeli wywalę tamta cześć kodu i dodam zamiast tego
GetIpAddrTable(pIpAddrtable, &dwSize, 0)
GetIpAddrTable(pIpAddrtable, &dwSize, 0) t
o program działa, aczkolwiek jestem pewny, że coś jest nie tak. Mógłby ktoś wyjaśnić o co to chodzi?
#ifndef WIN32_LEAN_AND_MEAN #define WIN32_LEAN_AND_MEAN #endif #include <windows.h> #include <winsock2.h> #include <ws2ipdef.h> #include <iphlpapi.h> #include <stdio.h> #include <stdlib.h> #include <iostream> #pragma comment(lib, "iphlpapi.lib") #pragma comment(lib, "ws2_32.lib") using namespace std; int main() { ULONG ulOutBufLen; DWORD dwRetVal; PIP_ADAPTER_INFO pAdapterInfo; ulOutBufLen = sizeof(IP_ADAPTER_INFO); pAdapterInfo = (IP_ADAPTER_INFO *) malloc( sizeof(IP_ADAPTER_INFO) ); ulOutBufLen = sizeof(IP_ADAPTER_INFO); if (GetAdaptersInfo( pAdapterInfo, &ulOutBufLen) != ERROR_SUCCESS) { free (pAdapterInfo); pAdapterInfo = (IP_ADAPTER_INFO *) malloc ( ulOutBufLen ); } if ((dwRetVal = GetAdaptersInfo( pAdapterInfo, &ulOutBufLen)) != ERROR_SUCCESS) { printf("GetAdaptersInfo call failed with %d\n", dwRetVal); } PMIB_IPADDRTABLE pIpAddrtable; DWORD dwSize = 0; DWORD dwRetVal2 = 0; IN_ADDR IPAddr; free(pIpAddrtable); pIpAddrtable = (MIB_IPADDRTABLE *) malloc(dwSize*2); PIP_ADAPTER_INFO pAdapter = pAdapterInfo; PMIB_IPNETROW pArpEntry; DWORD ip = inet_addr("182.221.231.1"); //start if (pIpAddrtable) { if (GetIpAddrTable(pIpAddrtable, &dwSize, 0) == ERROR_INSUFFICIENT_BUFFER) { free(pIpAddrtable); cout <<"Za mała ilosc pamięci"; } if (pIpAddrtable == NULL) { printf("Memory allocation failed for GetIpAddrTable\n"); exit(1); } if (dwRetVal2 = GetIpAddrTable(pIpAddrtable, &dwSize, 0) != NO_ERROR) { printf("Mamy error %s", dwRetVal2); } } //stop pArpEntry->dwIndex = pIpAddrtable->table[0].dwIndex; pArpEntry->dwPhysAddrLen = 6; pArpEntry->bPhysAddr[0] = '0x01'; pArpEntry->bPhysAddr[1] = '0xb2'; pArpEntry->bPhysAddr[2] = '0xd3'; pArpEntry->bPhysAddr[3] = '0xd4'; pArpEntry->bPhysAddr[4] = '0x05'; pArpEntry->bPhysAddr[5] = '0x16'; pArpEntry->dwType = MIB_IPNET_TYPE_STATIC; pArpEntry->dwAddr = ip; if (CreateIpNetEntry(pArpEntry) == ERROR_ACCESS_DENIED) { cout <<"Dostęp zabroniony "; } while (pAdapter) { printf(TEXT("Nazwa adaptera: %s \n"), pAdapter->AdapterName); printf("Adres adaptera: %s \n", pAdapter->IpAddressList.IpAddress.String); printf("Maska: %s \n ", pAdapter->IpAddressList.IpMask.String); printf("Opis: %s \n ", pAdapter->Description); printf("Serwer DHCP %s \n ", pAdapter->DhcpServer.IpAddress.String); printf("Indeks: %5d \n ", pAdapter->Index); cout <<endl; pAdapter = pAdapter->Next; } return 0; }