[Bug 521] WINE removes trailing backslash in GetFullPathNameA/W
in dos_fs.c.
Eric Pouech
pouech-eric at wanadoo.fr
Tue Jan 13 15:08:55 CST 2004
> Hmm I don't remember that one, it may have gotten lost in the vacation
> backlog. Could you please resend?
>
and by the way, this one got lost too
A+
-------------- next part --------------
Name: ntkrnl_37
ChangeLog:
- got rid of FILE_Dup2 export from kernel32
- move all dos handle related code into dlls/kernel32
License: X11
GenDate: 2003/12/07 10:38:48 UTC
ModifiedFiles: dlls/kernel/kernel32.spec dlls/kernel/file.c dlls/kernel/file16.c dlls/winedos/int21.c files/file.c
===================================================================
RCS file: /home/cvs/cvsroot/wine/wine/dlls/kernel/kernel32.spec,v
retrieving revision 1.120
diff -u -u -r1.120 kernel32.spec
--- dlls/kernel/kernel32.spec 25 Nov 2003 01:51:07 -0000 1.120
+++ dlls/kernel/kernel32.spec 7 Dec 2003 09:31:21 -0000
@@ -1147,7 +1147,6 @@
@ cdecl DOSMEM_GetBlock(long ptr)
@ cdecl DOSMEM_Init(long)
@ cdecl DOSMEM_ResizeBlock(ptr long long)
-@ cdecl FILE_Dup2(long long)
@ cdecl LOCAL_Alloc(long long long)
@ cdecl LOCAL_Compact(long long long)
@ cdecl LOCAL_CountFree(long)
Index: dlls/kernel/file.c
===================================================================
RCS file: /home/cvs/cvsroot/wine/wine/dlls/kernel/file.c,v
retrieving revision 1.4
diff -u -u -r1.4 file.c
--- dlls/kernel/file.c 5 Sep 2003 23:08:37 -0000 1.4
+++ dlls/kernel/file.c 7 Dec 2003 10:38:30 -0000
@@ -222,7 +222,6 @@
return (HFILE)CreateFileA( path, access, sharing, NULL, OPEN_EXISTING, 0, 0 );
}
-
/***********************************************************************
* _lread (KERNEL32.@)
*/
@@ -450,3 +449,110 @@
SetLastError(ERROR_UNABLE_TO_MOVE_REPLACEMENT);
return FALSE;
}
+
+HANDLE dos_handles[DOS_TABLE_SIZE];
+/***********************************************************************
+ * FILE_InitProcessDosHandles
+ *
+ * Allocates the default DOS handles for a process. Called either by
+ * Win32HandleToDosFileHandle below or by the DOSVM stuff.
+ */
+static void FILE_InitProcessDosHandles( void )
+{
+ static BOOL init_done /* = FALSE */;
+ HANDLE cp = GetCurrentProcess();
+
+ if (init_done) return;
+ init_done = TRUE;
+ DuplicateHandle(cp, GetStdHandle(STD_INPUT_HANDLE), cp, &dos_handles[0],
+ 0, TRUE, DUPLICATE_SAME_ACCESS);
+ DuplicateHandle(cp, GetStdHandle(STD_OUTPUT_HANDLE), cp, &dos_handles[1],
+ 0, TRUE, DUPLICATE_SAME_ACCESS);
+ DuplicateHandle(cp, GetStdHandle(STD_ERROR_HANDLE), cp, &dos_handles[2],
+ 0, TRUE, DUPLICATE_SAME_ACCESS);
+ DuplicateHandle(cp, GetStdHandle(STD_ERROR_HANDLE), cp, &dos_handles[3],
+ 0, TRUE, DUPLICATE_SAME_ACCESS);
+ DuplicateHandle(cp, GetStdHandle(STD_ERROR_HANDLE), cp, &dos_handles[4],
+ 0, TRUE, DUPLICATE_SAME_ACCESS);
+}
+
+/***********************************************************************
+ * Win32HandleToDosFileHandle (KERNEL32.21)
+ *
+ * Allocate a DOS handle for a Win32 handle. The Win32 handle is no
+ * longer valid after this function (even on failure).
+ *
+ * Note: this is not exactly right, since on Win95 the Win32 handles
+ * are on top of DOS handles and we do it the other way
+ * around. Should be good enough though.
+ */
+HFILE WINAPI Win32HandleToDosFileHandle( HANDLE handle )
+{
+ int i;
+
+ if (!handle || (handle == INVALID_HANDLE_VALUE))
+ return HFILE_ERROR;
+
+ FILE_InitProcessDosHandles();
+ for (i = 0; i < DOS_TABLE_SIZE; i++)
+ if (!dos_handles[i])
+ {
+ dos_handles[i] = handle;
+ TRACE("Got %d for h32 %p\n", i, handle );
+ return (HFILE)i;
+ }
+ CloseHandle( handle );
+ SetLastError( ERROR_TOO_MANY_OPEN_FILES );
+ return HFILE_ERROR;
+}
+
+
+/***********************************************************************
+ * DosFileHandleToWin32Handle (KERNEL32.20)
+ *
+ * Return the Win32 handle for a DOS handle.
+ *
+ * Note: this is not exactly right, since on Win95 the Win32 handles
+ * are on top of DOS handles and we do it the other way
+ * around. Should be good enough though.
+ */
+HANDLE WINAPI DosFileHandleToWin32Handle( HFILE handle )
+{
+ HFILE16 hfile = (HFILE16)handle;
+ if (hfile < 5) FILE_InitProcessDosHandles();
+ if ((hfile >= DOS_TABLE_SIZE) || !dos_handles[hfile])
+ {
+ SetLastError( ERROR_INVALID_HANDLE );
+ return INVALID_HANDLE_VALUE;
+ }
+ return dos_handles[hfile];
+}
+
+
+/***********************************************************************
+ * DisposeLZ32Handle (KERNEL32.22)
+ *
+ * Note: this is not entirely correct, we should only close the
+ * 32-bit handle and not the 16-bit one, but we cannot do
+ * this because of the way our DOS handles are implemented.
+ * It shouldn't break anything though.
+ */
+void WINAPI DisposeLZ32Handle( HANDLE handle )
+{
+ int i;
+
+ if (!handle || (handle == INVALID_HANDLE_VALUE)) return;
+
+ for (i = 5; i < DOS_TABLE_SIZE; i++)
+ if (dos_handles[i] == handle)
+ {
+ dos_handles[i] = 0;
+ CloseHandle( handle );
+ break;
+ }
+}
+
+
+
+
+
Index: dlls/kernel/file16.c
===================================================================
RCS file: /home/cvs/cvsroot/wine/wine/dlls/kernel/file16.c,v
retrieving revision 1.4
diff -u -u -r1.4 file16.c
--- dlls/kernel/file16.c 15 Nov 2003 00:13:21 -0000 1.4
+++ dlls/kernel/file16.c 7 Dec 2003 10:31:48 -0000
@@ -62,6 +62,21 @@
return _hwrite( (HFILE)DosFileHandleToWin32Handle(hFile), buffer, count );
}
+/***********************************************************************
+ * _lclose (KERNEL.81)
+ */
+HFILE16 WINAPI _lclose16( HFILE16 hFile )
+{
+ if ((hFile >= DOS_TABLE_SIZE) || !dos_handles[hFile])
+ {
+ SetLastError( ERROR_INVALID_HANDLE );
+ return HFILE_ERROR16;
+ }
+ TRACE("%d (handle32=%p)\n", hFile, dos_handles[hFile] );
+ CloseHandle( dos_handles[hFile] );
+ dos_handles[hFile] = 0;
+ return 0;
+}
/***********************************************************************
* _lcreat (KERNEL.83)
Index: dlls/winedos/int21.c
===================================================================
RCS file: /home/cvs/cvsroot/wine/wine/dlls/winedos/int21.c,v
retrieving revision 1.51
diff -u -u -r1.51 int21.c
--- dlls/winedos/int21.c 26 Nov 2003 22:29:30 -0000 1.51
+++ dlls/winedos/int21.c 7 Dec 2003 10:35:38 -0000
@@ -3737,6 +3801,44 @@
SET_SI( context, context->Esi + (int)s - (int)filename );
}
+static BOOL INT21_Dup2(HFILE16 hFile1, HFILE16 hFile2)
+{
+ HFILE16 res;
+ HANDLE handle, new_handle;
+#define DOS_TABLE_SIZE 256
+ DWORD map[DOS_TABLE_SIZE / 32];
+ int i;
+
+ handle = DosFileHandleToWin32Handle(hFile1);
+ if (handle == INVALID_HANDLE_VALUE)
+ return FALSE;
+
+ _lclose16(hFile2);
+ /* now loop to allocate the same one... */
+ memset(map, 0, sizeof(map));
+ for (i = 0; i < DOS_TABLE_SIZE; i++)
+ {
+ if (!DuplicateHandle(GetCurrentProcess(), handle,
+ GetCurrentProcess(), &new_handle,
+ 0, FALSE, DUPLICATE_SAME_ACCESS))
+ {
+ res = HFILE_ERROR16;
+ break;
+ }
+ res = Win32HandleToDosFileHandle(new_handle);
+ if (res == HFILE_ERROR16 || res == hFile2) break;
+ map[res / 32] |= 1 << (res % 32);
+ }
+ /* clean up the allocated slots */
+ for (i = 0; i < DOS_TABLE_SIZE; i++)
+ {
+ if (map[i / 32] & (1 << (i % 32)))
+ _lclose16((HFILE16)i);
+ }
+ return res == hFile2;
+}
+
+
/***********************************************************************
* DOSVM_Int21Handler
*
@@ -4517,8 +4619,7 @@
case 0x46: /* "DUP2", "FORCEDUP" - FORCE DUPLICATE FILE HANDLE */
TRACE( "FORCEDUP - FORCE DUPLICATE FILE HANDLE %d to %d\n",
BX_reg(context), CX_reg(context) );
-
- if (FILE_Dup2( BX_reg(context), CX_reg(context) ) == HFILE_ERROR16)
+ if (!INT21_Dup2(BX_reg(context), CX_reg(context)))
bSetDOSExtendedError = TRUE;
else
RESET_CFLAG(context);
Index: files/file.c
===================================================================
RCS file: /home/cvs/cvsroot/wine/wine/files/file.c,v
retrieving revision 1.195
diff -u -u -r1.195 file.c
--- files/file.c 2 Dec 2003 04:48:16 -0000 1.195
+++ files/file.c 7 Dec 2003 10:30:34 -0000
@@ -84,7 +84,6 @@
#define IS_OPTION_TRUE(ch) ((ch) == 'y' || (ch) == 'Y' || (ch) == 't' || (ch) == 'T' || (ch) == '1')
-HANDLE dos_handles[DOS_TABLE_SIZE];
mode_t FILE_umask;
/***********************************************************************
@@ -1277,146 +1276,6 @@
HFILE WINAPI OpenFile( LPCSTR name, OFSTRUCT *ofs, UINT mode )
{
return FILE_DoOpenFile( name, ofs, mode, TRUE );
-}
-
-
-/***********************************************************************
- * FILE_InitProcessDosHandles
- *
- * Allocates the default DOS handles for a process. Called either by
- * Win32HandleToDosFileHandle below or by the DOSVM stuff.
- */
-static void FILE_InitProcessDosHandles( void )
-{
- HANDLE cp = GetCurrentProcess();
- DuplicateHandle(cp, GetStdHandle(STD_INPUT_HANDLE), cp, &dos_handles[0],
- 0, TRUE, DUPLICATE_SAME_ACCESS);
- DuplicateHandle(cp, GetStdHandle(STD_OUTPUT_HANDLE), cp, &dos_handles[1],
- 0, TRUE, DUPLICATE_SAME_ACCESS);
- DuplicateHandle(cp, GetStdHandle(STD_ERROR_HANDLE), cp, &dos_handles[2],
- 0, TRUE, DUPLICATE_SAME_ACCESS);
- DuplicateHandle(cp, GetStdHandle(STD_ERROR_HANDLE), cp, &dos_handles[3],
- 0, TRUE, DUPLICATE_SAME_ACCESS);
- DuplicateHandle(cp, GetStdHandle(STD_ERROR_HANDLE), cp, &dos_handles[4],
- 0, TRUE, DUPLICATE_SAME_ACCESS);
-}
-
-/***********************************************************************
- * Win32HandleToDosFileHandle (KERNEL32.21)
- *
- * Allocate a DOS handle for a Win32 handle. The Win32 handle is no
- * longer valid after this function (even on failure).
- *
- * Note: this is not exactly right, since on Win95 the Win32 handles
- * are on top of DOS handles and we do it the other way
- * around. Should be good enough though.
- */
-HFILE WINAPI Win32HandleToDosFileHandle( HANDLE handle )
-{
- int i;
-
- if (!handle || (handle == INVALID_HANDLE_VALUE))
- return HFILE_ERROR;
-
- for (i = 5; i < DOS_TABLE_SIZE; i++)
- if (!dos_handles[i])
- {
- dos_handles[i] = handle;
- TRACE("Got %d for h32 %p\n", i, handle );
- return (HFILE)i;
- }
- CloseHandle( handle );
- SetLastError( ERROR_TOO_MANY_OPEN_FILES );
- return HFILE_ERROR;
-}
-
-
-/***********************************************************************
- * DosFileHandleToWin32Handle (KERNEL32.20)
- *
- * Return the Win32 handle for a DOS handle.
- *
- * Note: this is not exactly right, since on Win95 the Win32 handles
- * are on top of DOS handles and we do it the other way
- * around. Should be good enough though.
- */
-HANDLE WINAPI DosFileHandleToWin32Handle( HFILE handle )
-{
- HFILE16 hfile = (HFILE16)handle;
- if (hfile < 5 && !dos_handles[hfile]) FILE_InitProcessDosHandles();
- if ((hfile >= DOS_TABLE_SIZE) || !dos_handles[hfile])
- {
- SetLastError( ERROR_INVALID_HANDLE );
- return INVALID_HANDLE_VALUE;
- }
- return dos_handles[hfile];
-}
-
-
-/***********************************************************************
- * DisposeLZ32Handle (KERNEL32.22)
- *
- * Note: this is not entirely correct, we should only close the
- * 32-bit handle and not the 16-bit one, but we cannot do
- * this because of the way our DOS handles are implemented.
- * It shouldn't break anything though.
- */
-void WINAPI DisposeLZ32Handle( HANDLE handle )
-{
- int i;
-
- if (!handle || (handle == INVALID_HANDLE_VALUE)) return;
-
- for (i = 5; i < DOS_TABLE_SIZE; i++)
- if (dos_handles[i] == handle)
- {
- dos_handles[i] = 0;
- CloseHandle( handle );
- break;
- }
-}
-
-
-/***********************************************************************
- * FILE_Dup2
- *
- * dup2() function for DOS handles.
- */
-HFILE16 FILE_Dup2( HFILE16 hFile1, HFILE16 hFile2 )
-{
- HANDLE new_handle;
-
- if (hFile1 < 5 && !dos_handles[hFile1]) FILE_InitProcessDosHandles();
-
- if ((hFile1 >= DOS_TABLE_SIZE) || (hFile2 >= DOS_TABLE_SIZE) || !dos_handles[hFile1])
- {
- SetLastError( ERROR_INVALID_HANDLE );
- return HFILE_ERROR16;
- }
- if (!DuplicateHandle( GetCurrentProcess(), dos_handles[hFile1],
- GetCurrentProcess(), &new_handle,
- 0, FALSE, DUPLICATE_SAME_ACCESS ))
- return HFILE_ERROR16;
- if (dos_handles[hFile2]) CloseHandle( dos_handles[hFile2] );
- dos_handles[hFile2] = new_handle;
- return hFile2;
-}
-
-
-/***********************************************************************
- * _lclose (KERNEL.81)
- */
-HFILE16 WINAPI _lclose16( HFILE16 hFile )
-{
- if ((hFile >= DOS_TABLE_SIZE) || !dos_handles[hFile])
- {
- SetLastError( ERROR_INVALID_HANDLE );
- return HFILE_ERROR16;
- }
- TRACE("%d (handle32=%p)\n", hFile, dos_handles[hFile] );
- CloseHandle( dos_handles[hFile] );
- dos_handles[hFile] = 0;
- return 0;
}
More information about the wine-devel
mailing list