You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
484 lines
10 KiB
484 lines
10 KiB
/*++
|
|
|
|
Copyright (c) 1996 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
ipconfig.hxx
|
|
|
|
Abstract:
|
|
|
|
CIpconfig class definition
|
|
|
|
Author:
|
|
|
|
Richard L Firth (rfirth) 29-Oct-1996
|
|
|
|
Environment:
|
|
|
|
Win32 user-mode DLL
|
|
|
|
Revision History:
|
|
|
|
29-Oct-1996 rfirth
|
|
Created
|
|
|
|
15-Jul-1998 arthurbi
|
|
Resurrected from the dead
|
|
|
|
--*/
|
|
|
|
#ifndef IPCONFIG_H_
|
|
#define IPCONFIG_H_
|
|
|
|
//
|
|
// manifests
|
|
//
|
|
|
|
#define HOST_INADDR_ANY 0x00000000
|
|
#define HOST_INADDR_NONE 0xffffffff
|
|
#define HOST_INADDR_LOOPBACK 0x0100007f
|
|
|
|
#define KEY_TCP 1
|
|
#define KEY_NBT 2
|
|
|
|
//#define MAX_ADAPTER_NAME_LENGTH 128 // arb.
|
|
#define MAX_ADAPTER_ADDRESS_LENGTH 8 // arb.
|
|
|
|
//
|
|
// macros
|
|
//
|
|
|
|
#define IS_VALID_NON_LOOPBACK_IP_ADDRESS(address) \
|
|
(((address) != HOST_INADDR_ANY) \
|
|
&& ((address) != HOST_INADDR_NONE) \
|
|
&& ((address) != HOST_INADDR_LOOPBACK))
|
|
|
|
//
|
|
// class definitions
|
|
//
|
|
|
|
//
|
|
// CIpAddress - IP address and associated subnet mask
|
|
//
|
|
|
|
class CIpAddress {
|
|
|
|
friend class CAdapterInfo;
|
|
friend class CIpAddressList;
|
|
|
|
private:
|
|
|
|
CIpAddress * m_Next;
|
|
BOOL m_bFound;
|
|
DWORD m_dwIpAddress;
|
|
DWORD m_dwIpMask;
|
|
DWORD m_dwContext;
|
|
|
|
public:
|
|
|
|
CIpAddress(
|
|
IN DWORD dwIpAddress = INADDR_ANY,
|
|
IN DWORD dwIpMask = INADDR_ANY,
|
|
IN DWORD dwContext = 0
|
|
) {
|
|
m_Next = NULL;
|
|
m_bFound = TRUE;
|
|
m_dwIpAddress = dwIpAddress;
|
|
m_dwIpMask = dwIpMask;
|
|
m_dwContext = dwContext;
|
|
}
|
|
|
|
~CIpAddress() {
|
|
/* NOTHING */
|
|
}
|
|
|
|
VOID SetFound(BOOL bFound) {
|
|
m_bFound = bFound;
|
|
}
|
|
|
|
BOOL
|
|
GetAddress(
|
|
OUT LPBYTE lpbAddress,
|
|
IN OUT LPDWORD lpdwAddressLength
|
|
);
|
|
|
|
BOOL IsFound(VOID) const {
|
|
return m_bFound;
|
|
}
|
|
|
|
DWORD IpAddress(VOID) const {
|
|
return m_dwIpAddress;
|
|
}
|
|
|
|
DWORD IpMask(VOID) const {
|
|
return m_dwIpMask;
|
|
}
|
|
|
|
DWORD Context(VOID) const {
|
|
return m_dwContext;
|
|
}
|
|
};
|
|
|
|
//
|
|
// CIpAddressList - singly-linked list of IP addresses
|
|
//
|
|
|
|
class CIpAddressList {
|
|
|
|
friend class CAdapterInterface;
|
|
|
|
private:
|
|
|
|
CIpAddress * m_List;
|
|
|
|
public:
|
|
|
|
CIpAddressList(VOID) {
|
|
m_List = NULL;
|
|
}
|
|
|
|
~CIpAddressList() {
|
|
Clear();
|
|
}
|
|
|
|
CIpAddress *
|
|
Find(
|
|
IN DWORD dwIpAddress,
|
|
IN DWORD dwIpMask = INADDR_ANY
|
|
);
|
|
|
|
BOOL
|
|
IsContextInList(
|
|
IN DWORD dwContext
|
|
);
|
|
|
|
VOID
|
|
Add(
|
|
CIpAddress * pAddress
|
|
);
|
|
|
|
BOOL
|
|
Add(
|
|
IN DWORD dwIpAddress = INADDR_ANY,
|
|
IN DWORD dwIpMask = INADDR_ANY,
|
|
IN DWORD dwContext = 0
|
|
);
|
|
|
|
BOOL
|
|
GetAddress(
|
|
IN OUT LPDWORD lpdwIndex,
|
|
OUT LPBYTE lpbAddress,
|
|
IN OUT LPDWORD lpdwAddressLength
|
|
);
|
|
|
|
VOID SetFound(BOOL bFound) {
|
|
for (CIpAddress * pEntry = m_List;
|
|
pEntry != NULL;
|
|
pEntry = pEntry->m_Next) {
|
|
|
|
pEntry->SetFound(bFound);
|
|
}
|
|
}
|
|
|
|
VOID Clear(VOID) {
|
|
|
|
CIpAddress * pEntry;
|
|
|
|
while ((pEntry = m_List) != NULL) {
|
|
m_List = pEntry->m_Next;
|
|
delete pEntry;
|
|
}
|
|
}
|
|
|
|
BOOL IsEmpty(VOID) {
|
|
return (m_List == NULL) ? TRUE : FALSE;
|
|
}
|
|
|
|
BOOL
|
|
ThrowOutUnfoundEntries(
|
|
VOID
|
|
);
|
|
};
|
|
|
|
//
|
|
// CAdapterInterface - singly-linked list of interface descriptors
|
|
//
|
|
|
|
class CAdapterInterface {
|
|
|
|
friend class CIpConfig;
|
|
|
|
private:
|
|
|
|
LIST_ENTRY m_List;
|
|
LPSTR m_lpszDescription;
|
|
DWORD m_dwDescriptionLength;
|
|
BYTE m_dwPhysicalAddressType;
|
|
LPBYTE m_lpPhysicalAddress;
|
|
DWORD m_dwPhysicalAddressLength;
|
|
LPSTR m_lpszAdapterName;
|
|
DWORD m_dwIndex;
|
|
DWORD m_dwType;
|
|
DWORD m_dwSpeed;
|
|
union {
|
|
struct {
|
|
unsigned Found : 1;
|
|
unsigned DialUp : 1;
|
|
unsigned Dhcp : 1;
|
|
} Bits;
|
|
DWORD Word;
|
|
} m_Flags;
|
|
CIpAddressList m_IpList;
|
|
//CIpAddressList m_RouterList; // do we still care about this one? no, we don't need it
|
|
//CIpAddressList m_DnsList; // was never used to begin with
|
|
CIpAddressList m_DhcpList;
|
|
|
|
public:
|
|
|
|
CAdapterInterface(
|
|
IN DWORD dwIndex = 0,
|
|
IN DWORD dwType = 0,
|
|
IN DWORD dwSpeed = (DWORD)-1,
|
|
IN LPSTR lpszDescription = NULL,
|
|
IN DWORD dwDescriptionLength = 0,
|
|
IN LPBYTE lpPhysicalAddress = NULL,
|
|
IN DWORD dwPhysicalAddressLength = 0
|
|
);
|
|
|
|
~CAdapterInterface();
|
|
|
|
BOOL IsFound(VOID) {
|
|
return m_Flags.Bits.Found ? TRUE : FALSE;
|
|
}
|
|
|
|
VOID SetFound(BOOL bFound) {
|
|
m_Flags.Bits.Found = bFound ? 1 : 0;
|
|
}
|
|
|
|
BOOL IsDialUp(VOID) {
|
|
return m_Flags.Bits.DialUp ? TRUE : FALSE;
|
|
}
|
|
|
|
VOID SetDialUp(VOID) {
|
|
m_Flags.Bits.DialUp = 1;
|
|
}
|
|
|
|
BOOL IsDhcp(VOID) {
|
|
return m_Flags.Bits.Dhcp ? TRUE : FALSE;
|
|
}
|
|
|
|
VOID SetDhcp(VOID) {
|
|
m_Flags.Bits.Dhcp = 1;
|
|
}
|
|
|
|
VOID SetNotFound(VOID) {
|
|
SetFound(FALSE);
|
|
m_IpList.SetFound(FALSE);
|
|
//m_RouterList.SetFound(FALSE);
|
|
//m_DnsList.SetFound(FALSE);
|
|
}
|
|
|
|
BOOL FindIpAddress(DWORD dwIpAddress) {
|
|
return (m_IpList.Find(dwIpAddress) != NULL) ? TRUE : FALSE;
|
|
}
|
|
|
|
BOOL IsHardwareAddress(LPBYTE lpHardwareAddress) {
|
|
return ( m_lpPhysicalAddress ?
|
|
!memcmp(m_lpPhysicalAddress,
|
|
lpHardwareAddress,
|
|
m_dwPhysicalAddressLength
|
|
)
|
|
: FALSE );
|
|
}
|
|
|
|
BOOL IsContextInIPAddrList(IN DWORD dwContext) {
|
|
return (m_IpList.IsContextInList(dwContext));
|
|
}
|
|
|
|
BOOL AddDhcpServer(DWORD dwIpAddress) {
|
|
return m_DhcpList.Add(dwIpAddress);
|
|
}
|
|
|
|
VOID ClearDhcpServerList(VOID) {
|
|
m_DhcpList.Clear();
|
|
}
|
|
|
|
BOOL SetAdapterName(LPSTR lpszNewAdapterName) {
|
|
m_lpszAdapterName = NewString(lpszNewAdapterName);
|
|
return (m_lpszAdapterName ? TRUE : FALSE);
|
|
}
|
|
|
|
LPSTR GetAdapterName(VOID) {
|
|
return m_lpszAdapterName;
|
|
}
|
|
|
|
BOOL CopyAdapterInfoToDhcpContext(PDHCP_CONTEXT pDhcpContext);
|
|
|
|
BOOL
|
|
DhcpDoInformNT5(
|
|
IN OUT LPSTR lpszAutoProxyUrl,
|
|
IN DWORD dwAutoProxyUrlLength
|
|
);
|
|
};
|
|
|
|
//
|
|
// CIpConfig - maintains all info about IP interfaces on this machine
|
|
//
|
|
|
|
class CIpConfig {
|
|
|
|
private:
|
|
|
|
LIST_ENTRY m_List;
|
|
DWORD m_dwNumberOfInterfaces;
|
|
TRI_STATE m_Loaded;
|
|
CIpAddressList m_DnsList;
|
|
|
|
DWORD
|
|
LoadEntryPoints(
|
|
VOID
|
|
);
|
|
|
|
DWORD
|
|
UnloadEntryPoints(
|
|
VOID
|
|
);
|
|
|
|
BOOL EntryPointsLoaded(VOID) const {
|
|
return m_Loaded;
|
|
}
|
|
|
|
BOOL
|
|
GetAdapterList(
|
|
OUT LPBOOL lpbChanged = NULL
|
|
);
|
|
|
|
BOOL
|
|
GetAdapterListOnNT5(
|
|
OUT LPBOOL lpbChanged = NULL
|
|
);
|
|
|
|
CAdapterInterface *
|
|
FindOrCreateInterface(
|
|
IN DWORD dwIndex,
|
|
IN DWORD dwType,
|
|
IN DWORD dwSpeed,
|
|
IN LPSTR lpszDescription,
|
|
IN DWORD dwDescriptionLength,
|
|
IN LPBYTE lpPhysicalAddress,
|
|
IN DWORD dwPhysicalAddressLength
|
|
);
|
|
|
|
CAdapterInterface *
|
|
FindInterface(
|
|
IN DWORD dwIndex
|
|
);
|
|
|
|
VOID SetNotFound(VOID) {
|
|
|
|
//
|
|
// ASSUMES: address of list entry in CAdapterInterface is same as
|
|
// address of CAdapterInterface
|
|
//
|
|
|
|
for (CAdapterInterface * pEntry = (CAdapterInterface *)m_List.Flink;
|
|
pEntry != (CAdapterInterface *)&m_List.Flink;
|
|
pEntry = (CAdapterInterface *)pEntry->m_List.Flink) {
|
|
|
|
pEntry->SetNotFound();
|
|
}
|
|
m_DnsList.SetFound(FALSE);
|
|
}
|
|
|
|
BOOL
|
|
ThrowOutUnfoundEntries(
|
|
VOID
|
|
);
|
|
|
|
BOOL
|
|
ThrowOutUnfoundAddresses(
|
|
VOID
|
|
);
|
|
|
|
public:
|
|
|
|
CIpConfig(VOID);
|
|
|
|
~CIpConfig();
|
|
|
|
BOOL
|
|
GetRouterAddress(
|
|
IN LPBYTE lpbInterfaceAddress OPTIONAL,
|
|
IN DWORD dwInterfaceAddressLength,
|
|
IN OUT LPDWORD lpdwIndex,
|
|
OUT LPBYTE lpbAddress,
|
|
IN OUT LPDWORD lpdwAddressLength
|
|
);
|
|
|
|
BOOL
|
|
GetDnsAddress(
|
|
IN LPBYTE lpbInterfaceAddress OPTIONAL,
|
|
IN DWORD dwInterfaceAddressLength,
|
|
IN OUT LPDWORD lpdwIndex,
|
|
OUT LPBYTE lpbAddress,
|
|
IN OUT LPDWORD lpdwAddressLength
|
|
);
|
|
|
|
BOOL
|
|
IsKnownIpAddress(
|
|
IN LPBYTE lpbInterfaceAddress OPTIONAL,
|
|
IN DWORD dwInterfaceAddressLength,
|
|
IN LPBYTE lpbAddress,
|
|
IN DWORD dwAddressLength
|
|
);
|
|
|
|
BOOL
|
|
Refresh(
|
|
VOID
|
|
);
|
|
|
|
VOID
|
|
GetAdapterInfo(
|
|
VOID
|
|
);
|
|
|
|
BOOL
|
|
DoInformsOnEachInterface(
|
|
IN OUT LPSTR lpszAutoProxyUrl,
|
|
IN DWORD dwAutoProxyUrlLength
|
|
);
|
|
};
|
|
|
|
//
|
|
// Function declarations
|
|
//
|
|
|
|
LPSTR* GetBoundAdapterList(HKEY BindingsSectionKey);
|
|
BOOL OpenAdapterKey(DWORD KeyType, LPSTR Name, PHKEY Key);
|
|
BOOL ReadRegistryDword(HKEY Key, LPSTR ParameterName, LPDWORD Value);
|
|
BOOL ReadRegistryString(HKEY Key, LPSTR ParameterName, LPSTR String, LPDWORD Length);
|
|
UINT GetDhcpServerFromDhcp(IN OUT CAdapterInterface * paiInterface);
|
|
|
|
BOOL DhcpDoInform( // send an inform packet if necessary
|
|
IN CAdapterInterface * pAdapterInterface,
|
|
IN BOOL fBroadcast, // Do we broadcast this inform, or unicast to server?
|
|
OUT LPSTR lpszAutoProxyUrl,
|
|
IN DWORD dwAutoProxyUrlLength
|
|
);
|
|
|
|
DWORD
|
|
QueryWellKnownDnsName(
|
|
IN OUT LPSTR lpszAutoProxyUrl,
|
|
IN DWORD dwAutoProxyUrlLength
|
|
);
|
|
|
|
|
|
//
|
|
// global data
|
|
//
|
|
|
|
//extern CIpConfig * GlobalIpConfig;
|
|
extern const char SERVICES_KEY_NAME[];
|
|
|
|
#endif // IPCONFIG_H_
|