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;
+}