]> git.ipfire.org Git - thirdparty/openvpn.git/commitdiff
Squashed Win2K TAP bug that was introduced by Vista fixes.
authorjames <james@e7ae566f-a301-0410-adde-c780ea21d3b5>
Wed, 23 Jan 2008 09:37:25 +0000 (09:37 +0000)
committerjames <james@e7ae566f-a301-0410-adde-c780ea21d3b5>
Wed, 23 Jan 2008 09:37:25 +0000 (09:37 +0000)
git-svn-id: http://svn.openvpn.net/projects/openvpn/branches/BETA21/openvpn@2657 e7ae566f-a301-0410-adde-c780ea21d3b5

install-win32/settings.in
tap-win32/prototypes.h
tap-win32/tapdrvr.c

index 2239790d70ef5e55bf13040b7db2fd6f30e0c357..a2c138dc9363ff118a7770f3f80b780b9a5073e3 100644 (file)
 !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"
index f7d09f680f2b2d5d0b9bb9130d839dc7161a8ebd..b4dd69e79db76d5fd772b512893196cb6467b4c5 100755 (executable)
@@ -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
index ca02d13b7e0daf28bc7a227becc7523d28672a43..a6d2b6bfa37cfa7c216af73a3d2c5aa94fd3f1f0 100755 (executable)
@@ -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;
     }