Changing the Default Gateway
A version of this page is also available for
4/8/2010
This code is an example of how to change the default gateway to NewGateway. Simply calling GetIpForwardEntry, changing the gateway and then calling SetIpForwardEntry will not change the route, but rather will just add a new one. If for some reason there are multiple default gateways present, this code will delete them. Note that the new gateway must be viable, otherwise TCP/IP will ignore the change.
PMIB_IPFORWARDTABLE pIpForwardTable = NULL;
PMIB_IPFORWARDROW pRow = NULL;
ULONG dwSize = 0;
BOOL bOrder = FALSE;
DWORD dwStatus = 0;
DWORD NewGateway = 0xDDBBCCAA; // this is in host order Ip Address AA.BB.CC.DD is DDCCBBAA
// Find out how big our buffer needs to be
dwStatus = GetIpForwardTable(pIpForwardTable, &dwSize, bOrder);
if (dwStatus == ERROR_INSUFFICIENT_BUFFER) {
// Allocate the memory for the table
if (!(pIpForwardTable = (PMIB_IPFORWARDTABLE)malloc(dwSize))) {
OutputMessage(TEXT("Malloc failed, Out of Memory!\r\n"));
exit(1);
}
// Now get the table
dwStatus = GetIpForwardTable(pIpForwardTable, &dwSize, bOrder);
}
if (dwStatus != ERROR_SUCCESS) {
OutputMessage(TEXT("GetIpForwardTable Failed, ERROR %d\r\n"), dwStatus);
if (pIpForwardTable)
free(pIpForwardTable);
exit(1);
}
// Search for the row in the table that is wanted. The default gateway has a destination
// of 0.0.0.0 - Notice that while the table is looked through, but only one row is copied.
// This is so that if there happen to be multiple default gateways, all
// of them can be deleted.
for (unsigned long int i=0; i < pIpForwardTable->dwNumEntries; i++) {
if (pIpForwardTable->table[i].dwForwardDest == 0) {
// The default gateway has been found
if (!pRow) {
// Allocate some memory to store the row in - this is easier than filling
// in the row structure and helps ensure that only the
// gateway address is changed.
pRow = (PMIB_IPFORWARDROW)malloc(sizeof(MIB_IPFORWARDROW));
if (!pRow) {
OutputMessage(TEXT("Malloc failed, Out of Memory!\r\n"));
exit(1);
}
// Copy the row
memcpy(pRow, &(pIpForwardTable->table[i]), sizeof(MIB_IPFORWARDROW));
}
// Delete the old default gateway entry
dwStatus = DeleteIpForwardEntry(&(pIpForwardTable->table[i]));
if (dwStatus != ERROR_SUCCESS) {
OutputMessage(TEXT("Could not delete old gateway\n"));
exit(1);
}
}
}
// Set the nexthop field to our new gateway - all the other properties of the route will
// be the same as they were previously.
pRow->dwForwardNextHop = NewGateway;
// Create a new route entry for the default gateway.
dwStatus = CreateIpForwardEntry(pRow);
if (dwStatus == NO_ERROR)
OutputMessage(TEXT("Gateway changed successfully\n"));
else if (dwStatus == ERROR_INVALID_PARAMETER)
OutputMessage(TEXT("Invalid Parameter\n"));
else
DisplayErrorMessage(dwStatus);
// Free resources
if (pIpForwardTable)
free(pIpForwardTable);
if (pRow)
free(pRow);