Commit 5ce902b0 authored by Alexandre Julliard's avatar Alexandre Julliard

Implemented DosFileHandleToWin32Handle, Win32HandleToDosFileHandle and

DisposeLZ32Handle and use them to replace file.c internal functions. Renamed WOW* functions into K32WOW*.
parent 1c07718a
......@@ -37,9 +37,9 @@ debug_channels (comm debugstr dll int resource stress thunk toolhelp win32)
17 register -i386 CommonUnimpStub() CommonUnimpStub
18 stdcall GetProcessDword(long long) GetProcessDword
19 stub ThunkTheTemplateHandle
20 stub DosFileHandleToWin32Handle
21 stub Win32HandleToDosFileHandle
22 stub DisposeLZ32Handle
20 stdcall DosFileHandleToWin32Handle(long) DosFileHandleToWin32Handle
21 stdcall Win32HandleToDosFileHandle(long) Win32HandleToDosFileHandle
22 stdcall DisposeLZ32Handle(long) DisposeLZ32Handle
23 stub GDIReallyCares
24 stdcall GlobalAlloc16(long long) GlobalAlloc16
25 stdcall GlobalLock16(long) GlobalLock16
......@@ -71,23 +71,23 @@ debug_channels (comm debugstr dll int resource stress thunk toolhelp win32)
51 register -i386 W32S_BackTo32() W32S_BackTo32
52 stdcall GetThunkBuff() GetThunkBuff
53 stdcall GetThunkStuff(str str) GetThunkStuff
54 stdcall K32WOWCallback16(long long) WOWCallback16
55 stdcall K32WOWCallback16Ex(ptr long long ptr ptr) WOWCallback16Ex
56 stdcall K32WOWGetVDMPointer(long long long) WOWGetVDMPointer
57 stdcall K32WOWHandle32(long long) WOWHandle32
58 stdcall K32WOWHandle16(long long) WOWHandle16
59 stdcall K32WOWGlobalAlloc16(long long) WOWGlobalAlloc16
60 stdcall K32WOWGlobalLock16(long) WOWGlobalLock16
61 stdcall K32WOWGlobalUnlock16(long) WOWGlobalUnlock16
62 stdcall K32WOWGlobalFree16(long) WOWGlobalFree16
63 stdcall K32WOWGlobalAllocLock16(long long ptr) WOWGlobalAllocLock16
64 stdcall K32WOWGlobalUnlockFree16(long) WOWGlobalUnlockFree16
65 stdcall K32WOWGlobalLockSize16(long ptr) WOWGlobalLockSize16
66 stdcall K32WOWYield16() WOWYield16
67 stdcall K32WOWDirectedYield16(long) WOWDirectedYield16
68 stdcall K32WOWGetVDMPointerFix(long long long) WOWGetVDMPointerFix
69 stdcall K32WOWGetVDMPointerUnfix(long) WOWGetVDMPointerUnfix
70 stdcall K32WOWGetDescriptor(long long) WOWGetDescriptor
54 stdcall K32WOWCallback16(long long) K32WOWCallback16
55 stdcall K32WOWCallback16Ex(ptr long long ptr ptr) K32WOWCallback16Ex
56 stdcall K32WOWGetVDMPointer(long long long) K32WOWGetVDMPointer
57 stdcall K32WOWHandle32(long long) K32WOWHandle32
58 stdcall K32WOWHandle16(long long) K32WOWHandle16
59 stdcall K32WOWGlobalAlloc16(long long) K32WOWGlobalAlloc16
60 stdcall K32WOWGlobalLock16(long) K32WOWGlobalLock16
61 stdcall K32WOWGlobalUnlock16(long) K32WOWGlobalUnlock16
62 stdcall K32WOWGlobalFree16(long) K32WOWGlobalFree16
63 stdcall K32WOWGlobalAllocLock16(long long ptr) K32WOWGlobalAllocLock16
64 stdcall K32WOWGlobalUnlockFree16(long) K32WOWGlobalUnlockFree16
65 stdcall K32WOWGlobalLockSize16(long ptr) K32WOWGlobalLockSize16
66 stdcall K32WOWYield16() K32WOWYield16
67 stdcall K32WOWDirectedYield16(long) K32WOWDirectedYield16
68 stdcall K32WOWGetVDMPointerFix(long long long) K32WOWGetVDMPointerFix
69 stdcall K32WOWGetVDMPointerUnfix(long) K32WOWGetVDMPointerUnfix
70 stdcall K32WOWGetDescriptor(long long) K32WOWGetDescriptor
71 stub IsThreadId
72 forward K32RtlLargeIntegerAdd ntdll.RtlLargeIntegerAdd
73 forward K32RtlEnlargedIntegerMultiply ntdll.RtlEnlargedIntegerMultiply
......
......@@ -1038,7 +1038,6 @@ void WINAPI GetTEBSelectorFS16(void)
/**********************************************************************
* KERNEL_431 (KERNEL.431)
* IsPeFormat (W32SYS.2)
* Checks the passed filename if it is a PE format executeable
* RETURNS
* TRUE, if it is.
......@@ -1048,32 +1047,22 @@ BOOL16 WINAPI IsPeFormat16(
LPSTR fn, /* [in] filename to executeable */
HFILE16 hf16 /* [in] open file, if filename is NULL */
) {
IMAGE_DOS_HEADER mzh;
OFSTRUCT ofs;
DWORD xmagic;
if (fn) {
hf16 = OpenFile16(fn,&ofs,OF_READ);
if (hf16==HFILE_ERROR16)
return FALSE;
}
_llseek16(hf16,0,SEEK_SET);
if (sizeof(mzh)!=_lread16(hf16,&mzh,sizeof(mzh))) {
_lclose(hf16);
return FALSE;
}
if (mzh.e_magic!=IMAGE_DOS_SIGNATURE) {
WARN("File has not got dos signature!\n");
_lclose(hf16);
return FALSE;
}
_llseek16(hf16,mzh.e_lfanew,SEEK_SET);
if (sizeof(DWORD)!=_lread16(hf16,&xmagic,sizeof(DWORD))) {
_lclose(hf16);
return FALSE;
}
_lclose(hf16);
return (xmagic == IMAGE_NT_SIGNATURE);
BOOL ret = FALSE;
IMAGE_DOS_HEADER mzh;
OFSTRUCT ofs;
DWORD xmagic;
if (fn) hf16 = OpenFile16(fn,&ofs,OF_READ);
if (hf16 == HFILE_ERROR16) return FALSE;
_llseek16(hf16,0,SEEK_SET);
if (sizeof(mzh)!=_lread16(hf16,&mzh,sizeof(mzh))) goto done;
if (mzh.e_magic!=IMAGE_DOS_SIGNATURE) goto done;
_llseek16(hf16,mzh.e_lfanew,SEEK_SET);
if (sizeof(DWORD)!=_lread16(hf16,&xmagic,sizeof(DWORD))) goto done;
ret = (xmagic == IMAGE_NT_SIGNATURE);
done:
_lclose16(hf16);
return ret;
}
......@@ -1341,7 +1330,7 @@ void WINAPI C16ThkSL01(CONTEXT86 *context)
struct ThunkDataSL16 *SL16 = PTR_SEG_TO_LIN(context->Edx);
struct ThunkDataSL *td = SL16->fpData;
DWORD procAddress = (DWORD)GetProcAddress16(GetModuleHandle16("KERNEL"), 631);
DWORD procAddress = (DWORD)GetProcAddress16(GetModuleHandle16("KERNEL"), (LPCSTR)631);
WORD cs = __get_cs();
if (!td)
......@@ -1781,7 +1770,7 @@ INT16 WINAPI UnRegisterCBClient16( INT16 wCBCId,
void WINAPI InitCBClient16( FARPROC glueLS )
{
HMODULE16 kernel = GetModuleHandle16( "KERNEL" );
SEGPTR glueSL = (SEGPTR)WIN32_GetProcAddress16( kernel, (LPCSTR)604 );
SEGPTR glueSL = (SEGPTR)GetProcAddress16( kernel, (LPCSTR)604 );
SetThunkletCallbackGlue16( glueLS, glueSL );
}
......@@ -1870,7 +1859,7 @@ SEGPTR WINAPI Get16DLLAddress(HMODULE handle, LPSTR func_name) {
DWORD proc_16;
if (!handle) handle=GetModuleHandle16("WIN32S16");
proc_16 = (DWORD)WIN32_GetProcAddress16(handle, func_name);
proc_16 = (DWORD)GetProcAddress16(handle, func_name);
x=PTR_SEG_TO_LIN(thunk);
*x++=0xba; *(DWORD*)x=proc_16;x+=4; /* movl proc_16, $edx */
......
......@@ -229,7 +229,7 @@ BOOL WINAPI UTRegister( HMODULE hModule, LPSTR lpsz16BITDLL,
/* Load 16-bit DLL and get UTProc16 entry point */
if ( (hModule16 = LoadLibrary16( lpsz16BITDLL )) <= 32
|| (target16 = WIN32_GetProcAddress16( hModule16, lpszProcName )) == 0 )
|| (target16 = GetProcAddress16( hModule16, lpszProcName )) == 0 )
return FALSE;
/* Allocate UTINFO struct */
......@@ -250,7 +250,7 @@ BOOL WINAPI UTRegister( HMODULE hModule, LPSTR lpsz16BITDLL,
/* Call UTInit16 if present */
if ( lpszInitName
&& (init16 = WIN32_GetProcAddress16( hModule16, lpszInitName )) != 0 )
&& (init16 = GetProcAddress16( hModule16, lpszInitName )) != 0 )
{
SEGPTR callback = SEGPTR_GET( &ut->ut16 );
SEGPTR segBuff = MapLS( lpBuff );
......
......@@ -39,18 +39,18 @@ DWORD WINAPI CallProcEx32W16(VOID);
*/
/**********************************************************************
* WOWGetDescriptor (WOW32.1) (KERNEL32.70)
* K32WOWGetDescriptor (WOW32.1) (KERNEL32.70)
*/
BOOL WINAPI WOWGetDescriptor( SEGPTR segptr, LPLDT_ENTRY ldtent )
BOOL WINAPI K32WOWGetDescriptor( SEGPTR segptr, LPLDT_ENTRY ldtent )
{
return GetThreadSelectorEntry( GetCurrentThread(),
segptr >> 16, ldtent );
}
/**********************************************************************
* WOWGetVDMPointer (WOW32.5) (KERNEL32.56)
* K32WOWGetVDMPointer (WOW32.5) (KERNEL32.56)
*/
LPVOID WINAPI WOWGetVDMPointer( DWORD vp, DWORD dwBytes, BOOL fProtectedMode )
LPVOID WINAPI K32WOWGetVDMPointer( DWORD vp, DWORD dwBytes, BOOL fProtectedMode )
{
/* FIXME: add size check too */
......@@ -61,9 +61,9 @@ LPVOID WINAPI WOWGetVDMPointer( DWORD vp, DWORD dwBytes, BOOL fProtectedMode )
}
/**********************************************************************
* WOWGetVDMPointerFix (WOW32.6) (KERNEL32.68)
* K32WOWGetVDMPointerFix (WOW32.6) (KERNEL32.68)
*/
LPVOID WINAPI WOWGetVDMPointerFix( DWORD vp, DWORD dwBytes, BOOL fProtectedMode )
LPVOID WINAPI K32WOWGetVDMPointerFix( DWORD vp, DWORD dwBytes, BOOL fProtectedMode )
{
/*
* Hmmm. According to the docu, we should call:
......@@ -77,13 +77,13 @@ LPVOID WINAPI WOWGetVDMPointerFix( DWORD vp, DWORD dwBytes, BOOL fProtectedMode
* fProtectedMode is TRUE, anyway ...)
*/
return WOWGetVDMPointer( vp, dwBytes, fProtectedMode );
return K32WOWGetVDMPointer( vp, dwBytes, fProtectedMode );
}
/**********************************************************************
* WOWGetVDMPointerUnFix (WOW32.7) (KERNEL32.69)
* K32WOWGetVDMPointerUnFix (WOW32.7) (KERNEL32.69)
*/
VOID WINAPI WOWGetVDMPointerUnfix( DWORD vp )
VOID WINAPI K32WOWGetVDMPointerUnfix( DWORD vp )
{
/*
* See above why we don't call:
......@@ -94,75 +94,75 @@ VOID WINAPI WOWGetVDMPointerUnfix( DWORD vp )
}
/**********************************************************************
* WOWGlobalAlloc16 (WOW32.8) (KERNEL32.59)
* K32WOWGlobalAlloc16 (WOW32.8) (KERNEL32.59)
*/
WORD WINAPI WOWGlobalAlloc16( WORD wFlags, DWORD cb )
WORD WINAPI K32WOWGlobalAlloc16( WORD wFlags, DWORD cb )
{
return (WORD)GlobalAlloc16( wFlags, cb );
}
/**********************************************************************
* WOWGlobalFree16 (WOW32.10) (KERNEL32.62)
* K32WOWGlobalFree16 (WOW32.10) (KERNEL32.62)
*/
WORD WINAPI WOWGlobalFree16( WORD hMem )
WORD WINAPI K32WOWGlobalFree16( WORD hMem )
{
return (WORD)GlobalFree16( (HGLOBAL16)hMem );
}
/**********************************************************************
* WOWGlobalLock16 (WOW32.11) (KERNEL32.60)
* K32WOWGlobalLock16 (WOW32.11) (KERNEL32.60)
*/
DWORD WINAPI WOWGlobalLock16( WORD hMem )
DWORD WINAPI K32WOWGlobalLock16( WORD hMem )
{
return (DWORD)WIN16_GlobalLock16( (HGLOBAL16)hMem );
}
/**********************************************************************
* WOWGlobalUnlock16 (WOW32.13) (KERNEL32.61)
* K32WOWGlobalUnlock16 (WOW32.13) (KERNEL32.61)
*/
BOOL WINAPI WOWGlobalUnlock16( WORD hMem )
BOOL WINAPI K32WOWGlobalUnlock16( WORD hMem )
{
return (BOOL)GlobalUnlock16( (HGLOBAL16)hMem );
}
/**********************************************************************
* WOWGlobalAllocLock16 (WOW32.9) (KERNEL32.63)
* K32WOWGlobalAllocLock16 (WOW32.9) (KERNEL32.63)
*/
DWORD WINAPI WOWGlobalAllocLock16( WORD wFlags, DWORD cb, WORD *phMem )
DWORD WINAPI K32WOWGlobalAllocLock16( WORD wFlags, DWORD cb, WORD *phMem )
{
WORD hMem = WOWGlobalAlloc16( wFlags, cb );
WORD hMem = K32WOWGlobalAlloc16( wFlags, cb );
if (phMem) *phMem = hMem;
return WOWGlobalLock16( hMem );
return K32WOWGlobalLock16( hMem );
}
/**********************************************************************
* WOWGlobalLockSize16 (WOW32.12) (KERNEL32.65)
* K32WOWGlobalLockSize16 (WOW32.12) (KERNEL32.65)
*/
DWORD WINAPI WOWGlobalLockSize16( WORD hMem, PDWORD pcb )
DWORD WINAPI K32WOWGlobalLockSize16( WORD hMem, PDWORD pcb )
{
if ( pcb )
*pcb = GlobalSize16( (HGLOBAL16)hMem );
return WOWGlobalLock16( hMem );
return K32WOWGlobalLock16( hMem );
}
/**********************************************************************
* WOWGlobalUnlockFree16 (WOW32.14) (KERNEL32.64)
* K32WOWGlobalUnlockFree16 (WOW32.14) (KERNEL32.64)
*/
WORD WINAPI WOWGlobalUnlockFree16( DWORD vpMem )
WORD WINAPI K32WOWGlobalUnlockFree16( DWORD vpMem )
{
if ( !WOWGlobalUnlock16( HIWORD(vpMem) ) )
if ( !K32WOWGlobalUnlock16( HIWORD(vpMem) ) )
return FALSE;
return WOWGlobalFree16( HIWORD(vpMem) );
return K32WOWGlobalFree16( HIWORD(vpMem) );
}
/**********************************************************************
* WOWYield16 (WOW32.17) (KERNEL32.66)
* K32WOWYield16 (WOW32.17) (KERNEL32.66)
*/
VOID WINAPI WOWYield16( void )
VOID WINAPI K32WOWYield16( void )
{
/*
* This does the right thing for both Win16 and Win32 tasks.
......@@ -172,9 +172,9 @@ VOID WINAPI WOWYield16( void )
}
/**********************************************************************
* WOWDirectedYield16 (WOW32.4) (KERNEL32.67)
* K32WOWDirectedYield16 (WOW32.4) (KERNEL32.67)
*/
VOID WINAPI WOWDirectedYield16( WORD htask16 )
VOID WINAPI K32WOWDirectedYield16( WORD htask16 )
{
/*
* Argh. Our scheduler doesn't like DirectedYield by Win32
......@@ -186,9 +186,9 @@ VOID WINAPI WOWDirectedYield16( WORD htask16 )
/***********************************************************************
* WOWHandle32 (WOW32.16) (KERNEL32.57)
* K32WOWHandle32 (WOW32.16) (KERNEL32.57)
*/
HANDLE WINAPI WOWHandle32( WORD handle, WOW_HANDLE_TYPE type )
HANDLE WINAPI K32WOWHandle32( WORD handle, WOW_HANDLE_TYPE type )
{
switch ( type )
{
......@@ -216,9 +216,9 @@ HANDLE WINAPI WOWHandle32( WORD handle, WOW_HANDLE_TYPE type )
}
/***********************************************************************
* WOWHandle16 (WOW32.15) (KERNEL32.58)
* K32WOWHandle16 (WOW32.15) (KERNEL32.58)
*/
WORD WINAPI WOWHandle16( HANDLE handle, WOW_HANDLE_TYPE type )
WORD WINAPI K32WOWHandle16( HANDLE handle, WOW_HANDLE_TYPE type )
{
if ( HIWORD(handle ) )
ERR( "handle 0x%08x of type %d has non-zero HIWORD\n", handle, type );
......@@ -249,24 +249,10 @@ WORD WINAPI WOWHandle16( HANDLE handle, WOW_HANDLE_TYPE type )
}
/**********************************************************************
* WOWCallback16 (WOW32.2) (KERNEL32.54)
* K32WOWCallback16Ex (WOW32.3) (KERNEL32.55)
*/
DWORD WINAPI WOWCallback16( DWORD vpfn16, DWORD dwParam )
{
DWORD ret;
if ( !WOWCallback16Ex( vpfn16, WCB16_PASCAL,
sizeof(DWORD), &dwParam, &ret ) )
ret = 0L;
return ret;
}
/**********************************************************************
* WOWCallback16Ex (WOW32.3) (KERNEL32.55)
*/
BOOL WINAPI WOWCallback16Ex( DWORD vpfn16, DWORD dwFlags,
DWORD cbArgs, LPVOID pArgs, LPDWORD pdwRetCode )
BOOL WINAPI K32WOWCallback16Ex( DWORD vpfn16, DWORD dwFlags,
DWORD cbArgs, LPVOID pArgs, LPDWORD pdwRetCode )
{
DWORD ret;
......@@ -293,6 +279,19 @@ BOOL WINAPI WOWCallback16Ex( DWORD vpfn16, DWORD dwFlags,
return TRUE; /* success */
}
/**********************************************************************
* K32WOWCallback16 (WOW32.2) (KERNEL32.54)
*/
DWORD WINAPI K32WOWCallback16( DWORD vpfn16, DWORD dwParam )
{
DWORD ret;
if ( !K32WOWCallback16Ex( vpfn16, WCB16_PASCAL,
sizeof(DWORD), &dwParam, &ret ) )
ret = 0L;
return ret;
}
/*
......@@ -304,7 +303,7 @@ BOOL WINAPI WOWCallback16Ex( DWORD vpfn16, DWORD dwFlags,
*/
DWORD WINAPI GetVDMPointer32W16( SEGPTR vp, UINT16 fMode )
{
return (DWORD)WOWGetVDMPointer( vp, 0, (DWORD)fMode );
return (DWORD)K32WOWGetVDMPointer( vp, 0, (DWORD)fMode );
}
/***********************************************************************
......
......@@ -4,7 +4,7 @@ SRCDIR = @srcdir@
VPATH = @srcdir@
MODULE = lz32
ALTNAMES = lzexpand
IMPORTS = ntdll
EXTRALIBS = -lwine_unicode
LDDLLFLAGS = @LDDLLFLAGS@
SYMBOLFILE = $(MODULE).tmp.o
......
......@@ -15,8 +15,7 @@
#include "winbase.h"
#include "wine/winbase16.h"
#include "wine/winestring.h"
#include "file.h"
#include "heap.h"
#include "wine/unicode.h"
#include "lzexpand.h"
#include "debugtools.h"
......@@ -152,7 +151,7 @@ INT WINAPI LZStart(void)
*/
HFILE16 WINAPI LZInit16( HFILE16 hfSrc )
{
HFILE ret = LZInit( FILE_GetHandle(hfSrc) );
HFILE ret = LZInit( DosFileHandleToWin32Handle(hfSrc) );
if (IS_LZ_HANDLE(ret)) return ret;
if ((INT)ret <= 0) return ret;
return hfSrc;
......@@ -313,16 +312,16 @@ INT WINAPI GetExpandedNameA( LPCSTR in, LPSTR out )
*/
INT WINAPI GetExpandedNameW( LPCWSTR in, LPWSTR out )
{
char *xin,*xout;
INT ret;
xout = HeapAlloc( GetProcessHeap(), 0, lstrlenW(in)+3 );
xin = HEAP_strdupWtoA( GetProcessHeap(), 0, in );
ret = GetExpandedName16(xin,xout);
if (ret>0) lstrcpyAtoW(out,xout);
HeapFree( GetProcessHeap(), 0, xin );
HeapFree( GetProcessHeap(), 0, xout );
return ret;
INT ret;
DWORD len = WideCharToMultiByte( CP_ACP, 0, in, -1, NULL, 0, NULL, NULL );
char *xin = HeapAlloc( GetProcessHeap(), 0, len );
char *xout = HeapAlloc( GetProcessHeap(), 0, len+3 );
WideCharToMultiByte( CP_ACP, 0, in, -1, xin, len, NULL, NULL );
if ((ret = GetExpandedNameA( xin, xout )) > 0)
MultiByteToWideChar( CP_ACP, 0, xout, -1, out, strlenW(in)+4 );
HeapFree( GetProcessHeap(), 0, xin );
HeapFree( GetProcessHeap(), 0, xout );
return ret;
}
......@@ -332,7 +331,7 @@ INT WINAPI GetExpandedNameW( LPCWSTR in, LPWSTR out )
INT16 WINAPI LZRead16( HFILE16 fd, LPVOID buf, UINT16 toread )
{
if (IS_LZ_HANDLE(fd)) return LZRead( fd, buf, toread );
return _lread( FILE_GetHandle(fd), buf, toread );
return _lread( DosFileHandleToWin32Handle(fd), buf, toread );
}
......@@ -433,7 +432,7 @@ INT WINAPI LZRead( HFILE fd, LPVOID vbuf, UINT toread )
LONG WINAPI LZSeek16( HFILE16 fd, LONG off, INT16 type )
{
if (IS_LZ_HANDLE(fd)) return LZSeek( fd, off, type );
return _llseek( FILE_GetHandle(fd), off, type );
return _llseek( DosFileHandleToWin32Handle(fd), off, type );
}
......@@ -476,19 +475,19 @@ LONG WINAPI LZSeek( HFILE fd, LONG off, INT type )
LONG WINAPI LZCopy16( HFILE16 src, HFILE16 dest )
{
/* already a LZ handle? */
if (IS_LZ_HANDLE(src)) return LZCopy( src, FILE_GetHandle(dest) );
if (IS_LZ_HANDLE(src)) return LZCopy( src, DosFileHandleToWin32Handle(dest) );
/* no, try to open one */
src = LZInit16(src);
if ((INT16)src <= 0) return 0;
if (IS_LZ_HANDLE(src))
{
LONG ret = LZCopy( src, FILE_GetHandle(dest) );
LONG ret = LZCopy( src, DosFileHandleToWin32Handle(dest) );
LZClose( src );
return ret;
}
/* it was not a compressed file */
return LZCopy( FILE_GetHandle(src), FILE_GetHandle(dest) );
return LZCopy( DosFileHandleToWin32Handle(src), DosFileHandleToWin32Handle(dest) );
}
......@@ -576,7 +575,7 @@ HFILE16 WINAPI LZOpenFile16( LPCSTR fn, LPOFSTRUCT ofs, UINT16 mode )
if ((INT)hfret <= 0) return hfret;
if (IS_LZ_HANDLE(hfret)) return hfret;
/* but allocate a dos handle for 'normal' files */
return FILE_AllocDosHandle(hfret);
return Win32HandleToDosFileHandle(hfret);
}
......@@ -613,20 +612,13 @@ HFILE WINAPI LZOpenFileA( LPCSTR fn, LPOFSTRUCT ofs, UINT mode )
*/
HFILE WINAPI LZOpenFileW( LPCWSTR fn, LPOFSTRUCT ofs, UINT mode )
{
LPSTR xfn;
LPWSTR yfn;
HFILE ret;
xfn = HEAP_strdupWtoA( GetProcessHeap(), 0, fn);
ret = LZOpenFile16(xfn,ofs,mode);
HeapFree( GetProcessHeap(), 0, xfn );
if (ret!=HFILE_ERROR) {
/* ofs->szPathName is an array with the OFSTRUCT */
yfn = HEAP_strdupAtoW( GetProcessHeap(), 0, ofs->szPathName );
memcpy(ofs->szPathName,yfn,lstrlenW(yfn)*2+2);
HeapFree( GetProcessHeap(), 0, yfn );
}
return ret;
HFILE ret;
DWORD len = WideCharToMultiByte( CP_ACP, 0, fn, -1, NULL, 0, NULL, NULL );
LPSTR xfn = HeapAlloc( GetProcessHeap(), 0, len );
WideCharToMultiByte( CP_ACP, 0, fn, -1, xfn, len, NULL, NULL );
ret = LZOpenFileA(xfn,ofs,mode);
HeapFree( GetProcessHeap(), 0, xfn );
return ret;
}
......@@ -636,7 +628,7 @@ HFILE WINAPI LZOpenFileW( LPCWSTR fn, LPOFSTRUCT ofs, UINT mode )
void WINAPI LZClose16( HFILE16 fd )
{
if (IS_LZ_HANDLE(fd)) LZClose( fd );
else _lclose16( fd );
else DisposeLZ32Handle( DosFileHandleToWin32Handle(fd) );
}
......
......@@ -582,6 +582,8 @@ HRESULT WINAPI StringFromCLSID16(
LPOLESTR16 *idstr /* [out] a pointer to a to-be-allocated segmented pointer pointing to the resulting string */
) {
extern BOOL WINAPI K32WOWCallback16Ex( DWORD vpfn16, DWORD dwFlags,
DWORD cbArgs, LPVOID pArgs, LPDWORD pdwRetCode );
LPMALLOC16 mllc;
HRESULT ret;
DWORD args[2];
......@@ -595,7 +597,7 @@ HRESULT WINAPI StringFromCLSID16(
/* No need for a Callback entry, we have WOWCallback16Ex which does
* everything we need.
*/
if (!WOWCallback16Ex(
if (!K32WOWCallback16Ex(
(DWORD)((ICOM_VTABLE(IMalloc16)*)PTR_SEG_TO_LIN(
ICOM_VTBL(((LPMALLOC16)PTR_SEG_TO_LIN(mllc))))
)->fnAlloc,
......
......@@ -1033,7 +1033,7 @@ success: /* We get here if the open was successful */
}
else
{
hFileRet = FILE_AllocDosHandle( hFileRet );
hFileRet = Win32HandleToDosFileHandle( hFileRet );
if (hFileRet == HFILE_ERROR16) goto error;
if (mode & OF_EXIST) /* Return the handle, but close it first */
_lclose16( hFileRet );
......@@ -1075,7 +1075,7 @@ HFILE WINAPI OpenFile( LPCSTR name, OFSTRUCT *ofs, UINT mode )
* FILE_InitProcessDosHandles
*
* Allocates the default DOS handles for a process. Called either by
* AllocDosHandle below or by the DOSVM stuff.
* Win32HandleToDosFileHandle below or by the DOSVM stuff.
*/
static void FILE_InitProcessDosHandles( void )
{
......@@ -1087,38 +1087,47 @@ static void FILE_InitProcessDosHandles( void )
}
/***********************************************************************
* FILE_AllocDosHandle
* 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.
*/
HFILE16 FILE_AllocDosHandle( HANDLE handle )
HFILE WINAPI Win32HandleToDosFileHandle( HANDLE handle )
{
int i;
if (!handle || (handle == INVALID_HANDLE_VALUE))
return INVALID_HANDLE_VALUE16;
return HFILE_ERROR;
for (i = 5; i < DOS_TABLE_SIZE; i++)
if (!dos_handles[i])
{
dos_handles[i] = handle;
TRACE("Got %d for h32 %d\n", i, handle );
return i;
return (HFILE)i;
}
CloseHandle( handle );
SetLastError( ERROR_TOO_MANY_OPEN_FILES );
return INVALID_HANDLE_VALUE16;
return HFILE_ERROR;
}
/***********************************************************************
* FILE_GetHandle
* 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 FILE_GetHandle( HFILE16 hfile )
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])
{
......@@ -1130,6 +1139,30 @@ HANDLE FILE_GetHandle( HFILE16 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.
......@@ -1291,7 +1324,7 @@ LONG WINAPI WIN16_hread( HFILE16 hFile, SEGPTR buffer, LONG count )
/* Some programs pass a count larger than the allocated buffer */
maxlen = GetSelectorLimit16( SELECTOROF(buffer) ) - OFFSETOF(buffer) + 1;
if (count > maxlen) count = maxlen;
return _lread(FILE_GetHandle(hFile), PTR_SEG_TO_LIN(buffer), count );
return _lread(DosFileHandleToWin32Handle(hFile), PTR_SEG_TO_LIN(buffer), count );
}
......@@ -1320,7 +1353,7 @@ UINT WINAPI _lread( HFILE handle, LPVOID buffer, UINT count )
*/
UINT16 WINAPI _lread16( HFILE16 hFile, LPVOID buffer, UINT16 count )
{
return (UINT16)_lread(FILE_GetHandle(hFile), buffer, (LONG)count );
return (UINT16)_lread(DosFileHandleToWin32Handle(hFile), buffer, (LONG)count );
}
......@@ -1329,7 +1362,7 @@ UINT16 WINAPI _lread16( HFILE16 hFile, LPVOID buffer, UINT16 count )
*/
HFILE16 WINAPI _lcreat16( LPCSTR path, INT16 attr )
{
return FILE_AllocDosHandle( _lcreat( path, attr ) );
return Win32HandleToDosFileHandle( _lcreat( path, attr ) );
}
......@@ -1397,7 +1430,7 @@ DWORD WINAPI SetFilePointer( HANDLE hFile, LONG distance, LONG *highword,
*/
LONG WINAPI _llseek16( HFILE16 hFile, LONG lOffset, INT16 nOrigin )
{
return SetFilePointer( FILE_GetHandle(hFile), lOffset, NULL, nOrigin );
return SetFilePointer( DosFileHandleToWin32Handle(hFile), lOffset, NULL, nOrigin );
}
......@@ -1415,7 +1448,7 @@ LONG WINAPI _llseek( HFILE hFile, LONG lOffset, INT nOrigin )
*/
HFILE16 WINAPI _lopen16( LPCSTR path, INT16 mode )
{
return FILE_AllocDosHandle( _lopen( path, mode ) );
return Win32HandleToDosFileHandle( _lopen( path, mode ) );
}
......@@ -1437,7 +1470,7 @@ HFILE WINAPI _lopen( LPCSTR path, INT mode )
*/
UINT16 WINAPI _lwrite16( HFILE16 hFile, LPCSTR buffer, UINT16 count )
{
return (UINT16)_hwrite( FILE_GetHandle(hFile), buffer, (LONG)count );
return (UINT16)_hwrite( DosFileHandleToWin32Handle(hFile), buffer, (LONG)count );
}
/***********************************************************************
......@@ -1454,7 +1487,7 @@ UINT WINAPI _lwrite( HFILE hFile, LPCSTR buffer, UINT count )
*/
LONG WINAPI _hread16( HFILE16 hFile, LPVOID buffer, LONG count)
{
return _lread( FILE_GetHandle(hFile), buffer, count );
return _lread( DosFileHandleToWin32Handle(hFile), buffer, count );
}
......@@ -1472,7 +1505,7 @@ LONG WINAPI _hread( HFILE hFile, LPVOID buffer, LONG count)
*/
LONG WINAPI _hwrite16( HFILE16 hFile, LPCSTR buffer, LONG count )
{
return _hwrite( FILE_GetHandle(hFile), buffer, count );
return _hwrite( DosFileHandleToWin32Handle(hFile), buffer, count );
}
......
......@@ -42,8 +42,6 @@ extern HANDLE FILE_CreateFile( LPCSTR filename, DWORD access, DWORD sharing,
DWORD attributes, HANDLE template, BOOL fail_read_only );
extern HFILE FILE_CreateDevice( int client_id, DWORD access,
LPSECURITY_ATTRIBUTES sa );
extern HFILE16 FILE_AllocDosHandle( HANDLE handle );
extern HANDLE FILE_GetHandle( HFILE16 hfile );
/* files/directory.c */
extern int DIR_Init(void);
......
......@@ -1880,12 +1880,15 @@ typedef struct tagSYSLEVEL
INT level;
} SYSLEVEL;
void WINAPI DisposeLZ32Handle(HANDLE);
HANDLE WINAPI DosFileHandleToWin32Handle(HFILE);
VOID WINAPI GetpWin16Lock(SYSLEVEL**);
DWORD WINAPI MapLS(LPVOID);
LPVOID WINAPI MapSL(DWORD);
VOID WINAPI ReleaseThunkLock(DWORD*);
VOID WINAPI RestoreThunkLock(DWORD);
VOID WINAPI UnMapLS(DWORD);
HFILE WINAPI Win32HandleToDosFileHandle(HANDLE);
DWORD WINAPI _ConfirmWin16Lock(void);
DWORD WINAPI _ConfirmSysLevel(SYSLEVEL*);
VOID WINAPI _EnterSysLevel(SYSLEVEL*);
......
......@@ -121,7 +121,7 @@ BOOL NE_LoadSegment( NE_MODULE *pModule, WORD segnum )
pModule->self,hf,segnum );
DuplicateHandle( GetCurrentProcess(), hf, GetCurrentProcess(), &hFile32,
0, FALSE, DUPLICATE_SAME_ACCESS );
hFile16 = FILE_AllocDosHandle( hFile32 );
hFile16 = Win32HandleToDosFileHandle( hFile32 );
pSeg->hSeg = NE_CallTo16_word_www( selfloadheader->LoadAppSeg,
pModule->self, hFile16, segnum );
TRACE_(dll)("Ret CallLoadAppSegProc: hSeg = 0x%04x\n", pSeg->hSeg);
......@@ -417,7 +417,7 @@ BOOL NE_LoadAllSegments( NE_MODULE *pModule )
DuplicateHandle( GetCurrentProcess(), NE_OpenFile(pModule),
GetCurrentProcess(), &hf, 0, FALSE, DUPLICATE_SAME_ACCESS );
hFile16 = FILE_AllocDosHandle( hf );
hFile16 = Win32HandleToDosFileHandle( hf );
TRACE_(dll)("CallBootAppProc(hModule=0x%04x,hf=0x%04x)\n",
pModule->self,hFile16);
NE_CallTo16_word_ww(selfloadheader->BootApp, pModule->self,hFile16);
......
......@@ -267,7 +267,7 @@ static void ioctlGetDeviceInfo( CONTEXT86 *context )
RESET_CFLAG(context);
/* DOS device ? */
if ((dev = DOSFS_GetDeviceByHandle( FILE_GetHandle(BX_reg(context)) )))
if ((dev = DOSFS_GetDeviceByHandle( DosFileHandleToWin32Handle(BX_reg(context)) )))
{
DX_reg(context) = dev->flags;
return;
......@@ -475,7 +475,7 @@ static HFILE16 _lcreat16_uniq( LPCSTR path, INT attr )
{
/* Mask off all flags not explicitly allowed by the doc */
attr &= FILE_ATTRIBUTE_READONLY | FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_SYSTEM;
return FILE_AllocDosHandle( CreateFileA( path, GENERIC_READ | GENERIC_WRITE,
return Win32HandleToDosFileHandle( CreateFileA( path, GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,
CREATE_NEW, attr, -1 ));
}
......@@ -887,7 +887,7 @@ static void fLock( CONTEXT86 * context )
BX_reg(context),
MAKELONG(DX_reg(context),CX_reg(context)),
MAKELONG(DI_reg(context),SI_reg(context))) ;
if (!LockFile(FILE_GetHandle(BX_reg(context)),
if (!LockFile(DosFileHandleToWin32Handle(BX_reg(context)),
MAKELONG(DX_reg(context),CX_reg(context)), 0,
MAKELONG(DI_reg(context),SI_reg(context)), 0)) {
AX_reg(context) = GetLastError();
......@@ -900,7 +900,7 @@ static void fLock( CONTEXT86 * context )
BX_reg(context),
MAKELONG(DX_reg(context),CX_reg(context)),
MAKELONG(DI_reg(context),SI_reg(context))) ;
if (!UnlockFile(FILE_GetHandle(BX_reg(context)),
if (!UnlockFile(DosFileHandleToWin32Handle(BX_reg(context)),
MAKELONG(DX_reg(context),CX_reg(context)), 0,
MAKELONG(DI_reg(context),SI_reg(context)), 0)) {
AX_reg(context) = GetLastError();
......@@ -1628,7 +1628,7 @@ void WINAPI DOS3Call( CONTEXT86 *context )
break;
case 0x02:{
const DOS_DEVICE *dev;
if ((dev = DOSFS_GetDeviceByHandle( FILE_GetHandle(BX_reg(context)) )) &&
if ((dev = DOSFS_GetDeviceByHandle( DosFileHandleToWin32Handle(BX_reg(context)) )) &&
!strcasecmp( dev->name, "SCSIMGR$" ))
{
ASPI_DOS_HandleInt(context);
......@@ -1758,12 +1758,12 @@ void WINAPI DOS3Call( CONTEXT86 *context )
HANDLE handle;
TRACE("DUP - DUPLICATE FILE HANDLE %d\n",BX_reg(context));
if ((bSetDOSExtendedError = !DuplicateHandle( GetCurrentProcess(),
FILE_GetHandle(BX_reg(context)),
DosFileHandleToWin32Handle(BX_reg(context)),
GetCurrentProcess(), &handle,
0, TRUE, DUPLICATE_SAME_ACCESS )))
AX_reg(context) = HFILE_ERROR16;
else
AX_reg(context) = FILE_AllocDosHandle(handle);
AX_reg(context) = Win32HandleToDosFileHandle(handle);
break;
}
......@@ -1930,7 +1930,7 @@ void WINAPI DOS3Call( CONTEXT86 *context )
FILETIME filetime;
TRACE("GET FILE DATE AND TIME for handle %d\n",
BX_reg(context));
if (!GetFileTime( FILE_GetHandle(BX_reg(context)), NULL, NULL, &filetime ))
if (!GetFileTime( DosFileHandleToWin32Handle(BX_reg(context)), NULL, NULL, &filetime ))
bSetDOSExtendedError = TRUE;
else FileTimeToDosDateTime( &filetime, &DX_reg(context),
&CX_reg(context) );
......@@ -1945,7 +1945,7 @@ void WINAPI DOS3Call( CONTEXT86 *context )
DosDateTimeToFileTime( DX_reg(context), CX_reg(context),
&filetime );
bSetDOSExtendedError =
(!SetFileTime( FILE_GetHandle(BX_reg(context)),
(!SetFileTime( DosFileHandleToWin32Handle(BX_reg(context)),
NULL, NULL, &filetime ));
}
break;
......@@ -2119,7 +2119,7 @@ void WINAPI DOS3Call( CONTEXT86 *context )
case 0x68: /* "FFLUSH" - COMMIT FILE */
case 0x6a: /* COMMIT FILE */
TRACE("FFLUSH/COMMIT handle %d\n",BX_reg(context));
bSetDOSExtendedError = (!FlushFileBuffers( FILE_GetHandle(BX_reg(context)) ));
bSetDOSExtendedError = (!FlushFileBuffers( DosFileHandleToWin32Handle(BX_reg(context)) ));
break;
case 0x69: /* DISK SERIAL NUMBER */
......
......@@ -600,9 +600,8 @@ void WINAPI VXD_Win32s( CONTEXT86 *context )
if (!(PROCESS_Current()->flags & PDB32_WIN32S_PROC))
{
HMODULE16 hModule = GetModuleHandle16("win32s16");
SEGPTR func1 = (SEGPTR)WIN32_GetProcAddress16(hModule, "SetFS");
SEGPTR func2 = (SEGPTR)WIN32_GetProcAddress16(hModule,
"StackLinearToSegmented");
SEGPTR func1 = (SEGPTR)GetProcAddress16(hModule, "SetFS");
SEGPTR func2 = (SEGPTR)GetProcAddress16(hModule, "StackLinearToSegmented");
if ( hModule && func1 && func2
&& SELECTOROF(func1) == SELECTOROF(func2))
......@@ -1073,7 +1072,7 @@ void WINAPI VXD_Win32s( CONTEXT86 *context )
LARGE_INTEGER *size = (LARGE_INTEGER *)W32S_APP2WINE(stack[3], W32S_OFFSET);
DWORD protect = stack[4];
DWORD flags2 = stack[5];
HFILE hFile = FILE_GetHandle(stack[6]);
HANDLE hFile = DosFileHandleToWin32Handle(stack[6]);
DWORD psp = stack[7];
HANDLE result = INVALID_HANDLE_VALUE;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment