small file reorganisation

Eric Pouech pouech-eric at wanadoo.fr
Sat Dec 6 08:21:51 CST 2003


this patch removes a few no longer used exports for kernel32, as well as 
cleaning up a bit the DOS handle management (it's now moved into 
winedos) and putting a few more files management function at the right 
place.
I hope Alexandre will not got mad about the introduced circular dep 
(kernel32 => (delay) winedos => kernel32). Since, we're now building the 
DLLs through the .spec files, I assumed, since it no longer impacts the 
make system, it would be ok.

A+
-- 
Eric Pouech
-------------- next part --------------
Name:          dh
ChangeLog:     Cleaning of wine specific exports from kernel32:	- removed no longer used export	- got rid of _lclose16 & FILE_Dup2 export by moving all dos handles code to winedos (with delay import)	- moved _lclose16 into dlls/kernel directory
License:       X11
GenDate:       2003/12/06 14:14:06 UTC
ModifiedFiles: dlls/kernel/Makefile.in dlls/kernel/kernel32.spec dlls/kernel/kernel_private.h dlls/kernel/file.c dlls/kernel/file16.c
dlls/winedos/winedos.spec dlls/winedos/int21.c files/file.c include/file.h
===================================================================
RCS file: /home/cvs/cvsroot/wine/wine/dlls/kernel/Makefile.in,v
retrieving revision 1.102
diff -u -u -r1.102 Makefile.in
--- dlls/kernel/Makefile.in	14 Nov 2003 21:08:39 -0000	1.102
+++ dlls/kernel/Makefile.in	6 Dec 2003 10:49:59 -0000
@@ -7,6 +7,7 @@
 IMPORTS   = ntdll
 ALTNAMES  = krnl386.exe comm.drv stress.dll system.drv toolhelp.dll windebug.dll win87em.dll
 EXTRALIBS = $(LIBUNICODE)
+DELAYIMPORTS = winedos
 
 SPEC_SRCS16 = \
 	comm.drv.spec \
Index: dlls/kernel/kernel32.spec
===================================================================
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	6 Dec 2003 14:12:57 -0000
@@ -29,7 +29,7 @@
  19 stub ThunkTheTemplateHandle
  20 stdcall DosFileHandleToWin32Handle(long)
  21 stdcall Win32HandleToDosFileHandle(long)
- 22 stdcall DisposeLZ32Handle(long)
+ 22 stdcall DisposeLZ32Handle(long) KERNEL_DisposeLZ32Handle
  23 stub GDIReallyCares
  24 stdcall GlobalAlloc16(long long)
  25 stdcall GlobalLock16(long)
@@ -1075,7 +1077,6 @@
 ################################################################
 # Wine extensions: Win16 functions that are needed by other dlls
 #
-@ stdcall _lclose16(long)
 @ stdcall AllocCStoDSAlias16(long)
 @ stdcall AllocSelectorArray16(long)
 @ stdcall ConvertDialog32To16(ptr long ptr)
@@ -1090,12 +1091,8 @@
 @ stdcall GetDOSEnvironment16()
 @ stdcall GetExePtr(long)
 @ stdcall GetExpWinVer16(long)
-@ stdcall GetModuleFileName16(long ptr long)
 @ stdcall GetModuleHandle16(str)
-@ stdcall GetModuleName16(long ptr long)
-@ stdcall GetSelectorBase(long)
 @ stdcall GetSelectorLimit16(long)
-@ stdcall GetThreadQueue16(long)
 @ stdcall GetVersion16()
 @ stdcall GetWinFlags16()
 @ stdcall GlobalDOSAlloc16(long)
@@ -1140,14 +1137,13 @@
 ################################################################
 # Wine dll separation hacks, these will go away, don't use them
 #
 @ cdecl DOSFS_GetDeviceByHandle(long)
 @ cdecl DOSMEM_AllocSelector(long)
 @ cdecl DOSMEM_Available()
 @ cdecl DOSMEM_FreeBlock(ptr)
 @ 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/kernel_private.h
===================================================================
RCS file: /home/cvs/cvsroot/wine/wine/dlls/kernel/kernel_private.h,v
retrieving revision 1.8
diff -u -u -r1.8 kernel_private.h
--- dlls/kernel/kernel_private.h	1 Dec 2003 22:47:28 -0000	1.8
+++ dlls/kernel/kernel_private.h	6 Dec 2003 13:58:10 -0000
@@ -44,10 +44,8 @@
     return h != INVALID_HANDLE_VALUE ? (HANDLE)((DWORD)h ^ 3) : INVALID_HANDLE_VALUE;
 }
 
-/* Size of per-process table of DOS handles */
-#define DOS_TABLE_SIZE 256
-extern HANDLE dos_handles[DOS_TABLE_SIZE];
 void FILE_ConvertOFMode( INT mode, DWORD *access, DWORD *sharing );
+extern BOOL WINAPI DisposeDosFileHandle(UINT16, HANDLE*);
 
 extern BOOL WOWTHUNK_Init(void);
 
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	6 Dec 2003 13:54:25 -0000
@@ -222,7 +222,6 @@
     return (HFILE)CreateFileA( path, access, sharing, NULL, OPEN_EXISTING, 0, 0 );
 }
 
-
 /***********************************************************************
  *           _lread   (KERNEL32.@)
  */
@@ -251,6 +250,20 @@
     return (UINT)_hwrite( hFile, buffer, (LONG)count );
 }
 
+
+/******************************************************************
+ *		KERNEL_DisposeLZ32Handle
+ *
+ * sigh: this is needed because we delay import winedos, and since we don't use
+ * in kernel32 the DisposeLZ32Handle API, it's not seen by winebuild as a missing
+ * symbol, hence a linking error
+ * This will do for now (don't think it's necessary to add a specific flag to
+ * winebuild for this kind of behavior
+ */
+void WINAPI KERNEL_DisposeLZ32Handle( HANDLE hFile )
+{
+    DisposeLZ32Handle(hFile);
+}
 
 /***********************************************************************
  *           FlushFileBuffers   (KERNEL32.@)
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	6 Dec 2003 13:55:23 -0000
@@ -72,6 +72,20 @@
 }
 
 /***********************************************************************
+ *           _lclose   (KERNEL.81)
+ */
+HFILE16 WINAPI _lclose16( HFILE16 hFile16 )
+{
+    HANDLE hFile;
+
+    if (!DisposeDosFileHandle(hFile16, &hFile))
+        return HFILE_ERROR16;
+    TRACE("%d (handle32=%p)\n", hFile16, hFile );
+    CloseHandle(hFile);
+    return 0;
+}
+
+/***********************************************************************
  *           _llseek   (KERNEL.84)
  *
  * FIXME:
Index: dlls/winedos/winedos.spec
===================================================================
RCS file: /home/cvs/cvsroot/wine/wine/dlls/winedos/winedos.spec,v
retrieving revision 1.17
diff -u -u -r1.17 winedos.spec
--- dlls/winedos/winedos.spec	17 Sep 2003 22:45:46 -0000	1.17
+++ dlls/winedos/winedos.spec	6 Dec 2003 12:51:45 -0000
@@ -6,3 +6,9 @@
 # I/O functions
 @ stdcall inport(long long) DOSVM_inport
 @ stdcall outport(long long long) DOSVM_outport
+
+# DOS handles manipulation
+@ stdcall DosFileHandleToWin32Handle(long)
+@ stdcall Win32HandleToDosFileHandle(long)
+@ stdcall DisposeDosFileHandle(long ptr)
+@ stdcall DisposeLZ32Handle(long)
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	6 Dec 2003 14:13:55 -0000
@@ -38,12 +55,11 @@
 #include "winternl.h"
 #include "wine/winbase16.h"
 #include "dosexe.h"
-#include "file.h"
 #include "winerror.h"
 #include "winuser.h"
 #include "wine/unicode.h"
 #include "wine/debug.h"
 #include "wine/exception.h"
 #include "wine/server.h"
 
 /*
  * Note:
@@ -245,6 +262,164 @@
 #define EL_Serial            0x04
 #define EL_Memory            0x05
 
+#define DOS_TABLE_SIZE  256
+static 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 )
+{
+    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;
+
+    FIXME("I'm called\n");
+    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;
+    FIXME("I'm called\n");
+    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];
+}
+
+/******************************************************************
+ *		DisposeDosFileHandle
+ *
+ */
+BOOL WINAPI DisposeDosFileHandle( HFILE16 hFile16, HANDLE* hFile )
+{
+    FIXME("I'm called\n");
+    if (hFile16 >= DOS_TABLE_SIZE || !dos_handles[hFile16])
+    {
+        SetLastError( ERROR_INVALID_HANDLE );
+        return FALSE;
+    }
+    if (hFile) *hFile = dos_handles[hFile16];
+    dos_handles[hFile16] = NULL;
+    return TRUE;
+}
+
+/***********************************************************************
+ *           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;
+
+    FIXME("I'm called\n");
+    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.
+ */
+static 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;
+}
+
+/******************************************************************
+ *		FILE_Close
+ */
+static BOOL FILE_Close( HFILE16 hFile16 )
+{
+    HANDLE      hFile;
+
+    if (!DisposeDosFileHandle(hFile16, &hFile)) return FALSE;
+    TRACE("%d (handle32=%p)\n", hFile16, hFile);
+    CloseHandle(hFile);
+    return TRUE;
+}
 
 /* Many calls translate a drive argument like this:
    drive number (00h = default, 01h = A:, etc)
@@ -1109,13 +1284,13 @@
                 AL_result = 0xff; /* failed */
             } else if (hfile16 > 255) {
                 TRACE("hfile16 (=%d) larger than 255 for \"%s\"\n", hfile16, file_path);
-                _lclose16(hfile16);
+                FILE_Close(hfile16);
                 AL_result = 0xff; /* failed */
             } else {
                 if (!GetFileInformationByHandle(handle, &info)) {
                     TRACE("GetFileInformationByHandle(%d, %p) for \"%s\" failed\n",
                           hfile16, handle, file_path);
-                    _lclose16(hfile16);
+                    FILE_Close(hfile16);
                     AL_result = 0xff; /* failed */
                 } else {
                     fcb->drive_number = file_path[0] - 'A' + 1;
@@ -1173,7 +1348,7 @@
         fcb = (struct FCB *) xfcb->fcb;
     } /* if */
 
-    if (_lclose16((HFILE16) fcb->file_number) != 0) {
+    if (!FILE_Close((HFILE16) fcb->file_number)) {
         TRACE("_lclose16(%d) failed\n", fcb->file_number);
         AL_result = 0xff; /* failed */
     } else {
@@ -3439,7 +3661,7 @@
      * is something behind this ?
      */
     while (*p == '*' || *p == ' ') p++; /* skip wildcards and spaces */
-    return IS_END_OF_NAME(*p);
+    return !*p || *p == '/' || *p == '\\';
 }
 
 static HANDLE       INT21_FindHandle;
@@ -4362,7 +4584,7 @@
 
     case 0x3e: /* "CLOSE" - CLOSE FILE */
         TRACE( "CLOSE handle %d\n", BX_reg(context) );
-        if (_lclose16( BX_reg(context) ) == HFILE_ERROR16)
+        if (!FILE_Close( BX_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	6 Dec 2003 13:53:30 -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;
 
 /***********************************************************************
@@ -1244,7 +1194,10 @@
         hFileRet = Win32HandleToDosFileHandle( handle );
         if (hFileRet == HFILE_ERROR16) goto error;
         if (mode & OF_EXIST) /* Return the handle, but close it first */
-            _lclose16( hFileRet );
+        {
+            CloseHandle(handle);
+            DisposeDosFileHandle(hFileRet, NULL);
+        }
     }
     return hFileRet;
 
@@ -1280,146 +1233,6 @@
 }
 
 
-/***********************************************************************
- *           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;
-}
-
-
 /******************************************************************
  *		FILE_ReadWriteApc (internal)
  *
Index: include/file.h
===================================================================
RCS file: /home/cvs/cvsroot/wine/wine/include/file.h,v
retrieving revision 1.62
diff -u -u -r1.62 file.h
--- include/file.h	2 Dec 2003 04:19:56 -0000	1.62
+++ include/file.h	6 Dec 2003 11:50:42 -0000
@@ -71,12 +73,11 @@
 extern int FILE_strncasecmp( const char *str1, const char *str2, int len );
 extern void FILE_SetDosError(void);
 extern BOOL FILE_Stat( LPCSTR unixName, BY_HANDLE_FILE_INFORMATION *info, BOOL *is_symlink );
-extern HFILE16 FILE_Dup2( HFILE16 hFile1, HFILE16 hFile2 );
 extern HANDLE FILE_CreateFile( LPCSTR filename, DWORD access, DWORD sharing,
                                LPSECURITY_ATTRIBUTES sa, DWORD creation,
                                DWORD attributes, HANDLE template, BOOL fail_read_only,
                                UINT drive_type );
 extern HANDLE FILE_CreateDevice( int client_id, DWORD access, LPSECURITY_ATTRIBUTES sa );
 
 extern LONG WINAPI WIN16_hread(HFILE16,SEGPTR,LONG);
 


More information about the wine-patches mailing list