mirror of
https://github.com/OpenVPN/openvpn.git
synced 2025-05-09 05:31:05 +08:00
Squashed Win2K TAP bug that was introduced by Vista fixes.
git-svn-id: http://svn.openvpn.net/projects/openvpn/branches/BETA21/openvpn@2657 e7ae566f-a301-0410-adde-c780ea21d3b5
This commit is contained in:
parent
2f775b1a17
commit
55e8903b9f
@ -75,10 +75,10 @@
|
||||
!define MAKE_CLEAN "yes"
|
||||
|
||||
; DEBUGGING -- set to something like "-DBG2"
|
||||
!define OUTFILE_LABEL "-T2"
|
||||
!define OUTFILE_LABEL "-T4"
|
||||
|
||||
; DEBUGGING -- set to something like "DEBUG2"
|
||||
!define TITLE_LABEL "TEST2"
|
||||
!define TITLE_LABEL "TEST4"
|
||||
|
||||
# include a sample configuration file and key
|
||||
!define SAMPCONF_DIR "test-key"
|
||||
|
@ -219,6 +219,12 @@ ZwSetSecurityObject (
|
||||
|
||||
#endif
|
||||
|
||||
struct WIN2K_NDIS_MINIPORT_BLOCK
|
||||
{
|
||||
unsigned char opaque[16];
|
||||
UNICODE_STRING MiniportName; // how mini-port refers to us
|
||||
};
|
||||
|
||||
VOID AllowNonAdmin (TapExtensionPointer p_Extension);
|
||||
|
||||
#endif
|
||||
|
@ -288,12 +288,12 @@ TapDriverUnload (IN PDRIVER_OBJECT p_DriverObject)
|
||||
// Adapter Initialization
|
||||
//==========================================================
|
||||
NDIS_STATUS AdapterCreate
|
||||
(OUT PNDIS_STATUS p_ErrorStatus,
|
||||
OUT PUINT p_MediaIndex,
|
||||
IN PNDIS_MEDIUM p_Media,
|
||||
IN UINT p_MediaCount,
|
||||
IN NDIS_HANDLE p_AdapterHandle,
|
||||
IN NDIS_HANDLE p_ConfigurationHandle)
|
||||
(OUT PNDIS_STATUS p_ErrorStatus,
|
||||
OUT PUINT p_MediaIndex,
|
||||
IN PNDIS_MEDIUM p_Media,
|
||||
IN UINT p_MediaCount,
|
||||
IN NDIS_HANDLE p_AdapterHandle,
|
||||
IN NDIS_HANDLE p_ConfigurationHandle)
|
||||
{
|
||||
TapAdapterPointer l_Adapter = NULL;
|
||||
|
||||
@ -306,6 +306,8 @@ NDIS_STATUS AdapterCreate
|
||||
BOOLEAN enable_non_admin = FALSE;
|
||||
#endif
|
||||
|
||||
DEBUGP (("[TAP] AdapterCreate called\n"));
|
||||
|
||||
//====================================
|
||||
// Make sure adapter type is supported
|
||||
//====================================
|
||||
@ -392,56 +394,63 @@ NDIS_STATUS AdapterCreate
|
||||
NdisOpenConfiguration (&status, &configHandle, p_ConfigurationHandle);
|
||||
if (status != NDIS_STATUS_SUCCESS)
|
||||
{
|
||||
DEBUGP (("[TAP] Couldn't open adapter registry\n"));
|
||||
AdapterFreeResources (l_Adapter);
|
||||
return status;
|
||||
DEBUGP (("[TAP] Couldn't open adapter registry\n"));
|
||||
AdapterFreeResources (l_Adapter);
|
||||
return status;
|
||||
}
|
||||
|
||||
//====================================
|
||||
// Allocate and construct adapter name
|
||||
//====================================
|
||||
{
|
||||
NDIS_STRING key = NDIS_STRING_CONST("MiniportName");
|
||||
NdisReadConfiguration (&status, &parm, configHandle, &key, NdisParameterString);
|
||||
|
||||
NDIS_STRING mkey = NDIS_STRING_CONST("MiniportName");
|
||||
NDIS_STRING vkey = NDIS_STRING_CONST("NdisVersion");
|
||||
NDIS_STATUS vstatus;
|
||||
NDIS_CONFIGURATION_PARAMETER *vparm;
|
||||
|
||||
NdisReadConfiguration (&vstatus, &vparm, configHandle, &vkey, NdisParameterInteger);
|
||||
if (vstatus == NDIS_STATUS_SUCCESS)
|
||||
DEBUGP (("[TAP] NdisReadConfiguration NdisVersion=%X\n", vparm->ParameterData.IntegerData));
|
||||
|
||||
NdisReadConfiguration (&status, &parm, configHandle, &mkey, NdisParameterString);
|
||||
if (status == NDIS_STATUS_SUCCESS)
|
||||
{
|
||||
if (parm->ParameterType == NdisParameterString)
|
||||
{
|
||||
DEBUGP (("[TAP] NdisReadConfiguration (MiniportName=%s)\n", parm->ParameterData.StringData.Buffer));
|
||||
DEBUGP (("[TAP] NdisReadConfiguration (MiniportName=%S)\n", parm->ParameterData.StringData.Buffer));
|
||||
|
||||
if (RtlUnicodeStringToAnsiString (
|
||||
&l_Adapter->m_NameAnsi,
|
||||
&parm->ParameterData.StringData,
|
||||
TRUE) != STATUS_SUCCESS)
|
||||
&l_Adapter->m_NameAnsi,
|
||||
&parm->ParameterData.StringData,
|
||||
TRUE) != STATUS_SUCCESS)
|
||||
{
|
||||
DEBUGP (("[TAP] RtlUnicodeStringToAnsiString MiniportName failed\n"));
|
||||
DEBUGP (("[TAP] MiniportName failed\n"));
|
||||
status = NDIS_STATUS_RESOURCES;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
#if DDKVER_MAJOR < 5600
|
||||
}
|
||||
else
|
||||
{
|
||||
/* "MiniportName" is available only XP and above. Not on Windows 2000. */
|
||||
NDIS_STRING key = NDIS_STRING_CONST("NdisVersion");
|
||||
NdisReadConfiguration (&status, &parm, configHandle, &key, NdisParameterInteger);
|
||||
if (status == NDIS_STATUS_SUCCESS)
|
||||
if (vstatus == NDIS_STATUS_SUCCESS && vparm->ParameterData.IntegerData == 0x50000)
|
||||
{
|
||||
if (parm->ParameterData.IntegerData == 0x50000)
|
||||
/* Fallback for Windows 2000 with NDIS version 5.00.00
|
||||
Don't use this on Vista, 'NDIS_MINIPORT_BLOCK' was changed! */
|
||||
if (RtlUnicodeStringToAnsiString (&l_Adapter->m_NameAnsi,
|
||||
&((struct WIN2K_NDIS_MINIPORT_BLOCK *) p_AdapterHandle)->MiniportName,
|
||||
TRUE) != STATUS_SUCCESS)
|
||||
{
|
||||
/* Fallback for Windows 2000 with NDIS version 5.00.00
|
||||
Don't use this on Vista, 'NDIS_MINIPORT_BLOCK' was changed! */
|
||||
DEBUGP (("[TAP] NdisReadConfiguration NdisVersion (Int=%X)\n", parm->ParameterData.IntegerData));
|
||||
if (RtlUnicodeStringToAnsiString (
|
||||
&l_Adapter->m_NameAnsi,
|
||||
&((PNDIS_MINIPORT_BLOCK) p_AdapterHandle)->MiniportName,
|
||||
TRUE) != STATUS_SUCCESS)
|
||||
{
|
||||
DEBUGP (("[TAP] RtlUnicodeStringToAnsiString MiniportName (W2K) failed\n"));
|
||||
status = NDIS_STATUS_RESOURCES;
|
||||
}
|
||||
DEBUGP (("[TAP] MiniportName (W2K) failed\n"));
|
||||
status = NDIS_STATUS_RESOURCES;
|
||||
}
|
||||
else
|
||||
{
|
||||
DEBUGP (("[TAP] MiniportName (W2K) succeeded: %s\n", l_Adapter->m_NameAnsi.Buffer));
|
||||
status = NDIS_STATUS_SUCCESS;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Can't continue without name (see macro 'NAME') */
|
||||
@ -449,85 +458,86 @@ NDIS_STATUS AdapterCreate
|
||||
{
|
||||
NdisCloseConfiguration (configHandle);
|
||||
AdapterFreeResources (l_Adapter);
|
||||
DEBUGP (("[TAP] failed to get miniport name\n"));
|
||||
return NDIS_STATUS_RESOURCES;
|
||||
}
|
||||
|
||||
/* Read MTU setting from registry */
|
||||
/* Read MTU setting from registry */
|
||||
{
|
||||
NDIS_STRING key = NDIS_STRING_CONST("MTU");
|
||||
NdisReadConfiguration (&status, &parm, configHandle,
|
||||
&key, NdisParameterInteger);
|
||||
if (status == NDIS_STATUS_SUCCESS)
|
||||
{
|
||||
NDIS_STRING key = NDIS_STRING_CONST("MTU");
|
||||
NdisReadConfiguration (&status, &parm, configHandle,
|
||||
&key, NdisParameterInteger);
|
||||
if (status == NDIS_STATUS_SUCCESS)
|
||||
if (parm->ParameterType == NdisParameterInteger)
|
||||
{
|
||||
if (parm->ParameterType == NdisParameterInteger)
|
||||
{
|
||||
int mtu = parm->ParameterData.IntegerData;
|
||||
if (mtu < MINIMUM_MTU)
|
||||
mtu = MINIMUM_MTU;
|
||||
if (mtu > MAXIMUM_MTU)
|
||||
mtu = MAXIMUM_MTU;
|
||||
l_Adapter->m_MTU = mtu;
|
||||
}
|
||||
int mtu = parm->ParameterData.IntegerData;
|
||||
if (mtu < MINIMUM_MTU)
|
||||
mtu = MINIMUM_MTU;
|
||||
if (mtu > MAXIMUM_MTU)
|
||||
mtu = MAXIMUM_MTU;
|
||||
l_Adapter->m_MTU = mtu;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Read Media Status setting from registry */
|
||||
/* Read Media Status setting from registry */
|
||||
{
|
||||
NDIS_STRING key = NDIS_STRING_CONST("MediaStatus");
|
||||
NdisReadConfiguration (&status, &parm, configHandle,
|
||||
&key, NdisParameterInteger);
|
||||
if (status == NDIS_STATUS_SUCCESS)
|
||||
{
|
||||
NDIS_STRING key = NDIS_STRING_CONST("MediaStatus");
|
||||
NdisReadConfiguration (&status, &parm, configHandle,
|
||||
&key, NdisParameterInteger);
|
||||
if (status == NDIS_STATUS_SUCCESS)
|
||||
if (parm->ParameterType == NdisParameterInteger)
|
||||
{
|
||||
if (parm->ParameterType == NdisParameterInteger)
|
||||
if (parm->ParameterData.IntegerData)
|
||||
{
|
||||
if (parm->ParameterData.IntegerData)
|
||||
{
|
||||
l_Adapter->m_MediaStateAlwaysConnected = TRUE;
|
||||
l_Adapter->m_MediaState = TRUE;
|
||||
}
|
||||
l_Adapter->m_MediaStateAlwaysConnected = TRUE;
|
||||
l_Adapter->m_MediaState = TRUE;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#if ENABLE_NONADMIN
|
||||
/* Read AllowNonAdmin setting from registry */
|
||||
/* Read AllowNonAdmin setting from registry */
|
||||
{
|
||||
NDIS_STRING key = NDIS_STRING_CONST("AllowNonAdmin");
|
||||
NdisReadConfiguration (&status, &parm, configHandle,
|
||||
&key, NdisParameterInteger);
|
||||
if (status == NDIS_STATUS_SUCCESS)
|
||||
{
|
||||
NDIS_STRING key = NDIS_STRING_CONST("AllowNonAdmin");
|
||||
NdisReadConfiguration (&status, &parm, configHandle,
|
||||
&key, NdisParameterInteger);
|
||||
if (status == NDIS_STATUS_SUCCESS)
|
||||
if (parm->ParameterType == NdisParameterInteger)
|
||||
{
|
||||
if (parm->ParameterType == NdisParameterInteger)
|
||||
if (parm->ParameterData.IntegerData)
|
||||
{
|
||||
if (parm->ParameterData.IntegerData)
|
||||
{
|
||||
enable_non_admin = TRUE;
|
||||
}
|
||||
enable_non_admin = TRUE;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Read optional MAC setting from registry */
|
||||
/* Read optional MAC setting from registry */
|
||||
{
|
||||
NDIS_STRING key = NDIS_STRING_CONST("MAC");
|
||||
ANSI_STRING mac_string;
|
||||
NdisReadConfiguration (&status, &parm, configHandle,
|
||||
&key, NdisParameterString);
|
||||
if (status == NDIS_STATUS_SUCCESS)
|
||||
{
|
||||
NDIS_STRING key = NDIS_STRING_CONST("MAC");
|
||||
ANSI_STRING mac_string;
|
||||
NdisReadConfiguration (&status, &parm, configHandle,
|
||||
&key, NdisParameterString);
|
||||
if (status == NDIS_STATUS_SUCCESS)
|
||||
if (parm->ParameterType == NdisParameterString)
|
||||
{
|
||||
if (parm->ParameterType == NdisParameterString)
|
||||
if (RtlUnicodeStringToAnsiString (&mac_string, &parm->ParameterData.StringData, TRUE) == STATUS_SUCCESS)
|
||||
{
|
||||
if (RtlUnicodeStringToAnsiString (&mac_string, &parm->ParameterData.StringData, TRUE) == STATUS_SUCCESS)
|
||||
{
|
||||
l_MacFromRegistry = ParseMAC (l_Adapter->m_MAC, mac_string.Buffer);
|
||||
RtlFreeAnsiString (&mac_string);
|
||||
}
|
||||
l_MacFromRegistry = ParseMAC (l_Adapter->m_MAC, mac_string.Buffer);
|
||||
RtlFreeAnsiString (&mac_string);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
NdisCloseConfiguration (configHandle);
|
||||
NdisCloseConfiguration (configHandle);
|
||||
|
||||
DEBUGP (("[%s] MTU=%d\n", NAME (l_Adapter), l_Adapter->m_MTU));
|
||||
}
|
||||
@ -540,9 +550,9 @@ NDIS_STATUS AdapterCreate
|
||||
GenerateRandomMac (l_Adapter->m_MAC, NAME (l_Adapter));
|
||||
|
||||
DEBUGP (("[%s] Using MAC %x:%x:%x:%x:%x:%x\n",
|
||||
NAME (l_Adapter),
|
||||
l_Adapter->m_MAC[0], l_Adapter->m_MAC[1], l_Adapter->m_MAC[2],
|
||||
l_Adapter->m_MAC[3], l_Adapter->m_MAC[4], l_Adapter->m_MAC[5]));
|
||||
NAME (l_Adapter),
|
||||
l_Adapter->m_MAC[0], l_Adapter->m_MAC[1], l_Adapter->m_MAC[2],
|
||||
l_Adapter->m_MAC[3], l_Adapter->m_MAC[4], l_Adapter->m_MAC[5]));
|
||||
|
||||
//==================
|
||||
// Set broadcast MAC
|
||||
@ -562,6 +572,7 @@ NDIS_STATUS AdapterCreate
|
||||
if (tap_status != NDIS_STATUS_SUCCESS)
|
||||
{
|
||||
AdapterFreeResources (l_Adapter);
|
||||
DEBUGP (("[TAP] CreateTapDevice failed\n"));
|
||||
return tap_status;
|
||||
}
|
||||
}
|
||||
@ -571,6 +582,7 @@ NDIS_STATUS AdapterCreate
|
||||
NOTE_ERROR ();
|
||||
TapDeviceFreeResources (&l_Adapter->m_Extension);
|
||||
AdapterFreeResources (l_Adapter);
|
||||
DEBUGP (("[TAP] AddAdapterToInstanceList failed\n"));
|
||||
return NDIS_STATUS_RESOURCES;
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user