[PATCH 3/5] mountmgr.sys: Create network card registry keys.

Isabella Bosia ibosia at codeweavers.com
Tue Aug 25 09:32:23 CDT 2020


This really belongs to ndis.sys, but it's in mountmgr to reduce the
number of winedevice processes.

Signed-off-by: Isabella Bosia <ibosia at codeweavers.com>
---
 dlls/mountmgr.sys/Makefile.in |  3 +-
 dlls/mountmgr.sys/mountmgr.c  |  4 ++
 dlls/mountmgr.sys/mountmgr.h  |  1 +
 dlls/mountmgr.sys/ndis.c      | 98 +++++++++++++++++++++++++++++++++++
 4 files changed, 105 insertions(+), 1 deletion(-)
 create mode 100644 dlls/mountmgr.sys/ndis.c

diff --git a/dlls/mountmgr.sys/Makefile.in b/dlls/mountmgr.sys/Makefile.in
index e229164280..fe3871366b 100644
--- a/dlls/mountmgr.sys/Makefile.in
+++ b/dlls/mountmgr.sys/Makefile.in
@@ -9,4 +9,5 @@ C_SRCS = \
 	dbus.c \
 	device.c \
 	diskarb.c \
-	mountmgr.c
+	mountmgr.c \
+	ndis.c
diff --git a/dlls/mountmgr.sys/mountmgr.c b/dlls/mountmgr.sys/mountmgr.c
index 1961eab983..4962e11596 100644
--- a/dlls/mountmgr.sys/mountmgr.c
+++ b/dlls/mountmgr.sys/mountmgr.c
@@ -583,6 +583,7 @@ NTSTATUS WINAPI DriverEntry( DRIVER_OBJECT *driver, UNICODE_STRING *path )
     static const WCHAR harddiskW[] = {'\\','D','r','i','v','e','r','\\','H','a','r','d','d','i','s','k',0};
     static const WCHAR driver_serialW[] = {'\\','D','r','i','v','e','r','\\','S','e','r','i','a','l',0};
     static const WCHAR driver_parallelW[] = {'\\','D','r','i','v','e','r','\\','P','a','r','a','l','l','e','l',0};
+    static const WCHAR driver_ndisW[] = {'\\','D','r','i','v','e','r','\\','N','D','I','S',0};
     static const WCHAR devicemapW[] = {'H','A','R','D','W','A','R','E','\\','D','E','V','I','C','E','M','A','P','\\','S','c','s','i',0};
 
 #ifdef _WIN64
@@ -643,5 +644,8 @@ NTSTATUS WINAPI DriverEntry( DRIVER_OBJECT *driver, UNICODE_STRING *path )
     RtlInitUnicodeString( &nameW, driver_parallelW );
     IoCreateDriver( &nameW, parallel_driver_entry );
 
+    RtlInitUnicodeString( &nameW, driver_ndisW );
+    IoCreateDriver( &nameW, ndis_driver_entry );
+
     return status;
 }
