kernel32: [1/2] Rename oldconfig.c

Detlef Riekenberg wine.dev at web.de
Sun Feb 25 17:19:31 CST 2007


Parts of the Registry are stored only in RAM and the 
functions to create them are in "dlls/kernel32/oldconfig.c"

I need to add "HKLM\HARDWARE\DEVICEMAP\SERIALCOMM",
but the name of the file does not match the code:
In the old days, "oldconfig.c" implemented support for the
old configuration-file, but that code is gone.

I choose to rename "oldconfig.c" to "registry.c" to match
the code (WINE_DEFAULT_DEBUG_CHANNEL was already "reg").

On IRC, Alexandre mentioned also wineboot or explorer
as a possible new location, but
- wineboot is not started automatic nearly all the time
- explorer is only started automatic for gui-applications
  ("explorer.exe /desktop")

Moving the code in "explorer.exe" is possible, but I have
no idea, how many console-applications can break.
As Example:
When serialui is fixed, serialui_test.exe will skip all 
tests without the hardware-keys.
As a Hack/Workaround to get the needed registry-entries, 
GetDesktopWindow() in serialui_test.exe is possible.


Changelog:
- kernel32: Rename oldconfig.c


-- 
 
By by ... Detlef

-------------- next part --------------
>From c84d475723c4f5145c2fbfc050a47d5f0ce5babe Mon Sep 17 00:00:00 2001
From: Detlef Riekenberg <wine.dev at web.de>
Date: Sun, 25 Feb 2007 22:22:31 +0100
Subject: [PATCH] kernel32: rename oldconfig.c
---
 dlls/kernel32/Makefile.in |    2 
 dlls/kernel32/oldconfig.c |  467 ---------------------------------------------
 dlls/kernel32/registry.c  |  467 +++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 468 insertions(+), 468 deletions(-)

diff --git a/dlls/kernel32/Makefile.in b/dlls/kernel32/Makefile.in
index 09105be..2d94c7e 100644
--- a/dlls/kernel32/Makefile.in
+++ b/dlls/kernel32/Makefile.in
@@ -46,12 +46,12 @@ C_SRCS = \
 	module.c \
 	ne_module.c \
 	ne_segment.c \
-	oldconfig.c \
 	path.c \
 	powermgnt.c \
 	process.c \
 	profile.c \
 	pthread.c \
+	registry.c \
 	relay16.c \
 	resource.c \
 	resource16.c \
