wineboot: Create serial comm registry keys

André Hentschel nerv at dawncrow.de
Wed Oct 14 11:54:39 CDT 2015


Signed-off-by: André Hentschel <nerv at dawncrow.de>
---

get_dos_device_path stolen from dlls/kernel32/volume.c
supersedes 114615
This is for https://bugs.winehq.org/show_bug.cgi?id=11811
Next step would be https://bugs.winehq.org/show_bug.cgi?id=30409

 programs/wineboot/wineboot.c | 56 ++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 56 insertions(+)

diff --git a/programs/wineboot/wineboot.c b/programs/wineboot/wineboot.c
index 1477287..6e079d6 100644
--- a/programs/wineboot/wineboot.c
+++ b/programs/wineboot/wineboot.c
@@ -91,6 +91,27 @@ extern void kill_processes( BOOL kill_desktop );
 
 static WCHAR windowsdir[MAX_PATH];
 
+/* get the path of a dos device symlink in the $WINEPREFIX/dosdevices directory */
+static char *get_dos_device_path( LPCWSTR name )
+{
+    const char *config_dir = wine_get_config_dir();
+    char *buffer, *dev;
+    int i;
+
+    if (!(buffer = HeapAlloc( GetProcessHeap(), 0,
+                              strlen(config_dir) + sizeof("/dosdevices/") + 5 )))
+        return NULL;
+
+    strcpy( buffer, config_dir );
+    strcat( buffer, "/dosdevices/" );
+    dev = buffer + strlen(buffer);
+    /* no codepage conversion, DOS device names are ASCII anyway */
+    for (i = 0; i < 5; i++)
+        if (!(dev[i] = (char)tolowerW(name[i]))) break;
+    dev[5] = 0;
+    return buffer;
+}
+
 /* retrieve the (unix) path to the wine.inf file */
 static char *get_wine_inf_path(void)
 {
@@ -274,6 +295,40 @@ static void create_hardware_registry_keys(void)
     HeapFree( GetProcessHeap(), 0, power_info );
 }
 
+static void create_serial_registry_keys(void)
+{
+    static const WCHAR SerialCommW[] = {'H','a','r','d','w','a','r','e','\\',
+                                        'D','e','v','i','c','e','m','a','p','\\',
+                                        'S','e','r','i','a','l','C','o','m','m',0};
+    static const WCHAR ComDescW[] = {'C','O','M','%','d',0};
+    HKEY key;
+    int i;
+
+    if (RegCreateKeyExW( HKEY_LOCAL_MACHINE, SerialCommW, 0, NULL, REG_OPTION_VOLATILE,
+                         KEY_ALL_ACCESS, NULL, &key, NULL ))
+        return;
+
+    for (i = 1; i <= 9; i++)
+    {
+        WCHAR comW[5 /* com + single number + \0 */];
+        char *link;
+        int ret;
+
+        sprintfW( comW, ComDescW, i );
+        link = get_dos_device_path( comW );
+        ret = access( link, R_OK | W_OK );
+
+        if (ret)
+            RegDeleteValueW( key, comW );
+        else
+            set_reg_value( key, comW, comW );
+
+        HeapFree( GetProcessHeap(), 0, link );
+    }
+
+    RegCloseKey( key );
+}
+
 
 /* create the DynData registry keys */
 static void create_dynamic_registry_keys(void)
@@ -1234,6 +1289,7 @@ int main( int argc, char *argv[] )
     create_hardware_registry_keys();
     create_dynamic_registry_keys();
     create_environment_registry_keys();
+    create_serial_registry_keys();
     wininit();
     pendingRename();
 
-- 
1.9.1




More information about the wine-patches mailing list