CVS: winex/files dos_fs.c, 1.36, 1.37 drive.c, 1.47, 1.48

[email protected] 31 Jul 2007 19:46:18 -0000
Newsgroups gmane.comp.emulators.winex.cvs
Message-ID <[email protected]>
Subject: winex/files dos_fs.c,1.36,1.37 drive.c,1.47,1.48Update of /var/lib/cvsd/cvsroot/winex/files
In directory agravaine:/tmp/cvs-serv32747/files

Modified Files:
	dos_fs.c drive.c 
Log Message:

- add support to QueryDosDevice() for finding dos drives


Index: dos_fs.c
===================================================================
RCS file: /var/lib/cvsd/cvsroot/winex/files/dos_fs.c,v
retrieving revision 1.36
retrieving revision 1.37
diff -u -d -r1.36 -r1.37
--- dos_fs.c	31 Jul 2007 17:45:07 -0000	1.36
+++ dos_fs.c	31 Jul 2007 19:46:16 -0000	1.37
@@ -2450,66 +2450,6 @@
 }
 
 /***********************************************************************
- *           QueryDosDeviceA   (KERNEL32.@)
- *
- * returns array of strings terminated by \0, terminated by \0
- */
-DWORD WINAPI QueryDosDeviceA(LPCSTR devname,LPSTR target,DWORD bufsize)
-{
-    LPSTR s;
-    char  buffer[200];
-
-    TRACE("(%s,...)\n", devname ? devname : "<null>");
-    if (!devname) {
-	/* return known MSDOS devices */
-        static const char devices[24] = "CON\0COM1\0COM2\0LPT1\0NUL\0\0";
-        memcpy( target, devices, min(bufsize,sizeof(devices)) );
-        return min(bufsize,sizeof(devices));
-    }
-    /* In theory all that are possible and have been defined.
-     * Now just those below, since mirc uses it to check for special files.
-     *
-     * (It is more complex, and supports netmounted stuff, and \\.\ stuff,
-     *  but currently we just ignore that.)
-     */
-#define CHECK(x) (strstr(devname,#x)==devname)
-    if (CHECK(con) || CHECK(com) || CHECK(lpt) || CHECK(nul)) {
-	strcpy(buffer,"\\DEV\\");
-	strcat(buffer,devname);
-	if ((s=strchr(buffer,':'))) *s='\0';
-	lstrcpynA(target,buffer,bufsize);
-	return strlen(buffer)+1;
-    } else {
-	if (strchr(devname,':') || devname[0]=='\\') {
-	    /* This might be a DOS device we do not handle yet ... */
-	    FIXME("(%s) not detected as DOS device!\n",devname);
-	}
-	SetLastError(ERROR_DEV_NOT_EXIST);
-	return 0;
-    }
-
-}
-
-
-/***********************************************************************
- *           QueryDosDeviceW   (KERNEL32.@)
- *
- * returns array of strings terminated by \0, terminated by \0
- */
-DWORD WINAPI QueryDosDeviceW(LPCWSTR devname,LPWSTR target,DWORD bufsize)
-{
-    LPSTR devnameA = devname?HEAP_strdupWtoA(GetProcessHeap(),0,devname):NULL;
-    LPSTR targetA = (LPSTR)HeapAlloc(GetProcessHeap(),0,bufsize);
-    DWORD ret = QueryDosDeviceA(devnameA,targetA,bufsize);
-
-    ret = MultiByteToWideChar( CP_ACP, 0, targetA, ret, target, bufsize );
-    if (devnameA) HeapFree(GetProcessHeap(),0,devnameA);
-    if (targetA) HeapFree(GetProcessHeap(),0,targetA);
-    return ret;
-}
-
-
-/***********************************************************************
  *           SystemTimeToFileTime   (KERNEL32.@)
  */
 BOOL WINAPI SystemTimeToFileTime( const SYSTEMTIME *syst, LPFILETIME ft )

Index: drive.c
===================================================================
RCS file: /var/lib/cvsd/cvsroot/winex/files/drive.c,v
retrieving revision 1.47
retrieving revision 1.48
diff -u -d -r1.47 -r1.48
--- drive.c	31 Jul 2007 17:37:44 -0000	1.47
+++ drive.c	31 Jul 2007 19:46:16 -0000	1.48
@@ -84,6 +84,7 @@
     ino_t     ino;       /* unix inode number */
     dev_t     dev_dev;   /* unix device number for device */
     dev_t     dev_ino;   /* unix device number for device */
+    char     *dos_device_name; /* name for QueryDosDevice */
 } DOSDRIVE;
 
 
@@ -123,6 +124,9 @@
 static int DRIVE_CurDrive = -1;
 
 static HTASK16 DRIVE_LastTask = 0;
+static int HDCounter = 0;
+static int CDCounter = 0;
+static int FloppyCounter = 0;
 
 /* strdup on the process heap */
 inline static char *heap_strdup( const char *str )
@@ -292,6 +296,7 @@
 	char name[] = "Drive D";
 	BOOL found = FALSE;
 	struct stat drive_stat_buffer;