diff --git a/dlls/kernel32/oldconfig.c b/dlls/kernel32/oldconfig.c
deleted file mode 100644
index c386450..0000000
--- a/dlls/kernel32/oldconfig.c
+++ /dev/null
@@ -1,467 +0,0 @@
-/*
- * Support for converting from old configuration format
- *
- * Copyright 2005 Alexandre Julliard
- *
- * 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
- *
- * NOTES
- *   This file should be removed after a suitable transition period.
- */
-
-#include "config.h"
-#include "wine/port.h"
-
-#include <stdarg.h>
-#include <sys/types.h>
-#include <stdlib.h>
-#include <stdio.h>
-#ifdef HAVE_SYS_STAT_H
-# include <sys/stat.h>
-#endif
-#include <fcntl.h>
-#include <dirent.h>
-#ifdef HAVE_SYS_IOCTL_H
-#include <sys/ioctl.h>
-#endif
-#ifdef HAVE_LINUX_HDREG_H
-# include <linux/hdreg.h>
-#endif
-
-#define NONAMELESSUNION
-#define NONAMELESSSTRUCT
-#include "windef.h"
-#include "winbase.h"
-#include "winnls.h"
-#include "winternl.h"
-#include "winioctl.h"
-#include "ntddscsi.h"
-#include "wine/library.h"
-#include "wine/unicode.h"
-#include "wine/debug.h"
-#include "kernel_private.h"
-
-WINE_DEFAULT_DEBUG_CHANNEL(reg);
-
-
-/* registry initialisation, allocates some default keys. */
-static ULONG allocate_default_keys(void)
-{
-    static const WCHAR StatDataW[] = {'D','y','n','D','a','t','a','\\',
-                                      'P','e','r','f','S','t','a','t','s','\\',
-                                      'S','t','a','t','D','a','t','a',0};
-    static const WCHAR ConfigManagerW[] = {'D','y','n','D','a','t','a','\\',
-                                           'C','o','n','f','i','g',' ','M','a','n','a','g','e','r','\\',
-                                            'E','n','u','m',0};
-    HANDLE hkey;
-    ULONG dispos;
-    OBJECT_ATTRIBUTES attr;
-    UNICODE_STRING nameW;
-
-    attr.Length = sizeof(attr);
-    attr.RootDirectory = 0;
-    attr.ObjectName = &nameW;
-    attr.Attributes = 0;
-    attr.SecurityDescriptor = NULL;
-    attr.SecurityQualityOfService = NULL;
-
-    RtlInitUnicodeString( &nameW, StatDataW );
-    if (!NtCreateKey( &hkey, KEY_ALL_ACCESS, &attr, 0, NULL, 0, &dispos )) NtClose( hkey );
-    if (dispos == REG_OPENED_EXISTING_KEY)
-        return dispos; /* someone else already loaded the registry */
-
-    RtlInitUnicodeString( &nameW, ConfigManagerW );
-    if (!NtCreateKey( &hkey, KEY_ALL_ACCESS, &attr, 0, NULL, 0, NULL )) NtClose( hkey );
-
-    return dispos;
-}
-
-/******************************************************************
- *		create_scsi_entry
- *
- * Initializes registry to contain scsi info about the cdrom in NT.
- * All devices (even not real scsi ones) have this info in NT.
- * NOTE: programs usually read these registry entries after sending the
- *       IOCTL_SCSI_GET_ADDRESS ioctl to the cdrom
- */
-static void create_scsi_entry( PSCSI_ADDRESS scsi_addr, LPCSTR lpDriver, UINT uDriveType,
-    LPSTR lpDriveName, LPSTR lpUnixDeviceName )
-{
-    static UCHAR uCdromNumber = 0;
-    static UCHAR uTapeNumber = 0;
-
-    OBJECT_ATTRIBUTES attr;
-    UNICODE_STRING nameW;
-    WCHAR dataW[50];
-    DWORD lenW;
-    char buffer[40];
-    DWORD value;
-    const char *data;
-    HANDLE scsiKey;
-    HANDLE portKey;
-    HANDLE busKey;
-    HANDLE targetKey;
-    HANDLE lunKey;
-    DWORD disp;
-
-    attr.Length = sizeof(attr);
-    attr.RootDirectory = 0;
-    attr.ObjectName = &nameW;
-    attr.Attributes = 0;
-    attr.SecurityDescriptor = NULL;
-    attr.SecurityQualityOfService = NULL;
-
-    /* Ensure there is Scsi key */
-    if (!RtlCreateUnicodeStringFromAsciiz( &nameW, "Machine\\HARDWARE\\DEVICEMAP\\Scsi" ) ||
-        NtCreateKey( &scsiKey, KEY_ALL_ACCESS, &attr, 0,
-                     NULL, REG_OPTION_VOLATILE, &disp ))
-    {
-        ERR("Cannot create DEVICEMAP\\Scsi registry key\n" );
-        return;
-    }
-    RtlFreeUnicodeString( &nameW );
-
-    snprintf(buffer,sizeof(buffer),"Scsi Port %d",scsi_addr->PortNumber);
-    attr.RootDirectory = scsiKey;
-    if (!RtlCreateUnicodeStringFromAsciiz( &nameW, buffer ) ||
-        NtCreateKey( &portKey, KEY_ALL_ACCESS, &attr, 0,
-                     NULL, REG_OPTION_VOLATILE, &disp ))
-    {
-        ERR("Cannot create DEVICEMAP\\Scsi Port registry key\n" );
-        return;
-    }
-    RtlFreeUnicodeString( &nameW );
-
-    RtlCreateUnicodeStringFromAsciiz( &nameW, "Driver" );
-    RtlMultiByteToUnicodeN( dataW, sizeof(dataW), &lenW, lpDriver, strlen(lpDriver));
-    NtSetValueKey( portKey, &nameW, 0, REG_SZ, (BYTE*)dataW, lenW );
-    RtlFreeUnicodeString( &nameW );
-    value = 10;
-    RtlCreateUnicodeStringFromAsciiz( &nameW, "FirstBusTimeScanInMs" );
-    NtSetValueKey( portKey,&nameW, 0, REG_DWORD, (BYTE *)&value, sizeof(DWORD));
-    RtlFreeUnicodeString( &nameW );
-
-    value = 0;
-    if (strcmp(lpDriver, "atapi") == 0)
-    {
-#ifdef HDIO_GET_DMA
-        int fd, dma;
-        
-        fd = open(lpUnixDeviceName, O_RDONLY|O_NONBLOCK);
-        if (fd != -1)
-        {
-            if (ioctl(fd, HDIO_GET_DMA, &dma) != -1) value = dma;
-            close(fd);
-        }
-#endif
-        RtlCreateUnicodeStringFromAsciiz( &nameW, "DMAEnabled" );
-        NtSetValueKey( portKey,&nameW, 0, REG_DWORD, (BYTE *)&value, sizeof(DWORD));
-        RtlFreeUnicodeString( &nameW );
-    }
-
-    snprintf(buffer, sizeof(buffer),"Scsi Bus %d", scsi_addr->PathId);
-    attr.RootDirectory = portKey;
-    if (!RtlCreateUnicodeStringFromAsciiz( &nameW, buffer ) ||
-        NtCreateKey( &busKey, KEY_ALL_ACCESS, &attr, 0,
-                     NULL, REG_OPTION_VOLATILE, &disp ))
-    {
-        ERR("Cannot create DEVICEMAP\\Scsi Port\\Scsi Bus registry key\n" );
-        return;
-    }
-    RtlFreeUnicodeString( &nameW );
-
-    attr.RootDirectory = busKey;
-    /* FIXME: get real controller Id for SCSI */
-    if (!RtlCreateUnicodeStringFromAsciiz( &nameW, "Initiator Id 255" ) ||
-        NtCreateKey( &targetKey, KEY_ALL_ACCESS, &attr, 0,
-                     NULL, REG_OPTION_VOLATILE, &disp ))
-    {
-        ERR("Cannot create DEVICEMAP\\Scsi Port\\Scsi Bus\\Initiator Id 255 registry key\n" );
-        return;
-    }
-    RtlFreeUnicodeString( &nameW );
-    NtClose( targetKey );
-
-    snprintf(buffer, sizeof(buffer),"Target Id %d", scsi_addr->TargetId);
-    attr.RootDirectory = busKey;
-    if (!RtlCreateUnicodeStringFromAsciiz( &nameW, buffer ) ||
-        NtCreateKey( &targetKey, KEY_ALL_ACCESS, &attr, 0,
-                     NULL, REG_OPTION_VOLATILE, &disp ))
-    {
-        ERR("Cannot create DEVICEMAP\\Scsi Port\\Scsi Bus 0\\Target Id registry key\n" );
-        return;
-    }
-    RtlFreeUnicodeString( &nameW );
-
-    snprintf(buffer, sizeof(buffer),"Logical Unit Id %d", scsi_addr->Lun);
-    attr.RootDirectory = targetKey;
-    if (!RtlCreateUnicodeStringFromAsciiz( &nameW, buffer ) ||
-        NtCreateKey( &lunKey, KEY_ALL_ACCESS, &attr, 0,
-                     NULL, REG_OPTION_VOLATILE, &disp ))
-    {
-        ERR("Cannot create DEVICEMAP\\Scsi Port\\Scsi Bus 0\\Target Id registry key\\Logical Unit Id\n" );
-        return;
-    }
-    RtlFreeUnicodeString( &nameW );
-
-    switch (uDriveType)
-    {
-        case DRIVE_NO_ROOT_DIR:
-        default:
-            data = "OtherPeripheral"; break;
-        case DRIVE_FIXED:
-            data = "DiskPeripheral"; break;
-        case DRIVE_REMOVABLE:
-            data = "TapePeripheral";
-            snprintf(buffer, sizeof(buffer), "Tape%d", uTapeNumber++);
-            break;
-        case DRIVE_CDROM:
-            data = "CdRomPeripheral";
-            snprintf(buffer, sizeof(buffer), "Cdrom%d", uCdromNumber++);
-            break;
-    }
-    RtlCreateUnicodeStringFromAsciiz( &nameW, "Type" );
-    RtlMultiByteToUnicodeN( dataW, sizeof(dataW), &lenW, data, strlen(data));
-    NtSetValueKey( lunKey, &nameW, 0, REG_SZ, (BYTE*)dataW, lenW );
-    RtlFreeUnicodeString( &nameW );
-
-    RtlCreateUnicodeStringFromAsciiz( &nameW, "Identifier" );
-    RtlMultiByteToUnicodeN( dataW, sizeof(dataW), &lenW, lpDriveName, strlen(lpDriveName));
-    NtSetValueKey( lunKey, &nameW, 0, REG_SZ, (BYTE*)dataW, lenW );
-    RtlFreeUnicodeString( &nameW );
-
-    if (uDriveType == DRIVE_CDROM || uDriveType == DRIVE_REMOVABLE)
-    {
-        RtlCreateUnicodeStringFromAsciiz( &nameW, "DeviceName" );
-        RtlMultiByteToUnicodeN( dataW, sizeof(dataW), &lenW, buffer, strlen(buffer));
-        NtSetValueKey( lunKey, &nameW, 0, REG_SZ, (BYTE*)dataW, lenW );
-        RtlFreeUnicodeString( &nameW );
-    }
-
-    RtlCreateUnicodeStringFromAsciiz( &nameW, "UnixDeviceName" );
-    RtlMultiByteToUnicodeN( dataW, sizeof(dataW), &lenW, lpUnixDeviceName, strlen(lpUnixDeviceName));
-    NtSetValueKey( lunKey, &nameW, 0, REG_SZ, (BYTE*)dataW, lenW );
-    RtlFreeUnicodeString( &nameW );
-
-    NtClose( lunKey );
-    NtClose( targetKey );
-    NtClose( busKey );
-    NtClose( portKey );
-    NtClose( scsiKey );
-}
-
-struct LinuxProcScsiDevice
-{
-    int host;
-    int channel;
-    int target;
-    int lun;
-    char vendor[9];
-    char model[17];
-    char rev[5];
-    char type[33];
-    int ansirev;
-};
-
-/*
- * we need to declare white spaces explicitly via %*1[ ],
- * as there are very dainbread CD-ROM devices out there
- * which have their manufacturer name blanked out via spaces,
- * which confuses fscanf's parsing (skips all blank spaces)
- */
-static int SCSI_getprocentry( FILE * procfile, struct LinuxProcScsiDevice * dev )
-{
-    int result;
-
-    result = fscanf( procfile,
-        "Host:%*1[ ]scsi%d%*1[ ]Channel:%*1[ ]%d%*1[ ]Id:%*1[ ]%d%*1[ ]Lun:%*1[ ]%d\n",
-	&dev->host,
-	&dev->channel,
-	&dev->target,
-	&dev->lun );
-    if( result == EOF )
-    {
-        /* "end of entries" return, so no TRACE() here */
-        return EOF;
-    }
-    if( result != 4 )
-    {
-        ERR("bus id line scan count error (fscanf returns %d, expected 4)\n", result);
-        return 0;
-    }
-    result = fscanf( procfile,
-        "  Vendor:%*1[ ]%8c%*1[ ]Model:%*1[ ]%16c%*1[ ]Rev:%*1[ ]%4c\n",
-        dev->vendor,
-        dev->model,
-        dev->rev );
-    if( result != 3 )
-    {
-        ERR("model line scan count error (fscanf returns %d, expected 3)\n", result);
-        return 0;
-    }
-
-    result = fscanf( procfile,
-        "  Type:%*3[ ]%32c%*1[ ]ANSI%*1[ ]SCSI%*1[ ]revision:%*1[ ]%x\n",
-        dev->type,
-        &dev->ansirev );
-    if( result != 2 )
-    {
-        ERR("SCSI type line scan count error (fscanf returns %d, expected 2)\n", result);
-        return 0;
-    }
-    /* Since we fscanf with %XXc instead of %s.. put a NULL at end */
-    dev->vendor[8] = 0;
-    dev->model[16] = 0;
-    dev->rev[4] = 0;
-    dev->type[32] = 0;
-
-    return 1;
-}
-
-
-/* create the hardware registry branch */
-static void create_hardware_branch(void)
-{
-    /* The following mostly will work on Linux, but should not cause
-     * problems on other systems. */
-    static const char procname_ide_media[] = "/proc/ide/%s/media";
-    static const char procname_ide_model[] = "/proc/ide/%s/model";
-    static const char procname_scsi[] = "/proc/scsi/scsi";
-    DIR *idedir;
-    struct dirent *dent = NULL;
-    FILE *procfile = NULL;
-    char cStr[40], cDevModel[40], cUnixDeviceName[40], read1[10] = "\0", read2[10] = "\0";
-    SCSI_ADDRESS scsi_addr;
-    UINT nType;
-    struct LinuxProcScsiDevice dev;
-    int result = 0, nSgNumber = 0;
-    UCHAR uFirstSCSIPort = 0;
-
-    /* Enumerate all ide devices first */
-    idedir = opendir("/proc/ide");
-    if (idedir)
-    {
-        while ((dent = readdir(idedir)))
-        {
-            if (strncmp(dent->d_name, "hd", 2) == 0)
-            {
-                sprintf(cStr, procname_ide_media, dent->d_name);
-                procfile = fopen(cStr, "r");
-                if (!procfile)
-                {
-                    ERR("Could not open %s\n", cStr);
-                    continue;
-                } else {
-                    fgets(cStr, sizeof(cStr), procfile);
-                    fclose(procfile);
-                    nType = DRIVE_UNKNOWN;
-                    if (strncasecmp(cStr, "disk", 4)  == 0) nType = DRIVE_FIXED;
-                    if (strncasecmp(cStr, "cdrom", 5) == 0) nType = DRIVE_CDROM;
-
-                    if (nType == DRIVE_UNKNOWN) continue;
-                }
-
-                sprintf(cStr, procname_ide_model, dent->d_name);
-                procfile = fopen(cStr, "r");
-                if (!procfile)
-                {
-                    ERR("Could not open %s\n", cStr);
-                    switch (nType)
-                    {
-                    case DRIVE_FIXED: strcpy(cDevModel, "Wine harddisk"); break;
-                    case DRIVE_CDROM: strcpy(cDevModel, "Wine CDROM"); break;
-                    }
-                } else {
-                    fgets(cDevModel, sizeof(cDevModel), procfile);
-                    fclose(procfile);
-                    cDevModel[strlen(cDevModel) - 1] = 0;
-                }
-
-                sprintf(cUnixDeviceName, "/dev/%s", dent->d_name);
-                scsi_addr.PortNumber = (dent->d_name[2] - 'a') / 2;
-                scsi_addr.PathId = 0;
-                scsi_addr.TargetId = (dent->d_name[2] - 'a') % 2;
-                scsi_addr.Lun = 0;
-                if (scsi_addr.PortNumber + 1 > uFirstSCSIPort)
-                    uFirstSCSIPort = scsi_addr.PortNumber + 1;
-
-                create_scsi_entry(&scsi_addr, "atapi", nType, cDevModel, cUnixDeviceName);
-            }
-        }
-        closedir(idedir);
-    }
-
-    /* Now goes SCSI */
-    procfile = fopen(procname_scsi, "r");
-    if (!procfile)
-    {
-        TRACE("Could not open %s\n", procname_scsi);
-        return;
-    }
-    fgets(cStr, 40, procfile);
-    sscanf(cStr, "Attached %9s %9s", read1, read2);
-
-    if (strcmp(read1, "devices:") != 0)
-    {
-        WARN("Incorrect %s format\n", procname_scsi);
-        fclose( procfile );
-        return;
-    }
-    if (strcmp(read2, "none") == 0)
-    {
-        TRACE("No SCSI devices found in %s.\n", procname_scsi);
-        fclose( procfile );
-        return;
-    }
-
-    /* Read info for one device */
-    while ((result = SCSI_getprocentry(procfile, &dev)) > 0)
-    {
-        scsi_addr.PortNumber = dev.host;
-        scsi_addr.PathId = dev.channel;
-        scsi_addr.TargetId = dev.target;
-        scsi_addr.Lun = dev.lun;
-
-        scsi_addr.PortNumber += uFirstSCSIPort;
-        if (strncmp(dev.type, "Direct-Access", 13) == 0) nType = DRIVE_FIXED;
-        else if (strncmp(dev.type, "Sequential-Access", 17) == 0) nType = DRIVE_REMOVABLE;
-        else if (strncmp(dev.type, "CD-ROM", 6) == 0) nType = DRIVE_CDROM;
-        else if (strncmp(dev.type, "Processor", 9) == 0) nType = DRIVE_NO_ROOT_DIR;
-        else continue;
-
-        strcpy(cDevModel, dev.vendor);
-        strcat(cDevModel, dev.model);
-        strcat(cDevModel, dev.rev);
-        sprintf(cUnixDeviceName, "/dev/sg%d", nSgNumber++);
-        /* FIXME: get real driver name */
-        create_scsi_entry(&scsi_addr, "WINE SCSI", nType, cDevModel, cUnixDeviceName);
-    }
-    if( result != EOF )
-        WARN("Incorrect %s format\n", procname_scsi);
-    fclose( procfile );
-}
-
-
-/***********************************************************************
- *              convert_old_config
- */
-void convert_old_config(void)
-{
-    if (allocate_default_keys() == REG_OPENED_EXISTING_KEY)
-        return; /* someone else already loaded the registry */
-
-    /* create some hardware keys (FIXME: should not be done here) */
-    create_hardware_branch();
-}
diff --git a/dlls/kernel32/registry.c b/dlls/kernel32/registry.c
new file mode 100644
index 0000000..c386450
--- /dev/null
+++ b/dlls/kernel32/registry.c
@@ -0,0 +1,467 @@
+/*
+ * Support for converting from old configuration format
+ *
+ * Copyright 2005 Alexandre Julliard
+ *
+ * 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
+ *
+ * NOTES
+ *   This file should be removed after a suitable transition period.
+ */
+
+#include "config.h"
+#include "wine/port.h"
+
+#include <stdarg.h>
+#include <sys/types.h>
+#include <stdlib.h>
+#include <stdio.h>
+#ifdef HAVE_SYS_STAT_H
+# include <sys/stat.h>
+#endif
+#include <fcntl.h>
+#include <dirent.h>
+#ifdef HAVE_SYS_IOCTL_H
+#include <sys/ioctl.h>
+#endif
+#ifdef HAVE_LINUX_HDREG_H
+# include <linux/hdreg.h>
+#endif
+
+#define NONAMELESSUNION
+#define NONAMELESSSTRUCT
+#include "windef.h"
+#include "winbase.h"
+#include "winnls.h"
+#include "winternl.h"
+#include "winioctl.h"
+#include "ntddscsi.h"
+#include "wine/library.h"
+#include "wine/unicode.h"
+#include "wine/debug.h"
+#include "kernel_private.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(reg);
+
+
+/* registry initialisation, allocates some default keys. */
+static ULONG allocate_default_keys(void)
+{
+    static const WCHAR StatDataW[] = {'D','y','n','D','a','t','a','\\',
+                                      'P','e','r','f','S','t','a','t','s','\\',
+                                      'S','t','a','t','D','a','t','a',0};
+    static const WCHAR ConfigManagerW[] = {'D','y','n','D','a','t','a','\\',
+                                           'C','o','n','f','i','g',' ','M','a','n','a','g','e','r','\\',
+                                            'E','n','u','m',0};
+    HANDLE hkey;
+    ULONG dispos;
+    OBJECT_ATTRIBUTES attr;
+    UNICODE_STRING nameW;
+
+    attr.Length = sizeof(attr);
+    attr.RootDirectory = 0;
+    attr.ObjectName = &nameW;
+    attr.Attributes = 0;
+    attr.SecurityDescriptor = NULL;
+    attr.SecurityQualityOfService = NULL;
+
+    RtlInitUnicodeString( &nameW, StatDataW );
+    if (!NtCreateKey( &hkey, KEY_ALL_ACCESS, &attr, 0, NULL, 0, &dispos )) NtClose( hkey );
+    if (dispos == REG_OPENED_EXISTING_KEY)
+        return dispos; /* someone else already loaded the registry */
+
+    RtlInitUnicodeString( &nameW, ConfigManagerW );
+    if (!NtCreateKey( &hkey, KEY_ALL_ACCESS, &attr, 0, NULL, 0, NULL )) NtClose( hkey );
+
+    return dispos;
+}
+
+/******************************************************************
+ *		create_scsi_entry
+ *
+ * Initializes registry to contain scsi info about the cdrom in NT.
+ * All devices (even not real scsi ones) have this info in NT.
+ * NOTE: programs usually read these registry entries after sending the
+ *       IOCTL_SCSI_GET_ADDRESS ioctl to the cdrom
+ */
+static void create_scsi_entry( PSCSI_ADDRESS scsi_addr, LPCSTR lpDriver, UINT uDriveType,
+    LPSTR lpDriveName, LPSTR lpUnixDeviceName )
+{
+    static UCHAR uCdromNumber = 0;
+    static UCHAR uTapeNumber = 0;
+
+    OBJECT_ATTRIBUTES attr;
+    UNICODE_STRING nameW;
+    WCHAR dataW[50];
+    DWORD lenW;
+    char buffer[40];
+    DWORD value;
+    const char *data;
+    HANDLE scsiKey;
+    HANDLE portKey;
+    HANDLE busKey;
+    HANDLE targetKey;
+    HANDLE lunKey;
+    DWORD disp;
+
+    attr.Length = sizeof(attr);
+    attr.RootDirectory = 0;
+    attr.ObjectName = &nameW;
+    attr.Attributes = 0;
+    attr.SecurityDescriptor = NULL;
+    attr.SecurityQualityOfService = NULL;
+
+    /* Ensure there is Scsi key */
+    if (!RtlCreateUnicodeStringFromAsciiz( &nameW, "Machine\\HARDWARE\\DEVICEMAP\\Scsi" ) ||
+        NtCreateKey( &scsiKey, KEY_ALL_ACCESS, &attr, 0,
+                     NULL, REG_OPTION_VOLATILE, &disp ))
+    {
+        ERR("Cannot create DEVICEMAP\\Scsi registry key\n" );
+        return;
+    }
+    RtlFreeUnicodeString( &nameW );
+
+    snprintf(buffer,sizeof(buffer),"Scsi Port %d",scsi_addr->PortNumber);
+    attr.RootDirectory = scsiKey;
+    if (!RtlCreateUnicodeStringFromAsciiz( &nameW, buffer ) ||
+        NtCreateKey( &portKey, KEY_ALL_ACCESS, &attr, 0,
+                     NULL, REG_OPTION_VOLATILE, &disp ))
+    {
+        ERR("Cannot create DEVICEMAP\\Scsi Port registry key\n" );
+        return;
+    }
+    RtlFreeUnicodeString( &nameW );
+
+    RtlCreateUnicodeStringFromAsciiz( &nameW, "Driver" );
+    RtlMultiByteToUnicodeN( dataW, sizeof(dataW), &lenW, lpDriver, strlen(lpDriver));
+    NtSetValueKey( portKey, &nameW, 0, REG_SZ, (BYTE*)dataW, lenW );
+    RtlFreeUnicodeString( &nameW );
+    value = 10;
+    RtlCreateUnicodeStringFromAsciiz( &nameW, "FirstBusTimeScanInMs" );
+    NtSetValueKey( portKey,&nameW, 0, REG_DWORD, (BYTE *)&value, sizeof(DWORD));
+    RtlFreeUnicodeString( &nameW );
+
+    value = 0;
+    if (strcmp(lpDriver, "atapi") == 0)
+    {
+#ifdef HDIO_GET_DMA
+        int fd, dma;
+        
+        fd = open(lpUnixDeviceName, O_RDONLY|O_NONBLOCK);
+        if (fd != -1)
+        {
+            if (ioctl(fd, HDIO_GET_DMA, &dma) != -1) value = dma;
+            close(fd);
+        }
+#endif
+        RtlCreateUnicodeStringFromAsciiz( &nameW, "DMAEnabled" );
+        NtSetValueKey( portKey,&nameW, 0, REG_DWORD, (BYTE *)&value, sizeof(DWORD));
+        RtlFreeUnicodeString( &nameW );
+    }
+
+    snprintf(buffer, sizeof(buffer),"Scsi Bus %d", scsi_addr->PathId);
+    attr.RootDirectory = portKey;
+    if (!RtlCreateUnicodeStringFromAsciiz( &nameW, buffer ) ||
+        NtCreateKey( &busKey, KEY_ALL_ACCESS, &attr, 0,
+                     NULL, REG_OPTION_VOLATILE, &disp ))
+    {
+        ERR("Cannot create DEVICEMAP\\Scsi Port\\Scsi Bus registry key\n" );
+        return;
+    }
+    RtlFreeUnicodeString( &nameW );
+
+    attr.RootDirectory = busKey;
+    /* FIXME: get real controller Id for SCSI */
+    if (!RtlCreateUnicodeStringFromAsciiz( &nameW, "Initiator Id 255" ) ||
+        NtCreateKey( &targetKey, KEY_ALL_ACCESS, &attr, 0,
+                     NULL, REG_OPTION_VOLATILE, &disp ))
+    {
+        ERR("Cannot create DEVICEMAP\\Scsi Port\\Scsi Bus\\Initiator Id 255 registry key\n" );
+        return;
+    }
+    RtlFreeUnicodeString( &nameW );
+    NtClose( targetKey );
+
+    snprintf(buffer, sizeof(buffer),"Target Id %d", scsi_addr->TargetId);
+    attr.RootDirectory = busKey;
+    if (!RtlCreateUnicodeStringFromAsciiz( &nameW, buffer ) ||
+        NtCreateKey( &targetKey, KEY_ALL_ACCESS, &attr, 0,
+                     NULL, REG_OPTION_VOLATILE, &disp ))
+    {
+        ERR("Cannot create DEVICEMAP\\Scsi Port\\Scsi Bus 0\\Target Id registry key\n" );
+        return;
+    }
+    RtlFreeUnicodeString( &nameW );
+
+    snprintf(buffer, sizeof(buffer),"Logical Unit Id %d", scsi_addr->Lun);
+    attr.RootDirectory = targetKey;
+    if (!RtlCreateUnicodeStringFromAsciiz( &nameW, buffer ) ||
+        NtCreateKey( &lunKey, KEY_ALL_ACCESS, &attr, 0,
+                     NULL, REG_OPTION_VOLATILE, &disp ))
+    {
+        ERR("Cannot create DEVICEMAP\\Scsi Port\\Scsi Bus 0\\Target Id registry key\\Logical Unit Id\n" );
+        return;
+    }
+    RtlFreeUnicodeString( &nameW );
+
+    switch (uDriveType)
+    {
+        case DRIVE_NO_ROOT_DIR:
+        default:
+            data = "OtherPeripheral"; break;
+        case DRIVE_FIXED:
+            data = "DiskPeripheral"; break;
+        case DRIVE_REMOVABLE:
+            data = "TapePeripheral";
+            snprintf(buffer, sizeof(buffer), "Tape%d", uTapeNumber++);
+            break;
+        case DRIVE_CDROM:
+            data = "CdRomPeripheral";
+            snprintf(buffer, sizeof(buffer), "Cdrom%d", uCdromNumber++);
+            break;
+    }
+    RtlCreateUnicodeStringFromAsciiz( &nameW, "Type" );
+    RtlMultiByteToUnicodeN( dataW, sizeof(dataW), &lenW, data, strlen(data));
+    NtSetValueKey( lunKey, &nameW, 0, REG_SZ, (BYTE*)dataW, lenW );
+    RtlFreeUnicodeString( &nameW );
+
+    RtlCreateUnicodeStringFromAsciiz( &nameW, "Identifier" );
+    RtlMultiByteToUnicodeN( dataW, sizeof(dataW), &lenW, lpDriveName, strlen(lpDriveName));
+    NtSetValueKey( lunKey, &nameW, 0, REG_SZ, (BYTE*)dataW, lenW );
+    RtlFreeUnicodeString( &nameW );
+
+    if (uDriveType == DRIVE_CDROM || uDriveType == DRIVE_REMOVABLE)
+    {
+        RtlCreateUnicodeStringFromAsciiz( &nameW, "DeviceName" );
+        RtlMultiByteToUnicodeN( dataW, sizeof(dataW), &lenW, buffer, strlen(buffer));
+        NtSetValueKey( lunKey, &nameW, 0, REG_SZ, (BYTE*)dataW, lenW );
+        RtlFreeUnicodeString( &nameW );
+    }
+
+    RtlCreateUnicodeStringFromAsciiz( &nameW, "UnixDeviceName" );
+    RtlMultiByteToUnicodeN( dataW, sizeof(dataW), &lenW, lpUnixDeviceName, strlen(lpUnixDeviceName));
+    NtSetValueKey( lunKey, &nameW, 0, REG_SZ, (BYTE*)dataW, lenW );
+    RtlFreeUnicodeString( &nameW );
+
+    NtClose( lunKey );
+    NtClose( targetKey );
+    NtClose( busKey );
+    NtClose( portKey );
+    NtClose( scsiKey );
+}
+
+struct LinuxProcScsiDevice
+{
+    int host;
+    int channel;
+    int target;
+    int lun;
+    char vendor[9];
+    char model[17];
+    char rev[5];
+    char type[33];
+    int ansirev;
+};
+
+/*
+ * we need to declare white spaces explicitly via %*1[ ],
+ * as there are very dainbread CD-ROM devices out there
+ * which have their manufacturer name blanked out via spaces,
+ * which confuses fscanf's parsing (skips all blank spaces)
+ */
+static int SCSI_getprocentry( FILE * procfile, struct LinuxProcScsiDevice * dev )
+{
+    int result;
+
+    result = fscanf( procfile,
+        "Host:%*1[ ]scsi%d%*1[ ]Channel:%*1[ ]%d%*1[ ]Id:%*1[ ]%d%*1[ ]Lun:%*1[ ]%d\n",
+	&dev->host,
+	&dev->channel,
+	&dev->target,
+	&dev->lun );
+    if( result == EOF )
+    {
+        /* "end of entries" return, so no TRACE() here */
+        return EOF;
+    }
+    if( result != 4 )
+    {
+        ERR("bus id line scan count error (fscanf returns %d, expected 4)\n", result);
+        return 0;
+    }
+    result = fscanf( procfile,
+        "  Vendor:%*1[ ]%8c%*1[ ]Model:%*1[ ]%16c%*1[ ]Rev:%*1[ ]%4c\n",
+        dev->vendor,
+        dev->model,
+        dev->rev );
+    if( result != 3 )
+    {
+        ERR("model line scan count error (fscanf returns %d, expected 3)\n", result);
+        return 0;
+    }
+
+    result = fscanf( procfile,
+        "  Type:%*3[ ]%32c%*1[ ]ANSI%*1[ ]SCSI%*1[ ]revision:%*1[ ]%x\n",
+        dev->type,
+        &dev->ansirev );
+    if( result != 2 )
+    {
+        ERR("SCSI type line scan count error (fscanf returns %d, expected 2)\n", result);
+        return 0;
+    }
+    /* Since we fscanf with %XXc instead of %s.. put a NULL at end */
+    dev->vendor[8] = 0;
+    dev->model[16] = 0;
+    dev->rev[4] = 0;
+    dev->type[32] = 0;
+
+    return 1;
+}
+
+
+/* create the hardware registry branch */
+static void create_hardware_branch(void)
+{
+    /* The following mostly will work on Linux, but should not cause
+     * problems on other systems. */
+    static const char procname_ide_media[] = "/proc/ide/%s/media";
+    static const char procname_ide_model[] = "/proc/ide/%s/model";
+    static const char procname_scsi[] = "/proc/scsi/scsi";
+    DIR *idedir;
+    struct dirent *dent = NULL;
+    FILE *procfile = NULL;
+    char cStr[40], cDevModel[40], cUnixDeviceName[40], read1[10] = "\0", read2[10] = "\0";
+    SCSI_ADDRESS scsi_addr;
+    UINT nType;
+    struct LinuxProcScsiDevice dev;
+    int result = 0, nSgNumber = 0;
+    UCHAR uFirstSCSIPort = 0;
+
+    /* Enumerate all ide devices first */
+    idedir = opendir("/proc/ide");
+    if (idedir)
+    {
+        while ((dent = readdir(idedir)))
+        {
+            if (strncmp(dent->d_name, "hd", 2) == 0)
+            {
+                sprintf(cStr, procname_ide_media, dent->d_name);
+                procfile = fopen(cStr, "r");
+                if (!procfile)
+                {
+                    ERR("Could not open %s\n", cStr);
+                    continue;
+                } else {
+                    fgets(cStr, sizeof(cStr), procfile);
+                    fclose(procfile);
+                    nType = DRIVE_UNKNOWN;
+                    if (strncasecmp(cStr, "disk", 4)  == 0) nType = DRIVE_FIXED;
+                    if (strncasecmp(cStr, "cdrom", 5) == 0) nType = DRIVE_CDROM;
+
+                    if (nType == DRIVE_UNKNOWN) continue;
+                }
+
+                sprintf(cStr, procname_ide_model, dent->d_name);
+                procfile = fopen(cStr, "r");
+                if (!procfile)
+                {
+                    ERR("Could not open %s\n", cStr);
+                    switch (nType)
+                    {
+                    case DRIVE_FIXED: strcpy(cDevModel, "Wine harddisk"); break;
+                    case DRIVE_CDROM: strcpy(cDevModel, "Wine CDROM"); break;
+                    }
+                } else {
+                    fgets(cDevModel, sizeof(cDevModel), procfile);
+                    fclose(procfile);
+                    cDevModel[strlen(cDevModel) - 1] = 0;
+                }
+
+                sprintf(cUnixDeviceName, "/dev/%s", dent->d_name);
+                scsi_addr.PortNumber = (dent->d_name[2] - 'a') / 2;
+                scsi_addr.PathId = 0;
+                scsi_addr.TargetId = (dent->d_name[2] - 'a') % 2;
+                scsi_addr.Lun = 0;
+                if (scsi_addr.PortNumber + 1 > uFirstSCSIPort)
+                    uFirstSCSIPort = scsi_addr.PortNumber + 1;
+
+                create_scsi_entry(&scsi_addr, "atapi", nType, cDevModel, cUnixDeviceName);
+            }
+        }
+        closedir(idedir);
+    }
+
+    /* Now goes SCSI */
+    procfile = fopen(procname_scsi, "r");
+    if (!procfile)
+    {
+        TRACE("Could not open %s\n", procname_scsi);
+        return;
+    }
+    fgets(cStr, 40, procfile);
+    sscanf(cStr, "Attached %9s %9s", read1, read2);
+
+    if (strcmp(read1, "devices:") != 0)
+    {
+        WARN("Incorrect %s format\n", procname_scsi);
+        fclose( procfile );
+        return;
+    }
+    if (strcmp(read2, "none") == 0)
+    {
+        TRACE("No SCSI devices found in %s.\n", procname_scsi);
+        fclose( procfile );
+        return;
+    }
+
+    /* Read info for one device */
+    while ((result = SCSI_getprocentry(procfile, &dev)) > 0)
+    {
+        scsi_addr.PortNumber = dev.host;
+        scsi_addr.PathId = dev.channel;
+        scsi_addr.TargetId = dev.target;
+        scsi_addr.Lun = dev.lun;
+
+        scsi_addr.PortNumber += uFirstSCSIPort;
+        if (strncmp(dev.type, "Direct-Access", 13) == 0) nType = DRIVE_FIXED;
+        else if (strncmp(dev.type, "Sequential-Access", 17) == 0) nType = DRIVE_REMOVABLE;
+        else if (strncmp(dev.type, "CD-ROM", 6) == 0) nType = DRIVE_CDROM;
+        else if (strncmp(dev.type, "Processor", 9) == 0) nType = DRIVE_NO_ROOT_DIR;
+        else continue;
+
+        strcpy(cDevModel, dev.vendor);
+        strcat(cDevModel, dev.model);
+        strcat(cDevModel, dev.rev);
+        sprintf(cUnixDeviceName, "/dev/sg%d", nSgNumber++);
+        /* FIXME: get real driver name */
+        create_scsi_entry(&scsi_addr, "WINE SCSI", nType, cDevModel, cUnixDeviceName);
+    }
+    if( result != EOF )
+        WARN("Incorrect %s format\n", procname_scsi);
+    fclose( procfile );
+}
+
+
+/***********************************************************************
+ *              convert_old_config
+ */
+void convert_old_config(void)
+{
+    if (allocate_default_keys() == REG_OPENED_EXISTING_KEY)
+        return; /* someone else already loaded the registry */
+
+    /* create some hardware keys (FIXME: should not be done here) */
+    create_hardware_branch();
+}
-- 
1.4.1



More information about the wine-patches mailing list