246 lines
5.4 KiB
C
246 lines
5.4 KiB
C
|
#include <nt.h>
|
||
|
#include <ntrtl.h>
|
||
|
#include <nturtl.h>
|
||
|
#include <ntddser.h>
|
||
|
|
||
|
#include <windows.h>
|
||
|
|
||
|
#include <stdio.h>
|
||
|
#include <stdlib.h>
|
||
|
#include <memory.h>
|
||
|
#include <malloc.h>
|
||
|
|
||
|
#include <rasman.h>
|
||
|
#include <dim.h>
|
||
|
#include <routprot.h>
|
||
|
#include <ipxrtdef.h>
|
||
|
|
||
|
// [pmay] this will no longer be neccessary when the ipx router
|
||
|
// is converted to use MprInfo api's.
|
||
|
typedef RTR_INFO_BLOCK_HEADER IPX_INFO_BLOCK_HEADER, *PIPX_INFO_BLOCK_HEADER;
|
||
|
|
||
|
|
||
|
typedef struct _IF_CONFIG {
|
||
|
|
||
|
BOOL Empty;
|
||
|
WCHAR InterfaceName[48];
|
||
|
HANDLE DimIfHandle;
|
||
|
ROUTER_INTERFACE_TYPE IfType;
|
||
|
ULONG IfSize;
|
||
|
|
||
|
} IF_CONFIG, *PIF_CONFIG;
|
||
|
|
||
|
FILE *ConfigFile;
|
||
|
|
||
|
typedef struct _IF_TYPE_TRANSLATION {
|
||
|
|
||
|
ROUTER_INTERFACE_TYPE DimType;
|
||
|
ULONG IpxMibType;
|
||
|
|
||
|
} IF_TYPE_TRANSLATION, *PIF_TYPE_TRANSLATION;
|
||
|
|
||
|
IF_TYPE_TRANSLATION IfTypeTranslation[] = {
|
||
|
|
||
|
{ ROUTER_IF_TYPE_FULL_ROUTER, IF_TYPE_WAN_ROUTER },
|
||
|
{ ROUTER_IF_TYPE_HOME_ROUTER, IF_TYPE_PERSONAL_WAN_ROUTER },
|
||
|
{ ROUTER_IF_TYPE_DEDICATED, IF_TYPE_LAN },
|
||
|
{ ROUTER_IF_TYPE_CLIENT, IF_TYPE_WAN_WORKSTATION },
|
||
|
{ ROUTER_IF_TYPE_INTERNAL, IF_TYPE_INTERNAL }
|
||
|
|
||
|
};
|
||
|
|
||
|
#define MAX_IF_TYPES sizeof(IfTypeTranslation)/sizeof(IF_TYPE_TRANSLATION)
|
||
|
|
||
|
VOID
|
||
|
SaveInterface(PDIM_ROUTER_INTERFACE dimifp,
|
||
|
PIPX_INTERFACE IpxIfp);
|
||
|
|
||
|
|
||
|
VOID
|
||
|
SaveConfiguration(PDIM_ROUTER_INTERFACE dimifp)
|
||
|
{
|
||
|
DWORD rc;
|
||
|
IPX_MIB_GET_INPUT_DATA MibGetInputData;
|
||
|
DWORD IfSize;
|
||
|
IPX_INTERFACE IpxIf;
|
||
|
IF_CONFIG IfConfig;
|
||
|
|
||
|
// open configuration file
|
||
|
if((ConfigFile = fopen("c:\\test\\config.bin", "w+b")) == NULL) {
|
||
|
|
||
|
printf("SaveConfiguration: cannot open config file\n");
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
// get all configured interfaces from the rtrmgr and save them
|
||
|
IfSize = sizeof(IPX_INTERFACE);
|
||
|
|
||
|
MibGetInputData.TableId = IPX_INTERFACE_TABLE;
|
||
|
MibGetInputData.MibIndex.InterfaceTableIndex.InterfaceIndex = 0;
|
||
|
|
||
|
rc = (*(dimifp->MIBEntryGetFirst))(
|
||
|
IPX_PROTOCOL_BASE,
|
||
|
sizeof(IPX_MIB_GET_INPUT_DATA),
|
||
|
&MibGetInputData,
|
||
|
&IfSize,
|
||
|
&IpxIf);
|
||
|
|
||
|
|
||
|
if(rc != NO_ERROR) {
|
||
|
|
||
|
printf("MIBEntryGetFirst: failed rc = %d\n", rc);
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
SaveInterface(dimifp, &IpxIf);
|
||
|
|
||
|
for(;;)
|
||
|
{
|
||
|
MibGetInputData.MibIndex.InterfaceTableIndex.InterfaceIndex = IpxIf.InterfaceIndex;
|
||
|
|
||
|
rc = (*(dimifp->MIBEntryGetNext))(
|
||
|
IPX_PROTOCOL_BASE,
|
||
|
sizeof(IPX_MIB_GET_INPUT_DATA),
|
||
|
&MibGetInputData,
|
||
|
&IfSize,
|
||
|
&IpxIf);
|
||
|
|
||
|
if(rc != NO_ERROR) {
|
||
|
|
||
|
printf("EnumerateIpxInterfaces: MIBEntryGetNext failed rc= 0x%x\n", rc);
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
SaveInterface(dimifp, &IpxIf);
|
||
|
}
|
||
|
|
||
|
// done
|
||
|
IfConfig.Empty = TRUE;
|
||
|
|
||
|
fwrite(&IfConfig, sizeof(IF_CONFIG), 1, ConfigFile);
|
||
|
|
||
|
fclose(ConfigFile);
|
||
|
}
|
||
|
|
||
|
VOID
|
||
|
SaveInterface(PDIM_ROUTER_INTERFACE dimifp,
|
||
|
PIPX_INTERFACE IpxIfp)
|
||
|
{
|
||
|
DWORD rc;
|
||
|
ULONG IfSize = 0;
|
||
|
ULONG InFtSize = 0;
|
||
|
ULONG OutFtSize = 0;
|
||
|
LPVOID IfInfop;
|
||
|
IF_CONFIG IfConfig;
|
||
|
ANSI_STRING AnsiString;
|
||
|
UNICODE_STRING UnicodeString;
|
||
|
int i;
|
||
|
PIF_TYPE_TRANSLATION ittp;
|
||
|
|
||
|
rc = (*dimifp->GetInterfaceInfo)((HANDLE)(IpxIfp->InterfaceIndex),
|
||
|
NULL,
|
||
|
&IfSize,
|
||
|
NULL,
|
||
|
&InFtSize,
|
||
|
NULL,
|
||
|
&OutFtSize);
|
||
|
|
||
|
if(rc != ERROR_INSUFFICIENT_BUFFER) {
|
||
|
|
||
|
printf("SaveInterface: GetInterfaceInfo failed rc = %d\n", rc);
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
IfInfop = GlobalAlloc(GPTR, IfSize);
|
||
|
|
||
|
rc = (*dimifp->GetInterfaceInfo)((HANDLE)(IpxIfp->InterfaceIndex),
|
||
|
IfInfop,
|
||
|
&IfSize,
|
||
|
NULL,
|
||
|
&InFtSize,
|
||
|
NULL,
|
||
|
&OutFtSize);
|
||
|
|
||
|
if(rc != NO_ERROR) {
|
||
|
|
||
|
printf("SaveInterface: GetInterfaceInfo failed rc = %d\n", rc);
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
// write an IfConfig item followed by the if info
|
||
|
RtlInitAnsiString(&AnsiString, IpxIfp->InterfaceName);
|
||
|
|
||
|
RtlAnsiStringToUnicodeString(&UnicodeString, &AnsiString, TRUE);
|
||
|
|
||
|
memcpy(IfConfig.InterfaceName, UnicodeString.Buffer, UnicodeString.MaximumLength);
|
||
|
IfConfig.Empty = FALSE;
|
||
|
IfConfig.DimIfHandle = (HANDLE)IpxIfp->InterfaceIndex;
|
||
|
IfConfig.IfSize = IfSize;
|
||
|
|
||
|
for(i=0, ittp=IfTypeTranslation; i<MAX_IF_TYPES; i++, ittp++) {
|
||
|
|
||
|
if(IpxIfp->InterfaceType == ittp->IpxMibType) {
|
||
|
|
||
|
IfConfig.IfType = ittp->DimType;
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
printf("Saving if index %d size %d\n", IpxIfp->InterfaceIndex, IfSize);
|
||
|
|
||
|
fwrite(&IfConfig, sizeof(IF_CONFIG), 1, ConfigFile);
|
||
|
|
||
|
fwrite(IfInfop, IfSize, 1, ConfigFile);
|
||
|
|
||
|
GlobalFree(IfInfop);
|
||
|
|
||
|
RtlFreeUnicodeString(&UnicodeString);
|
||
|
}
|
||
|
|
||
|
VOID
|
||
|
RestoreConfiguration(PDIM_ROUTER_INTERFACE dimifp)
|
||
|
{
|
||
|
IF_CONFIG IfConfig;
|
||
|
LPVOID IfInfop;
|
||
|
HANDLE IfIndex;
|
||
|
PIF_TYPE_TRANSLATION ittp;
|
||
|
DWORD rc;
|
||
|
|
||
|
// open configuration file
|
||
|
if((ConfigFile = fopen("c:\\test\\config.bin", "r+b")) == NULL) {
|
||
|
|
||
|
printf("RestoreConfiguration: cannot open config file\n");
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
fread(&IfConfig, sizeof(IF_CONFIG), 1, ConfigFile);
|
||
|
|
||
|
while(!IfConfig.Empty)
|
||
|
{
|
||
|
IfInfop = GlobalAlloc(GPTR, IfConfig.IfSize);
|
||
|
|
||
|
fread(IfInfop, IfConfig.IfSize, 1, ConfigFile);
|
||
|
|
||
|
rc = (*(dimifp->AddInterface))(IfConfig.InterfaceName,
|
||
|
IfInfop,
|
||
|
NULL,
|
||
|
NULL,
|
||
|
IfConfig.IfType,
|
||
|
TRUE,
|
||
|
IfConfig.DimIfHandle,
|
||
|
&IfIndex);
|
||
|
|
||
|
if(rc != NO_ERROR) {
|
||
|
|
||
|
printf("RestoreConfiguration: failed with rc = %d\n", rc);
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
printf("RestoreConfiguration: added if index %d\n", IfIndex);
|
||
|
|
||
|
fread(&IfConfig, sizeof(IF_CONFIG), 1, ConfigFile);
|
||
|
}
|
||
|
|
||
|
fclose(ConfigFile);
|
||
|
}
|