+ 	char dos_dev_name[32];
 
 	for (i = 3, drive = DOSDrives+3; i < MAX_DOS_DRIVES && !found; i++, name[6]++, drive++)
 	{
@@ -322,6 +327,8 @@
 	stat( drive->device, &drive_stat_buffer );
 	drive->dev_dev = drive_stat_buffer.st_dev;
 	drive->dev_ino = drive_stat_buffer.st_ino;
+	sprintf (dos_dev_name, "\\Device\\CdRom%d", CDCounter++);
+	drive->dos_device_name = heap_strdup (dos_dev_name);
 
 	DRIVE_AddCDReg(name[6]);       
 
@@ -807,6 +814,8 @@
 
         if (drive->root)
         {
+            char dos_dev_name[32];
+
             drive->dos_cwd  = heap_strdup( "" );
             drive->unix_cwd = heap_strdup( "" );
             drive->type     = DRIVE_GetDriveType( name );
@@ -817,6 +826,21 @@
             drive->dev_dev  = 0; /* only needed for cdrom */
             drive->dev_ino  = 0; /* only needed for cdrom */
 
+            if (drive->type == DRIVE_FIXED)
+               sprintf (dos_dev_name, "\\Device\\HarddiskVolume%d",
+                        HDCounter++);
+            else if (drive->type == DRIVE_REMOVABLE)
+               sprintf (dos_dev_name, "\\Device\\Floppy%d", FloppyCounter++);
+            else if (drive->type == DRIVE_CDROM)
+               sprintf (dos_dev_name, "\\Device\\CdRom%d", CDCounter++);
+            else
+            {
+               WARN ("Unable to create dos device name for drive '%s'\n",
+                     name);
+               dos_dev_name[0] = '\0';
+            }
+            drive->dos_device_name = heap_strdup (dos_dev_name);
+
             /* Get the drive label */
             PROFILE_GetWineIniString( name, "Label", "", drive->label_conf, 12 );
             if ((len = strlen(drive->label_conf)) < 11)
@@ -892,6 +916,8 @@
         DOSDrives[2].type     = DRIVE_FIXED;
         DOSDrives[2].device   = NULL;
         DOSDrives[2].flags    = 0;
+        DOSDrives[2].dos_device_name = heap_strdup ("\\Device\\HarddiskVolume0");
+        HDCounter++;
         DRIVE_CurDrive = 2;
     }
 
@@ -1743,6 +1769,7 @@
     new->dos_cwd  = heap_strdup( old->dos_cwd );
     new->unix_cwd = heap_strdup( old->unix_cwd );
     new->device   = heap_strdup( old->device );
+    new->dos_device_name = heap_strdup( old->dos_device_name );
     memcpy ( new->label_conf, old->label_conf, 12 );
     memcpy ( new->label_read, old->label_read, 12 );
     new->serial_conf = old->serial_conf;
@@ -2541,3 +2568,85 @@
     HeapFree( GetProcessHeap(), 0, xvol );
     return ret;
 }
+
+
+/***********************************************************************
+ *           QueryDosDeviceA   (KERNEL32.@)
+ *
+ * returns array of strings terminated by \0, terminated by \0
+ */
+DWORD WINAPI QueryDosDeviceA(LPCSTR devname,LPSTR target,DWORD bufsize)
+{
+    LPSTR s;
+    char  buffer[200];
+
+    TRACE("(%s,...)\n", devname ? devname : "<null>");
+    if (!devname) {
+	/* return known MSDOS devices */
+        static const char devices[24] = "CON\0COM1\0COM2\0LPT1\0NUL\0\0";
+        memcpy( target, devices, min(bufsize,sizeof(devices)) );
+        return min(bufsize,sizeof(devices));
+    }
+    /* In theory all that are possible and have been defined.
+     * Now just those below, since mirc uses it to check for special files.
+     *
+     * (It is more complex, and supports netmounted stuff, and \\.\ stuff,
+     *  but currently we just ignore that.)
+     */
+#define CHECK(x) (strstr(devname,#x)==devname)
+    if (CHECK(con) || CHECK(com) || CHECK(lpt) || CHECK(nul)) {
+	strcpy(buffer,"\\DEV\\");
+	strcat(buffer,devname);
+	if ((s=strchr(buffer,':'))) *s='\0';
+	lstrcpynA(target,buffer,bufsize);
+	return strlen(buffer)+1;
+    } else {
+       if ((strlen (devname) == 2) && (devname[1] == ':'))
+       {
+          int drive = toupper (devname[0]) - 'A';
+          if (DRIVE_IsValid (drive))
+          {
+             size_t len;
+
+             if (bufsize < (strlen (DOSDrives[drive].dos_device_name) + 2))
+             {
+                SetLastError (ERROR_INSUFFICIENT_BUFFER);
+                return 0;
+             }
+
+             strcpy (target, DOSDrives[drive].dos_device_name);
+
+             /* Needs to end in a double-null */
+             len = strlen (target);
+             target[len + 1] = '\0';
+             return len + 2;
+          }
+       }
+
+	if (strchr(devname,':') || devname[0]=='\\') {
+	    /* This might be a DOS device we do not handle yet ... */
+	    FIXME("(%s) not detected as DOS device!\n",devname);
+	}
+	SetLastError(ERROR_DEV_NOT_EXIST);
+	return 0;
+    }
+
+}
+
+
+/***********************************************************************
+ *           QueryDosDeviceW   (KERNEL32.@)
+ *
+ * returns array of strings terminated by \0, terminated by \0
+ */
+DWORD WINAPI QueryDosDeviceW(LPCWSTR devname,LPWSTR target,DWORD bufsize)
+{
+    LPSTR devnameA = devname?HEAP_strdupWtoA(GetProcessHeap(),0,devname):NULL;
+    LPSTR targetA = (LPSTR)HeapAlloc(GetProcessHeap(),0,bufsize);
+    DWORD ret = QueryDosDeviceA(devnameA,targetA,bufsize);
+
+    ret = MultiByteToWideChar( CP_ACP, 0, targetA, ret, target, bufsize );
+    if (devnameA) HeapFree(GetProcessHeap(),0,devnameA);
+    if (targetA) HeapFree(GetProcessHeap(),0,targetA);
+    return ret;
+}