This really belongs to ndis.sys, but it's in mountmgr to reduce the number of winedevice processes.
Signed-off-by: Isabella Bosia ibosia@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; +}