diff --git a/dlls/mountmgr.sys/mountmgr.h b/dlls/mountmgr.sys/mountmgr.h
index 5fb43119c6..4ee2ba16e8 100644
--- a/dlls/mountmgr.sys/mountmgr.h
+++ b/dlls/mountmgr.sys/mountmgr.h
@@ -65,6 +65,7 @@ extern NTSTATUS query_unix_device( ULONGLONG unix_dev, enum device_type *type,
 extern NTSTATUS WINAPI harddisk_driver_entry( DRIVER_OBJECT *driver, UNICODE_STRING *path ) DECLSPEC_HIDDEN;
 extern NTSTATUS WINAPI serial_driver_entry( DRIVER_OBJECT *driver, UNICODE_STRING *path ) DECLSPEC_HIDDEN;
 extern NTSTATUS WINAPI parallel_driver_entry( DRIVER_OBJECT *driver, UNICODE_STRING *path ) DECLSPEC_HIDDEN;
+extern NTSTATUS WINAPI ndis_driver_entry( DRIVER_OBJECT *driver, UNICODE_STRING *path ) DECLSPEC_HIDDEN;
 
 /* SCSI entry functions */
 
diff --git a/dlls/mountmgr.sys/ndis.c b/dlls/mountmgr.sys/ndis.c
new file mode 100644
index 0000000000..0a3f87d410
--- /dev/null
+++ b/dlls/mountmgr.sys/ndis.c
@@ -0,0 +1,98 @@
+/*
+ * NDIS Ioctl support
+ *
+ * Copyright 2020 Isabella Bosia
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include <stdarg.h>
+
+#define NONAMELESSUNION
+#include "ntstatus.h"
+#define WIN32_NO_STATUS
+#include "windef.h"
+#include "winbase.h"
+#include "winternl.h"
+#include "winioctl.h"
+#include "ntddndis.h"
+#include "ddk/wdm.h"
+#include "ddk/ndis.h"
+#include "winreg.h"
+#include "wine/debug.h"
+
+#include <winsock2.h>
+#include <ws2ipdef.h>
+#include <iphlpapi.h>
+#include <netioapi.h>
+
+WINE_DEFAULT_DEBUG_CHANNEL(ndis);
+
+static void add_key(const char *guidstr, const MIB_IF_ROW2 *netdev)
+{
+    HKEY card_key;
+    char keyname[100];
+    char description[MAX_ADAPTER_NAME_LENGTH + 4];
+
+    snprintf( keyname, sizeof(keyname),
+              "Software\\Microsoft\\Windows NT\\CurrentVersion\\NetworkCards\\%d", netdev->InterfaceIndex );
+    WideCharToMultiByte( CP_ACP, 0, netdev->Description, -1, description, sizeof(description), NULL, NULL );
+
+    if (RegCreateKeyExA( HKEY_LOCAL_MACHINE, keyname, 0, NULL,
+                 REG_OPTION_VOLATILE, KEY_ALL_ACCESS, NULL, &card_key, NULL ) == ERROR_SUCCESS)
+    {
+        RegSetValueExA( card_key, "Description", 0, REG_SZ, (unsigned char *)description, strlen(description) );
+        RegSetValueExA( card_key, "ServiceName", 0, REG_SZ, (unsigned char *)guidstr, strlen(guidstr) );
+        RegCloseKey( card_key );
+    }
+}
+
+static int add_device(DRIVER_OBJECT *driver, const char *guidstr, MIB_IF_ROW2 *netdev)
+{
+    return 1;
+}
+
+static void create_network_devices(DRIVER_OBJECT *driver)
+{
+    MIB_IF_TABLE2 *table;
+    ULONG i;
+
+    if (GetIfTable2( &table ) != NO_ERROR)
+        return;
+
+    for (i = 0; i < table->NumEntries; i++)
+    {
+        GUID *guid = &table->Table[i].InterfaceGuid;
+        char guidstr[39];
+
+        sprintf( guidstr, "{%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}",
+                 guid->Data1, guid->Data2, guid->Data3, guid->Data4[0], guid->Data4[1],
+                 guid->Data4[2], guid->Data4[3], guid->Data4[4], guid->Data4[5],
+                 guid->Data4[6], guid->Data4[7] );
+        if (add_device( driver, guidstr, &table->Table[i] ))
+            add_key( guidstr, &table->Table[i] );
+    }
+
+    FreeMibTable( table );
+}
+
+NTSTATUS WINAPI ndis_driver_entry(DRIVER_OBJECT *driver, UNICODE_STRING *path)
+{
+    TRACE("(%p, %s)\n", driver, debugstr_w(path->Buffer));
+
+    create_network_devices( driver );
+
+    return STATUS_SUCCESS;
+}
-- 
2.25.1




More information about the wine-devel mailing list