Signed-off-by: Haoyang Chen chenhaoyang@uniontech.com --- loader/wine.inf.in | 7 ++ programs/wineboot/Makefile.in | 2 +- programs/wineboot/wineboot.c | 119 ++++++++++++++++++++++++++++++++++ 3 files changed, 127 insertions(+), 1 deletion(-)
diff --git a/loader/wine.inf.in b/loader/wine.inf.in index 49e4f45da27..1f9e964d060 100644 --- a/loader/wine.inf.in +++ b/loader/wine.inf.in @@ -41,6 +41,7 @@ AddReg=\ Fonts,\ MCI,\ Misc,\ + Network,\ Nls,\ OLE,\ Printing,\ @@ -65,6 +66,7 @@ AddReg=\ Fonts,\ MCI,\ Misc,\ + Network,\ Nls,\ OLE,\ Printing,\ @@ -92,6 +94,7 @@ AddReg=\ Fonts,\ MCI,\ Misc,\ + Network,\ Nls,\ OLE,\ Printing,\ @@ -119,6 +122,7 @@ AddReg=\ Fonts,\ MCI,\ Misc,\ + Network,\ Nls,\ OLE,\ Printing,\ @@ -764,6 +768,9 @@ HKCU,Software\Microsoft\Windows\Shell\Associations\UrlAssociations\ftp\UserChoic HKCU,Software\Microsoft\Windows\Shell\Associations\UrlAssociations\http\UserChoice,"ProgId",,"http" HKCU,Software\Microsoft\Windows\Shell\Associations\UrlAssociations\https\UserChoice,"ProgId",,"https"
+[Network] +HKLM,System\CurrentControlSet\Control\Network{4D36E972-E325-11CE-BFC1-08002BE10318} + [Nls] HKLM,System\CurrentControlSet\Control\Nls\Language,"0401",,"l_intl.nls" HKLM,System\CurrentControlSet\Control\Nls\Language,"0402",,"l_intl.nls" diff --git a/programs/wineboot/Makefile.in b/programs/wineboot/Makefile.in index 0a1f5e4152f..5cb778f65cc 100644 --- a/programs/wineboot/Makefile.in +++ b/programs/wineboot/Makefile.in @@ -1,6 +1,6 @@ MODULE = wineboot.exe APPMODE = -mconsole -IMPORTS = uuid advapi32 ws2_32 kernelbase +IMPORTS = uuid advapi32 ws2_32 kernelbase oleaut32 ole32 DELAYIMPORTS = shell32 shlwapi version user32 setupapi newdev
EXTRADLLFLAGS = -mno-cygwin diff --git a/programs/wineboot/wineboot.c b/programs/wineboot/wineboot.c index 92276fcbe76..1d3a43fedff 100644 --- a/programs/wineboot/wineboot.c +++ b/programs/wineboot/wineboot.c @@ -79,6 +79,8 @@ #include <setupapi.h> #include <newdev.h> #include "resource.h" +#include "initguid.h" +#include <wbemcli.h>
WINE_DEFAULT_DEBUG_CHANNEL(wineboot);
@@ -1586,6 +1588,122 @@ done: return ret; }
+static HRESULT query_property(IWbemClassObject *obj, const WCHAR *prop, WCHAR *buf, DWORD bufLen ) +{ + CIMTYPE type = 0xdeadbeef; + VARIANT val; + HRESULT hr = S_OK; + + if (!buf || !bufLen) return WBEM_E_INVALID_QUERY; + + VariantInit( &val ); + hr = IWbemClassObject_Get( obj, prop, 0, &val, &type, NULL ); + if (hr != S_OK) return hr; + + if (V_VT(&val) == VT_BSTR) + wcscpy(buf,V_BSTR(&val)); + else + hr = WBEM_E_INVALID_QUERY_TYPE; + VariantClear( &val ); + return hr; +} + +static void insert_adapter(HKEY hkey, IWbemClassObject *obj) +{ + WCHAR value[MAX_PATH]; + WCHAR connection[MAX_PATH]; + HKEY subhkey; + LSTATUS status; + static int index = 0; + + if (S_OK != query_property( obj, L"GUID", value, ARRAYSIZE(value))) + return; + + swprintf( connection, ARRAYSIZE(connection), L"%s\Connection", value); + + if ((status = RegCreateKeyExW( hkey, connection, 0, NULL, REG_OPTION_VOLATILE, KEY_ALL_ACCESS, NULL, &subhkey, NULL ))) + return; + set_reg_value_dword(subhkey, L"DefaultNameIndex", index++); + set_reg_value_dword(subhkey, L"DefaultNameResourceId", 0x709); /* FIXME */ + + if (S_OK == query_property( obj, L"Name", value, ARRAYSIZE(value))) + set_reg_value(subhkey, L"Name", value); + if (S_OK == query_property( obj, L"PNPDeviceID", value, ARRAYSIZE(value))) + set_reg_value(subhkey, L"PnpInstanceID", value); + RegCloseKey( subhkey ); +} + +static void update_networkAdapter(void) +{ + BSTR wql = SysAllocString( L"wql" ), query = SysAllocString( L"SELECT * FROM Win32_NetworkAdapter" ); + IEnumWbemClassObject *result = NULL; + IWbemClassObject *obj = NULL; + HRESULT hr = S_OK; + DWORD count = 0; + BSTR path = SysAllocString( L"ROOT\CIMV2" ); + IWbemLocator *locator = NULL; + IWbemServices *services = NULL; + HKEY key; + + CoInitialize( NULL ); + + if (RegOpenKeyW( HKEY_LOCAL_MACHINE, L"System\CurrentControlSet\Control\Network\{4D36E972-E325-11CE-BFC1-08002BE10318}", &key )) + { + WINE_WARN("can't open network adapter registry.\n"); + goto done; + } + + CoInitializeSecurity( NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_DEFAULT, + RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, NULL ); + hr = CoCreateInstance( &CLSID_WbemLocator, NULL, CLSCTX_INPROC_SERVER, &IID_IWbemLocator, + (void **)&locator ); + if (hr != S_OK) + { + WINE_TRACE("can't create instance of WbemLocator\n"); + goto done; + } + hr = IWbemLocator_ConnectServer( locator, path, NULL, NULL, NULL, 0, NULL, NULL, &services ); + if (hr != S_OK) + { + WINE_TRACE( "failed to get IWbemServices interface %08x\n", hr ); + goto done; + } + + hr = CoSetProxyBlanket( (IUnknown *)services, RPC_C_AUTHN_WINNT, RPC_C_AUTHZ_NONE, NULL, + RPC_C_AUTHN_LEVEL_CALL, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE ); + if (hr != S_OK) + { + WINE_TRACE( "failed to set proxyBlanket %08x\n", hr ); + goto done; + } + hr = IWbemServices_ExecQuery( services, wql, query, 0, NULL, &result ); + if (hr != S_OK) + { + WINE_TRACE( "failed to exec query %08x\n", hr ); + goto done; + } + + for (;;) + { + hr = IEnumWbemClassObject_Next( result, 10000, 1, &obj, &count ); + if (hr != S_OK) break; + + insert_adapter(key, obj); + + IWbemClassObject_Release( obj ); + } + +done: + if (result) IEnumWbemClassObject_Release( result ); + if (query) SysFreeString( query ); + if (wql) SysFreeString( wql ); + if (path) SysFreeString( path ); + if (services) IWbemServices_Release( services ); + if (locator) IWbemLocator_Release( locator ); + RegCloseKey( key ); + CoUninitialize(); +} + static void usage( int status ) { WINE_MESSAGE( "Usage: wineboot [options]\n" ); @@ -1713,6 +1831,7 @@ int __cdecl main( int argc, char *argv[] ) if (init || update) update_wineprefix( update );
create_volatile_environment_registry_key(); + update_networkAdapter();
ProcessRunKeys( HKEY_LOCAL_MACHINE, L"RunOnce", TRUE, TRUE );
On Thu, Jul 15, 2021 at 03:09:41PM +0800, Haoyang Chen wrote:
Signed-off-by: Haoyang Chen chenhaoyang@uniontech.com
loader/wine.inf.in | 7 ++ programs/wineboot/Makefile.in | 2 +- programs/wineboot/wineboot.c | 119 ++++++++++++++++++++++++++++++++++ 3 files changed, 127 insertions(+), 1 deletion(-)
diff --git a/programs/wineboot/wineboot.c b/programs/wineboot/wineboot.c index 92276fcbe76..1d3a43fedff 100644 --- a/programs/wineboot/wineboot.c +++ b/programs/wineboot/wineboot.c @@ -79,6 +79,8 @@ #include <setupapi.h> #include <newdev.h> #include "resource.h" +#include "initguid.h" +#include <wbemcli.h>
WINE_DEFAULT_DEBUG_CHANNEL(wineboot);
@@ -1586,6 +1588,122 @@ done: return ret; }
+static HRESULT query_property(IWbemClassObject *obj, const WCHAR *prop, WCHAR *buf, DWORD bufLen ) +{
- CIMTYPE type = 0xdeadbeef;
- VARIANT val;
- HRESULT hr = S_OK;
- if (!buf || !bufLen) return WBEM_E_INVALID_QUERY;
- VariantInit( &val );
- hr = IWbemClassObject_Get( obj, prop, 0, &val, &type, NULL );
- if (hr != S_OK) return hr;
- if (V_VT(&val) == VT_BSTR)
wcscpy(buf,V_BSTR(&val));
- else
hr = WBEM_E_INVALID_QUERY_TYPE;
- VariantClear( &val );
- return hr;
+}
+static void insert_adapter(HKEY hkey, IWbemClassObject *obj) +{
- WCHAR value[MAX_PATH];
- WCHAR connection[MAX_PATH];
- HKEY subhkey;
- LSTATUS status;
- static int index = 0;
- if (S_OK != query_property( obj, L"GUID", value, ARRAYSIZE(value)))
return;
- swprintf( connection, ARRAYSIZE(connection), L"%s\Connection", value);
- if ((status = RegCreateKeyExW( hkey, connection, 0, NULL, REG_OPTION_VOLATILE, KEY_ALL_ACCESS, NULL, &subhkey, NULL )))
return;
- set_reg_value_dword(subhkey, L"DefaultNameIndex", index++);
- set_reg_value_dword(subhkey, L"DefaultNameResourceId", 0x709); /* FIXME */
- if (S_OK == query_property( obj, L"Name", value, ARRAYSIZE(value)))
set_reg_value(subhkey, L"Name", value);
- if (S_OK == query_property( obj, L"PNPDeviceID", value, ARRAYSIZE(value)))
set_reg_value(subhkey, L"PnpInstanceID", value);
- RegCloseKey( subhkey );
+}
We're already adding some network card keys in ndis.sys, so probably this should go there instead of wineboot.
Also, which is these does the app you're looking at actually need? I don't see DefaultNameIndex and DefaultNameResourceId in my Windows 10 VM and don't see PnpInstanceID on many of the adaptors in my Windows 7 VM.
Huw.
在 2021/7/19 下午3:16, Huw Davies 写道:
On Thu, Jul 15, 2021 at 03:09:41PM +0800, Haoyang Chen wrote:
Signed-off-by: Haoyang Chen chenhaoyang@uniontech.com
loader/wine.inf.in | 7 ++ programs/wineboot/Makefile.in | 2 +- programs/wineboot/wineboot.c | 119 ++++++++++++++++++++++++++++++++++ 3 files changed, 127 insertions(+), 1 deletion(-)
diff --git a/programs/wineboot/wineboot.c b/programs/wineboot/wineboot.c index 92276fcbe76..1d3a43fedff 100644 --- a/programs/wineboot/wineboot.c +++ b/programs/wineboot/wineboot.c @@ -79,6 +79,8 @@ #include <setupapi.h> #include <newdev.h> #include "resource.h" +#include "initguid.h" +#include <wbemcli.h>
WINE_DEFAULT_DEBUG_CHANNEL(wineboot);
@@ -1586,6 +1588,122 @@ done: return ret; }
+static HRESULT query_property(IWbemClassObject *obj, const WCHAR *prop, WCHAR *buf, DWORD bufLen ) +{
- CIMTYPE type = 0xdeadbeef;
- VARIANT val;
- HRESULT hr = S_OK;
- if (!buf || !bufLen) return WBEM_E_INVALID_QUERY;
- VariantInit( &val );
- hr = IWbemClassObject_Get( obj, prop, 0, &val, &type, NULL );
- if (hr != S_OK) return hr;
- if (V_VT(&val) == VT_BSTR)
wcscpy(buf,V_BSTR(&val));
- else
hr = WBEM_E_INVALID_QUERY_TYPE;
- VariantClear( &val );
- return hr;
+}
+static void insert_adapter(HKEY hkey, IWbemClassObject *obj) +{
- WCHAR value[MAX_PATH];
- WCHAR connection[MAX_PATH];
- HKEY subhkey;
- LSTATUS status;
- static int index = 0;
- if (S_OK != query_property( obj, L"GUID", value, ARRAYSIZE(value)))
return;
- swprintf( connection, ARRAYSIZE(connection), L"%s\Connection", value);
- if ((status = RegCreateKeyExW( hkey, connection, 0, NULL, REG_OPTION_VOLATILE, KEY_ALL_ACCESS, NULL, &subhkey, NULL )))
return;
- set_reg_value_dword(subhkey, L"DefaultNameIndex", index++);
- set_reg_value_dword(subhkey, L"DefaultNameResourceId", 0x709); /* FIXME */
- if (S_OK == query_property( obj, L"Name", value, ARRAYSIZE(value)))
set_reg_value(subhkey, L"Name", value);
- if (S_OK == query_property( obj, L"PNPDeviceID", value, ARRAYSIZE(value)))
set_reg_value(subhkey, L"PnpInstanceID", value);
- RegCloseKey( subhkey );
+}
We're already adding some network card keys in ndis.sys, so probably this should go there instead of wineboot.
Also, which is these does the app you're looking at actually need? I don't see DefaultNameIndex and DefaultNameResourceId in my Windows 10 VM and don't see PnpInstanceID on many of the adaptors in my Windows 7 VM.
Huw.
Hi,
There is an application which needs to query the "real" MAC address.
It first enumerates all the MAC addresses through the GetAdaptersInfo()
function, and then goes to the registry to look up the PnpInstanceID
value of the corresponding network card. It does not query the
ndis.sys key. I tested this on Windows 7.
Haoyang.