Release 960913
Wed Sep 11 18:08:30 1996 Albrecht Kleine <kleine@ak.sax.de>
* [windows/event.c]
Minor improvements in setting event time in MSG struct.
* [windows/hook.c]
Removed an useless 'unimplemented hook' message.
* [windows/win.c]
Added a WH_CBT hook call during window creation: good for CTL3D.DLL
Wed Sep 11 11:19:56 1996 Marcus Meissner <msmeissn@cip.informatik.uni-erlangen.de>
* [loader/pe_image.c]
Fixed imports with no name/ordinal list (MFC30.DLL).
Added borland style - ordinal import (wsock32.dll).
* [files/file.c] [win32/file.c] [if1632/kernel.spec]
[if1632/kernel32.spec] [include/windows.h]
Win32 and Win16 code use the same filehandles/HFILEs.
Added SetEndOfFile, MoveFile*, diverse *W functions.
* [loader/pe_image.c]
Fixed argument 2 to DllEntry.
* [misc/comm.c]
Adapt to filehandling changes, win32 code still broken.
* [misc/registry.c]
Use Wine filehandling.
StartupRegistry to add startup-detected registry entries.
* [miscemu/dpmi.c] [miscemu/int21.c]
Some missing interrupt-functions added.
* [if1632/gdi32.spec][if1632/user32.spec]
Some thunks to 16 bit equivalent functions added.
Sat Sep 7 11:36:57 EDT 1996 Matthew Ghio <ghio@netcom.com>
* [misc/winsocket.c]
Rewrote WINSOCK_select() and WSAFDIsSet() to properly convert
Windows fd_set structs.
* [if1632/winsock.spec]
Corrected arguments to select().
diff --git a/ANNOUNCE b/ANNOUNCE
index 4e63740..0712204 100644
--- a/ANNOUNCE
+++ b/ANNOUNCE
@@ -1,13 +1,12 @@
-This is release 960902 of Wine, the MS Windows emulator. This is still a
+This is release 960913 of Wine, the MS Windows emulator. This is still a
developer's only release. There are many bugs and many unimplemented API
features. Most applications still do not work correctly.
Patches should be submitted to "julliard@lrc.epfl.ch". Please don't
forget to include a ChangeLog entry.
-WHAT'S NEW with Wine-960902: (see ChangeLog for details)
- - JOURNALPLAYBACK hook.
- - Multimedia support for FreeBSD.
+WHAT'S NEW with Wine-960913: (see ChangeLog for details)
+ - Better Win32 file handling.
- Lots of bug fixes.
See the README file in the distribution for installation instructions.
@@ -16,10 +15,10 @@
the release is available at the ftp sites. The sources will be available
from the following locations:
- ftp://sunsite.unc.edu/pub/Linux/ALPHA/wine/development/Wine-960902.tar.gz
- ftp://tsx-11.mit.edu/pub/linux/ALPHA/Wine/development/Wine-960902.tar.gz
- ftp://ftp.infomagic.com/pub/mirrors/linux/wine/development/Wine-960902.tar.gz
- ftp://aris.com/pub/linux/ALPHA/Wine/development/Wine-960902.tar.gz
+ ftp://sunsite.unc.edu/pub/Linux/ALPHA/wine/development/Wine-960913.tar.gz
+ ftp://tsx-11.mit.edu/pub/linux/ALPHA/Wine/development/Wine-960913.tar.gz
+ ftp://ftp.infomagic.com/pub/mirrors/linux/wine/development/Wine-960913.tar.gz
+ ftp://aris.com/pub/linux/ALPHA/Wine/development/Wine-960913.tar.gz
It should also be available from any site that mirrors tsx-11 or sunsite.
diff --git a/ChangeLog b/ChangeLog
index d3a1b81..4db62be 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,4 +1,51 @@
----------------------------------------------------------------------
+Wed Sep 11 18:08:30 1996 Albrecht Kleine <kleine@ak.sax.de>
+
+ * [windows/event.c]
+ Minor improvements in setting event time in MSG struct.
+
+ * [windows/hook.c]
+ Removed an useless 'unimplemented hook' message.
+
+ * [windows/win.c]
+ Added a WH_CBT hook call during window creation: good for CTL3D.DLL
+
+Wed Sep 11 11:19:56 1996 Marcus Meissner <msmeissn@cip.informatik.uni-erlangen.de>
+ * [loader/pe_image.c]
+ Fixed imports with no name/ordinal list (MFC30.DLL).
+ Added borland style - ordinal import (wsock32.dll).
+
+ * [files/file.c] [win32/file.c] [if1632/kernel.spec]
+ [if1632/kernel32.spec] [include/windows.h]
+ Win32 and Win16 code use the same filehandles/HFILEs.
+ Added SetEndOfFile, MoveFile*, diverse *W functions.
+
+ * [loader/pe_image.c]
+ Fixed argument 2 to DllEntry.
+
+ * [misc/comm.c]
+ Adapt to filehandling changes, win32 code still broken.
+
+ * [misc/registry.c]
+ Use Wine filehandling.
+ StartupRegistry to add startup-detected registry entries.
+
+ * [miscemu/dpmi.c] [miscemu/int21.c]
+ Some missing interrupt-functions added.
+
+ * [if1632/gdi32.spec][if1632/user32.spec]
+ Some thunks to 16 bit equivalent functions added.
+
+Sat Sep 7 11:36:57 EDT 1996 Matthew Ghio <ghio@netcom.com>
+
+ * [misc/winsocket.c]
+ Rewrote WINSOCK_select() and WSAFDIsSet() to properly convert
+ Windows fd_set structs.
+
+ * [if1632/winsock.spec]
+ Corrected arguments to select().
+
+----------------------------------------------------------------------
Sun Sep 1 19:22:46 1996 Alexandre Julliard <julliard@lrc.epfl.ch>
* [misc/commdlg.c] [if1632/commdlg.spec]
diff --git a/controls/button.c b/controls/button.c
index 99300f2..cfe6490 100644
--- a/controls/button.c
+++ b/controls/button.c
@@ -123,14 +123,14 @@
case WM_LBUTTONDOWN:
SendMessage32A( hWnd, BM_SETSTATE32, TRUE, 0 );
- SetFocus( hWnd );
+ SetFocus32( hWnd );
SetCapture( hWnd );
break;
case WM_LBUTTONUP:
ReleaseCapture();
if (!(infoPtr->state & BUTTON_HIGHLIGHTED)) break;
- SendMessage16( hWnd, BM_SETSTATE16, FALSE, 0 );
+ SendMessage32A( hWnd, BM_SETSTATE32, FALSE, 0 );
GetClientRect16( hWnd, &rect );
if (PtInRect16( &rect, MAKEPOINT16(lParam) ))
{
diff --git a/controls/combo.c b/controls/combo.c
index 80a016b..0904e8b 100644
--- a/controls/combo.c
+++ b/controls/combo.c
@@ -262,7 +262,7 @@
if (lpls != NULL) {
FillRect16(hdc, &rect, hBrush);
ListBoxDrawItem (hwnd, lphl, hdc, lpls, &rect, ODA_DRAWENTIRE, 0);
- if (GetFocus() == hwnd)
+ if (GetFocus32() == hwnd)
ListBoxDrawItem (hwnd,lphl, hdc, lpls, &rect, ODA_FOCUS, ODS_FOCUS);
}
else FillRect16(hdc, &rect, hBrush);
@@ -616,7 +616,7 @@
SetWindowPos(lphc->hWndLBox, 0, rect.left, rect.top+lphc->LBoxTop, 0, 0,
SWP_NOSIZE | SWP_NOACTIVATE |
(wParam ? SWP_SHOWWINDOW : SWP_HIDEWINDOW));
- if (!wParam) SetFocus(hwnd);
+ if (!wParam) SetFocus32(hwnd);
}
return 0;
}
@@ -960,7 +960,7 @@
ListBoxDrawItem (combohwnd, lphl, hdc, lpls, &lpls->itemRect, ODA_DRAWENTIRE,
lpls->itemState);
}
- if ((lphl->ItemFocused == i) && GetFocus() == hwnd)
+ if ((lphl->ItemFocused == i) && GetFocus32() == hwnd)
ListBoxDrawItem (combohwnd, lphl, hdc, lpls, &lpls->itemRect, ODA_FOCUS, ODS_FOCUS);
top += height;
@@ -1007,7 +1007,7 @@
int y;
RECT16 rectsel;
-/* SetFocus(hwnd); */
+/* SetFocus32(hwnd); */
SetCapture(hwnd);
lphl->PrevFocused = lphl->ItemFocused;
diff --git a/controls/edit.c b/controls/edit.c
index ec29002..939e100 100644
--- a/controls/edit.c
+++ b/controls/edit.c
@@ -1270,7 +1270,7 @@
s = MIN(li + ll, MAX(li, s));
e = MIN(li + ll, MAX(li, e));
if (rev && (s != e) &&
- ((GetFocus() == wndPtr->hwndSelf) ||
+ ((GetFocus32() == wndPtr->hwndSelf) ||
(wndPtr->dwStyle & ES_NOHIDESEL))) {
x += EDIT_PaintText(wndPtr, hdc, x, y, line, 0, s - li, FALSE);
x += EDIT_PaintText(wndPtr, hdc, x, y, line, s - li, e - s, TRUE);
@@ -1852,7 +1852,7 @@
dx = xoff - nxoff;
dy = EDIT_WndYFromLine(wndPtr, fv) - EDIT_WndYFromLine(wndPtr, nfv);
if (dx || dy) {
- if (wndPtr->hwndSelf == GetFocus())
+ if (wndPtr->hwndSelf == GetFocus32())
HideCaret(wndPtr->hwndSelf);
if (EDIT_GetRedraw(wndPtr))
ScrollWindow(wndPtr->hwndSelf, dx, dy, NULL, NULL);
@@ -1864,7 +1864,7 @@
if (IsHScrollBar(wndPtr))
SetScrollPos(wndPtr->hwndSelf, SB_HORZ,
EDIT_WM_HScroll(wndPtr, EM_GETTHUMB, 0L), TRUE);
- if (wndPtr->hwndSelf == GetFocus()) {
+ if (wndPtr->hwndSelf == GetFocus32()) {
GetCaretPos16(&pos);
SetCaretPos(pos.x + dx, pos.y + dy);
ShowCaret(wndPtr->hwndSelf);
@@ -2023,7 +2023,7 @@
}
es->SelStart = ns;
es->SelEnd = ne;
- if (wndPtr->hwndSelf == GetFocus()) {
+ if (wndPtr->hwndSelf == GetFocus32()) {
el = (UINT)EDIT_EM_LineFromChar(wndPtr, ne, 0L);
eli = (UINT)EDIT_EM_LineIndex(wndPtr, el, 0L);
SetCaretPos(EDIT_WndXFromCol(wndPtr, el, ne - eli),
@@ -2603,7 +2603,7 @@
UINT vlc = EDIT_GetVisibleLineCount(wndPtr);
UINT li;
- SetFocus(wndPtr->hwndSelf);
+ SetFocus32(wndPtr->hwndSelf);
SetCapture(wndPtr->hwndSelf);
l = MIN(fv + vlc - 1, MAX(fv, l));
x = MIN(EDIT_GetWndWidth(wndPtr), MAX(0, x));
@@ -2684,7 +2684,7 @@
RECT16 rcLine;
RECT16 rcRgn;
BOOL rev = IsWindowEnabled(wndPtr->hwndSelf) &&
- ((GetFocus() == wndPtr->hwndSelf) ||
+ ((GetFocus32() == wndPtr->hwndSelf) ||
(wndPtr->dwStyle & ES_NOHIDESEL));
hdc = BeginPaint16(wndPtr->hwndSelf, &ps);
@@ -2791,7 +2791,7 @@
EDIT_BuildLineDefs(wndPtr);
if ((BOOL)lParam && EDIT_GetRedraw(wndPtr))
InvalidateRect32( wndPtr->hwndSelf, NULL, TRUE );
- if (wndPtr->hwndSelf == GetFocus()) {
+ if (wndPtr->hwndSelf == GetFocus32()) {
DestroyCaret();
CreateCaret(wndPtr->hwndSelf, 0, 2, EDIT_GetLineHeight(wndPtr));
EDIT_EM_SetSel(wndPtr, 1, sel);
diff --git a/controls/listbox.c b/controls/listbox.c
index 8bf7c36..5a16e4a 100644
--- a/controls/listbox.c
+++ b/controls/listbox.c
@@ -1047,7 +1047,7 @@
int y,n;
RECT16 rectsel;
- SetFocus(hwnd);
+ SetFocus32(hwnd);
SetCapture(hwnd);
lphl->PrevFocused = lphl->ItemFocused;
@@ -1480,7 +1480,7 @@
dprintf_listbox(stddeb,"LBPaint: drawing item: %d %d %d %d %d\n",
rect.left,top,rect.right,top+height,lpls->itemState);
- if (lphl->OwnerDrawn && (lphl->ItemFocused == i) && GetFocus() == hwnd)
+ if (lphl->OwnerDrawn && (lphl->ItemFocused == i) && GetFocus32() == hwnd)
{
ListBoxDrawItem (hwnd, lphl, hdc, lpls, &lpls->itemRect, ODA_FOCUS,
lpls->itemState & ~ODS_FOCUS);
diff --git a/controls/scroll.c b/controls/scroll.c
index d198bbb..8b6fb07 100644
--- a/controls/scroll.c
+++ b/controls/scroll.c
@@ -490,7 +490,7 @@
vertical = SCROLL_GetScrollBarRect( hwnd, nBar, &rect,
&arrowSize, &thumbPos );
- hdc = (nBar == SB_CTL) ? GetDC(hwnd) : GetWindowDC(hwnd);
+ hdc = GetDCEx( hwnd, 0, DCX_CACHE | ((nBar == SB_CTL) ? 0 : DCX_WINDOW) );
if (!hdc) return;
SCROLL_DrawInterior( hwnd, hdc, nBar, &rect, arrowSize, thumbPos,
infoPtr->flags, vertical, FALSE, FALSE );
@@ -556,7 +556,7 @@
if (!infoPtr) return;
if ((trackHitTest == SCROLL_NOWHERE) && (msg != WM_LBUTTONDOWN)) return;
- hdc = (nBar == SB_CTL) ? GetDC(hwnd) : GetWindowDC(hwnd);
+ hdc = GetDCEx( hwnd, 0, DCX_CACHE | ((nBar == SB_CTL) ? 0 : DCX_WINDOW) );
vertical = SCROLL_GetScrollBarRect( hwnd, nBar, &rect,
&arrowSize, &thumbPos );
hwndOwner = (nBar == SB_CTL) ? GetParent32(hwnd) : hwnd;
@@ -571,7 +571,7 @@
trackThumbPos = thumbPos;
prevPt = pt;
SetCapture( hwnd );
- if (nBar == SB_CTL) SetFocus( hwnd );
+ if (nBar == SB_CTL) SetFocus32( hwnd );
break;
case WM_MOUSEMOVE:
@@ -1007,7 +1007,7 @@
infoPtr->flags = flags;
/* Redraw the whole scroll bar */
- hdc = (nBar == SB_CTL) ? GetDC(hwnd) : GetWindowDC(hwnd);
+ hdc = GetDCEx( hwnd, 0, DCX_CACHE | ((nBar == SB_CTL) ? 0 : DCX_WINDOW) );
SCROLL_DrawScrollBar( hwnd, hdc, nBar );
ReleaseDC( hwnd, hdc );
return TRUE;
diff --git a/debugger/Makefile.in b/debugger/Makefile.in
index 640932e..d574c2a 100644
--- a/debugger/Makefile.in
+++ b/debugger/Makefile.in
@@ -1,4 +1,4 @@
-DEFS = -D__WINE__
+DEFS = -D__WINE__ -DNO_TRANSITION_TYPES
TOPSRC = @top_srcdir@
MODULE = debugger
diff --git a/debugger/break.c b/debugger/break.c
index 1e48763..283d6fa 100644
--- a/debugger/break.c
+++ b/debugger/break.c
@@ -21,8 +21,8 @@
DBG_ADDR addr;
BYTE addrlen;
BYTE opcode;
- BOOL enabled;
- BOOL in_use;
+ BOOL16 enabled;
+ BOOL16 in_use;
} BREAKPOINT;
static BREAKPOINT breakpoints[MAX_BREAKPOINTS];
@@ -65,7 +65,7 @@
* Determine if the instruction at CS:EIP is an instruction that
* we need to step over (like a call or a repetitive string move).
*/
-static BOOL DEBUG_IsStepOverInstr( SIGCONTEXT *context )
+static BOOL32 DEBUG_IsStepOverInstr( SIGCONTEXT *context )
{
BYTE *instr = (BYTE *)PTR_SEG_OFF_TO_LIN(CS_reg(context),EIP_reg(context));
diff --git a/debugger/db_disasm.c b/debugger/db_disasm.c
index ab59a97..ea068b7 100644
--- a/debugger/db_disasm.c
+++ b/debugger/db_disasm.c
@@ -69,7 +69,7 @@
/*
* Switch to disassemble 16-bit code.
*/
-static BOOL db_disasm_16 = FALSE;
+static BOOL32 db_disasm_16 = FALSE;
/*
* Size attributes
@@ -1139,7 +1139,7 @@
int i_size;
int i_mode;
int regmodrm = 0;
- BOOL first;
+ BOOL32 first;
int displ;
int prefix;
int imm;
diff --git a/debugger/hash.c b/debugger/hash.c
index 459878d..82609e7 100644
--- a/debugger/hash.c
+++ b/debugger/hash.c
@@ -213,7 +213,7 @@
char buffer[256];
unsigned char *cpnt, *name;
FARPROC16 address;
- BOOL ok;
+ BOOL32 ok;
for (ok = ModuleFirst(&entry); ok; ok = ModuleNext(&entry))
{
diff --git a/debugger/memory.c b/debugger/memory.c
index 62d33060..81ce74d 100644
--- a/debugger/memory.c
+++ b/debugger/memory.c
@@ -19,8 +19,8 @@
BOOL32 DEBUG_IsBadReadPtr( const DBG_ADDR *address, int size )
{
if (address->seg) /* segmented addr */
- return IsBadReadPtr( (SEGPTR)MAKELONG( (WORD)address->off,
- (WORD)address->seg ), size );
+ return IsBadReadPtr16( (SEGPTR)MAKELONG( (WORD)address->off,
+ (WORD)address->seg ), size );
/* FIXME: should check if resulting linear addr is readable */
else /* linear address */
return FALSE; /* FIXME: should do some checks here */
@@ -37,8 +37,8 @@
if (address->seg) /* segmented addr */
/* Note: we use IsBadReadPtr here because we are */
/* always allowed to write to read-only segments */
- return IsBadReadPtr( (SEGPTR)MAKELONG( (WORD)address->off,
- (WORD)address->seg ), size );
+ return IsBadReadPtr16( (SEGPTR)MAKELONG( (WORD)address->off,
+ (WORD)address->seg ), size );
/* FIXME: should check if resulting linear addr is writable */
else /* linear address */
return FALSE; /* FIXME: should do some checks here */
diff --git a/documentation/languages b/documentation/languages
index e51262e..c1391a4 100644
--- a/documentation/languages
+++ b/documentation/languages
@@ -18,8 +18,9 @@
2. Edit ./wine.man (search for -language) to show the new language
abbreviation.
-3. Edit misc/main.c variable "langNames" to contain the new language
- abbreviation. Also edit macro "USAGE" to show the new abbreviation.
+3. Edit misc/main.c variable "Languages" to contain the new language
+ abbreviation and language ID. Also edit macro "USAGE" to show the
+ new abbreviation.
4. Edit include/options.h enum "WINE_LANGUAGE" to have a member called
LANG_XX where XX is the new abbreviation.
diff --git a/files/directory.c b/files/directory.c
index 10fcf64..07049f6 100644
--- a/files/directory.c
+++ b/files/directory.c
@@ -147,7 +147,13 @@
&DIR_SystemDosDir, &DIR_SystemUnixDir ))) return 0;
if (!(DIR_GetPath( "temp", "c:\\windows",
&DIR_TempDosDir, &DIR_TempUnixDir ))) return 0;
-
+ if (-1==access(DIR_TempUnixDir,W_OK)) {
+ if (errno==EACCES)
+ fprintf(stderr,"Warning: The Temporary Directory (as specified in wine.conf) is NOT writeable. Please check your configuration.\n");
+ else
+ fprintf(stderr,"Warning: Access to Temporary Directory failed (%s).\n",strerror(errno));
+ }
+
if (drive == -1)
{
drive = DIR_WindowsDosDir[0] - 'A';
diff --git a/files/file.c b/files/file.c
index d638140..ee4a7e8 100644
--- a/files/file.c
+++ b/files/file.c
@@ -18,6 +18,7 @@
#include <utime.h>
#include "windows.h"
+#include "winerror.h"
#include "directory.h"
#include "dos_fs.h"
#include "drive.h"
@@ -42,6 +43,7 @@
char *unix_name;
WORD filedate;
WORD filetime;
+ DWORD type; /* Type for win32 apps */
} DOS_FILE;
/* Global files array */
@@ -72,6 +74,7 @@
file->count = 1;
file->unix_handle = -1;
file->unix_name = NULL;
+ file->type = FILE_TYPE_DISK;
return file;
}
@@ -217,7 +220,7 @@
*
* Close all open files of a given PDB. Used on task termination.
*/
-void FILE_CloseAllFiles( HANDLE hPDB )
+void FILE_CloseAllFiles( HANDLE16 hPDB )
{
BYTE *files;
WORD count;
@@ -314,7 +317,7 @@
struct stat st;
if (!(file = FILE_Alloc())) return NULL;
- if ((file->unix_handle = open( name, mode )) == -1)
+ if ((file->unix_handle = open( name, mode, 0666 )) == -1)
{
if (Options.allowReadOnly && (mode == O_RDWR))
{
@@ -346,9 +349,11 @@
/***********************************************************************
* FILE_Open
*/
-static DOS_FILE *FILE_Open( LPCSTR path, int mode )
+HFILE FILE_Open( LPCSTR path, INT32 mode )
{
const char *unixName;
+ DOS_FILE *file;
+ HFILE handle;
dprintf_file(stddeb, "FILE_Open: '%s' %04x\n", path, mode );
if ((unixName = DOSFS_IsDevice( path )) != NULL)
@@ -358,11 +363,16 @@
{
dprintf_file(stddeb, "FILE_Open: Non-existing device\n");
DOS_ERROR( ER_FileNotFound, EC_NotFound, SA_Abort, EL_Disk );
- return NULL;
+ return HFILE_ERROR;
}
}
- else if (!(unixName = DOSFS_GetUnixFileName( path, TRUE ))) return NULL;
- return FILE_OpenUnixFile( unixName, mode );
+ else if (!(unixName = DOSFS_GetUnixFileName( path, TRUE )))
+ return HFILE_ERROR;
+
+ if (!(file = FILE_OpenUnixFile( unixName, mode ))) return HFILE_ERROR;
+ if ((handle = FILE_AllocTaskHandle( file )) == HFILE_ERROR)
+ FILE_Close( file );
+ return handle;
}
@@ -434,7 +444,7 @@
*
* Get the date and time of a file.
*/
-int FILE_GetDateTime( HFILE hFile, WORD *pdate, WORD *ptime, BOOL refresh )
+int FILE_GetDateTime( HFILE hFile, WORD *pdate, WORD *ptime, BOOL32 refresh )
{
DOS_FILE *file;
@@ -596,6 +606,8 @@
{
lstrcpyn32A( buffer, DOSFS_GetDosTrueName( buffer, FALSE ), 144 );
dprintf_file( stddeb, "GetTempFileName: returning %s\n", buffer );
+ if (-1==access(DOSFS_GetUnixFileName(buffer,TRUE),W_OK))
+ fprintf(stderr,"Warning: GetTempFileName returns '%s', which doesn't seem to be writeable. Please check your configuration file if this generates a failure.\n",buffer);
return unique;
}
@@ -617,6 +629,8 @@
lstrcpyn32A( buffer, DOSFS_GetDosTrueName( buffer, FALSE ), 144 );
dprintf_file( stddeb, "GetTempFileName: returning %s\n", buffer );
+ if (-1==access(DOSFS_GetUnixFileName(buffer,TRUE),W_OK))
+ fprintf(stderr,"Warning: GetTempFileName returns '%s', which doesn't seem to be writeable. Please check your configuration file if this generates a failure.\n",buffer);
return num;
}
@@ -965,11 +979,46 @@
/***********************************************************************
- * _lread (KERNEL.82)
+ * WIN16_hread
*/
-INT _lread( HFILE hFile, SEGPTR buffer, WORD count )
+LONG WIN16_hread( HFILE hFile, SEGPTR buffer, LONG count )
{
- return (INT)_hread( hFile, buffer, (LONG)count );
+ LONG maxlen;
+
+ dprintf_file( stddeb, "_hread16: %d %08lx %ld\n",
+ hFile, (DWORD)buffer, count );
+
+ /* Some programs pass a count larger than the allocated buffer */
+ maxlen = GetSelectorLimit( SELECTOROF(buffer) ) - OFFSETOF(buffer) + 1;
+ if (count > maxlen) count = maxlen;
+ return FILE_Read( hFile, PTR_SEG_TO_LIN(buffer), count );
+}
+
+
+/***********************************************************************
+ * WIN16_lread
+ */
+UINT16 WIN16_lread( HFILE hFile, SEGPTR buffer, UINT16 count )
+{
+ return (UINT16)WIN16_hread( hFile, buffer, (LONG)count );
+}
+
+
+/***********************************************************************
+ * _lread32 (KERNEL32.596)
+ */
+UINT32 _lread32( HFILE hFile, LPVOID buffer, UINT32 count )
+{
+ return (UINT32)FILE_Read( hFile, buffer, (LONG)count );
+}
+
+
+/***********************************************************************
+ * _lread16 (KERNEL.82)
+ */
+UINT16 _lread16( HFILE hFile, LPVOID buffer, UINT16 count )
+{
+ return (UINT16)FILE_Read( hFile, buffer, (LONG)count );
}
@@ -1010,9 +1059,9 @@
/***********************************************************************
- * _llseek (KERNEL.84)
+ * _llseek (KERNEL.84) (KERNEL32.594)
*/
-LONG _llseek( HFILE hFile, LONG lOffset, INT nOrigin )
+LONG _llseek( HFILE hFile, LONG lOffset, INT32 nOrigin )
{
DOS_FILE *file;
int origin, result;
@@ -1039,9 +1088,7 @@
*/
HFILE _lopen( LPCSTR path, INT32 mode )
{
- DOS_FILE *file;
- int unixMode;
- HFILE handle;
+ INT32 unixMode;
dprintf_file(stddeb, "_lopen('%s',%04x)\n", path, mode );
@@ -1058,38 +1105,33 @@
unixMode = O_RDONLY;
break;
}
- if (!(file = FILE_Open( path, unixMode ))) return HFILE_ERROR;
- if ((handle = FILE_AllocTaskHandle( file )) == HFILE_ERROR)
- FILE_Close( file );
- return handle;
+ return FILE_Open( path, unixMode );
}
/***********************************************************************
- * _lwrite (KERNEL.86)
+ * _lwrite16 (KERNEL.86)
*/
-INT _lwrite( HFILE hFile, LPCSTR buffer, WORD count )
+UINT16 _lwrite16( HFILE hFile, LPCSTR buffer, UINT16 count )
{
- return (INT)_hwrite( hFile, buffer, (LONG)count );
+ return (UINT16)_hwrite( hFile, buffer, (LONG)count );
+}
+
+/***********************************************************************
+ * _lwrite32 (KERNEL.86)
+ */
+UINT32 _lwrite32( HFILE hFile, LPCSTR buffer, UINT32 count )
+{
+ return (UINT32)_hwrite( hFile, buffer, (LONG)count );
}
/***********************************************************************
* _hread (KERNEL.349)
*/
-LONG _hread( HFILE hFile, SEGPTR buffer, LONG count )
+LONG _hread( HFILE hFile, LPVOID buffer, LONG count)
{
-#ifndef WINELIB
- LONG maxlen;
-
- dprintf_file( stddeb, "_hread: %d %08lx %ld\n",
- hFile, (DWORD)buffer, count );
-
- /* Some programs pass a count larger than the allocated buffer */
- maxlen = GetSelectorLimit( SELECTOROF(buffer) ) - OFFSETOF(buffer) + 1;
- if (count > maxlen) count = maxlen;
-#endif
- return FILE_Read( hFile, PTR_SEG_TO_LIN(buffer), count );
+ return FILE_Read( hFile, buffer, count );
}
@@ -1117,9 +1159,9 @@
/***********************************************************************
- * SetHandleCount (KERNEL.199)
+ * SetHandleCount16 (KERNEL.199)
*/
-WORD SetHandleCount( WORD count )
+UINT16 SetHandleCount16( UINT16 count )
{
HANDLE hPDB = GetCurrentPDB();
PDB *pdb = (PDB *)GlobalLock16( hPDB );
@@ -1345,3 +1387,31 @@
free(xpath);
return ret;
}
+
+
+/***********************************************************************
+ * FILE_SetFileType
+ */
+BOOL32 FILE_SetFileType( HFILE hFile, DWORD type )
+{
+ DOS_FILE *file = FILE_GetFile(hFile);
+ if (!file) return FALSE;
+ file->type = type;
+ return TRUE;
+}
+
+
+/***********************************************************************
+ * GetFileType (KERNEL32.222)
+ */
+DWORD GetFileType( HFILE hFile )
+{
+ DOS_FILE *file = FILE_GetFile(hFile);
+
+ if (!file)
+ {
+ SetLastError( ERROR_INVALID_HANDLE );
+ return FILE_TYPE_UNKNOWN; /* FIXME: correct? */
+ }
+ return file->type;
+}
diff --git a/graphics/win16drv/font.c b/graphics/win16drv/font.c
index 72f0c96..6edc8df 100644
--- a/graphics/win16drv/font.c
+++ b/graphics/win16drv/font.c
@@ -4,6 +4,7 @@
* Copyright 1996 John Harvey
*/
+#include <stdio.h>
#include "windows.h"
#include "win16drv.h"
#include "gdi.h"
diff --git a/if1632/gdi32.spec b/if1632/gdi32.spec
index 4e82ed1..d70567e 100644
--- a/if1632/gdi32.spec
+++ b/if1632/gdi32.spec
@@ -39,7 +39,7 @@
0034 stdcall CreateDIBPatternBrush(long long) CreateDIBPatternBrush
0035 stub CreateDIBPatternBrushPt
0036 stub CreateDIBSection
-0037 stub CreateDIBitmap
+0037 stdcall CreateDIBitmap(long ptr long ptr ptr long) CreateDIBitmap
0038 stdcall CreateDiscardableBitmap(long long long) CreateDiscardableBitmap
0039 stdcall CreateEllipticRgn(long long long long) CreateEllipticRgn
0040 stdcall CreateEllipticRgnIndirect(ptr) CreateEllipticRgnIndirect32
@@ -149,7 +149,7 @@
0142 stub GetAspectRatioFilterEx
0143 stdcall GetBitmapBits(long long ptr) GetBitmapBits
0144 stdcall GetBitmapDimensionEx(long ptr) GetBitmapDimensionEx32
-0145 stub GetBkColor
+0145 stdcall GetBkColor(long) GetBkColor
0146 stub GetBkMode
0147 stub GetBoundsRect
0148 stub GetBrushOrgEx
@@ -231,10 +231,10 @@
0224 stub GetTextAlign
0225 stub GetTextCharacterExtra
0226 stub GetTextCharset
-0227 stub GetTextColor
+0227 stdcall GetTextColor(long) GetTextColor
0228 stub GetTextExtentExPointA
0229 stub GetTextExtentExPointW
-0230 stub GetTextExtentPoint32A
+0230 stdcall GetTextExtentPoint32A(long ptr long ptr) GetTextExtentPoint32A
0231 stub GetTextExtentPoint32W
0232 stdcall GetTextExtentPointA(long ptr long ptr) GetTextExtentPoint32A
0233 stdcall GetTextExtentPointW(long ptr long ptr) GetTextExtentPoint32W
@@ -250,7 +250,7 @@
0243 stub GetWindowOrgEx
0244 stub GetWorldTransform
0245 stub IntersectClipRect
-0246 stub InvertRgn
+0246 stdcall InvertRgn(long long) InvertRgn
0247 stdcall LPtoDP(long ptr long) LPtoDP32
0248 stdcall LineDDA(long long long long ptr long) THUNK_LineDDA32
0249 stdcall LineTo(long long long) LineTo
@@ -294,9 +294,9 @@
0287 stub ResetDCA
0288 stub ResetDCW
0289 stub ResizePalette
-0290 stub RestoreDC
+0290 stdcall RestoreDC(long long) RestoreDC
0291 stub RoundRect
-0292 stub SaveDC
+0292 stdcall SaveDC(long) SaveDC
0293 stdcall ScaleViewportExtEx(long long long long long ptr) ScaleViewportExtEx32
0294 stdcall ScaleWindowExtEx(long long long long long ptr) ScaleWindowExtEx32
0295 stub SelectBrushLocal
@@ -339,7 +339,7 @@
0331 stdcall SetROP2(long long) SetROP2
0332 stdcall SetRectRgn(long long long long long) SetRectRgn
0333 stub SetRelAbs
-0334 stub SetStretchBltMode
+0334 stdcall SetStretchBltMode(long long) SetStretchBltMode
0335 stub SetSystemPaletteUse
0336 stub SetTextAlign
0337 stub SetTextCharacterExtra
@@ -363,7 +363,7 @@
0355 stdcall TextOutA(long long long ptr long) TextOut32A
0356 stdcall TextOutW(long long long ptr long) TextOut32W
0357 stub UnloadNetworkFonts
-0358 stub UnrealizeObject
+0358 stdcall UnrealizeObject(long) UnrealizeObject
0359 stub UpdateColors
0360 stub WidenPath
0361 stub pstackConnect
diff --git a/if1632/kernel.spec b/if1632/kernel.spec
index e6f943a..39c0ca1 100644
--- a/if1632/kernel.spec
+++ b/if1632/kernel.spec
@@ -78,11 +78,11 @@
#79 RESERVED3
#80 RESERVED4
81 pascal16 _lclose(word) _lclose
-82 pascal16 _lread(word segptr word) _lread
+82 pascal16 _lread(word segptr word) WIN16_lread
83 pascal16 _lcreat(ptr word) _lcreat
84 pascal _llseek(word long word) _llseek
85 pascal16 _lopen(ptr word) _lopen
-86 pascal16 _lwrite(word ptr word) _lwrite
+86 pascal16 _lwrite(word ptr word) _lwrite16
87 pascal16 RESERVED5(ptr ptr) lstrcmp16
88 pascal lstrcpy(segptr segptr) lstrcpy16
89 pascal lstrcat(segptr segptr) lstrcat16
@@ -196,7 +196,7 @@
196 pascal16 SelectorAccessRights(word word word) SelectorAccessRights
197 pascal16 GlobalFix(word) GlobalFix
198 pascal16 GlobalUnfix(word) GlobalUnfix
-199 pascal16 SetHandleCount(word) SetHandleCount
+199 pascal16 SetHandleCount(word) SetHandleCount16
200 stub ValidateFreeSpaces
201 stub ReplaceInst
202 stub RegisterPtrace
@@ -241,10 +241,10 @@
328 stub _DebugOutput
#329 K329
#332 stub THHOOK
-334 pascal16 IsBadReadPtr(segptr word) IsBadReadPtr
-335 pascal16 IsBadWritePtr(segptr word) IsBadWritePtr
-336 pascal16 IsBadCodePtr(segptr) IsBadCodePtr
-337 pascal16 IsBadStringPtr(segptr word) IsBadStringPtr
+334 pascal16 IsBadReadPtr(segptr word) IsBadReadPtr16
+335 pascal16 IsBadWritePtr(segptr word) IsBadWritePtr16
+336 pascal16 IsBadCodePtr(segptr) IsBadCodePtr16
+337 pascal16 IsBadStringPtr(segptr word) IsBadStringPtr16
338 stub HasGPHandler
339 stub DiagQuery
340 stub DiagOutput
@@ -253,10 +253,10 @@
343 stub RegisterWinOldApHook
344 stub GetWinOldApHooks
345 pascal16 IsSharedSelector(word) IsSharedSelector
-346 pascal16 IsBadHugeReadPtr(segptr long) IsBadHugeReadPtr
-347 pascal16 IsBadHugeWritePtr(segptr long) IsBadHugeWritePtr
+346 pascal16 IsBadHugeReadPtr(segptr long) IsBadHugeReadPtr16
+347 pascal16 IsBadHugeWritePtr(segptr long) IsBadHugeWritePtr16
348 pascal16 hmemcpy(ptr ptr long) hmemcpy
-349 pascal _hread(word segptr long) _hread
+349 pascal _hread(word segptr long) WIN16_hread
350 pascal _hwrite(word ptr long) _hwrite
#351 BUNNY_351
352 pascal lstrcatn(segptr segptr word) lstrcatn16
@@ -292,3 +292,4 @@
517 stub CallProc32W
518 stub CallProcEx32W
627 stub IsBadFlatReadWritePtr
+631 stub FUNC004 # shell hook
diff --git a/if1632/kernel32.spec b/if1632/kernel32.spec
index 3cd982d..18d2279 100644
--- a/if1632/kernel32.spec
+++ b/if1632/kernel32.spec
@@ -47,10 +47,10 @@
0042 stdcall CreateDirectoryW(ptr ptr) CreateDirectory32W
0043 stdcall CreateEventA(ptr long long ptr) CreateEventA
0044 stub CreateEventW
-0045 stdcall CreateFileA(ptr long long ptr long long long) CreateFileA
-0046 stdcall CreateFileMappingA(long ptr long long long ptr) CreateFileMapping
-0047 stub CreateFileMappingW
-0048 stub CreateFileW
+0045 stdcall CreateFileA(ptr long long ptr long long long) CreateFile32A
+0046 stdcall CreateFileMappingA(long ptr long long long ptr) CreateFileMapping32A
+0047 stdcall CreateFileMappingW(long ptr long long long ptr) CreateFileMapping32W
+0048 stdcall CreateFileW(ptr long long ptr long long long) CreateFile32W
0049 stub CreateIoCompletionPort
0050 stub CreateMailslotA
0051 stub CreateMailslotW
@@ -121,15 +121,15 @@
0116 stub FillConsoleOutputCharacterW
0117 stub FindAtomA
0118 stub FindAtomW
-0119 stdcall FindClose(long) FindClose
+0119 stdcall FindClose(long) FindClose32
0120 stub FindCloseChangeNotification
0121 stub FindFirstChangeNotificationA
0122 stub FindFirstChangeNotificationW
0123 stdcall FindFirstFileA(ptr ptr) FindFirstFile32A
-0124 stub FindFirstFileW
+0124 stdcall FindFirstFileW(ptr ptr) FindFirstFile32W
0125 stub FindNextChangeNotification
0126 stdcall FindNextFileA(long ptr) FindNextFile32A
-0127 stub FindNextFileW
+0127 stdcall FindNextFileW(long ptr) FindNextFile32W
0128 stdcall FindResourceA(long ptr ptr) FindResource32A
0129 stdcall FindResourceExA(long ptr ptr long) FindResourceEx32A
0130 stdcall FindResourceExW(long ptr ptr long) FindResourceEx32W
@@ -219,9 +219,9 @@
0214 stub GetEnvironmentVariableW
0215 stub GetExitCodeProcess
0216 stub GetExitCodeThread
-0217 stdcall GetFileAttributesA(ptr) GetFileAttributesA
-0218 stub GetFileAttributesW
-0219 stdcall GetFileInformationByHandle(long ptr) GetFileInformationByHandle
+0217 stdcall GetFileAttributesA(ptr) GetFileAttributes32A
+0218 stdcall GetFileAttributesW(ptr) GetFileAttributes32W
+0219 stdcall GetFileInformationByHandle(long ptr) GetFileInformationByHandle
0220 stub GetFileSize
0221 stub GetFileTime
0222 stdcall GetFileType(long) GetFileType
@@ -388,11 +388,11 @@
0383 stub LockFileEx
0384 stdcall LockResource(long) LockResource32
0385 stub MapViewOfFile
-0386 stdcall MapViewOfFileEx(long long long long long long) MapViewOfFileEx
-0387 stub MoveFileA
+0386 stdcall MapViewOfFileEx(long long long long long long) MapViewOfFileEx
+0387 stdcall MoveFileA(ptr ptr) MoveFile32A
0388 stub MoveFileExA
0389 stub MoveFileExW
-0390 stub MoveFileW
+0390 stdcall MoveFileW(ptr ptr) MoveFile32W
0391 stdcall MulDiv(long long long) MulDiv32
0392 stdcall MultiByteToWideChar(long long ptr long ptr long) MultiByteToWideChar
0393 stub OpenConsoleW
@@ -485,7 +485,7 @@
0480 stub SetCurrentDirectoryW
0481 stub SetDefaultCommConfigA
0482 stub SetDefaultCommConfigW
-0483 stub SetEndOfFile
+0483 stdcall SetEndOfFile(long) SetEndOfFile
0484 stdcall SetEnvironmentVariableA(ptr ptr) SetEnvironmentVariable32A
0485 stdcall SetEnvironmentVariableW(ptr ptr) SetEnvironmentVariable32W
0486 stdcall SetErrorMode(long) SetErrorMode
@@ -493,10 +493,10 @@
0488 stub SetFileApisToANSI
0489 stub SetFileApisToOEM
0490 stdcall SetFileAttributesA(ptr long) SetFileAttributes32A
-0491 stub SetFileAttributesW
+0491 stdcall SetFileAttributesW(ptr long) SetFileAttributes32W
0492 stdcall SetFilePointer(long long ptr long) SetFilePointer
0493 stub SetFileTime
-0494 stdcall SetHandleCount(long) W32_SetHandleCount
+0494 stdcall SetHandleCount(long) SetHandleCount32
0495 stub SetHandleInformation
0496 stub SetLastConsoleEventActive
0497 stdcall SetLastError(long) SetLastError
@@ -580,7 +580,7 @@
0575 stub WriteConsoleOutputCharacterW
0576 stub WriteConsoleOutputW
0577 stub WriteConsoleW
-0578 stdcall WriteFile(long ptr long ptr ptr) WriteFile
+0578 stdcall WriteFile(long ptr long ptr ptr) WriteFile
0579 stub WriteFileEx
0580 stub WritePrivateProfileSectionA
0581 stub WritePrivateProfileSectionW
@@ -592,14 +592,14 @@
0587 stdcall WriteProfileStringA(ptr ptr ptr) WriteProfileString
0588 stub WriteProfileStringW
0589 stub WriteTapemark
-0590 stub _hread
-0591 stub _hwrite
+0590 stdcall _hread(long ptr long) _hread
+0591 stdcall _hwrite(long ptr long) _hwrite
0592 stdcall _lclose(long) _lclose
0593 stdcall _lcreat(ptr long) _lcreat
-0594 stub _llseek
+0594 stdcall _llseek(long long long) _llseek
0595 stdcall _lopen(ptr long) _lopen
-0596 stub _lread
-0597 stub _lwrite
+0596 stdcall _lread(long ptr long) _lread32
+0597 stdcall _lwrite(long ptr long) _lwrite32
0598 stdcall lstrcat(ptr ptr) lstrcat32A
0599 stdcall lstrcatA(ptr ptr) lstrcat32A
0600 stdcall lstrcatW(ptr ptr) lstrcat32W
diff --git a/if1632/thunk.c b/if1632/thunk.c
index 7b926da..48a8022 100644
--- a/if1632/thunk.c
+++ b/if1632/thunk.c
@@ -264,7 +264,7 @@
{
HINSTANCE16 hmm;
- fprintf(stdnimp,"ThunkConnect32(<struct>,%s,%s,%s,%lx,%lx)\n",
+ fprintf(stdnimp,"ThunkConnect32(<struct>,%s,%s,%s,%x,%lx)\n",
thunkfun16,module32,module16,hmod32,dllinitarg1
);
fprintf(stdnimp," magic = %c%c%c%c\n",
diff --git a/if1632/user.spec b/if1632/user.spec
index a74189b..7a05205 100644
--- a/if1632/user.spec
+++ b/if1632/user.spec
@@ -21,8 +21,8 @@
19 pascal16 ReleaseCapture() ReleaseCapture
20 pascal16 SetDoubleClickTime(word) SetDoubleClickTime
21 pascal16 GetDoubleClickTime() GetDoubleClickTime
-22 pascal16 SetFocus(word) SetFocus
-23 pascal16 GetFocus() GetFocus
+22 pascal16 SetFocus(word) SetFocus16
+23 pascal16 GetFocus() GetFocus16
24 pascal16 RemoveProp(word ptr) RemoveProp16
25 pascal16 GetProp(word ptr) GetProp16
26 pascal16 SetProp(word ptr word) SetProp16
diff --git a/if1632/user32.spec b/if1632/user32.spec
index a55b91f..01268cb 100644
--- a/if1632/user32.spec
+++ b/if1632/user32.spec
@@ -132,7 +132,7 @@
0125 stdcall DefWindowProcA(long long long long) DefWindowProc32A
0126 stdcall DefWindowProcW(long long long long) DefWindowProc32W
0127 stub DeferWindowPos
-0128 stub DeleteMenu
+0128 stdcall DeleteMenu(long) DeleteMenu
0129 stub DestroyAcceleratorTable
0130 stdcall DestroyCaret() DestroyCaret
0131 stub DestroyCursor
@@ -243,7 +243,7 @@
0236 stdcall GetDlgItemTextA(long long ptr long) GetDlgItemText32A
0237 stdcall GetDlgItemTextW(long long ptr long) GetDlgItemText32W
0238 stub GetDoubleClickTime
-0239 stdcall GetFocus() GetFocus
+0239 stdcall GetFocus() GetFocus32
0240 stub GetForegroundWindow
0241 stub GetIconInfo
0242 stub GetInputDesktop
@@ -288,9 +288,9 @@
0281 stdcall GetPropW(long ptr) GetProp32W
0282 stub GetQueueStatus
0283 stdcall GetScrollInfo(long long ptr) GetScrollInfo32
-0284 stub GetScrollPos
+0284 stdcall GetScrollPos(long long) GetScrollPos
0285 stub GetScrollRange
-0286 stub GetShellWindow
+0286 return GetShellWindow 0 0
0287 stdcall GetSubMenu(long long) GetSubMenu
0288 stdcall GetSysColor(long) GetSysColor
0289 stdcall GetSysColorBrush(long) GetSysColorBrush
@@ -484,7 +484,7 @@
0477 stdcall SetDlgItemTextA(long long ptr) SetDlgItemText32A
0478 stdcall SetDlgItemTextW(long long ptr) SetDlgItemText32W
0479 stub SetDoubleClickTime
-0480 stdcall SetFocus(long) SetFocus
+0480 stdcall SetFocus(long) SetFocus32
0481 stub SetForegroundWindow
0482 stdcall SetInternalWindowPos(long long ptr ptr) SetInternalWindowPos32
0483 stub SetKeyboardState
@@ -576,7 +576,7 @@
0569 stub UserRegisterWowHandlers
0570 stdcall ValidateRect(long ptr) ValidateRect32
0571 stdcall ValidateRgn(long long) ValidateRgn
-0572 stub VkKeyScanA
+0572 stdcall VkKeyScanA(long) VkKeyScan
0573 stub VkKeyScanExA
0574 stub VkKeyScanExW
0575 stub VkKeyScanW
diff --git a/if1632/winsock.spec b/if1632/winsock.spec
index ee58e55..5048f83 100644
--- a/if1632/winsock.spec
+++ b/if1632/winsock.spec
@@ -23,7 +23,7 @@
15 pascal16 ntohs(word) WINSOCK_ntohs
16 pascal16 recv(word ptr word word) WINSOCK_recv
17 pascal16 recvfrom(word ptr word word ptr ptr) WINSOCK_recvfrom
-18 pascal16 select(word ptr ptr ptr ptr ptr) WINSOCK_select
+18 pascal16 select(word ptr ptr ptr ptr) WINSOCK_select
19 pascal16 send(word ptr word word) WINSOCK_send
20 pascal16 sendto(word ptr word word ptr ptr) WINSOCK_sendto
21 pascal16 setsockopt(word word word ptr word) WINSOCK_setsockopt
diff --git a/include/atom.h b/include/atom.h
index 5988a5b..3c6f057 100644
--- a/include/atom.h
+++ b/include/atom.h
@@ -9,11 +9,11 @@
#include "windows.h"
-extern BOOL ATOM_Init(void);
+extern BOOL32 ATOM_Init(void);
typedef struct
{
- HANDLE next;
+ HANDLE16 next;
WORD refCount;
BYTE length;
BYTE str[1];
@@ -22,7 +22,7 @@
typedef struct
{
WORD size;
- HANDLE entries[1];
+ HANDLE16 entries[1];
} ATOMTABLE;
#endif /* ATOM_H */
diff --git a/include/debug.h b/include/debug.h
index a36689e..9ccba2b 100644
--- a/include/debug.h
+++ b/include/debug.h
@@ -87,6 +87,7 @@
#undef DEBUG_TEXT
#undef DEBUG_TIMER
#undef DEBUG_TOOLHELP
+#undef DEBUG_VER
#undef DEBUG_VXD
#undef DEBUG_WIN
#undef DEBUG_WIN32
@@ -165,6 +166,7 @@
#define DEBUG_TEXT
#define DEBUG_TIMER
#define DEBUG_TOOLHELP
+#define DEBUG_VER
#define DEBUG_VXD
#define DEBUG_WIN
#define DEBUG_WIN32
@@ -529,6 +531,11 @@
#else
0,
#endif
+#ifdef DEBUG_VER
+ 1,
+#else
+ 0,
+#endif
#ifdef DEBUG_VXD
1,
#else
@@ -1480,8 +1487,21 @@
#endif
#ifdef DEBUG_RUNTIME
-#define dprintf_vxd if(!debug_msg_enabled[71]) ; else fprintf
-#define debugging_vxd debug_msg_enabled[71]
+#define dprintf_ver if(!debug_msg_enabled[71]) ; else fprintf
+#define debugging_ver debug_msg_enabled[71]
+#else
+#ifdef DEBUG_VER
+#define dprintf_ver fprintf
+#define debugging_ver 1
+#else
+#define dprintf_ver while(0) fprintf
+#define debugging_ver 0
+#endif
+#endif
+
+#ifdef DEBUG_RUNTIME
+#define dprintf_vxd if(!debug_msg_enabled[72]) ; else fprintf
+#define debugging_vxd debug_msg_enabled[72]
#else
#ifdef DEBUG_VXD
#define dprintf_vxd fprintf
@@ -1493,8 +1513,8 @@
#endif
#ifdef DEBUG_RUNTIME
-#define dprintf_win if(!debug_msg_enabled[72]) ; else fprintf
-#define debugging_win debug_msg_enabled[72]
+#define dprintf_win if(!debug_msg_enabled[73]) ; else fprintf
+#define debugging_win debug_msg_enabled[73]
#else
#ifdef DEBUG_WIN
#define dprintf_win fprintf
@@ -1506,8 +1526,8 @@
#endif
#ifdef DEBUG_RUNTIME
-#define dprintf_win32 if(!debug_msg_enabled[73]) ; else fprintf
-#define debugging_win32 debug_msg_enabled[73]
+#define dprintf_win32 if(!debug_msg_enabled[74]) ; else fprintf
+#define debugging_win32 debug_msg_enabled[74]
#else
#ifdef DEBUG_WIN32
#define dprintf_win32 fprintf
@@ -1519,8 +1539,8 @@
#endif
#ifdef DEBUG_RUNTIME
-#define dprintf_winsock if(!debug_msg_enabled[74]) ; else fprintf
-#define debugging_winsock debug_msg_enabled[74]
+#define dprintf_winsock if(!debug_msg_enabled[75]) ; else fprintf
+#define debugging_winsock debug_msg_enabled[75]
#else
#ifdef DEBUG_WINSOCK
#define dprintf_winsock fprintf
@@ -1606,6 +1626,7 @@
"text",
"timer",
"toolhelp",
+ "ver",
"vxd",
"win",
"win32",
diff --git a/include/file.h b/include/file.h
index f1533d9..cb665c8 100644
--- a/include/file.h
+++ b/include/file.h
@@ -10,18 +10,20 @@
#include "windows.h"
extern void FILE_SetDosError(void);
-extern void FILE_CloseAllFiles( HANDLE hPDB );
+extern void FILE_CloseAllFiles( HANDLE16 hPDB );
extern HFILE FILE_DupUnixHandle( int fd );
extern int FILE_Stat( LPCSTR unixName, BYTE *pattr, DWORD *psize,
WORD *pdate, WORD *ptime );
extern int FILE_GetDateTime( HFILE hFile, WORD *pdate, WORD *ptime,
- BOOL refresh );
+ BOOL32 refresh );
extern int FILE_SetDateTime( HFILE hFile, WORD date, WORD time );
extern int FILE_Fstat( HFILE hFile, BYTE *pattr, DWORD *psize,
WORD *pdate, WORD *ptime );
extern HFILE FILE_Dup( HFILE hFile );
extern HFILE FILE_Dup2( HFILE hFile1, HFILE hFile2 );
+extern HFILE FILE_Open( LPCSTR path, INT32 mode );
extern INT32 FILE_Read( HFILE hFile, LPVOID buffer, UINT32 count );
+extern BOOL32 FILE_SetFileType( HFILE hFile, DWORD type );
extern HFILE _lcreat_uniq( LPCSTR path, INT32 attr );
#endif /* __WINE_FILE_H */
diff --git a/include/handle32.h b/include/handle32.h
index c2b79cb..3ad80e1 100644
--- a/include/handle32.h
+++ b/include/handle32.h
@@ -29,21 +29,9 @@
unsigned long main_thread_id;
} PROCESS_OBJECT;
-/* The FILE object includes things like disk files, pipes, and
- * character devices (com ports, consoles, ...).
- */
-typedef struct {
- KERNEL_OBJECT common;
- int fd; /* UNIX fd */
- int type; /* FILE_TYPE_* */
- unsigned long misc_flags; /* special flags */
- unsigned long access_flags; /* UNIX access flags */
- unsigned long create_flags; /* UNIX creation flags */
-} FILE_OBJECT;
-
typedef struct {
KERNEL_OBJECT common;
- FILE_OBJECT *file_obj;
+ HFILE hfile;
int prot;
unsigned long size;
} FILEMAP_OBJECT;
@@ -115,6 +103,6 @@
/* Prototypes for the Close*Handle functions
*/
-int CloseFileHandle(FILE_OBJECT *hFile);
+int CloseFileHandle(HFILE hFile);
#endif /* __WINE_HANDLE32_H */
diff --git a/include/message.h b/include/message.h
index 0a67fbf..6bb32bc 100644
--- a/include/message.h
+++ b/include/message.h
@@ -13,8 +13,9 @@
extern DWORD MSG_WineStartTicks; /* Ticks at Wine startup */
/* message.c */
-extern BOOL MSG_InternalGetMessage( MSG16 *msg, HWND hwnd, HWND hwndOwner,
- short code, WORD flags, BOOL sendIdle );
+extern BOOL32 MSG_InternalGetMessage( MSG16 *msg, HWND32 hwnd,
+ HWND32 hwndOwner, WPARAM32 code,
+ WORD flags, BOOL32 sendIdle );
/* timer.c */
extern void TIMER_RemoveWindowTimers( HWND32 hwnd );
@@ -26,7 +27,7 @@
HQUEUE16 hQueue, BOOL32 remove );
/* event.c */
-extern BOOL EVENT_WaitXEvent( BOOL sleep );
+extern BOOL32 EVENT_WaitXEvent( BOOL32 sleep );
extern void EVENT_Synchronize(void);
extern void EVENT_ProcessEvent( XEvent *event );
extern void EVENT_RegisterWindow( WND *pWnd );
diff --git a/include/resource.h b/include/resource.h
index e54ea95..2540faf 100644
--- a/include/resource.h
+++ b/include/resource.h
@@ -44,7 +44,7 @@
#endif
extern int NE_AccessResource( HMODULE16 hModule, HRSRC16 hRsrc );
-extern BOOL NE_FreeResource( HMODULE16 hModule, HGLOBAL16 handle );
+extern BOOL32 NE_FreeResource( HMODULE16 hModule, HGLOBAL16 handle );
extern HRSRC16 NE_FindResource(HMODULE16 hModule, SEGPTR typeId, SEGPTR resId);
extern DWORD NE_SizeofResource( HMODULE16 hModule, HRSRC16 hRsrc );
extern SEGPTR NE_LockResource( HMODULE16 hModule, HGLOBAL16 handle );
diff --git a/include/spy.h b/include/spy.h
index ea1b6cc..a221ab8 100644
--- a/include/spy.h
+++ b/include/spy.h
@@ -19,6 +19,7 @@
#define SPY_RESULT_INVALIDHWND16 0x0002
#define SPY_RESULT_INVALIDHWND32 0x0003
+extern const char *SPY_GetMsgName( UINT32 msg );
extern void SPY_EnterMessage( INT32 iFlag, HWND32 hwnd, UINT32 msg,
WPARAM32 wParam, LPARAM lParam );
extern void SPY_ExitMessage( INT32 iFlag, HWND32 hwnd, UINT32 msg,
diff --git a/include/stddebug.h b/include/stddebug.h
index 8139e9c..331575a 100644
--- a/include/stddebug.h
+++ b/include/stddebug.h
@@ -147,6 +147,7 @@
#undef DEBUG_TEXT
#undef DEBUG_TIMER
#undef DEBUG_TOOLHELP
+#undef DEBUG_VER
#undef DEBUG_VXD
#undef DEBUG_WIN
#undef DEBUG_WIN32
@@ -225,6 +226,7 @@
#define DEBUG_TEXT
#define DEBUG_TIMER
#define DEBUG_TOOLHELP
+#define DEBUG_VER
#define DEBUG_VXD
#define DEBUG_WIN
#define DEBUG_WIN32
diff --git a/include/win.h b/include/win.h
index 74bde91..92653ed6 100644
--- a/include/win.h
+++ b/include/win.h
@@ -41,7 +41,7 @@
CLASS *class; /* Window class */
HWINDOWPROC winproc; /* Window procedure */
DWORD dwMagic; /* Magic number (must be WND_MAGIC) */
- HWND16 hwndSelf; /* Handle of this window */
+ HWND32 hwndSelf; /* Handle of this window */
HINSTANCE16 hInstance; /* Window hInstance (from CreateWindow) */
RECT16 rectClient; /* Client area rel. to parent client area */
RECT16 rectWindow; /* Whole window rel. to parent client area */
diff --git a/include/winbase.h b/include/winbase.h
index bb7de5b..411c42b 100644
--- a/include/winbase.h
+++ b/include/winbase.h
@@ -133,37 +133,6 @@
DECL_WINELIB_TYPE_AW(OSVERSIONINFO);
-typedef struct
-{
- DWORD dwFileAttributes;
- FILETIME ftCreationTime;
- FILETIME ftLastAccessTime;
- FILETIME ftLastWriteTime;
- DWORD nFileSizeHigh;
- DWORD nFileSizeLow;
- DWORD dwReserved0;
- DWORD dwReserved1;
- CHAR cFileName[260];
- CHAR cAlternateFileName[14];
-} WIN32_FIND_DATA32A, *LPWIN32_FIND_DATA32A;
-
-typedef struct
-{
- DWORD dwFileAttributes;
- FILETIME ftCreationTime;
- FILETIME ftLastAccessTime;
- FILETIME ftLastWriteTime;
- DWORD nFileSizeHigh;
- DWORD nFileSizeLow;
- DWORD dwReserved0;
- DWORD dwReserved1;
- WCHAR cFileName[260];
- WCHAR cAlternateName[14];
-} WIN32_FIND_DATA32W, *LPWIN32_FIND_DATA32W;
-
-DECL_WINELIB_TYPE_AW(WIN32_FIND_DATA);
-DECL_WINELIB_TYPE_AW(LPWIN32_FIND_DATA);
-
#define VER_PLATFORM_WIN32s 0
#define VER_PLATFORM_WIN32_WINDOWS 1
#define VER_PLATFORM_WIN32_NT 2
diff --git a/include/windows.h b/include/windows.h
index 96798f2..f834039 100644
--- a/include/windows.h
+++ b/include/windows.h
@@ -1523,6 +1523,38 @@
INT32 dwHighDateTime;
} FILETIME;
+/* Find* structures */
+typedef struct
+{
+ DWORD dwFileAttributes;
+ FILETIME ftCreationTime;
+ FILETIME ftLastAccessTime;
+ FILETIME ftLastWriteTime;
+ DWORD nFileSizeHigh;
+ DWORD nFileSizeLow;
+ DWORD dwReserved0;
+ DWORD dwReserved1;
+ CHAR cFileName[260];
+ CHAR cAlternateFileName[14];
+} WIN32_FIND_DATA32A, *LPWIN32_FIND_DATA32A;
+
+typedef struct
+{
+ DWORD dwFileAttributes;
+ FILETIME ftCreationTime;
+ FILETIME ftLastAccessTime;
+ FILETIME ftLastWriteTime;
+ DWORD nFileSizeHigh;
+ DWORD nFileSizeLow;
+ DWORD dwReserved0;
+ DWORD dwReserved1;
+ WCHAR cFileName[260];
+ WCHAR cAlternateFileName[14];
+} WIN32_FIND_DATA32W, *LPWIN32_FIND_DATA32W;
+
+DECL_WINELIB_TYPE_AW(WIN32_FIND_DATA);
+DECL_WINELIB_TYPE_AW(LPWIN32_FIND_DATA);
+
/* comm */
#define CBR_110 0xFF10
@@ -2556,20 +2588,22 @@
#define SIF_ALL (SIF_RANGE | SIF_PAGE | SIF_POS | SIF_TRACKPOS)
/* Listbox styles */
-#define LBS_NOTIFY 0x0001L
-#define LBS_SORT 0x0002L
-#define LBS_NOREDRAW 0x0004L
-#define LBS_MULTIPLESEL 0x0008L
-#define LBS_OWNERDRAWFIXED 0x0010L
-#define LBS_OWNERDRAWVARIABLE 0x0020L
-#define LBS_HASSTRINGS 0x0040L
-#define LBS_USETABSTOPS 0x0080L
-#define LBS_NOINTEGRALHEIGHT 0x0100L
-#define LBS_MULTICOLUMN 0x0200L
-#define LBS_WANTKEYBOARDINPUT 0x0400L
-#define LBS_EXTENDEDSEL 0x0800L
-#define LBS_DISABLENOSCROLL 0x1000L
-#define LBS_STANDARD (LBS_NOTIFY | LBS_SORT | WS_VSCROLL | WS_BORDER)
+#define LBS_NOTIFY 0x0001
+#define LBS_SORT 0x0002
+#define LBS_NOREDRAW 0x0004
+#define LBS_MULTIPLESEL 0x0008
+#define LBS_OWNERDRAWFIXED 0x0010
+#define LBS_OWNERDRAWVARIABLE 0x0020
+#define LBS_HASSTRINGS 0x0040
+#define LBS_USETABSTOPS 0x0080
+#define LBS_NOINTEGRALHEIGHT 0x0100
+#define LBS_MULTICOLUMN 0x0200
+#define LBS_WANTKEYBOARDINPUT 0x0400
+#define LBS_EXTENDEDSEL 0x0800
+#define LBS_DISABLENOSCROLL 0x1000
+#define LBS_NODATA 0x2000
+#define LBS_NOSEL 0x4000
+#define LBS_STANDARD (LBS_NOTIFY | LBS_SORT | WS_VSCROLL | WS_BORDER)
/* Listbox messages */
#define LB_ADDSTRING16 (WM_USER+1)
@@ -2677,12 +2711,22 @@
#define LB_FINDSTRINGEXACT16 (WM_USER+35)
#define LB_FINDSTRINGEXACT32 0x01a2
#define LB_FINDSTRINGEXACT WINELIB_NAME(LB_FINDSTRINGEXACT)
-
+/* Here are 2 undocumented messages used by ComboLBoxes */
+#define LB_SETLOCALE16 WM_NULL /* Not in Win16 */
#define LB_SETLOCALE32 0x01a5
+#define LB_SETLOCALE WINELIB_NAME(LB_SETLOCALE)
+#define LB_GETLOCALE16 WM_NULL /* Not in Win16 */
#define LB_GETLOCALE32 0x01a6
+#define LB_GETLOCALE WINELIB_NAME(LB_GETLOCALE)
+#define LB_SETCOUNT16 WM_NULL /* Not in Win16 */
#define LB_SETCOUNT32 0x01a7
+#define LB_SETCOUNT WINELIB_NAME(LB_SETCOUNT)
+#define LB_INITSTORAGE16 WM_NULL /* Not in Win16 */
#define LB_INITSTORAGE32 0x01a8
+#define LB_INITSTORAGE WINELIB_NAME(LB_INITSTORAGE)
+#define LB_ITEMFROMPOINT16 WM_NULL /* Not in Win16 */
#define LB_ITEMFROMPOINT32 0x01a9
+#define LB_ITEMFROMPOINT WINELIB_NAME(LB_ITEMFROMPOINT)
/* Listbox notification codes */
#define LBN_ERRSPACE (-2)
@@ -3537,10 +3581,19 @@
#define SLE_MINORERROR 0x00000002
#define SLE_WARNING 0x00000003
+/* Argument 1 passed to the DllEntryProc. */
+#define DLL_PROCESS_DETACH 0 /* detach process (unload library) */
+#define DLL_PROCESS_ATTACH 1 /* attach process (load library) */
+#define DLL_THREAD_ATTACH 2 /* attach new thread */
+#define DLL_THREAD_DETACH 3 /* detach thread */
+
+
#pragma pack(4)
/* Declarations for functions that exist only in Win16 */
+WORD AllocCStoDSAlias(WORD);
+WORD AllocDStoCSAlias(WORD);
WORD AllocSelector(WORD);
WORD AllocSelectorArray(WORD);
INT16 Catch(LPCATCHBUF);
@@ -3550,15 +3603,21 @@
VOID FillWindow(HWND16,HWND16,HDC16,HBRUSH16);
INT16 FlushComm(INT16,INT16);
WORD FreeSelector(WORD);
+HANDLE16 GetAtomHandle(ATOM);
DWORD GetBitmapDimension(HBITMAP16);
INT16 GetCommError(INT16,LPCOMSTAT);
UINT16 GetCommEventMask(INT16,UINT16);
+HANDLE16 GetCurrentPDB(void);
HTASK16 GetCurrentTask(void);
HMODULE16 GetExePtr(HANDLE16);
WORD GetExeVersion(void);
BOOL16 GetModuleName(HINSTANCE16,LPSTR,INT16);
+DWORD GetSelectorBase(WORD);
+DWORD GetSelectorLimit(WORD);
HINSTANCE16 GetTaskDS(void);
HQUEUE16 GetTaskQueue(HTASK16);
+DWORD GlobalDOSAlloc(DWORD);
+WORD GlobalDOSFree(WORD);
BOOL16 IsSharedSelector(HANDLE16);
BOOL16 LocalInit(HANDLE16,WORD,WORD);
DWORD OffsetViewportOrg(HDC16,INT16,INT16);
@@ -3568,9 +3627,12 @@
INT16 ReadComm(INT16,LPSTR,INT16);
DWORD ScaleViewportExt(HDC16,INT16,INT16,INT16,INT16);
DWORD ScaleWindowExt(HDC16,INT16,INT16,INT16,INT16);
+WORD SelectorAccessRights(WORD,WORD,WORD);
DWORD SetBitmapDimension(HBITMAP16,INT16,INT16);
DWORD SetBrushOrg(HDC16,INT16,INT16);
UINT16* SetCommEventMask(INT16,UINT16);
+WORD SetSelectorBase(WORD,DWORD);
+WORD SetSelectorLimit(WORD,DWORD);
FARPROC16 SetTaskSignalProc(HTASK16,FARPROC16);
DWORD SetViewportExt(HDC16,INT16,INT16);
DWORD SetViewportOrg(HDC16,INT16,INT16);
@@ -3584,7 +3646,13 @@
/* Declarations for functions that exist only in Win32 */
BOOL32 Beep(DWORD,DWORD);
-BOOL32 ClearCommError(HANDLE32,LPDWORD,LPCOMSTAT);
+BOOL32 ClearCommError(INT32,LPDWORD,LPCOMSTAT);
+HFILE CreateFile32A(LPCSTR,DWORD,DWORD,LPSECURITY_ATTRIBUTES,DWORD,DWORD,HANDLE32);
+HFILE CreateFile32W(LPCWSTR,DWORD,DWORD,LPSECURITY_ATTRIBUTES,DWORD,DWORD,HANDLE32);
+#define CreateFile WINELIB_NAME_AW(CreateFile)
+HANDLE32 CreateFileMapping32A(HANDLE32,LPSECURITY_ATTRIBUTES,DWORD,DWORD,DWORD,LPCSTR);
+HANDLE32 CreateFileMapping32W(HANDLE32,LPSECURITY_ATTRIBUTES,DWORD,DWORD,DWORD,LPCWSTR);
+#define CreateFileMapping WINELIB_NAME_AW(CreateFileMapping)
INT32 EnumPropsEx32A(HWND32,PROPENUMPROCEX32A,LPARAM);
INT32 EnumPropsEx32W(HWND32,PROPENUMPROCEX32W,LPARAM);
#define EnumPropsEx WINELIB_NAME_AW(EnumPropsEx)
@@ -3597,9 +3665,11 @@
LPCSTR GetCommandLine32A();
LPCWSTR GetCommandLine32W();
#define GetCommandLine WINELIB_NAME_AW(GetCommandLine)
-BOOL32 GetCommTimeouts(HANDLE32,LPCOMMTIMEOUTS);
+BOOL32 GetCommTimeouts(INT32,LPCOMMTIMEOUTS);
+DWORD GetFileInformationByHandle(HFILE,BY_HANDLE_FILE_INFORMATION*);
DWORD GetLogicalDrives(void);
HANDLE32 GetProcessHeap(void);
+HFILE GetStdHandle(DWORD);
VOID GlobalMemoryStatus(LPMEMORYSTATUS);
LPVOID HeapAlloc(HANDLE32,DWORD,DWORD);
DWORD HeapCompact(HANDLE32,DWORD);
@@ -3612,7 +3682,12 @@
BOOL32 HeapUnlock(HANDLE32);
BOOL32 HeapValidate(HANDLE32,DWORD,LPVOID);
BOOL32 IsWindowUnicode(HWND32);
+LPVOID MapViewOfFileEx(HANDLE32,DWORD,DWORD,DWORD,DWORD,DWORD);
+BOOL32 MoveFile32A(LPCSTR,LPCSTR);
+BOOL32 MoveFile32W(LPCWSTR,LPCWSTR);
+#define MoveFile WINELIB_NAME_AW(MoveFile)
BOOL32 QueryPerformanceCounter(LPLARGE_INTEGER);
+BOOL32 ReadFile(HFILE,LPVOID,DWORD,LPDWORD,LPOVERLAPPED);
DWORD RegCreateKeyEx32A(HKEY,LPCSTR,DWORD,LPSTR,DWORD,REGSAM,
LPSECURITY_ATTRIBUTES,LPHKEY,LPDWORD);
DWORD RegCreateKeyEx32W(HKEY,LPCWSTR,DWORD,LPWSTR,DWORD,REGSAM,
@@ -3635,12 +3710,16 @@
DWORD SearchPath32A(LPCSTR,LPCSTR,LPCSTR,DWORD,LPSTR,LPSTR*);
DWORD SearchPath32W(LPCWSTR,LPCWSTR,LPCWSTR,DWORD,LPWSTR,LPWSTR*);
#define SearchPath WINELIB_NAME(SearchPath)
-BOOL32 SetCommMask(HANDLE32,DWORD);
-BOOL32 SetCommTimeouts(HANDLE32,LPCOMMTIMEOUTS);
BOOL32 SetBrushOrgEx(HDC32,INT32,INT32,LPPOINT32);
+BOOL32 SetCommMask(INT32,DWORD);
+BOOL32 SetCommTimeouts(INT32,LPCOMMTIMEOUTS);
+BOOL32 SetEndOfFile(HFILE);
+DWORD SetFilePointer(HFILE,LONG,LPLONG,DWORD);
BOOL32 SetTimeZoneInformation(const LPTIME_ZONE_INFORMATION);
LPVOID VirtualAlloc(LPVOID,DWORD,DWORD,DWORD);
BOOL32 VirtualFree(LPVOID,DWORD,DWORD);
+BOOL32 WriteFile(HFILE,LPVOID,DWORD,LPDWORD,LPOVERLAPPED);
+
/* Declarations for functions that are the same in Win16 and Win32 */
@@ -3698,9 +3777,12 @@
WORD SetWindowWord(HWND32,INT32,WORD);
BOOL16 ShowCaret(HWND32);
HWND16 WindowFromDC(HDC32);
+LONG _hread(HFILE,LPVOID,LONG);
HFILE _lclose(HFILE);
HFILE _lcreat(LPCSTR,INT32);
+LONG _llseek(HFILE,LONG,INT32);
HFILE _lopen(LPCSTR,INT32);
+LONG _hwrite(HFILE,LPCSTR,LONG);
/* Declarations for functions that change between Win16 and Win32 */
@@ -3772,7 +3854,7 @@
HWND32 ChildWindowFromPoint32(HWND32,POINT32);
#define ChildWindowFromPoint WINELIB_NAME(ChildWindowFromPoint)
INT16 ClearCommBreak16(INT16);
-BOOL32 ClearCommBreak32(HANDLE32);
+BOOL32 ClearCommBreak32(INT32);
#define ClearCommBreak WINELIB_NAME(ClearCommBreak)
BOOL16 ClientToScreen16(HWND16,LPPOINT16);
BOOL32 ClientToScreen32(HWND32,LPPOINT32);
@@ -3935,7 +4017,7 @@
BOOL32 EqualRect32(const RECT32*,const RECT32*);
#define EqualRect WINELIB_NAME(EqualRect)
LONG EscapeCommFunction16(UINT16,UINT16);
-BOOL32 EscapeCommFunction32(HANDLE32,UINT32);
+BOOL32 EscapeCommFunction32(INT32,UINT32);
#define EscapeCommFunction WINELIB_NAME(EscapeCommFunction)
BOOL16 ExtTextOut16(HDC16,INT16,INT16,UINT16,const RECT16*,LPCSTR,UINT16,const INT16*);
BOOL32 ExtTextOut32A(HDC32,INT32,INT32,UINT32,const RECT32*,LPCSTR,UINT32,const INT32*);
@@ -3944,6 +4026,17 @@
INT16 FillRect16(HDC16,const RECT16*,HBRUSH16);
INT32 FillRect32(HDC32,const RECT32*,HBRUSH32);
#define FillRect WINELIB_NAME(FillRect)
+BOOL16 FindClose16(HANDLE16);
+BOOL32 FindClose32(HANDLE32);
+#define FindClose WINELIB_NAME(FindClose)
+HANDLE16 FindFirstFile16(LPCSTR,LPVOID);
+HANDLE32 FindFirstFile32A(LPCSTR,LPWIN32_FIND_DATA32A);
+HANDLE32 FindFirstFile32W(LPCWSTR,LPWIN32_FIND_DATA32W);
+#define FindFirst WINELIB_NAME_AW(FindFirst)
+BOOL16 FindNextFile16(HANDLE16,LPVOID);
+BOOL32 FindNextFile32A(HANDLE32,LPWIN32_FIND_DATA32A);
+BOOL32 FindNextFile32W(HANDLE32,LPWIN32_FIND_DATA32W);
+#define FindNext WINELIB_NAME_AW(FindNext)
HRSRC16 FindResource16(HINSTANCE16,SEGPTR,SEGPTR);
HRSRC32 FindResource32A(HINSTANCE32,LPCSTR,LPCSTR);
HRSRC32 FindResource32W(HINSTANCE32,LPCWSTR,LPCWSTR);
@@ -4006,7 +4099,7 @@
void GetClipCursor32(LPRECT32);
#define GetClipCursor WINELIB_NAME(GetClipCursor)
INT16 GetCommState16(INT16,LPDCB16);
-BOOL32 GetCommState32(HANDLE32,LPDCB32);
+BOOL32 GetCommState32(INT32,LPDCB32);
#define GetCommState WINELIB_NAME(GetCommState)
UINT16 GetCurrentDirectory16(UINT16,LPSTR);
UINT32 GetCurrentDirectory32A(UINT32,LPSTR);
@@ -4034,6 +4127,10 @@
INT32 GetExpandedName32A(LPCSTR,LPSTR);
INT32 GetExpandedName32W(LPCWSTR,LPWSTR);
#define GetExpandedName WINELIB_NAME_AW(GetExpandedName)
+DWORD GetFileAttributes16(LPCSTR);
+DWORD GetFileAttributes32A(LPCSTR);
+DWORD GetFileAttributes32W(LPCWSTR);
+#define GetFileAttributes WINELIB_NAME_AW(GetFileAttributes)
DWORD GetFileVersionInfoSize16(LPCSTR,LPDWORD);
DWORD GetFileVersionInfoSize32A(LPCSTR,LPDWORD);
DWORD GetFileVersionInfoSize32W(LPCWSTR,LPDWORD);
@@ -4042,6 +4139,9 @@
DWORD GetFileVersionInfo32A(LPCSTR,DWORD,DWORD,LPVOID);
DWORD GetFileVersionInfo32W(LPCWSTR,DWORD,DWORD,LPVOID);
#define GetFileVersionInfo WINELIB_NAME_AW(GetFileVersionInfo)
+HWND16 GetFocus16(void);
+HWND32 GetFocus32(void);
+#define GetFocus WINELIB_NAME(GetFocus)
UINT16 GetInternalWindowPos16(HWND16,LPRECT16,LPPOINT16);
UINT32 GetInternalWindowPos32(HWND32,LPRECT32,LPPOINT32);
#define GetInternalWindowPos WINELIB_NAME(GetInternalWindowPos)
@@ -4186,6 +4286,25 @@
void InvertRect16(HDC16,const RECT16*);
void InvertRect32(HDC32,const RECT32*);
#define InvertRect WINELIB_NAME(InvertRect)
+BOOL16 IsBadCodePtr16(SEGPTR);
+BOOL32 IsBadCodePtr32(FARPROC32);
+#define IsBadCodePtr WINELIB_NAME(IsBadCodePtr)
+BOOL16 IsBadHugeReadPtr16(SEGPTR,DWORD);
+BOOL32 IsBadHugeReadPtr32(LPCVOID,UINT32);
+#define IsBadHugeReadPtr WINELIB_NAME(IsBadHugeReadPtr)
+BOOL16 IsBadHugeWritePtr16(SEGPTR,DWORD);
+BOOL32 IsBadHugeWritePtr32(LPCVOID,UINT32);
+#define IsBadHugeWritePtr WINELIB_NAME(IsBadHugeWritePtr)
+BOOL16 IsBadReadPtr16(SEGPTR,UINT16);
+BOOL32 IsBadReadPtr32(LPCVOID,UINT32);
+#define IsBadReadPtr WINELIB_NAME(IsBadReadPtr)
+BOOL16 IsBadStringPtr16(SEGPTR,UINT16);
+BOOL32 IsBadStringPtr32A(LPCSTR,UINT32);
+BOOL32 IsBadStringPtr32W(LPCWSTR,UINT32);
+#define IsBadStringPtr WINELIB_NAME_AW(IsBadStringPtr)
+BOOL16 IsBadWritePtr16(SEGPTR,UINT16);
+BOOL32 IsBadWritePtr32(LPVOID,UINT32);
+#define IsBadWritePtr WINELIB_NAME(IsBadWritePtr)
BOOL16 IsCharAlpha16(CHAR);
BOOL32 IsCharAlpha32A(CHAR);
BOOL32 IsCharAlpha32W(WCHAR);
@@ -4435,10 +4554,10 @@
LONG SetClassLong32W(HWND32,INT32,LONG);
#define SetClassLong WINELIB_NAME_AW(SetClassLong)
INT16 SetCommBreak16(INT16);
-BOOL32 SetCommBreak32(HANDLE32);
+BOOL32 SetCommBreak32(INT32);
#define SetCommBreak WINELIB_NAME(SetCommBreak)
INT16 SetCommState16(LPDCB16);
-BOOL32 SetCommState32(HANDLE32,LPDCB32);
+BOOL32 SetCommState32(INT32,LPDCB32);
#define SetCommState WINELIB_NAME(SetCommState)
void SetDlgItemInt16(HWND16,INT16,UINT16,BOOL16);
void SetDlgItemInt32(HWND32,INT32,UINT32,BOOL32);
@@ -4450,6 +4569,16 @@
BOOL32 SetEnvironmentVariable32A(LPCSTR,LPCSTR);
BOOL32 SetEnvironmentVariable32W(LPCWSTR,LPCWSTR);
#define SetEnvironmentVariable WINELIB_NAME_AW(SetEnvironmentVariable)
+BOOL16 SetFileAttributes16(LPCSTR,DWORD);
+BOOL32 SetFileAttributes32A(LPCSTR,DWORD);
+BOOL32 SetFileAttributes32W(LPCWSTR,DWORD);
+#define SetFileAttributes WINELIB_NAME_AW(SetFileAttributes)
+HWND16 SetFocus16(HWND16);
+HWND32 SetFocus32(HWND32);
+#define SetFocus WINELIB_NAME(SetFocus)
+UINT16 SetHandleCount16(UINT16);
+UINT32 SetHandleCount32(UINT32);
+#define SetHandleCount WINELIB_NAME(SetHandleCount)
void SetInternalWindowPos16(HWND16,UINT16,LPRECT16,LPPOINT16);
void SetInternalWindowPos32(HWND32,UINT32,LPRECT32,LPPOINT32);
#define SetInternalWindowPos WINELIB_NAME(SetInternalWindowPos)
@@ -4509,7 +4638,7 @@
BOOL32 TrackPopupMenu32(HMENU32,UINT32,INT32,INT32,INT32,HWND32,const RECT32*);
#define TrackPopupMenu WINELIB_NAME(TrackPopupMenu)
INT16 TransmitCommChar16(INT16,CHAR);
-BOOL32 TransmitCommChar32(HANDLE32,CHAR);
+BOOL32 TransmitCommChar32(INT32,CHAR);
#define TransmitCommChar WINELIB_NAME(TransmitCommChar)
BOOL16 UnionRect16(LPRECT16,const RECT16*,const RECT16*);
BOOL32 UnionRect32(LPRECT32,const RECT32*,const RECT32*);
@@ -4587,11 +4716,18 @@
INT32 wvsprintf32A(LPSTR,LPCSTR,LPCVOID);
INT32 wvsprintf32W(LPWSTR,LPCWSTR,LPCVOID);
#define wvsprintf WINELIB_NAME_AW(wvsprintf)
+UINT16 _lread16(HFILE,LPVOID,UINT16);
+UINT32 _lread32(HFILE,LPVOID,UINT32);
+#define _lread WINELIB_NAME(_lread)
+UINT16 _lwrite16(HFILE,LPCSTR,UINT16);
+UINT32 _lwrite32(HFILE,LPCSTR,UINT32);
+#define _lwrite WINELIB_NAME(_lwrite)
/* Extra functions that don't exist in the Windows API */
INT32 LoadMessage32A(HINSTANCE32,UINT32,WORD,LPSTR,INT32);
INT32 LoadMessage32W(HINSTANCE32,UINT32,WORD,LPWSTR,INT32);
+SEGPTR WIN16_GlobalLock16(HGLOBAL16);
INT32 lstrncmp32A(LPCSTR,LPCSTR,INT32);
INT32 lstrncmp32W(LPCWSTR,LPCWSTR,INT32);
INT32 lstrncmpi32A(LPCSTR,LPCSTR,INT32);
@@ -4650,8 +4786,6 @@
ATOM AddAtom(SEGPTR);
INT AddFontResource(LPCSTR);
-WORD AllocCStoDSAlias(WORD);
-WORD AllocDStoCSAlias(WORD);
BOOL AnimatePalette(HPALETTE16,UINT,UINT,LPPALETTEENTRY);
LPSTR AnsiLower(LPSTR);
UINT AnsiLowerBuff(LPSTR,UINT);
@@ -4753,7 +4887,6 @@
HWND GetActiveWindow(void);
DWORD GetAspectRatioFilter(HDC);
int GetAsyncKeyState(int);
-HANDLE GetAtomHandle(ATOM);
WORD GetAtomName(ATOM,LPSTR,short);
COLORREF GetBkColor(HDC);
WORD GetBkMode(HDC);
@@ -4769,7 +4902,6 @@
HANDLE GetCodeHandle(FARPROC16);
void GetCodeInfo(FARPROC16,LPVOID);
HBRUSH GetControlBrush(HWND,HDC,WORD);
-HANDLE GetCurrentPDB(void);
DWORD GetCurrentPosition(HDC);
DWORD GetCurrentTime(void);
HCURSOR16 GetCursor(void);
@@ -4788,7 +4920,6 @@
WORD GetDlgItemInt(HWND,WORD,BOOL*,BOOL);
WORD GetDoubleClickTime(void);
int GetEnvironment(LPSTR,LPSTR,WORD);
-HWND GetFocus(void);
DWORD GetFreeSpace(UINT16);
DWORD GetHeapSpaces(HMODULE16);
BOOL GetInputState(void);
@@ -4839,8 +4970,6 @@
WORD GetRelAbs(HDC);
int GetScrollPos(HWND,int);
void GetScrollRange(HWND,int,LPINT16,LPINT16);
-DWORD GetSelectorBase(WORD);
-DWORD GetSelectorLimit(WORD);
HANDLE GetStockObject(int);
WORD GetStretchBltMode(HDC);
HMENU GetSubMenu(HMENU,short);
@@ -4870,8 +4999,6 @@
DWORD GetWindowOrg(HDC);
int GetWindowTextLength(HWND);
UINT GetWindowsDirectory(LPSTR,UINT);
-DWORD GlobalDOSAlloc(DWORD);
-WORD GlobalDOSFree(WORD);
ATOM GlobalDeleteAtom(ATOM);
void GlobalFix(HGLOBAL16);
void GlobalFreeAll(HGLOBAL16);
@@ -4892,12 +5019,6 @@
int IntersectVisRect(HDC,short,short,short,short);
void InvalidateRgn(HWND32,HRGN32,BOOL32);
BOOL InvertRgn(HDC,HRGN);
-BOOL IsBadCodePtr(SEGPTR);
-BOOL IsBadHugeReadPtr(SEGPTR,DWORD);
-BOOL IsBadHugeWritePtr(SEGPTR,DWORD);
-BOOL IsBadReadPtr(SEGPTR,WORD);
-BOOL IsBadStringPtr(SEGPTR,WORD);
-BOOL IsBadWritePtr(SEGPTR,WORD);
BOOL IsChild(HWND,HWND);
BOOL IsClipboardFormatAvailable(WORD);
BOOL IsDialogMessage(HWND,LPMSG16);
@@ -4972,7 +5093,6 @@
HANDLE SelectObject(HDC,HANDLE);
HPALETTE16 SelectPalette(HDC,HPALETTE16,BOOL);
int SelectVisRgn(HDC,HRGN);
-WORD SelectorAccessRights(WORD,WORD,WORD);
HWND SetActiveWindow(HWND);
WORD SetBkMode(HDC,WORD);
HWND SetCapture(HWND);
@@ -4990,8 +5110,6 @@
void SetDoubleClickTime(WORD);
int SetEnvironment(LPCSTR,LPCSTR,WORD);
UINT SetErrorMode(UINT);
-HWND SetFocus(HWND);
-WORD SetHandleCount(WORD);
WORD SetHookFlags(HDC,WORD);
void SetKeyboardState(BYTE*);
WORD SetMapMode(HDC,WORD);
@@ -5009,8 +5127,6 @@
FARPROC16 SetResourceHandler(HANDLE,LPSTR,FARPROC16);
int SetScrollPos(HWND,int,int,BOOL);
void SetScrollRange(HWND,int,int,int,BOOL);
-WORD SetSelectorBase(WORD,DWORD);
-WORD SetSelectorLimit(WORD,DWORD);
int SetSoundNoise(int,int);
WORD SetStretchBltMode(HDC,WORD);
LONG SetSwapAreaSize(WORD);
@@ -5064,7 +5180,6 @@
LPSTR ValidateFreeSpaces(void);
void ValidateRgn(HWND32,HRGN32);
WORD VkKeyScan(WORD);
-SEGPTR WIN16_GlobalLock16(HGLOBAL16);
SEGPTR WIN16_LockResource(HANDLE);
BOOL WaitEvent(HTASK);
void WaitMessage(void);
@@ -5075,11 +5190,6 @@
BOOL WritePrivateProfileString(LPCSTR,LPCSTR,LPCSTR,LPCSTR);
BOOL WriteProfileString(LPCSTR,LPCSTR,LPCSTR);
void Yield(void);
-LONG _hread(HFILE,SEGPTR,LONG);
-LONG _hwrite(HFILE,LPCSTR,LONG);
-LONG _llseek(HFILE,LONG,INT);
-INT _lread(HFILE,SEGPTR,WORD);
-INT _lwrite(HFILE,LPCSTR,WORD);
#endif /* NO_TRANSITION_TYPES */
diff --git a/include/winpos.h b/include/winpos.h
index fed1e37..2b30dd3 100644
--- a/include/winpos.h
+++ b/include/winpos.h
@@ -21,14 +21,15 @@
WORD suggestedCount;
WORD valid;
WORD wMagic;
- HWND hwndParent;
+ HWND32 hwndParent;
WINDOWPOS16 winPos[1];
} DWP;
-extern void WINPOS_FindIconPos( HWND hwnd );
-extern BOOL WINPOS_SetActiveWindow( HWND hWnd, BOOL fMouse, BOOL fChangeFocus);
-extern BOOL WINPOS_ChangeActiveWindow( HWND hwnd, BOOL mouseMsg );
-extern LONG WINPOS_SendNCCalcSize( HWND hwnd, BOOL calcValidRect,
+extern void WINPOS_FindIconPos( HWND32 hwnd );
+extern BOOL32 WINPOS_SetActiveWindow( HWND32 hWnd, BOOL32 fMouse,
+ BOOL32 fChangeFocus );
+extern BOOL32 WINPOS_ChangeActiveWindow( HWND32 hwnd, BOOL32 mouseMsg );
+extern LONG WINPOS_SendNCCalcSize( HWND32 hwnd, BOOL32 calcValidRect,
RECT16 *newWindowRect, RECT16 *oldWindowRect,
RECT16 *oldClientRect, SEGPTR winpos,
RECT16 *newClientRect );
diff --git a/loader/ne_resource.c b/loader/ne_resource.c
index 99e32b7..e235131 100644
--- a/loader/ne_resource.c
+++ b/loader/ne_resource.c
@@ -318,7 +318,7 @@
/***********************************************************************
* NE_FreeResource
*/
-BOOL NE_FreeResource( HMODULE16 hModule, HGLOBAL16 handle )
+BOOL32 NE_FreeResource( HMODULE16 hModule, HGLOBAL16 handle )
{
NE_TYPEINFO *pTypeInfo;
NE_NAMEINFO *pNameInfo;
diff --git a/loader/pe_image.c b/loader/pe_image.c
index d4b4f13..6514c18 100644
--- a/loader/pe_image.c
+++ b/loader/pe_image.c
@@ -94,11 +94,15 @@
name = (u_char **) (((char *) load_addr) + (int) pe_exports->AddressOfNames);
dprintf_win32(stddeb,"%-32s Ordinal Virt Addr\n", "Function Name");
- for(i=0; i< pe_exports->Number_Of_Functions; i++)
- {
- ename = (char *) (((char *) load_addr) + (int) *name++);
- dprintf_win32(stddeb,"%-32s %4d %8.8lx\n", ename, *ordinal++, *function++);
- }
+ for(i=0; i< pe_exports->Number_Of_Functions; i++) {
+ if (i<pe_exports->Number_Of_Names) {
+ ename = (char *) (((char *) load_addr) + (int) *name++);
+ dprintf_win32(stddeb,"%-32s %4d %8.8lx\n", ename, *ordinal++, *function++);
+ } else {
+ /* ordinals/names no longer valid, but we still got functions */
+ dprintf_win32(stddeb,"%-32s %4s %8.8lx\n","","",*function++);
+ }
+ }
}
FARPROC32 PE_FindExportedFunction(struct pe_data *pe, LPCSTR funcName)
@@ -110,153 +114,151 @@
u_char ** name, *ename;
int i;
- if (!exports) return NULL;
- ordinal = (u_short *) (((char *) load_addr) + (int) exports->Address_Of_Name_Ordinals);
- function = (u_long *) (((char *) load_addr) + (int) exports->AddressOfFunctions);
- name = (u_char **) (((char *) load_addr) + (int) exports->AddressOfNames);
- for(i=0; i<exports->Number_Of_Functions; i++)
- {
- if(HIWORD(funcName))
+ if (!exports)
+ return NULL;
+ ordinal=(u_short*)(((char*)load_addr)+(int)exports->Address_Of_Name_Ordinals);
+ function=(u_long*)(((char*)load_addr)+(int)exports->AddressOfFunctions);
+ name=(u_char **)(((char*)load_addr)+(int)exports->AddressOfNames);
+ if (HIWORD(funcName)) {
+ for(i=0; i<exports->Number_Of_Names; i++)
{
ename = (char *) (((char *) load_addr) + (int) *name);
if(strcmp(ename,funcName)==0)
return (FARPROC32)(load_addr + *function);
- }else{
+ function++;
+ name++;
+ }
+ } else {
+ /* if we got no name directory, we use the ordinal as offset */
+ if (!exports->Number_Of_Names) {
+ i = function[(int)funcName-exports->Base];
+ return (FARPROC32)(load_addr+i);
+ }
+ for(i=0; i<exports->Number_Of_Names; i++) {
if((int)funcName == (int)*ordinal + exports->Base)
return (FARPROC32)(load_addr + *function);
+ function++;
+ ordinal++;
}
- function++;
- ordinal++;
- name++;
}
return NULL;
}
-void fixup_imports(struct pe_data *pe, HMODULE16 hModule)
-{
- struct PE_Import_Directory * pe_imp;
- int fixup_failed=0;
- unsigned int load_addr = pe->load_addr;
- int i;
- NE_MODULE *ne_mod;
- HMODULE16 *mod_ptr;
+void
+fixup_imports (struct pe_data *pe, HMODULE16 hModule)
+{
+ struct PE_Import_Directory *pe_imp;
+ int fixup_failed = 0;
+ unsigned int load_addr = pe->load_addr;
+ int i;
+ NE_MODULE *ne_mod;
+ HMODULE16 *mod_ptr;
- /* OK, now dump the import list */
- dprintf_win32(stddeb, "\nDumping imports list\n");
+ /* OK, now dump the import list */
+ dprintf_win32 (stddeb, "\nDumping imports list\n");
- /* first, count the number of imported non-internal modules */
- pe_imp = pe->pe_import;
- for(i=0;pe_imp->ModuleName;pe_imp++)
- i++;
+ /* first, count the number of imported non-internal modules */
+ pe_imp = pe->pe_import;
+ for (i = 0; pe_imp->ModuleName; pe_imp++)
+ i++;
- /* Now, allocate memory for dlls_to_init */
- ne_mod = GlobalLock16(hModule);
- ne_mod->dlls_to_init = GLOBAL_Alloc(GMEM_ZEROINIT,(i+1) * sizeof(HMODULE16),
- hModule, FALSE, FALSE, FALSE );
- mod_ptr = GlobalLock16(ne_mod->dlls_to_init);
- /* load the modules and put their handles into the list */
- for(i=0,pe_imp = pe->pe_import;pe_imp->ModuleName;pe_imp++)
- {
- char *name = (char*)load_addr+pe_imp->ModuleName;
- mod_ptr[i] = LoadModule(name,(LPVOID)-1);
- if(mod_ptr[i]<=(HMODULE16)32)
- {
- char *p, buffer[256];
+ /* Now, allocate memory for dlls_to_init */
+ ne_mod = GlobalLock16 (hModule);
+ ne_mod->dlls_to_init = GLOBAL_Alloc(GMEM_ZEROINIT, (i+1)*sizeof(HMODULE16),
+ hModule, FALSE, FALSE, FALSE);
+ mod_ptr = GlobalLock16 (ne_mod->dlls_to_init);
+ /* load the modules and put their handles into the list */
+ for (i = 0, pe_imp = pe->pe_import; pe_imp->ModuleName; pe_imp++) {
+ char *name = (char *) load_addr + pe_imp->ModuleName;
+ mod_ptr[i] = LoadModule (name, (LPVOID) - 1);
+ if (mod_ptr[i] <= (HMODULE16) 32) {
+ char *p, buffer[256];
- /* Try with prepending the path of the current module */
- GetModuleFileName( hModule, buffer, sizeof(buffer) );
- if (!(p = strrchr( buffer, '\\' ))) p = buffer;
- strcpy( p + 1, name );
- mod_ptr[i] = LoadModule( buffer, (LPVOID)-1 );
- }
- if(mod_ptr[i]<=(HMODULE16)32)
- {
- fprintf(stderr,"Module %s not found\n",name);
- exit(0);
+ /* Try with prepending the path of the current module */
+ GetModuleFileName (hModule, buffer, sizeof (buffer));
+ if (!(p = strrchr (buffer, '\\')))
+ p = buffer;
+ strcpy (p + 1, name);
+ mod_ptr[i] = LoadModule (buffer, (LPVOID) - 1);
+ }
+ if (mod_ptr[i] <= (HMODULE16) 32) {
+ fprintf (stderr, "Module %s not found\n", name);
+ exit (0);
}
i++;
- }
- pe_imp = pe->pe_import;
- while (pe_imp->ModuleName)
- {
- char * Module;
- struct pe_import_name * pe_name;
- unsigned int * import_list, *thunk_list;
-
- Module = ((char *) load_addr) + pe_imp->ModuleName;
- dprintf_win32(stddeb, "%s\n", Module);
-
- if(pe_imp->Import_List != 0) { /* original microsoft style */
- dprintf_win32(stddeb, "Microsoft style imports used\n");
- import_list = (unsigned int *)
- (((unsigned int) load_addr) + pe_imp->Import_List);
- thunk_list = (unsigned int *)
- (((unsigned int) load_addr) + pe_imp->Thunk_List);
-
-
- while(*import_list)
- {
- pe_name = (struct pe_import_name *) ((int) load_addr + ((unsigned)*import_list & ~0x80000000));
- if((unsigned)*import_list & 0x80000000)
- {
- int ordinal=*import_list & (0x80000000-1);
- dprintf_win32(stddeb,"--- Ordinal %s,%d\n", Module, ordinal);
- *thunk_list = GetProcAddress32(MODULE_FindModule(Module),
- (LPCSTR)ordinal);
- if(!*thunk_list)
- {
- fprintf(stderr,"No implementation for %s.%d, setting to NULL\n",
- Module, ordinal);
- /* fixup_failed=1; */
- }
- }else{ /* import by name */
- dprintf_win32(stddeb, "--- %s %s.%d\n", pe_name->Name, Module, pe_name->Hint);
-#ifndef WINELIB /* FIXME: JBP: Should this happen in libwine.a? */
- *thunk_list = GetProcAddress32(MODULE_FindModule(Module),
- pe_name->Name);
- if(!*thunk_list)
- {
- fprintf(stderr,"No implementation for %s.%d(%s), setting to NULL\n",
- Module, pe_name->Hint, pe_name->Name);
- /* fixup_failed=1; */
- }
-
-#else
- fprintf(stderr,"JBP: Call to RELAY32_GetEntryPoint being ignored.\n");
-#endif
- }
-
- import_list++;
- thunk_list++;
- }
- } else { /* Borland style */
- dprintf_win32(stddeb, "Borland style imports used\n");
- thunk_list = (unsigned int *)
- (((unsigned int) load_addr) + pe_imp->Thunk_List);
- while(*thunk_list) {
- pe_name = (struct pe_import_name *) ((int) load_addr + *thunk_list);
- if((unsigned)pe_name & 0x80000000) {
- fprintf(stderr,"Import by ordinal not supported\n");
- exit(0);
- }
- dprintf_win32(stddeb, "--- %s %s.%d\n", pe_name->Name, Module, pe_name->Hint);
-#ifndef WINELIB /* FIXME: JBP: Should this happen in libwine.a? */
- *thunk_list = GetProcAddress32(MODULE_FindModule(Module),
- pe_name->Name);
-#else
- fprintf(stderr,"JBP: Call to RELAY32_GetEntryPoint being ignored.\n");
-#endif
- if(!*thunk_list) {
- fprintf(stderr,"No implementation for %s.%d, setting to NULL\n",
- Module, pe_name->Hint);
- /* fixup_failed=1; */
- }
- thunk_list++;
- }
}
- pe_imp++;
- }
- if(fixup_failed)exit(1);
+ pe_imp = pe->pe_import;
+ while (pe_imp->ModuleName) {
+ char *Module;
+ struct pe_import_name *pe_name;
+ unsigned int *import_list, *thunk_list;
+
+ Module = ((char *) load_addr) + pe_imp->ModuleName;
+ dprintf_win32 (stddeb, "%s\n", Module);
+
+ if (pe_imp->Import_List != 0) { /* original microsoft style */
+ dprintf_win32 (stddeb, "Microsoft style imports used\n");
+ import_list = (unsigned int *)(((unsigned int)load_addr)+pe_imp->Import_List);
+ thunk_list = (unsigned int *)(((unsigned int)load_addr)+pe_imp->Thunk_List);
+
+ while (*import_list) {
+ pe_name = (struct pe_import_name *) ((int) load_addr + ((unsigned) *import_list & ~0x80000000));
+ if ((unsigned) *import_list & 0x80000000) {
+ int ordinal = *import_list & (0x80000000 - 1);
+ dprintf_win32 (stddeb, "--- Ordinal %s,%d\n", Module, ordinal);
+ *thunk_list = GetProcAddress32(MODULE_FindModule (Module),
+ (LPCSTR) ordinal);
+ if (!*thunk_list) {
+ fprintf(stderr,"No implementation for %s.%d, setting to NULL\n",
+ Module, ordinal);
+ /* fixup_failed=1; */
+ }
+ } else { /* import by name */
+ dprintf_win32 (stddeb, "--- %s %s.%d\n", pe_name->Name, Module, pe_name->Hint);
+ *thunk_list = GetProcAddress32(MODULE_FindModule (Module),
+ pe_name->Name);
+ if (!*thunk_list) {
+ fprintf(stderr, "No implementation for %s.%d(%s), setting to NULL\n",
+ Module, pe_name->Hint, pe_name->Name);
+ /* fixup_failed=1; */
+ }
+ }
+ import_list++;
+ thunk_list++;
+ }
+ } else { /* Borland style */
+ dprintf_win32 (stddeb, "Borland style imports used\n");
+ thunk_list = (unsigned int *)(((unsigned int)load_addr)+pe_imp->Thunk_List);
+ while (*thunk_list) {
+ pe_name=(struct pe_import_name *)((int)load_addr+*thunk_list);
+ if ((unsigned) pe_name & 0x80000000) {
+ /* not sure about this branch, but it seems to work */
+ int ordinal = *thunk_list & ~0x80000000;
+ dprintf_win32(stddeb,"--- Ordinal %s.%d\n",Module,ordinal);
+ *thunk_list = GetProcAddress32(MODULE_FindModule (Module),
+ (LPCSTR) ordinal);
+ if (!*thunk_list) {
+ fprintf(stderr, "No implementation for %s.%d, setting to NULL\n",
+ Module,ordinal);
+ /* fixup_failed=1; */
+ }
+ } else {
+ dprintf_win32(stddeb,"--- %s %s.%d\n",
+ pe_name->Name, Module, pe_name->Hint);
+ *thunk_list = GetProcAddress32(MODULE_FindModule(Module),
+ pe_name->Name);
+ if (!*thunk_list) {
+ fprintf(stderr, "No implementation for %s.%d, setting to NULL\n",
+ Module, pe_name->Hint);
+ /* fixup_failed=1; */
+ }
+ }
+ thunk_list++;
+ }
+ }
+ pe_imp++;
+ }
+ if (fixup_failed) exit(1);
}
static void calc_vma_size(struct pe_data *pe)
@@ -558,6 +560,7 @@
int USER_InitApp(HINSTANCE hInstance);
void PE_InitTEB(int hTEB);
+void PE_InitializeDLLs(HMODULE16 hModule);
void PE_Win32CallToStart( SIGCONTEXT *context )
{
int fs;
@@ -594,7 +597,9 @@
if (!(pModule->flags & NE_FFLAGS_WIN32) || !(pe = pModule->pe_module))
return;
- /* FIXME: What are the correct values for parameters 2 and 3? */
+ /* FIXME: What is the correct value for parameter 3?
+ * (the MSDN library JAN96 says 'reserved for future use')
+ */
/* Is this a library? */
if (pe->pe_header->coff.Characteristics & IMAGE_FILE_DLL)
@@ -602,7 +607,7 @@
printf("InitPEDLL() called!\n");
CallDLLEntryProc32( (FARPROC32)(pe->load_addr +
pe->pe_header->opt_coff.AddressOfEntryPoint),
- hModule, 0, 0 );
+ hModule, DLL_PROCESS_ATTACH, 0 );
}
}
diff --git a/loader/signal.c b/loader/signal.c
index c072334..8474223 100644
--- a/loader/signal.c
+++ b/loader/signal.c
@@ -152,7 +152,7 @@
sigset_t sig_mask;
sigemptyset(&sig_mask);
sig_act.sa_handler = func;
- sig_act.sa_flags = SA_ONSTACK | SA_SIGINFO;
+ sig_act.sa_flags = SA_SIGINFO | SA_ONSTACK | SA_RESTART;
sig_act.sa_mask = sig_mask;
ret = sigaction( sig, &sig_act, NULL );
#endif /* __svr4__ || _SCO_DS */
diff --git a/loader/task.c b/loader/task.c
index 4e62f3c..cd58f36 100644
--- a/loader/task.c
+++ b/loader/task.c
@@ -1181,7 +1181,7 @@
/***********************************************************************
* GetCurrentPDB (KERNEL.37)
*/
-HANDLE GetCurrentPDB(void)
+HANDLE16 GetCurrentPDB(void)
{
TDB *pTask;
diff --git a/memory/Makefile.in b/memory/Makefile.in
index c0e1c98..f1a6348 100644
--- a/memory/Makefile.in
+++ b/memory/Makefile.in
@@ -1,4 +1,4 @@
-DEFS = -D__WINE__
+DEFS = -D__WINE__ -DNO_TRANSITION_TYPES
TOPSRC = @top_srcdir@
MODULE = memory
diff --git a/memory/atom.c b/memory/atom.c
index 986df85..581de04 100644
--- a/memory/atom.c
+++ b/memory/atom.c
@@ -31,7 +31,7 @@
#define MIN_STR_ATOM 0xc000
#define MAX_ATOM_LEN 255
-#define ATOMTOHANDLE(atom) ((HANDLE)(atom) << 2)
+#define ATOMTOHANDLE(atom) ((HANDLE16)(atom) << 2)
#define HANDLETOATOM(handle) ((ATOM)(0xc000 | ((handle) >> 2)))
#define HAS_ATOM_TABLE(sel) \
@@ -53,7 +53,7 @@
/* Allocate the table */
handle = LOCAL_Alloc( selector, LMEM_FIXED,
- sizeof(ATOMTABLE) + (entries-1) * sizeof(HANDLE) );
+ sizeof(ATOMTABLE) + (entries-1) * sizeof(HANDLE16) );
if (!handle) return 0;
table = (ATOMTABLE *)PTR_SEG_OFF_TO_LIN( selector, handle );
table->size = entries;
@@ -71,7 +71,7 @@
*
* Global table initialisation.
*/
-BOOL ATOM_Init(void)
+BOOL32 ATOM_Init(void)
{
return ATOM_InitTable( USER_HeapSel, DEFAULT_ATOMTABLE_SIZE ) != 0;
}
@@ -83,7 +83,7 @@
* Return a pointer to the atom table of a given segment, creating
* it if necessary.
*/
-static ATOMTABLE * ATOM_GetTable( WORD selector, BOOL create )
+static ATOMTABLE * ATOM_GetTable( WORD selector, BOOL32 create )
{
INSTANCEDATA *ptr = (INSTANCEDATA *)PTR_SEG_OFF_TO_LIN( selector, 0 );
if (!ptr->atomtable)
@@ -102,7 +102,7 @@
*
* Make an ATOMENTRY pointer from a handle (obtained from GetAtomHandle()).
*/
-static ATOMENTRY * ATOM_MakePtr( WORD selector, HANDLE handle )
+static ATOMENTRY * ATOM_MakePtr( WORD selector, HANDLE16 handle )
{
return (ATOMENTRY *)PTR_SEG_OFF_TO_LIN( selector, handle );
}
@@ -126,7 +126,7 @@
static ATOM ATOM_AddAtom( WORD selector, LPCSTR str )
{
WORD hash;
- HANDLE entry;
+ HANDLE16 entry;
ATOMENTRY * entryPtr;
ATOMTABLE * table;
int len;
@@ -169,7 +169,7 @@
{
ATOMENTRY * entryPtr;
ATOMTABLE * table;
- HANDLE entry, *prevEntry;
+ HANDLE16 entry, *prevEntry;
WORD hash;
if (atom < MIN_STR_ATOM) return 0; /* Integer atom */
@@ -205,7 +205,7 @@
{
ATOMTABLE * table;
WORD hash;
- HANDLE entry;
+ HANDLE16 entry;
int len;
if (str[0] == '#') return atoi( &str[1] ); /* Check for integer atom */
@@ -233,7 +233,7 @@
{
ATOMTABLE * table;
ATOMENTRY * entryPtr;
- HANDLE entry;
+ HANDLE16 entry;
char * strPtr;
UINT32 len;
char text[8];
@@ -272,7 +272,7 @@
/***********************************************************************
* GetAtomHandle (KERNEL.73)
*/
-HANDLE GetAtomHandle( ATOM atom )
+HANDLE16 GetAtomHandle( ATOM atom )
{
if (atom < MIN_STR_ATOM) return 0;
return ATOMTOHANDLE( atom );
diff --git a/memory/heap.c b/memory/heap.c
index d2f25af..4e3d1ec 100644
--- a/memory/heap.c
+++ b/memory/heap.c
@@ -4,7 +4,6 @@
* Copyright 1996 Alexandre Julliard
*/
-#define NO_TRANSITION_TYPES /* This file is Win32-clean */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
diff --git a/memory/local.c b/memory/local.c
index f207c6a..c04fe2d 100644
--- a/memory/local.c
+++ b/memory/local.c
@@ -111,7 +111,7 @@
INSTANCEDATA *ptr = (INSTANCEDATA *)PTR_SEG_OFF_TO_LIN( ds, 0 );
dprintf_local( stddeb, "Heap at %p, %04x\n", ptr, ptr->heap );
if (!ptr || !ptr->heap) return NULL;
- if (IsBadReadPtr((SEGPTR)MAKELONG( ptr->heap, ds ), sizeof(LOCALHEAPINFO)))
+ if (IsBadReadPtr16( (SEGPTR)MAKELONG(ptr->heap,ds), sizeof(LOCALHEAPINFO)))
return NULL;
pInfo = (LOCALHEAPINFO*)((char*)ptr + ptr->heap);
if (pInfo->magic != LOCAL_HEAP_MAGIC) return NULL;
diff --git a/memory/selector.c b/memory/selector.c
index 98a6ea9..411186a 100644
--- a/memory/selector.c
+++ b/memory/selector.c
@@ -365,9 +365,9 @@
/***********************************************************************
- * IsBadCodePtr (KERNEL.336)
+ * IsBadCodePtr16 (KERNEL.336)
*/
-BOOL IsBadCodePtr( SEGPTR lpfn )
+BOOL16 IsBadCodePtr16( SEGPTR lpfn )
{
WORD sel;
ldt_entry entry;
@@ -383,9 +383,9 @@
/***********************************************************************
- * IsBadStringPtr (KERNEL.337)
+ * IsBadStringPtr16 (KERNEL.337)
*/
-BOOL IsBadStringPtr( SEGPTR ptr, WORD size )
+BOOL16 IsBadStringPtr16( SEGPTR ptr, UINT16 size )
{
WORD sel;
ldt_entry entry;
@@ -402,9 +402,9 @@
/***********************************************************************
- * IsBadHugeReadPtr (KERNEL.346)
+ * IsBadHugeReadPtr16 (KERNEL.346)
*/
-BOOL IsBadHugeReadPtr( SEGPTR ptr, DWORD size )
+BOOL16 IsBadHugeReadPtr16( SEGPTR ptr, DWORD size )
{
WORD sel;
ldt_entry entry;
@@ -420,9 +420,9 @@
/***********************************************************************
- * IsBadHugeWritePtr (KERNEL.347)
+ * IsBadHugeWritePtr16 (KERNEL.347)
*/
-BOOL IsBadHugeWritePtr( SEGPTR ptr, DWORD size )
+BOOL16 IsBadHugeWritePtr16( SEGPTR ptr, DWORD size )
{
WORD sel;
ldt_entry entry;
@@ -437,20 +437,20 @@
}
/***********************************************************************
- * IsBadReadPtr (KERNEL.334)
+ * IsBadReadPtr16 (KERNEL.334)
*/
-BOOL IsBadReadPtr( SEGPTR ptr, WORD size )
+BOOL16 IsBadReadPtr16( SEGPTR ptr, UINT16 size )
{
- return IsBadHugeReadPtr( ptr, size );
+ return IsBadHugeReadPtr16( ptr, size );
}
/***********************************************************************
- * IsBadWritePtr (KERNEL.335)
+ * IsBadWritePtr16 (KERNEL.335)
*/
-BOOL IsBadWritePtr( SEGPTR ptr, WORD size )
+BOOL16 IsBadWritePtr16( SEGPTR ptr, UINT16 size )
{
- return IsBadHugeWritePtr( ptr, size );
+ return IsBadHugeWritePtr16( ptr, size );
}
diff --git a/memory/string.c b/memory/string.c
index 8d49223..c4b9ad5 100644
--- a/memory/string.c
+++ b/memory/string.c
@@ -5,7 +5,6 @@
* Copyright 1996 Alexandre Julliard
*/
-#define NO_TRANSITION_TYPES /* This file is Win32-clean */
#include <ctype.h>
#include <string.h>
#include "windows.h"
diff --git a/misc/comm.c b/misc/comm.c
index b628a2b..8fda4ae 100644
--- a/misc/comm.c
+++ b/misc/comm.c
@@ -2,6 +2,8 @@
* DEC 93 Erik Bos <erik@xs4all.nl>
*
* Copyright 1996 Marcus Meissner
+ * FIXME: use HFILEs instead of unixfds
+ * the win32 functions here get HFILEs already.
*/
#include <stdio.h>
@@ -379,7 +381,7 @@
*/
INT16 OpenComm(LPCSTR device,UINT16 cbInQueue,UINT16 cbOutQueue)
{
- int port, fd;
+ int port,fd;
dprintf_comm(stddeb,
"OpenComm: %s, %d, %d\n", device, cbInQueue, cbOutQueue);
@@ -474,10 +476,8 @@
/*****************************************************************************
* SetCommBreak (KERNEL32.449)
*/
-BOOL32 SetCommBreak32(HANDLE32 hfile)
+BOOL32 SetCommBreak32(INT32 fd)
{
- FILE_OBJECT *fob = (FILE_OBJECT*)hfile;
- int fd = fob->fd;
struct DosDeviceStruct *ptr;
@@ -513,10 +513,8 @@
/*****************************************************************************
* ClearCommBreak (KERNEL32.20)
*/
-BOOL32 ClearCommBreak32(HANDLE32 hfile)
+BOOL32 ClearCommBreak32(INT32 fd)
{
- FILE_OBJECT *fob = (FILE_OBJECT*)hfile;
- int fd = fob->fd;
struct DosDeviceStruct *ptr;
dprintf_comm(stddeb,"ClearCommBreak: fd: %d\n", fd);
@@ -609,10 +607,8 @@
/*****************************************************************************
* EscapeCommFunction (KERNEL32.214)
*/
-BOOL32 EscapeCommFunction32(HANDLE32 hfile,UINT32 nFunction)
+BOOL32 EscapeCommFunction32(INT32 fd,UINT32 nFunction)
{
- FILE_OBJECT *fob = (FILE_OBJECT*)hfile;
- int fd = fob->fd;
struct termios port;
struct DosDeviceStruct *ptr;
@@ -725,11 +721,9 @@
/*****************************************************************************
* ClearCommError (KERNEL32.21)
*/
-BOOL32 ClearCommError(HANDLE32 hfile,LPDWORD errors,LPCOMSTAT lpStat)
+BOOL32 ClearCommError(INT32 fd,LPDWORD errors,LPCOMSTAT lpStat)
{
int temperror;
- FILE_OBJECT *fob=(FILE_OBJECT*)hfile;
- int fd = fob->fd;
dprintf_comm(stddeb,
"ClearCommError: fd %d (current error %d)\n", fd, commerror);
@@ -762,11 +756,8 @@
/*****************************************************************************
* GetCommMask (KERNEL32.156)
*/
-BOOL32 GetCommMask(HANDLE32 hfile,LPDWORD evtmask)
+BOOL32 GetCommMask(INT32 fd,LPDWORD evtmask)
{
- FILE_OBJECT *fob=(FILE_OBJECT*)hfile;
- int fd = fob->fd;
-
dprintf_comm(stddeb,
"GetCommMask: fd %d, mask %p\n", fd, evtmask);
*evtmask = eventmask;
@@ -776,11 +767,8 @@
/*****************************************************************************
* SetCommMask (KERNEL32.451)
*/
-BOOL32 SetCommMask(HANDLE32 hfile,DWORD evtmask)
+BOOL32 SetCommMask(INT32 fd,DWORD evtmask)
{
- FILE_OBJECT *fob=(FILE_OBJECT*)hfile;
- int fd = fob->fd;
-
dprintf_comm(stddeb,
"SetCommMask: fd %d, mask %lx\n", fd, evtmask);
eventmask = evtmask;
@@ -992,10 +980,8 @@
/*****************************************************************************
* SetCommState32 (KERNEL32.452)
*/
-BOOL32 SetCommState32(HANDLE32 hfile,LPDCB32 lpdcb)
+BOOL32 SetCommState32(INT32 fd,LPDCB32 lpdcb)
{
- FILE_OBJECT *fob = (FILE_OBJECT*)hfile;
- int fd = fob->fd;
struct termios port;
struct DosDeviceStruct *ptr;
@@ -1316,10 +1302,8 @@
/*****************************************************************************
* GetCommState (KERNEL32.159)
*/
-BOOL32 GetCommState32(HANDLE32 hfile, LPDCB32 lpdcb)
+BOOL32 GetCommState32(INT32 fd, LPDCB32 lpdcb)
{
- FILE_OBJECT *fob = (FILE_OBJECT*)hfile;
- int fd = fob->fd;
struct termios port;
@@ -1461,10 +1445,8 @@
/*****************************************************************************
* TransmitCommChar (KERNEL32.535)
*/
-BOOL32 TransmitCommChar32(HANDLE32 hfile,CHAR chTransmit)
+BOOL32 TransmitCommChar32(INT32 fd,CHAR chTransmit)
{
- FILE_OBJECT *fob = (FILE_OBJECT*)hfile;
- int fd = fob->fd;
struct DosDeviceStruct *ptr;
dprintf_comm(stddeb,"TransmitCommChar32(%d,'%c')\n",fd,chTransmit);
@@ -1593,9 +1575,9 @@
/*****************************************************************************
* GetCommTimeouts (KERNEL32.160)
*/
-BOOL32 GetCommTimeouts(HANDLE32 hfile,LPCOMMTIMEOUTS lptimeouts) {
+BOOL32 GetCommTimeouts(INT32 fd,LPCOMMTIMEOUTS lptimeouts) {
dprintf_comm(stddeb,"GetCommTimeouts(%lx,%p), empty stub.\n",
- (DWORD)hfile,lptimeouts
+ fd,lptimeouts
);
return TRUE;
}
@@ -1603,9 +1585,9 @@
/*****************************************************************************
* SetCommTimeouts (KERNEL32.453)
*/
-BOOL32 SetCommTimeouts(HANDLE32 hfile,LPCOMMTIMEOUTS lptimeouts) {
+BOOL32 SetCommTimeouts(INT32 fd,LPCOMMTIMEOUTS lptimeouts) {
dprintf_comm(stddeb,"SetCommTimeouts(%lx,%p), empty stub.\n",
- (DWORD)hfile,lptimeouts
+ fd,lptimeouts
);
return TRUE;
}
diff --git a/misc/commdlg.c b/misc/commdlg.c
index 84432c0..e356a82 100644
--- a/misc/commdlg.c
+++ b/misc/commdlg.c
@@ -2006,7 +2006,7 @@
case 0x2cf:
CC_SwitchToFullSize(hDlg,lpp->lpcc->rgbResult,&lpp->fullsize);
InvalidateRect32( hDlg, NULL, TRUE );
- SetFocus(GetDlgItem(hDlg,0x2bf));
+ SetFocus32(GetDlgItem(hDlg,0x2bf));
break;
case 0x2c8: /* add colors ... column by column */
diff --git a/misc/lzexpand.c b/misc/lzexpand.c
index cdf314d..717b586 100644
--- a/misc/lzexpand.c
+++ b/misc/lzexpand.c
@@ -461,7 +461,7 @@
return ret;
}
len += ret;
- wret = _lwrite(dest,buf,ret);
+ wret = _lwrite32(dest,buf,ret);
if (wret!=ret)
return LZERROR_WRITE;
}
diff --git a/misc/registry.c b/misc/registry.c
index 62bc558..ac00c2c 100644
--- a/misc/registry.c
+++ b/misc/registry.c
@@ -224,6 +224,7 @@
/*
* Shell initialisation, allocates keys.
*/
+void SHELL_StartupRegistry();
void
SHELL_Init() {
struct passwd *pwd;
@@ -265,8 +266,69 @@
ADD_ROOT_KEY(key_current_config);
ADD_ROOT_KEY(key_dyn_data);
#undef ADD_ROOT_KEY
+ SHELL_StartupRegistry();
}
+
+void
+SHELL_StartupRegistry() {
+ HKEY hkey,xhkey=0;
+ FILE *F;
+ char buf[200],cpubuf[200];
+
+ RegCreateKey16(HKEY_DYN_DATA,"\\PerfStats\\StatData",&xhkey);
+ RegCloseKey(xhkey);
+ RegCreateKey16(HKEY_LOCAL_MACHINE,"\\HARDWARE\\DESCRIPTION\\System\\CentralProcessor",&hkey);
+#ifdef linux
+ F=fopen("/proc/cpuinfo","r");
+ if (F) {
+ int procnr=-1,x;
+ while (NULL!=fgets(buf,200,F)) {
+ if (sscanf(buf,"processor\t: %d",&x)) {
+ sprintf(buf,"%d",x);
+ if (xhkey)
+ RegCloseKey(xhkey);
+ procnr=x;
+ RegCreateKey16(hkey,buf,&xhkey);
+ }
+ if (sscanf(buf,"cpu\t\t: %s",cpubuf)) {
+ sprintf(buf,"CPU %s",cpubuf);
+ if (xhkey)
+ RegSetValueEx32A(xhkey,"Identifier",0,REG_SZ,buf,strlen(buf));
+ }
+ }
+ fclose(F);
+ }
+ if (xhkey)
+ RegCloseKey(xhkey);
+ RegCloseKey(hkey);
+#else
+ /* FIXME */
+ RegCreateKey16(hkey,"0",&xhkey);
+ RegSetValueEx32A(xhkey,"Identifier",0,REG_SZ,"CPU 386",strlen("CPU 386"));
+#endif
+ RegOpenKey16(HKEY_LOCAL_MACHINE,"\\HARDWARE\\DESCRIPTION\\System",&hkey);
+ RegSetValueEx32A(hkey,"Identifier",0,REG_SZ,"SystemType WINE",strlen("SystemType WINE"));
+ RegCloseKey(hkey);
+ /* \\SOFTWARE\\Microsoft\\Window NT\\CurrentVersion
+ * CurrentVersion
+ * CurrentBuildNumber
+ * CurrentType
+ * string RegisteredOwner
+ * string RegisteredOrganization
+ *
+ */
+ /* System\\CurrentControlSet\\Services\\SNMP\\Parameters\\RFC1156Agent
+ * string SysContact
+ * string SysLocation
+ * SysServices
+ */
+ if (-1!=gethostname(buf,200)) {
+ RegCreateKey16(HKEY_LOCAL_MACHINE,"System\\CurrentControlSet\\Control\\ComputerName\\ComputerName",&xhkey);
+ RegSetValueEx16(xhkey,"ComputerName",0,REG_SZ,buf,strlen(buf)+1);
+ RegCloseKey(xhkey);
+ }
+}
/************************ SAVE Registry Function ****************************/
#define REGISTRY_SAVE_VERSION 0x00000001
@@ -992,6 +1054,8 @@
return NULL;
}
+extern time_t FileTimeToUnixTime(FILETIME*);
+
static void
_w95_loadreg(char* fn,LPKEYSTRUCT lpkey) {
/* Disk Key Entry structure (RGKN part) */
@@ -1028,34 +1092,33 @@
struct _w95nr2da *nr2da;
HFILE hfd;
- int fd,lastmodified;
+ int lastmodified;
char magic[5];
unsigned long nr,pos,i,where,version,rgdbsection,end,off_next_rgdb;
struct _w95key *keys;
int nrofdkes;
unsigned char *data,*curdata,*nextrgdb;
OFSTRUCT ofs;
- struct stat stbuf;
+ BY_HANDLE_FILE_INFORMATION hfdinfo;
dprintf_reg(stddeb,"Loading Win95 registry database '%s'\n",fn);
hfd=OpenFile(fn,&ofs,OF_READ);
if (hfd==HFILE_ERROR)
return;
- fd = FILE_GetUnixHandle(hfd);
magic[4]=0;
- if (4!=read(fd,magic,4))
+ if (4!=FILE_Read(hfd,magic,4))
return;
if (strcmp(magic,"CREG")) {
fprintf(stddeb,"%s is not a w95 registry.\n",fn);
return;
}
- if (4!=read(fd,&version,4))
+ if (4!=FILE_Read(hfd,&version,4))
return;
- if (4!=read(fd,&rgdbsection,4))
+ if (4!=FILE_Read(hfd,&rgdbsection,4))
return;
- if (-1==lseek(fd,0x20,SEEK_SET))
+ if (-1==_llseek(hfd,0x20,SEEK_SET))
return;
- if (4!=read(fd,magic,4))
+ if (4!=FILE_Read(hfd,magic,4))
return;
if (strcmp(magic,"RGKN")) {
dprintf_reg(stddeb,"second IFF header not RGKN, but %s\n",magic);
@@ -1063,14 +1126,14 @@
}
/* STEP 1: Keylink structures */
- if (-1==lseek(fd,0x40,SEEK_SET))
+ if (-1==_llseek(hfd,0x40,SEEK_SET))
return;
where = 0x40;
end = rgdbsection;
nrofdkes = (end-where)/sizeof(struct dke)+100;
data = (char*)xmalloc(end-where);
- if ((end-where)!=read(fd,data,end-where))
+ if ((end-where)!=FILE_Read(hfd,data,end-where))
return;
curdata = data;
@@ -1144,15 +1207,15 @@
qsort(nr2da,nrofdkes,sizeof(nr2da[0]),_w95dkecomp);
/* STEP 2: keydata & values */
- if (-1==fstat(fd,&stbuf))
+ if (!GetFileInformationByHandle(hfd,&hfdinfo))
return;
- end = stbuf.st_size;
- lastmodified = stbuf.st_mtime;
+ end = hfdinfo.nFileSizeLow;
+ lastmodified = FileTimeToUnixTime(&(hfdinfo.ftLastWriteTime));
- if (-1==lseek(fd,rgdbsection,SEEK_SET))
+ if (-1==_llseek(hfd,rgdbsection,SEEK_SET))
return;
data = (char*)xmalloc(end-rgdbsection);
- if ((end-rgdbsection)!=read(fd,data,end-rgdbsection))
+ if ((end-rgdbsection)!=FILE_Read(hfd,data,end-rgdbsection))
return;
_lclose(hfd);
curdata = data;
diff --git a/misc/spy.c b/misc/spy.c
index 5b13fd7..1a1b325 100644
--- a/misc/spy.c
+++ b/misc/spy.c
@@ -5,6 +5,7 @@
* 1995, Alex Korobka
*/
+#define NO_TRANSITION_TYPES /* This file is Win32-clean */
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
@@ -454,7 +455,7 @@
};
-static BOOL SPY_Exclude[SPY_MAX_MSGNUM+1];
+static BOOL16 SPY_Exclude[SPY_MAX_MSGNUM+1];
static int SPY_IndentLevel = 0;
#define SPY_EXCLUDE(msg) \
@@ -463,7 +464,7 @@
/***********************************************************************
* SPY_GetMsgName
*/
-const char *SPY_GetMsgName( UINT msg )
+const char *SPY_GetMsgName( UINT32 msg )
{
static char buffer[20];
@@ -504,7 +505,7 @@
case SPY_SENDMESSAGE32:
{
char taskName[30];
- HTASK hTask = GetWindowTask16(hWnd);
+ HTASK16 hTask = GetWindowTask16(hWnd);
if (hTask == GetCurrentTask()) strcpy( taskName, "self" );
else if (!hTask) strcpy( taskName, "Wine" );
else sprintf( taskName, "task %04x %s",
diff --git a/misc/ver.c b/misc/ver.c
index e785cb5..d3043ca 100644
--- a/misc/ver.c
+++ b/misc/ver.c
@@ -62,8 +62,8 @@
nehdoffset = LZTELL(lzfd);
LZSeek(lzfd,nehd->resource_tab_offset,SEEK_CUR);
LZREAD(&shiftcount);
- dprintf_resource(stderr,"shiftcount is %d\n",shiftcount);
- dprintf_resource(stderr,"reading resource typeinfo dir.\n");
+ dprintf_ver(stddeb,"shiftcount is %d\n",shiftcount);
+ dprintf_ver(stddeb,"reading resource typeinfo dir.\n");
if (!HIWORD(typeid)) typeid = (SEGPTR)(LOWORD(typeid) | 0x8000);
if (!HIWORD(resid)) resid = (SEGPTR)(LOWORD(resid) | 0x8000);
@@ -73,7 +73,7 @@
LZREAD(&ti);
if (!ti.type_id)
return 0;
- dprintf_resource(stderr," ti.typeid =%04x,count=%d\n",ti.type_id,ti.count);
+ dprintf_ver(stddeb," ti.typeid =%04x,count=%d\n",ti.type_id,ti.count);
skipflag=0;
if (!HIWORD(typeid)) {
if ((ti.type_id&0x8000)&&(typeid!=ti.type_id))
@@ -96,7 +96,7 @@
str=xmalloc(len);
if (len!=LZRead32(lzfd,str,len))
return 0;
- dprintf_resource(stderr,"read %s to compare it with %s\n",
+ dprintf_ver(stddeb,"read %s to compare it with %s\n",
str,(char*)PTR_SEG_TO_LIN(typeid)
);
if (lstrcmpi32A(str,(char*)PTR_SEG_TO_LIN(typeid)))
@@ -114,7 +114,7 @@
int len;
LZREAD(&ni);
- dprintf_resource(stderr," ni.id=%4x,offset=%d,length=%d\n",
+ dprintf_ver(stddeb," ni.id=%4x,offset=%d,length=%d\n",
ni.id,ni.offset,ni.length
);
skipflag=1;
@@ -137,7 +137,7 @@
str=xmalloc(len);
if (len!=LZRead32(lzfd,str,len))
return 0;
- dprintf_resource(stderr,"read %s to compare it with %s\n",
+ dprintf_ver(stddeb,"read %s to compare it with %s\n",
str,(char*)PTR_SEG_TO_LIN(typeid)
);
if (!lstrcmpi32A(str,(char*)PTR_SEG_TO_LIN(typeid)))
@@ -156,7 +156,7 @@
free(rdata);
return 0;
}
- dprintf_resource(stderr,"resource found.\n");
+ dprintf_ver(stddeb,"resource found.\n");
*resdata= (BYTE*)rdata;
*reslen = len;
return 1;
@@ -173,7 +173,7 @@
int reslen;
struct ne_header_s nehd;
- fprintf(stderr,"GetFileResourceSize(%s,%lx,%lx,%p)\n",
+ dprintf_ver(stddeb,"GetFileResourceSize(%s,%lx,%lx,%p)\n",
filename,(LONG)restype,(LONG)resid,off
);
lzfd=LZOpenFile16(filename,&ofs,OF_READ);
@@ -202,7 +202,7 @@
BYTE *resdata;
int reslen=datalen;
struct ne_header_s nehd;
- fprintf(stderr,"GetFileResource(%s,%lx,%lx,%ld,%ld,%p)\n",
+ dprintf_ver(stddeb,"GetFileResource(%s,%lx,%lx,%ld,%ld,%p)\n",
filename,(LONG)restype,(LONG)resid,off,datalen,data
);
@@ -235,7 +235,7 @@
BYTE buf[72];
VS_FIXEDFILEINFO *vffi;
- dprintf_resource(stderr,"GetFileVersionInfoSize16(%s,%p)\n",filename,handle);
+ dprintf_ver(stddeb,"GetFileVersionInfoSize16(%s,%p)\n",filename,handle);
len=GetFileResourceSize(filename,VS_FILE_INFO,VS_VERSION_INFO,handle);
if (!len)
return 0;
@@ -250,100 +250,100 @@
return 0;
if (*(WORD*)buf < len)
len = *(WORD*)buf;
- fprintf(stderr,"->strucver=%ld.%ld,filever=%ld.%ld,productver=%ld.%ld,flagmask=%lx,flags=%lx,OS=",
+ dprintf_ver(stddeb,"->strucver=%ld.%ld,filever=%ld.%ld,productver=%ld.%ld,flagmask=%lx,flags=%lx,OS=",
(vffi->dwStrucVersion>>16),vffi->dwStrucVersion&0xFFFF,
vffi->dwFileVersionMS,vffi->dwFileVersionLS,
vffi->dwProductVersionMS,vffi->dwProductVersionLS,
vffi->dwFileFlagsMask,vffi->dwFileFlags
);
switch (vffi->dwFileOS&0xFFFF0000) {
- case VOS_DOS:fprintf(stderr,"DOS,");break;
- case VOS_OS216:fprintf(stderr,"OS/2-16,");break;
- case VOS_OS232:fprintf(stderr,"OS/2-32,");break;
- case VOS_NT:fprintf(stderr,"NT,");break;
+ case VOS_DOS:dprintf_ver(stddeb,"DOS,");break;
+ case VOS_OS216:dprintf_ver(stddeb,"OS/2-16,");break;
+ case VOS_OS232:dprintf_ver(stddeb,"OS/2-32,");break;
+ case VOS_NT:dprintf_ver(stddeb,"NT,");break;
case VOS_UNKNOWN:
default:
- fprintf(stderr,"UNKNOWN(%ld),",vffi->dwFileOS&0xFFFF0000);break;
+ dprintf_ver(stddeb,"UNKNOWN(%ld),",vffi->dwFileOS&0xFFFF0000);break;
}
switch (vffi->dwFileOS & 0xFFFF) {
- case VOS__BASE:fprintf(stderr,"BASE");break;
- case VOS__WINDOWS16:fprintf(stderr,"WIN16");break;
- case VOS__WINDOWS32:fprintf(stderr,"WIN32");break;
- case VOS__PM16:fprintf(stderr,"PM16");break;
- case VOS__PM32:fprintf(stderr,"PM32");break;
- default:fprintf(stderr,"UNKNOWN(%ld)",vffi->dwFileOS&0xFFFF);break;
+ case VOS__BASE:dprintf_ver(stddeb,"BASE");break;
+ case VOS__WINDOWS16:dprintf_ver(stddeb,"WIN16");break;
+ case VOS__WINDOWS32:dprintf_ver(stddeb,"WIN32");break;
+ case VOS__PM16:dprintf_ver(stddeb,"PM16");break;
+ case VOS__PM32:dprintf_ver(stddeb,"PM32");break;
+ default:dprintf_ver(stddeb,"UNKNOWN(%ld)",vffi->dwFileOS&0xFFFF);break;
}
switch (vffi->dwFileType) {
default:
case VFT_UNKNOWN:
- fprintf(stderr,"filetype=Unknown(%ld)",vffi->dwFileType);
+ dprintf_ver(stddeb,"filetype=Unknown(%ld)",vffi->dwFileType);
break;
- case VFT_APP:fprintf(stderr,"filetype=APP");break;
- case VFT_DLL:fprintf(stderr,"filetype=DLL");break;
+ case VFT_APP:dprintf_ver(stddeb,"filetype=APP");break;
+ case VFT_DLL:dprintf_ver(stddeb,"filetype=DLL");break;
case VFT_DRV:
- fprintf(stderr,"filetype=DRV,");
+ dprintf_ver(stddeb,"filetype=DRV,");
switch(vffi->dwFileSubtype) {
default:
case VFT2_UNKNOWN:
- fprintf(stderr,"UNKNOWN(%ld)",vffi->dwFileSubtype);
+ dprintf_ver(stddeb,"UNKNOWN(%ld)",vffi->dwFileSubtype);
break;
case VFT2_DRV_PRINTER:
- fprintf(stderr,"PRINTER");
+ dprintf_ver(stddeb,"PRINTER");
break;
case VFT2_DRV_KEYBOARD:
- fprintf(stderr,"KEYBOARD");
+ dprintf_ver(stddeb,"KEYBOARD");
break;
case VFT2_DRV_LANGUAGE:
- fprintf(stderr,"LANGUAGE");
+ dprintf_ver(stddeb,"LANGUAGE");
break;
case VFT2_DRV_DISPLAY:
- fprintf(stderr,"DISPLAY");
+ dprintf_ver(stddeb,"DISPLAY");
break;
case VFT2_DRV_MOUSE:
- fprintf(stderr,"MOUSE");
+ dprintf_ver(stddeb,"MOUSE");
break;
case VFT2_DRV_NETWORK:
- fprintf(stderr,"NETWORK");
+ dprintf_ver(stddeb,"NETWORK");
break;
case VFT2_DRV_SYSTEM:
- fprintf(stderr,"SYSTEM");
+ dprintf_ver(stddeb,"SYSTEM");
break;
case VFT2_DRV_INSTALLABLE:
- fprintf(stderr,"INSTALLABLE");
+ dprintf_ver(stddeb,"INSTALLABLE");
break;
case VFT2_DRV_SOUND:
- fprintf(stderr,"SOUND");
+ dprintf_ver(stddeb,"SOUND");
break;
case VFT2_DRV_COMM:
- fprintf(stderr,"COMM");
+ dprintf_ver(stddeb,"COMM");
break;
case VFT2_DRV_INPUTMETHOD:
- fprintf(stderr,"INPUTMETHOD");
+ dprintf_ver(stddeb,"INPUTMETHOD");
break;
}
break;
case VFT_FONT:
- fprintf(stderr,"filetype=FONT.");
+ dprintf_ver(stddeb,"filetype=FONT.");
switch (vffi->dwFileSubtype) {
default:
- fprintf(stderr,"UNKNOWN(%ld)",vffi->dwFileSubtype);
+ dprintf_ver(stddeb,"UNKNOWN(%ld)",vffi->dwFileSubtype);
break;
- case VFT2_FONT_RASTER:fprintf(stderr,"RASTER");break;
- case VFT2_FONT_VECTOR:fprintf(stderr,"VECTOR");break;
- case VFT2_FONT_TRUETYPE:fprintf(stderr,"TRUETYPE");break;
+ case VFT2_FONT_RASTER:dprintf_ver(stddeb,"RASTER");break;
+ case VFT2_FONT_VECTOR:dprintf_ver(stddeb,"VECTOR");break;
+ case VFT2_FONT_TRUETYPE:dprintf_ver(stddeb,"TRUETYPE");break;
}
break;
- case VFT_VXD:fprintf(stderr,"filetype=VXD");break;
- case VFT_STATIC_LIB:fprintf(stderr,"filetype=STATIC_LIB");break;
+ case VFT_VXD:dprintf_ver(stddeb,"filetype=VXD");break;
+ case VFT_STATIC_LIB:dprintf_ver(stddeb,"filetype=STATIC_LIB");break;
}
- fprintf(stderr,"filedata=%lx.%lx\n",vffi->dwFileDateMS,vffi->dwFileDateLS);
+ dprintf_ver(stddeb,"filedata=%lx.%lx\n",vffi->dwFileDateMS,vffi->dwFileDateLS);
return len;
}
/* GetFileVersionInfoSize32A [VERSION.1] */
DWORD
GetFileVersionInfoSize32A(LPCSTR filename,LPDWORD handle) {
- dprintf_resource(stderr,"GetFileVersionInfoSize32A(%s,%p)\n",filename,handle);
+ dprintf_ver(stddeb,"GetFileVersionInfoSize32A(%s,%p)\n",filename,handle);
return GetFileVersionInfoSize16(filename,handle);
}
@@ -362,7 +362,7 @@
/* GetFileVersionInfo [VER.7] */
DWORD
GetFileVersionInfo16(LPCSTR filename,DWORD handle,DWORD datasize,LPVOID data) {
- dprintf_resource(stderr,"GetFileVersionInfo16(%s,%ld,%ld,%p)\n->",
+ dprintf_ver(stddeb,"GetFileVersionInfo16(%s,%ld,%ld,%p)\n->",
filename,handle,datasize,data
);
return GetFileResource(
@@ -394,7 +394,7 @@
UINT16 flags,LPCSTR filename,LPCSTR windir,LPCSTR appdir,
LPSTR curdir,UINT16 *curdirlen,LPSTR destdir,UINT16 *destdirlen
) {
- fprintf(stderr,"VerFindFile(%x,%s,%s,%s,%p,%d,%p,%d)\n",
+ dprintf_ver(stddeb,"VerFindFile(%x,%s,%s,%s,%p,%d,%p,%d)\n",
flags,filename,windir,appdir,curdir,*curdirlen,destdir,*destdirlen
);
strcpy(curdir,"Z:\\ROOT\\.WINE\\");/*FIXME*/
@@ -441,7 +441,7 @@
UINT16 flags,LPCSTR srcfilename,LPCSTR destfilename,LPCSTR srcdir,
LPCSTR destdir,LPSTR tmpfile,UINT16 *tmpfilelen
) {
- fprintf(stderr,"VerInstallFile(%x,%s,%s,%s,%s,%p,%d)\n",
+ dprintf_ver(stddeb,"VerInstallFile(%x,%s,%s,%s,%s,%p,%d)\n",
flags,srcfilename,destfilename,srcdir,destdir,tmpfile,*tmpfilelen
);
@@ -541,7 +541,7 @@
int i;
char *buf;
- fprintf(stderr,"VerLanguageName(%d,%p,%d)\n",langid,langname,langnamelen);
+ dprintf_ver(stddeb,"VerLanguageName(%d,%p,%d)\n",langid,langname,langnamelen);
/* First, check \System\CurrentControlSet\control\Nls\Locale\<langid>
* from the registry.
*/
@@ -632,13 +632,13 @@
while (1) {
db=(struct db*)block;
- fprintf(stderr,"db=%p,db->nextoff=%d,db->datalen=%d,db->name=%s,db->data=%s\n",
+ dprintf_ver(stddeb,"db=%p,db->nextoff=%d,db->datalen=%d,db->name=%s,db->data=%s\n",
db,db->nextoff,db->datalen,db->name,(char*)((char*)db+4+((strlen(db->name)+4)&~3))
);
if (!db->nextoff)
return NULL;
- fprintf(stderr,"comparing with %s\n",db->name);
+ dprintf_ver(stddeb,"comparing with %s\n",db->name);
if (!strncmp(db->name,str,substrlen)) {
if (nextslash)
return _find_data(
@@ -661,7 +661,7 @@
struct db *db;
char *s;
- fprintf(stderr,"VerQueryValue16(%p,%s,%p,%d)\n",
+ dprintf_ver(stddeb,"VerQueryValue16(%p,%s,%p,%d)\n",
block,subblock,buffer,*buflen
);
s=(char*)xmalloc(strlen("VS_VERSION_INFO")+strlen(subblock)+1);
@@ -677,7 +677,7 @@
b = b+4+((strlen(db->name)+4)&~3);
/* now look up what the resp. SEGPTR would be ... */
*buffer = (b-block)+segblock;
- fprintf(stderr," -> %s=%s\n",subblock,b);
+ dprintf_ver(stddeb," -> %s=%s\n",subblock,b);
return 1;
}
@@ -688,7 +688,7 @@
struct db *db;
char *s;
- fprintf(stderr,"VerQueryValue32A(%p,%s,%p,%d)\n",
+ dprintf_ver(stddeb,"VerQueryValue32A(%p,%s,%p,%d)\n",
block,subblock,buffer,*buflen
);
s=(char*)xmalloc(strlen("VS_VERSION_INFO")+strlen(subblock)+1);
@@ -703,7 +703,7 @@
/* let b point to data area */
b = b+4+((strlen(db->name)+4)&~3);
*buffer = b;
- fprintf(stderr," -> %s=%s\n",subblock,b);
+ dprintf_ver(stddeb," -> %s=%s\n",subblock,b);
return 1;
}
@@ -733,7 +733,7 @@
/* let b point to data area */
b = b+4+((strlen(db->name)+4)&~3);
*buffer = b;
- fprintf(stderr," -> %s=%s\n",sb,b);
+ dprintf_ver(stddeb," -> %s=%s\n",sb,b);
free(sb);
return 1;
}
diff --git a/misc/winsocket.c b/misc/winsocket.c
index 15bc731..ce3c916 100644
--- a/misc/winsocket.c
+++ b/misc/winsocket.c
@@ -89,6 +89,11 @@
SEGPTR s_proto WINE_PACKED; /* protocol to use */
};
+typedef struct WinSock_fd_set {
+ u_short fd_count; /* how many are SET? */
+ SOCKET fd_array[FD_SETSIZE]; /* an array of SOCKETs */
+} WinSock_fd_set;
+
struct WinSockHeap {
char ntoa_buffer[32];
@@ -686,17 +691,124 @@
return length;
}
-INT WINSOCK_select(INT nfds, fd_set *readfds, fd_set *writefds,
- fd_set *exceptfds, struct timeval *timeout)
+INT WINSOCK_select(INT nfds, WinSock_fd_set *ws_readfds,
+ WinSock_fd_set *ws_writefds, WinSock_fd_set *ws_exceptfds,
+ struct timeval *timeout)
{
- dprintf_winsock(stddeb, "WSA_select: fd # %d, ptr %8lx, ptr %8lx, ptr %8lX\n", nfds, (unsigned long) readfds, (unsigned long) writefds, (unsigned long) exceptfds);
+ int ret;
+ int i;
+ int count;
+ int highfd;
+ fd_set readfds,writefds,exceptfds;
+ FD_ZERO(&readfds);
+ FD_ZERO(&writefds);
+ FD_ZERO(&exceptfds);
+
+ dprintf_winsock(stddeb, "WSA_select called: nfds %d (ignored), ptr %8lx, ptr %8lx, ptr %8lx\n", nfds, (unsigned long) ws_readfds, (unsigned long) ws_writefds, (unsigned long) ws_exceptfds);
if (!wsa_initted) {
WSASetLastError(WSANOTINITIALISED);
+ dprintf_winsock(stddeb, "WSA_select: returning error WSANOTINITIALISED\n");
return SOCKET_ERROR;
}
-/* FIXME */
- return(select(nfds, readfds, writefds, exceptfds, timeout));
+
+/* In some sort of attempt to be BSD-compatible, MS-Winsock accepts and
+ discards the nfds parameter. However, the format of windoze's fd_sets
+ is totally different from the BSD standard. So much for compatibility.
+ Hence, we must convert the winsock array-of-ints fd_set to the UNIX
+ bitmapped format. */
+
+ if(ws_readfds!=NULL) {
+ dprintf_winsock(stddeb, "readfds: (%d) ",ws_readfds->fd_count);
+ for(i=0;i<(ws_readfds->fd_count);i++) {
+ dprintf_winsock(stddeb, " %d",( (SOCKET *)&(((char *)ws_readfds)[2]) )[i]);
+ /*FD_SET(((SOCKET *)&(((char *)ws_readfds)[2]))[i], &readfds);*/
+ FD_SET(ws_readfds->fd_array[i], &readfds);
+ }
+ dprintf_winsock(stddeb, "\n");
+ } else {
+ dprintf_winsock(stddeb, "readfds: (null)\n");
+ }
+ if(ws_writefds!=NULL) {
+ dprintf_winsock(stddeb, "writefds: (%d) ",ws_writefds->fd_count);
+ for(i=0;i<(ws_writefds->fd_count);i++) {
+ dprintf_winsock(stddeb, " %d",( (SOCKET *)&(((char *)ws_writefds)[2]) )[i]);
+ /*FD_SET(((SOCKET *)&(((char *)ws_writefds)[2]))[i], &writefds);*/
+ FD_SET(ws_writefds->fd_array[i], &writefds);
+ }
+ dprintf_winsock(stddeb, "\n");
+ } else {
+ dprintf_winsock(stddeb, "writefds: (null)\n");
+ }
+ if(ws_exceptfds!=NULL) {
+ dprintf_winsock(stddeb, "exceptfds: (%d) ",ws_exceptfds->fd_count);
+ for(i=0;i<(ws_exceptfds->fd_count);i++) {
+ dprintf_winsock(stddeb, " %d",( (SOCKET *)&(((char *)ws_exceptfds)[2]) )[i]);
+ /*FD_SET(((SOCKET *)&(((char *)ws_exceptfds)[2]))[i], &exceptfds);*/
+ FD_SET(ws_exceptfds->fd_array[i], &exceptfds);
+ }
+ dprintf_winsock(stddeb, "\n");
+ } else {
+ dprintf_winsock(stddeb, "exceptfds: (null)\n");
+ }
+
+ /* Make the select() call */
+ dprintf_winsock(stddeb, "WSA_select: calling select()\n");
+ highfd=256; /* We should count them, but this works */
+ ret=select(highfd, &readfds, &writefds, &exceptfds, timeout);
+ dprintf_winsock(stddeb, "WSA_select: select() returned %d\n",ret);
+ if(ret<0) {
+ errno_to_wsaerrno();
+ dprintf_winsock(stddeb, "WSA_select returning: Error %d\n",SOCKET_ERROR);
+ return SOCKET_ERROR;
+ }
+
+ /* update the winsock fd sets */
+ if(ws_readfds!=NULL) {
+ dprintf_winsock(stddeb, "readfds: ");
+ count=0;
+ for(i=0;i<highfd;i++) {
+ if(FD_ISSET(i,&readfds)) {
+ dprintf_winsock(stddeb, " %d",i);
+ ws_readfds->fd_array[count++]=i;
+ }
+ }
+ dprintf_winsock(stddeb, " (%d)\n",count);
+ ws_readfds->fd_count=count;
+ } else {
+ dprintf_winsock(stddeb, "readfds: (null)\n");
+ }
+ if(ws_writefds!=NULL) {
+ dprintf_winsock(stddeb, "writefds: ");
+ count=0;
+ for(i=0;i<highfd;i++) {
+ if(FD_ISSET(i,&writefds)) {
+ dprintf_winsock(stddeb, " %d",i);
+ ws_writefds->fd_array[count++]=i;
+ }
+ }
+ dprintf_winsock(stddeb, " (%d)\n",count);
+ ws_writefds->fd_count=count;
+ } else {
+ dprintf_winsock(stddeb, "writefds: (null)\n");
+ }
+ if(ws_exceptfds!=NULL) {
+ dprintf_winsock(stddeb, "exceptfds: ");
+ count=0;
+ for(i=0;i<highfd;i++) {
+ if(FD_ISSET(i,&exceptfds)) {
+ dprintf_winsock(stddeb, " %d",i);
+ ws_exceptfds->fd_array[count++]=i;
+ }
+ }
+ dprintf_winsock(stddeb, " (%d)\n",count);
+ ws_exceptfds->fd_count=count;
+ } else {
+ dprintf_winsock(stddeb, "exceptfds: (null)\n");
+ }
+
+ dprintf_winsock(stddeb, "WSA_select returning: %d\n",ret);
+ return(ret);
}
INT WINSOCK_send(SOCKET s, char *buf, INT len, INT flags)
@@ -1363,10 +1475,23 @@
}
}
-INT WSAFDIsSet(INT fd, fd_set *set)
+INT WSAFDIsSet(SOCKET fd, WinSock_fd_set *set)
{
- return( FD_ISSET(fd, set) );
-}
+ int i = set->fd_count;
+
+ dprintf_winsock(stddeb, "__WSAFDIsSet(%d,%8lx)\n",fd,(unsigned long)set);
+
+ while (i--)
+ {
+ if (set->fd_array[i] == fd)
+ {
+ dprintf_winsock(stddeb, "__WSAFDIsSet returning 1\n");
+ return 1;
+ }
+ }
+ dprintf_winsock(stddeb, "__WSAFDIsSet returning 0\n");
+ return 0;
+}
INT WSACancelAsyncRequest(HANDLE hAsyncTaskHandle)
{
diff --git a/misc/wsprintf.c b/misc/wsprintf.c
index 0eb9a2d..bdf6334 100644
--- a/misc/wsprintf.c
+++ b/misc/wsprintf.c
@@ -254,7 +254,7 @@
break;
case WPR_WSTRING: /* No Unicode in Win16 */
case WPR_STRING:
- if (IsBadReadPtr( *(SEGPTR *)args, 1 )) cur_arg = (DWORD)"";
+ if (IsBadReadPtr16( *(SEGPTR *)args, 1 )) cur_arg = (DWORD)"";
else cur_arg = (DWORD)PTR_SEG_TO_LIN( *(SEGPTR *)args );
args = (SEGPTR *)args + 1;
break;
diff --git a/miscemu/Makefile.in b/miscemu/Makefile.in
index b786d45..4fb7d5f 100644
--- a/miscemu/Makefile.in
+++ b/miscemu/Makefile.in
@@ -1,4 +1,4 @@
-DEFS = -D__WINE__
+DEFS = -D__WINE__ -DNO_TRANSITION_TYPES
TOPSRC = @top_srcdir@
MODULE = miscemu
diff --git a/miscemu/dpmi.c b/miscemu/dpmi.c
index 2e41f4b..453032d 100644
--- a/miscemu/dpmi.c
+++ b/miscemu/dpmi.c
@@ -12,10 +12,13 @@
#include "ldt.h"
#include "module.h"
#include "miscemu.h"
+#include "drive.h"
+#include "msdos.h"
#include "stddebug.h"
-/* #define DEBUG_INT */
#include "debug.h"
+#define DOS_GET_DRIVE(reg) ((reg) ? (reg) - 1 : DRIVE_GetCurrentDrive())
+
/* Structure for real-mode callbacks */
typedef struct
@@ -196,26 +199,24 @@
* ES:DI points to real-mode call structure
* Currently we just print it out and return error.
*/
+ RESET_CFLAG(context);
{
REALMODECALL *p = (REALMODECALL *)PTR_SEG_OFF_TO_LIN( ES_reg(context), DI_reg(context) );
- fprintf(stdnimp,
- "RealModeInt %02x: EAX=%08lx EBX=%08lx ECX=%08lx EDX=%08lx\n"
- " ESI=%08lx EDI=%08lx ES=%04x DS=%04x\n",
- BL_reg(context), p->eax, p->ebx, p->ecx, p->edx,
- p->esi, p->edi, p->es, p->ds );
- /* Compton's 1995 encyclopedia does its MSCDEX calls through
- * this interrupt. Why? Who knows...
- */
- if ((BL_reg(context) == 0x2f) && ((p->eax & 0xFF00) == 0x1500))
- {
- do_mscdex( context );
+ switch (BL_reg(context)) {
+ case 0x2f: /* int2f */
+ switch ((p->eax & 0xFF00)>>8) {
+ case 0x15:
+ /* MSCDEX hook */
+ AX_reg(context) = p->eax & 0xFFFF;
+ do_mscdex( context );
+ break;
+ default:
+ SET_CFLAG(context);
+ break;
+ }
break;
- }
- /* NETAPI.DLL of Win95 does AX=6506 to fetch a realmode ptr
- * to the COLLATE table.
- */
- if (BL_reg(context) == 0x21) {
+ case 0x21: /* int21 */
switch ((p->eax & 0xFF00)>>8) {
case 0x65:
switch (p->eax & 0xFF) {
@@ -235,16 +236,76 @@
default:
SET_CFLAG(context);
}
+ break;
+ case 0x44:
+ switch (p->eax & 0xFF) {
+ case 0x0D:{/* generic block device request */
+ BYTE *dataptr = DOSMEM_RealMode2Linear((p->ds)*0x1000+(p->edx & 0xFFFF));
+ int drive = DOS_GET_DRIVE(p->ebx&0xFF);
+
+ if ((p->ecx & 0xFF00) != 0x0800) {
+ SET_CFLAG(context);
+ break;
+ }
+ switch (p->ecx & 0xFF) {
+ case 0x66:{
+
+ char label[12],fsname[9],path[4];
+ DWORD serial;
+
+ strcpy(path,"x:\\");path[0]=drive+'A';
+ GetVolumeInformation32A(path,label,12,&serial,NULL,NULL,fsname,9);
+ *(WORD*)dataptr = 0;
+ memcpy(dataptr+2,&serial,4);
+ memcpy(dataptr+6,label ,11);
+ memcpy(dataptr+17,fsname,8);
+ break;
+ }
+ case 0x60: /* get device parameters */
+ /* used by defrag.exe of win95 */
+ memset(dataptr, 0, 0x26);
+ dataptr[0] = 0x04;
+ dataptr[6] = 0; /* media type */
+ if (drive > 1) {
+ dataptr[1] = 0x05; /* fixed disk */
+ setword(&dataptr[2], 0x01); /* non removable */
+ setword(&dataptr[4], 0x300); /* # of cylinders */
+ } else {
+ dataptr[1] = 0x07; /* block dev, floppy */
+ setword(&dataptr[2], 0x02); /* removable */
+ setword(&dataptr[4], 80); /* # of cylinders */
+ }
+ CreateBPB(drive, &dataptr[7]);
+ break;
+ default:
+ SET_CFLAG(context);
+ break;
+ }
+ }
+ break;
+ default:
+ SET_CFLAG(context);
+ break;
+ }
default:
SET_CFLAG(context);
break;
}
break;
+ default:
+ SET_CFLAG(context);
+ break;
}
- SET_CFLAG(context);
+ if (EFL_reg(context)&1) {
+ fprintf(stdnimp,
+ "RealModeInt %02x: EAX=%08lx EBX=%08lx ECX=%08lx EDX=%08lx\n"
+ " ESI=%08lx EDI=%08lx ES=%04x DS=%04x\n",
+ BL_reg(context), p->eax, p->ebx, p->ecx, p->edx,
+ p->esi, p->edi, p->es, p->ds
+ );
+ }
}
break;
-
case 0x0301: /* Call real mode procedure with far return */
{
REALMODECALL *p = (REALMODECALL *)PTR_SEG_OFF_TO_LIN( ES_reg(context), DI_reg(context) );
@@ -274,9 +335,12 @@
REALMODECALL *p = (REALMODECALL *)PTR_SEG_OFF_TO_LIN( ES_reg(context), DI_reg(context) );
fprintf(stdnimp,
"AllocRMCB: EAX=%08lx EBX=%08lx ECX=%08lx EDX=%08lx\n"
- " ESI=%08lx EDI=%08lx ES=%04x DS=%04x CS:IP=%04x:%04x\n",
+ " ESI=%08lx EDI=%08lx ES=%04x DS=%04x CS:IP=%04x:%04x\n"
+ " Function to call: %04x:%04x\n",
p->eax, p->ebx, p->ecx, p->edx,
- p->esi, p->edi, p->es, p->ds, p->cs, p->ip );
+ p->esi, p->edi, p->es, p->ds, p->cs, p->ip,
+ DS_reg(context),SI_reg(context)
+ );
SET_CFLAG(context);
}
break;
diff --git a/miscemu/instr.c b/miscemu/instr.c
index 3f19015..e07fcb6 100644
--- a/miscemu/instr.c
+++ b/miscemu/instr.c
@@ -195,8 +195,8 @@
*
* Emulate the LDS (and LES,LFS,etc.) instruction.
*/
-static BOOL INSTR_EmulateLDS( SIGCONTEXT *context, BYTE *instr, int long_op,
- int long_addr, int segprefix, int *len )
+static BOOL32 INSTR_EmulateLDS( SIGCONTEXT *context, BYTE *instr, int long_op,
+ int long_addr, int segprefix, int *len )
{
WORD seg;
BYTE *regmodrm = instr + 1 + (*instr == 0x0f);
diff --git a/miscemu/int21.c b/miscemu/int21.c
index 8cb3ba5..fb5aff4 100644
--- a/miscemu/int21.c
+++ b/miscemu/int21.c
@@ -98,7 +98,7 @@
string[length] = '\0';
}
-static void CreateBPB(int drive, BYTE *data)
+void CreateBPB(int drive, BYTE *data)
{
if (drive > 1) {
setword(data, 512);
@@ -232,6 +232,9 @@
return;
}
switch (CL_reg(context)) {
+ case 0x4a: /* lock logical volume */
+ dprintf_int(stddeb,"int21: lock logical volume (%d) level %d mode %d\n",drive,BH_reg(context),DX_reg(context));
+ return;
case 0x60: /* get device parameters */
/* used by w4wgrp's winfile */
memset(dataptr, 0, 0x26);
@@ -252,6 +255,23 @@
CreateBPB(drive, &dataptr[7]);
RESET_CFLAG(context);
return;
+ case 0x66:/* get disk serial number */
+ { char label[12],fsname[9],path[4];
+ DWORD serial;
+
+ strcpy(path,"x:\\");path[0]=drive+'A';
+ GetVolumeInformation32A(
+ path,label,12,&serial,NULL,NULL,fsname,9
+ );
+ *(WORD*)dataptr = 0;
+ memcpy(dataptr+2,&serial,4);
+ memcpy(dataptr+6,label ,11);
+ memcpy(dataptr+17,fsname,8);
+ return;
+ }
+ case 0x6a:
+ dprintf_int(stddeb,"int21: logical volume %d unlocked.\n",drive);
+ return;
default:
INT_BARF( context, 0x21 );
}
@@ -285,7 +305,7 @@
/* Note hundredths of seconds */
}
-static void CreateFile( SIGCONTEXT *context )
+static void INT21_CreateFile( SIGCONTEXT *context )
{
AX_reg(context) = _lcreat( PTR_SEG_OFF_TO_LIN( DS_reg(context),
DX_reg(context) ), CX_reg(context) );
@@ -439,7 +459,7 @@
AL_reg(context) = BL_reg(context);
/* CX is still the same */
DX_reg(context) = SI_reg(context);
- CreateFile(context);
+ INT21_CreateFile(context);
if (EFL_reg(context) & 0x0001) { /*no file open, flags set */
dprintf_int(stddeb, "int21: extended open/create: truncfailed");
return;
@@ -466,7 +486,7 @@
AL_reg(context) = BL_reg(context);
/* CX should still be the same */
DX_reg(context) = SI_reg(context);
- CreateFile(context);
+ INT21_CreateFile(context);
if (EFL_reg(context) & 0x0001) { /*no file open, flags set */
dprintf_int(stddeb, "int21: extended open/create: create failed\n");
return;
@@ -1172,10 +1192,10 @@
case 0x3f: /* "READ" - READ FROM FILE OR DEVICE */
{
- LONG result = _hread( BX_reg(context),
- PTR_SEG_OFF_TO_SEGPTR( DS_reg(context),
- DX_reg(context) ),
- CX_reg(context) );
+ LONG result = WIN16_hread( BX_reg(context),
+ PTR_SEG_OFF_TO_SEGPTR( DS_reg(context),
+ DX_reg(context) ),
+ CX_reg(context) );
if (result == -1)
{
AX_reg(context) = DOS_ExtendedError;
@@ -1250,7 +1270,18 @@
case 0x01:
break;
+ case 0x05:{ /* IOCTL - WRITE TO BLOCK DEVICE CONTROL CHANNEL */
+ BYTE *dataptr = PTR_SEG_OFF_TO_LIN(DS_reg(context),DX_reg(context));
+ int i;
+ int drive = DOS_GET_DRIVE(BL_reg(context));
+ fprintf(stdnimp,"int21: program tried to write to block device control channel of drive %d:\n",drive);
+ for (i=0;i<CX_reg(context);i++)
+ fprintf(stdnimp,"%02x ",dataptr[i]);
+ fprintf(stdnimp,"\n");
+ AX_reg(context)=CX_reg(context);
+ break;
+ }
case 0x08: /* Check if drive is removable. */
switch(GetDriveType16( DOS_GET_DRIVE( BL_reg(context) )))
{
@@ -1521,11 +1552,34 @@
case 0x61: /* UNUSED */
case 0x63: /* UNUSED */
case 0x64: /* OS/2 DOS BOX */
- case 0x65: /* GET EXTENDED COUNTRY INFORMATION */
INT_BARF( context, 0x21 );
SET_CFLAG(context);
- break;
-
+ break;
+ case 0x65:{/* GET EXTENDED COUNTRY INFORMATION */
+ extern WORD WINE_LanguageId;
+ BYTE *dataptr=PTR_SEG_OFF_TO_LIN(ES_reg(context),DI_reg(context));;
+ switch (AL_reg(context)) {
+ case 0x01:
+ dataptr[0] = 0x1;
+ *(WORD*)(dataptr+1) = 41;
+ *(WORD*)(dataptr+3) = WINE_LanguageId;
+ *(WORD*)(dataptr+5) = CodePage;
+ break;
+ case 0x06: {
+ extern DWORD DOSMEM_CollateTable;
+
+ dataptr[0] = 0x06;
+ *(DWORD*)(dataptr+1) = MAKELONG(DOSMEM_CollateTable & 0xFFFF,DOSMEM_AllocSelector(DOSMEM_CollateTable>>16));
+ CX_reg(context) = 258;/*FIXME: size of table?*/
+ break;
+ }
+ default:
+ INT_BARF( context, 0x21 );
+ SET_CFLAG(context);
+ break;
+ }
+ break;
+ }
case 0x66: /* GLOBAL CODE PAGE TABLE */
switch (AL_reg(context))
{
@@ -1541,7 +1595,7 @@
break;
case 0x67: /* SET HANDLE COUNT */
- SetHandleCount( BX_reg(context) );
+ SetHandleCount16( BX_reg(context) );
if (DOS_ExtendedError)
{
AX_reg(context) = DOS_ExtendedError;
@@ -1603,6 +1657,8 @@
SET_CFLAG(context);
}
break;
+ case 0xa0:
+ break;
case 0x3b: /* Change directory */
case 0x41: /* Delete file */
case 0x43: /* Get/Set file attributes */
diff --git a/multimedia/mmsystem.c b/multimedia/mmsystem.c
index 91dd742..3662fef 100644
--- a/multimedia/mmsystem.c
+++ b/multimedia/mmsystem.c
@@ -1929,7 +1929,7 @@
dprintf_mmsys(stddeb, "mmioWrite(%04X, %p, %ld);\n", hmmio, pch, cch);
lpmminfo = (LPMMIOINFO)GlobalLock16(hmmio);
if (lpmminfo == NULL) return 0;
- count = _lwrite(LOWORD(lpmminfo->dwReserved2), (LPSTR)pch, cch);
+ count = _lwrite32(LOWORD(lpmminfo->dwReserved2), (LPSTR)pch, cch);
GlobalUnlock16(hmmio);
return count;
}
@@ -2017,7 +2017,7 @@
lpmmioinfo->pchBuffer, lpmmioinfo->cchBuffer);
}
if (uFlags == MMIO_WRITE) {
- count = _lwrite(LOWORD(lpmminfo->dwReserved2),
+ count = _lwrite32(LOWORD(lpmminfo->dwReserved2),
lpmmioinfo->pchBuffer, lpmmioinfo->cchBuffer);
}
lpmmioinfo->pchNext += count;
diff --git a/objects/metafile.c b/objects/metafile.c
index 5efb700..170a6d9 100644
--- a/objects/metafile.c
+++ b/objects/metafile.c
@@ -120,7 +120,7 @@
{
mh->mtType = 1; /* disk */
hFile = _lcreat(lpFilename, 0);
- if (_lwrite(hFile, (char *)mh, MFHEADERSIZE) == -1)
+ if (_lwrite32(hFile, (char *)mh, MFHEADERSIZE) == -1)
{
GlobalFree16(dc->w.hMetaFile);
return 0;
@@ -165,7 +165,7 @@
hFile = _lcreat(lpFilename, 0);
j=mh->mtType;
mh->mtType=1; /* disk file version stores 1 here */
- i=_lwrite(hFile, (char *)mh, mh->mtSize * 2) ;
+ i=_lwrite32(hFile, (char *)mh, mh->mtSize * 2) ;
mh->mtType=j; /* restore old value [0 or 1] */
_lclose(hFile);
if (i == -1)
@@ -241,7 +241,7 @@
GlobalFree16(dc->w.hMetaFile);
return 0;
}
- if (_lwrite(hFile, (char *)mh, MFHEADERSIZE) == -1)
+ if (_lwrite32(hFile, (char *)mh, MFHEADERSIZE) == -1)
{
GlobalFree16(dc->w.hMetaFile);
return 0;
@@ -806,7 +806,7 @@
else if (mh->mtType == 1) /* disk based metafile */
{
dprintf_metafile(stddeb,"Writing record to disk\n");
- if (_lwrite(mh->mtNoParameters, (char *)mr, rlen) == -1)
+ if (_lwrite32(mh->mtNoParameters, (char *)mr, rlen) == -1)
{
GlobalUnlock16(hmf);
return 0;
diff --git a/rc/Makefile.in b/rc/Makefile.in
index d4d178a..d5e9e15 100644
--- a/rc/Makefile.in
+++ b/rc/Makefile.in
@@ -1,4 +1,4 @@
-DEFS = -D__WINE__
+DEFS = -D__WINE__ -DNO_TRANSITION_TYPES
TOPSRC = @top_srcdir@
PROGRAM = winerc
diff --git a/resources/Makefile.in b/resources/Makefile.in
index 153df2c..b972f81 100644
--- a/resources/Makefile.in
+++ b/resources/Makefile.in
@@ -1,4 +1,4 @@
-DEFS = -D__WINE__
+DEFS = -D__WINE__ -DNO_TRANSITION_TYPES
TOPSRC = @top_srcdir@
MODULE = resources
diff --git a/tools/Makefile.in b/tools/Makefile.in
index 3ff5e74..303b5ec 100644
--- a/tools/Makefile.in
+++ b/tools/Makefile.in
@@ -1,4 +1,4 @@
-DEFS = -D__WINE__
+DEFS = -D__WINE__ -DNO_TRANSITION_TYPES
TOPSRC = @top_srcdir@
PROGRAM = build
diff --git a/win32/file.c b/win32/file.c
index c07faa0..c8463cb 100644
--- a/win32/file.c
+++ b/win32/file.c
@@ -16,118 +16,111 @@
#include "windows.h"
#include "winbase.h"
#include "winerror.h"
+#include "file.h"
#include "handle32.h"
+#include "string32.h"
#include "dos_fs.h"
+#include "xmalloc.h"
#include "stddebug.h"
#define DEBUG_WIN32
#include "debug.h"
-extern FILE_OBJECT *hstdin;
-extern FILE_OBJECT *hstdout;
-extern FILE_OBJECT *hstderr;
-
static void UnixTimeToFileTime(time_t unix_time, FILETIME *filetime);
static int TranslateCreationFlags(DWORD create_flags);
static int TranslateAccessFlags(DWORD access_flags);
+int TranslateProtectionFlags(DWORD);
#ifndef MAP_ANON
#define MAP_ANON 0
#endif
/***********************************************************************
* OpenFileMappingA (KERNEL32.397)
+ * FIXME: stub
*
*/
HANDLE32 OpenFileMapping(DWORD access, BOOL inherit,const char *fname)
{
return 0;
}
-/***********************************************************************
- * CreateFileMappingA (KERNEL32.46)
- *
- */
-int TranslateProtectionFlags(DWORD);
-HANDLE32 CreateFileMapping(HANDLE32 h,SECURITY_ATTRIBUTES *ats,
- DWORD pot, DWORD sh, DWORD hlow, const char * lpName )
-{
- FILE_OBJECT *file_obj;
- FILEMAP_OBJECT *filemap_obj;
- int fd;
- if (sh)
- {
+
+/***********************************************************************
+ * CreateFileMapping32A (KERNEL32.46)
+ */
+HANDLE32 CreateFileMapping32A(HANDLE32 h,LPSECURITY_ATTRIBUTES ats,
+ DWORD pot, DWORD sh, DWORD hlow, LPCSTR lpName )
+{
+ HFILE hfile;
+ FILEMAP_OBJECT *filemap_obj;
+
+ if (sh) {
SetLastError(ErrnoToLastError(errno));
return INVALID_HANDLE_VALUE;
}
- fd = open(lpName, O_CREAT, 0666);
- if(fd == -1)
- {
+ hfile = _lcreat(lpName,1);
+ if(hfile == HFILE_ERROR) {
SetLastError(ErrnoToLastError(errno));
return INVALID_HANDLE_VALUE;
}
- file_obj = (FILE_OBJECT *)
- CreateKernelObject(sizeof(FILE_OBJECT));
- if(file_obj == NULL)
- {
+ filemap_obj=(FILEMAP_OBJECT *)CreateKernelObject(sizeof(FILEMAP_OBJECT));
+ if(filemap_obj == NULL) {
+ _lclose(hfile);
SetLastError(ERROR_UNKNOWN);
return 0;
}
- filemap_obj = (FILEMAP_OBJECT *)
- CreateKernelObject(sizeof(FILEMAP_OBJECT));
- if(filemap_obj == NULL)
- {
- ReleaseKernelObject(file_obj);
- SetLastError(ERROR_UNKNOWN);
- return 0;
- }
- file_obj->common.magic = KERNEL_OBJECT_FILE;
- file_obj->fd = fd;
- file_obj->type = FILE_TYPE_DISK;
+
filemap_obj->common.magic = KERNEL_OBJECT_FILEMAP;
- filemap_obj->file_obj = file_obj;
+ filemap_obj->hfile = hfile;
filemap_obj->prot = TranslateProtectionFlags(pot);
filemap_obj->size = hlow;
return (HANDLE32)filemap_obj;;
}
/***********************************************************************
+ * CreateFileMapping32W (KERNEL32.47)
+ *
+ */
+HANDLE32 CreateFileMapping32W(HANDLE32 h,LPSECURITY_ATTRIBUTES ats,
+ DWORD pot, DWORD sh, DWORD hlow, LPCWSTR lpName)
+{
+ HANDLE32 res;
+ LPSTR aname = STRING32_DupUniToAnsi(lpName);
+
+ res = CreateFileMapping32A(h,ats,pot,sh,hlow,aname);
+ free(aname);
+ return res;
+}
+
+
+/***********************************************************************
* MapViewOfFileEx (KERNEL32.386)
*
*/
-void *MapViewOfFileEx(HANDLE32 handle, DWORD access, DWORD offhi,
+LPVOID MapViewOfFileEx(HANDLE32 handle, DWORD access, DWORD offhi,
DWORD offlo, DWORD size, DWORD st)
{
if (!size) size = ((FILEMAP_OBJECT *)handle)->size;
return mmap ((caddr_t)st, size, ((FILEMAP_OBJECT *)handle)->prot,
MAP_ANON|MAP_PRIVATE,
- ((FILEMAP_OBJECT *)handle)->file_obj->fd,
+ FILE_GetUnixHandle(((FILEMAP_OBJECT *)handle)->hfile),
offlo);
}
+
/***********************************************************************
* GetFileInformationByHandle (KERNEL32.219)
- *
*/
-DWORD GetFileInformationByHandle(FILE_OBJECT *hFile,
- BY_HANDLE_FILE_INFORMATION *lpfi)
+DWORD GetFileInformationByHandle(HFILE hFile,BY_HANDLE_FILE_INFORMATION *lpfi)
{
- struct stat file_stat;
- int rc;
+ struct stat file_stat;
+ int rc;
+ int unixfd = FILE_GetUnixHandle(hFile);
- if(ValidateKernelObject((HANDLE32)hFile) != 0)
- {
- SetLastError(ERROR_INVALID_HANDLE);
- return 0;
- }
- if(hFile->common.magic != KERNEL_OBJECT_FILE)
- {
- SetLastError(ERROR_INVALID_HANDLE);
- return 0;
- }
-
- rc = fstat(hFile->fd, &file_stat);
- if(rc == -1)
- {
+ if (unixfd==-1)
+ return 0;
+ rc = fstat(unixfd,&file_stat);
+ if(rc == -1) {
SetLastError(ErrnoToLastError(errno));
return 0;
}
@@ -162,7 +155,6 @@
return 1;
}
-
static void UnixTimeToFileTime(time_t unix_time, FILETIME *filetime)
{
/* This isn't anywhere close to being correct, but should
@@ -172,91 +164,68 @@
filetime->dwHighDateTime = (unix_time & 0xFFFF0000) >> 16;
}
-
-/***********************************************************************
- * GetFileType (KERNEL32.222)
- *
- * GetFileType currently only supports stdin, stdout, and stderr, which
- * are considered to be of type FILE_TYPE_CHAR.
- */
-DWORD GetFileType(FILE_OBJECT *hFile)
+time_t FileTimeToUnixTime(FILETIME *filetime)
{
- if(ValidateKernelObject((HANDLE32)hFile) != 0)
- {
- SetLastError(ERROR_UNKNOWN);
- return FILE_TYPE_UNKNOWN;
- }
- if(hFile->common.magic != KERNEL_OBJECT_FILE)
- {
- SetLastError(ERROR_UNKNOWN);
- return FILE_TYPE_UNKNOWN;
- }
-
- return hFile->type;
+ /* reverse of UnixTimeToFileTime */
+ return filetime->dwLowDateTime+(filetime->dwHighDateTime<<16);
}
/***********************************************************************
* GetStdHandle (KERNEL32.276)
+ * FIXME: We should probably allocate filehandles for stdin/stdout/stderr
+ * at task creation (with HFILE-handle 0,1,2 respectively) and
+ * return them here. Or at least look, if we created them already.
*/
-HANDLE32 GetStdHandle(DWORD nStdHandle)
+HFILE GetStdHandle(DWORD nStdHandle)
{
- HANDLE32 rc;
+ HFILE hfile;
+ int unixfd;
switch(nStdHandle)
{
case STD_INPUT_HANDLE:
- rc = (HANDLE32)hstdin;
+ unixfd = 0;
break;
case STD_OUTPUT_HANDLE:
- rc = (HANDLE32)hstdout;
+ unixfd = 1;
break;
case STD_ERROR_HANDLE:
- rc = (HANDLE32)hstderr;
+ unixfd = 2;
break;
-
default:
- rc = INVALID_HANDLE_VALUE;
SetLastError(ERROR_INVALID_HANDLE);
- break;
+ return HFILE_ERROR;
}
-
- return rc;
+ hfile = FILE_DupUnixHandle(unixfd);
+ if (hfile == HFILE_ERROR)
+ return HFILE_ERROR;
+ FILE_SetFileType( hfile, FILE_TYPE_CHAR );
+ return hfile;
}
+
/***********************************************************************
* SetFilePointer (KERNEL32.492)
*
* Luckily enough, this function maps almost directly into an lseek
* call, the exception being the use of 64-bit offsets.
*/
-DWORD SetFilePointer(FILE_OBJECT *hFile, LONG distance, LONG *highword,
+DWORD SetFilePointer(HFILE hFile, LONG distance, LONG *highword,
DWORD method)
{
- int rc;
-
- if(ValidateKernelObject((HANDLE32)hFile) != 0)
- {
- SetLastError(ERROR_INVALID_HANDLE);
- return ((DWORD)0xFFFFFFFF);
- }
- if(hFile->common.magic != KERNEL_OBJECT_FILE)
- {
- SetLastError(ERROR_INVALID_HANDLE);
- return ((DWORD)0xFFFFFFFF);
- }
-
+ LONG rc;
if(highword != NULL)
{
if(*highword != 0)
{
- dprintf_win32(stddeb, "SetFilePointer: 64-bit offsets not yet supported.\n");
+ dprintf_file(stddeb, "SetFilePointer: 64-bit offsets not yet supported.\n");
return -1;
}
}
- rc = lseek(hFile->fd, distance, method);
+ rc = _llseek(hFile, distance, method);
if(rc == -1)
SetLastError(ErrnoToLastError(errno));
return rc;
@@ -265,74 +234,52 @@
/***********************************************************************
* WriteFile (KERNEL32.578)
*/
-BOOL WriteFile(FILE_OBJECT *hFile, LPVOID lpBuffer, DWORD numberOfBytesToWrite,
- LPDWORD numberOfBytesWritten, LPOVERLAPPED lpOverlapped)
+BOOL32 WriteFile(HFILE hFile, LPVOID lpBuffer, DWORD numberOfBytesToWrite,
+ LPDWORD numberOfBytesWritten, LPOVERLAPPED lpOverlapped)
{
- int written;
+ LONG res;
- if(ValidateKernelObject((HANDLE32)hFile) != 0)
- {
- SetLastError(ERROR_INVALID_HANDLE);
- return 0;
+ res = _lwrite32(hFile,lpBuffer,numberOfBytesToWrite);
+ if (res==-1) {
+ SetLastError(ErrnoToLastError(errno));
+ return FALSE;
}
- if(hFile->common.magic != KERNEL_OBJECT_FILE)
- {
- SetLastError(ERROR_INVALID_HANDLE);
- return 0;
- }
-
- written = write(hFile->fd, lpBuffer, numberOfBytesToWrite);
if(numberOfBytesWritten)
- *numberOfBytesWritten = written;
-
- return 1;
+ *numberOfBytesWritten = res;
+ return TRUE;
}
/***********************************************************************
* ReadFile (KERNEL32.428)
*/
-BOOL ReadFile(FILE_OBJECT *hFile, LPVOID lpBuffer, DWORD numtoread,
- LPDWORD numread, LPOVERLAPPED lpOverlapped)
+BOOL32 ReadFile(HFILE hFile, LPVOID lpBuffer, DWORD numtoread,
+ LPDWORD numread, LPOVERLAPPED lpOverlapped)
{
int actual_read;
- if(ValidateKernelObject((HANDLE32)hFile) != 0)
- {
- SetLastError(ERROR_INVALID_HANDLE);
- return 0;
- }
- if(hFile->common.magic != KERNEL_OBJECT_FILE)
- {
- SetLastError(ERROR_INVALID_HANDLE);
- return 0;
- }
-
- actual_read = read(hFile->fd, lpBuffer, numtoread);
- if(actual_read == -1)
- {
+ actual_read = _lread32(hFile,lpBuffer,numtoread);
+ if(actual_read == -1) {
SetLastError(ErrnoToLastError(errno));
- return 0;
+ return FALSE;
}
if(numread)
*numread = actual_read;
- return 1;
+ return TRUE;
}
+
/*************************************************************************
- * CreateFile (KERNEL32.45)
+ * CreateFile32A (KERNEL32.45)
*
* Doesn't support character devices, pipes, template files, or a
* lot of the 'attributes' flags yet.
*/
-HANDLE32 CreateFileA(LPSTR filename, DWORD access, DWORD sharing,
- LPSECURITY_ATTRIBUTES security, DWORD creation,
- DWORD attributes, HANDLE32 template)
+HFILE CreateFile32A(LPCSTR filename, DWORD access, DWORD sharing,
+ LPSECURITY_ATTRIBUTES security, DWORD creation,
+ DWORD attributes, HANDLE32 template)
{
int access_flags, create_flags;
- int fd;
- FILE_OBJECT *file_obj;
- int type;
/* Translate the various flags to Unix-style.
*/
@@ -340,7 +287,7 @@
create_flags = TranslateCreationFlags(creation);
if(template)
- dprintf_win32(stddeb, "CreateFile: template handles not supported.\n");
+ dprintf_file(stddeb, "CreateFile: template handles not supported.\n");
/* If the name starts with '\\?' or '\\.', ignore the first 3 chars.
*/
@@ -351,76 +298,48 @@
*/
if(!strncmp(filename, "\\\\", 2))
{
- dprintf_win32(stddeb, "CreateFile: UNC names not supported.\n");
+ dprintf_file(stddeb, "CreateFile: UNC names not supported.\n");
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
- return INVALID_HANDLE_VALUE;
+ return HFILE_ERROR;
}
/* If the name is either CONIN$ or CONOUT$, give them stdin
* or stdout, respectively.
*/
- if(!strcmp(filename, "CONIN$"))
- {
- type = FILE_TYPE_CHAR;
- fd = 0;
- }
- else if(!strcmp(filename, "CONOUT$"))
- {
- type = FILE_TYPE_CHAR;
- fd = 1;
- }
- else
- {
- const char *unixName = DOSFS_GetUnixFileName( filename, FALSE );
- type = FILE_TYPE_DISK;
+ if(!strcmp(filename, "CONIN$")) return GetStdHandle( STD_INPUT_HANDLE );
+ if(!strcmp(filename, "CONOUT$")) return GetStdHandle( STD_OUTPUT_HANDLE );
- /* Try to open the file.
- */
- if (!unixName ||
- ((fd = open(unixName, access_flags | create_flags, 0666)) == -1))
- {
- SetLastError(ErrnoToLastError(errno));
- return INVALID_HANDLE_VALUE;
- }
- }
+ return FILE_Open( filename, access_flags | create_flags );
+}
- /* We seem to have succeeded, so allocate a kernel object
- * and set it up.
- */
- file_obj = (FILE_OBJECT *)CreateKernelObject(sizeof(FILE_OBJECT));
- if(file_obj == NULL)
- {
- SetLastError(ERROR_INVALID_HANDLE);
- return INVALID_HANDLE_VALUE;
- }
- file_obj->common.magic = KERNEL_OBJECT_FILE;
- file_obj->fd = fd;
- file_obj->type = type;
- file_obj->misc_flags = attributes;
- file_obj->access_flags = access_flags;
- file_obj->create_flags = create_flags;
- return (HANDLE32)file_obj;
+/*************************************************************************
+ * CreateFile32W (KERNEL32.48)
+ */
+HFILE CreateFile32W(LPCWSTR filename, DWORD access, DWORD sharing,
+ LPSECURITY_ATTRIBUTES security, DWORD creation,
+ DWORD attributes, HANDLE32 template)
+{
+ HFILE res;
+ LPSTR afn = STRING32_DupUniToAnsi(filename);
+
+ res = CreateFile32A(afn,access,sharing,security,creation,attributes,template);
+ free(afn);
+ return res;
}
/*************************************************************************
- * W32_SetHandleCount (KERNEL32.??)
- *
+ * SetHandleCount32 (KERNEL32.494)
*/
-UINT W32_SetHandleCount(UINT cHandles)
+UINT32 SetHandleCount32( UINT32 cHandles )
{
- return SetHandleCount(cHandles);
+ return SetHandleCount16(cHandles);
}
-int CloseFileHandle(FILE_OBJECT *hFile)
-{
- /* If it's one of the 3 standard handles, don't really
- * close it.
- */
- if(hFile->fd > 2)
- close(hFile->fd);
- return 1;
+int CloseFileHandle(HFILE hFile)
+{
+ return _lclose(hFile);
}
static int TranslateAccessFlags(DWORD access_flags)
@@ -475,17 +394,18 @@
return rc;
}
+
/**************************************************************************
- * GetFileAttributes
+ * GetFileAttributes32A (KERNEL32.217)
*/
-DWORD GetFileAttributesA(LPCSTR lpFileName)
+DWORD GetFileAttributes32A(LPCSTR lpFileName)
{
struct stat buf;
DWORD res=0;
char *fn;
- dprintf_win32(stddeb,"GetFileAttributesA(%s)\n",lpFileName);
- fn=DOSFS_GetUnixFileName(lpFileName,FALSE);
+ dprintf_file(stddeb,"GetFileAttributesA(%s)\n",lpFileName);
+ fn=(LPSTR)DOSFS_GetUnixFileName(lpFileName,FALSE);
/* fn points to a static buffer, don't free it */
if(stat(fn,&buf)==-1) {
SetLastError(ErrnoToLastError(errno));
@@ -501,16 +421,119 @@
}
/**************************************************************************
- * SetFileAttributes
+ * GetFileAttributes32W (KERNEL32.218)
*/
-BOOL SetFileAttributes32A(LPCSTR lpFileName, DWORD attributes)
+DWORD GetFileAttributes32W(LPCWSTR lpFileName)
+{
+ LPSTR afn = STRING32_DupUniToAnsi(lpFileName);
+ DWORD res;
+ res = GetFileAttributes32A(afn);
+ free(afn);
+ return res;
+}
+
+
+/**************************************************************************
+ * SetFileAttributes32A (KERNEL32.490)
+ */
+BOOL32 SetFileAttributes32A(LPCSTR lpFileName, DWORD attributes)
{
struct stat buf;
- DWORD res=0;
- char *fn;
+ LPSTR fn=(LPSTR)DOSFS_GetUnixFileName(lpFileName,FALSE);
- fprintf(stdnimp,"Call to stub function SetFileAttributesA(%s, %08x)\n",lpFileName, attributes);
+ dprintf_file(stddeb,"SetFileAttributes(%s,%lx)\n",lpFileName,attributes);
+ if(stat(fn,&buf)==-1) {
+ SetLastError(ErrnoToLastError(errno));
+ return FALSE;
+ }
+ if (attributes & FILE_ATTRIBUTE_READONLY) {
+ buf.st_mode &= ~0222; /* octal!, clear write permission bits */
+ attributes &= ~FILE_ATTRIBUTE_READONLY;
+ }
+ if (attributes)
+ fprintf(stdnimp,"SetFileAttributesA(%s):%lx attribute(s) not implemented.\n",lpFileName,attributes);
+ if (-1==chmod(fn,buf.st_mode)) {
+ SetLastError(ErrnoToLastError(errno));
+ return FALSE;
+ }
return TRUE;
}
+/**************************************************************************
+ * SetFileAttributes32W (KERNEL32.491)
+ */
+BOOL32 SetFileAttributes32W(LPCWSTR lpFileName, DWORD attributes)
+{
+ LPSTR afn = STRING32_DupUniToAnsi(lpFileName);
+ BOOL32 res;
+
+ res = SetFileAttributes32A(afn,attributes);
+ free(afn);
+ return res;
+}
+
+/**************************************************************************
+ * SetEndOfFile (KERNEL32.483)
+ */
+BOOL32 SetEndOfFile(HFILE hFile)
+{
+ int unixfd = FILE_GetUnixHandle(hFile);
+
+ dprintf_file(stddeb,"SetEndOfFile(%lx)\n",(LONG)hFile);
+ if (!unixfd)
+ return 0;
+ if (-1==ftruncate(unixfd,lseek(unixfd,0,SEEK_CUR))) {
+ SetLastError(ErrnoToLastError(errno));
+ return FALSE;
+ }
+ return TRUE;
+}
+
+
+/**************************************************************************
+ * MoveFileA (KERNEL32.387)
+ */
+BOOL32 MoveFile32A(LPCSTR fn1,LPCSTR fn2)
+{
+ LPSTR ufn1;
+ LPSTR ufn2;
+
+ dprintf_file(stddeb,"MoveFileA(%s,%s)\n",fn1,fn2);
+ ufn1 = (LPSTR)DOSFS_GetUnixFileName(fn1,FALSE);
+ if (!ufn1) {
+ SetLastError(ErrnoToLastError(ENOENT));
+ return FALSE;
+ }
+ ufn1 = xstrdup(ufn1);
+ ufn2 = (LPSTR)DOSFS_GetUnixFileName(fn2,FALSE);
+ if (!ufn2) {
+ SetLastError(ErrnoToLastError(ENOENT));
+ return FALSE;
+ }
+ ufn2 = xstrdup(ufn2);
+ if (-1==rename(ufn1,ufn2)) {
+ SetLastError(ErrnoToLastError(errno));
+ free(ufn1);
+ free(ufn2);
+ return FALSE;
+ }
+ free(ufn1);
+ free(ufn2);
+ return TRUE;
+}
+
+/**************************************************************************
+ * MoveFileW (KERNEL32.390)
+ */
+BOOL32 MoveFile32W(LPCWSTR fn1,LPCWSTR fn2)
+{
+ LPSTR afn1 = STRING32_DupUniToAnsi(fn1);
+ LPSTR afn2 = STRING32_DupUniToAnsi(fn2);
+ BOOL32 res;
+
+ res = MoveFile32A(afn1,afn2);
+ free(afn1);
+ free(afn2);
+ return res;
+}
diff --git a/win32/findfile.c b/win32/findfile.c
index 83b23a4..4520d2e 100644
--- a/win32/findfile.c
+++ b/win32/findfile.c
@@ -1,12 +1,13 @@
#include <sys/types.h>
#include <dirent.h>
#include <string.h>
+#include <ctype.h>
+#include <malloc.h>
#include "xmalloc.h"
#include "windows.h"
-#include "winbase.h"
#include "dos_fs.h"
#include "heap.h"
-#include <ctype.h>
+#include "string32.h"
#define PATH_LEN 260
@@ -55,7 +56,6 @@
/*************************************************************************
* FindNextFile32A (KERNEL32.126)
*/
-
BOOL32 FindNextFile32A(HANDLE32 handle, LPWIN32_FIND_DATA32A data)
{
FindFileContext32 *context;
@@ -89,6 +89,26 @@
}
/*************************************************************************
+ * FindNextFile32W (KERNEL32.127)
+ */
+BOOL32 FindNextFile32W(HANDLE32 handle, LPWIN32_FIND_DATA32W data)
+{
+ WIN32_FIND_DATA32A adata;
+
+ adata.dwFileAttributes = data->dwFileAttributes;
+ adata.ftCreationTime = data->ftCreationTime;
+ adata.ftLastAccessTime = data->ftLastAccessTime;
+ adata.ftLastWriteTime = data->ftLastWriteTime;
+ adata.nFileSizeHigh = data->nFileSizeHigh;
+ adata.nFileSizeLow = data->nFileSizeLow;
+ adata.dwReserved0 = data->dwReserved0;
+ adata.dwReserved1 = data->dwReserved1;
+ STRING32_UniToAnsi(adata.cFileName,data->cFileName);
+ STRING32_UniToAnsi(adata.cAlternateFileName,data->cAlternateFileName);
+ return FindNextFile32A(handle,&adata);
+}
+
+/*************************************************************************
* FindFirstFile32A (KERNEL32.123)
*/
@@ -140,9 +160,33 @@
}
/*************************************************************************
- * FindClose (KERNEL32.119)
+ * FindFirstFile32W (KERNEL32.124)
*/
-BOOL32 FindClose(HANDLE32 handle)
+HANDLE32 FindFirstFile32W(LPCWSTR filename,LPWIN32_FIND_DATA32W data)
+{
+ WIN32_FIND_DATA32A adata;
+ LPSTR afn = STRING32_DupUniToAnsi(filename);
+ HANDLE32 res;
+
+ adata.dwFileAttributes = data->dwFileAttributes;
+ adata.ftCreationTime = data->ftCreationTime;
+ adata.ftLastAccessTime = data->ftLastAccessTime;
+ adata.ftLastWriteTime = data->ftLastWriteTime;
+ adata.nFileSizeHigh = data->nFileSizeHigh;
+ adata.nFileSizeLow = data->nFileSizeLow;
+ adata.dwReserved0 = data->dwReserved0;
+ adata.dwReserved1 = data->dwReserved1;
+ STRING32_UniToAnsi(adata.cFileName,data->cFileName);
+ STRING32_UniToAnsi(adata.cAlternateFileName,data->cAlternateFileName);
+ res=FindFirstFile32A(afn,&adata);
+ free(afn);
+ return res;
+}
+
+/*************************************************************************
+ * FindClose32 (KERNEL32.119)
+ */
+BOOL32 FindClose32(HANDLE32 handle)
{
FindFileContext32 *context;
diff --git a/win32/init.c b/win32/init.c
index 4b4b7cb..e5e5af7 100644
--- a/win32/init.c
+++ b/win32/init.c
@@ -20,34 +20,29 @@
*/
int WIN32_LastError;
-/* Standard system handles for stdin, stdout, and stderr.
- */
-FILE_OBJECT *hstdin, *hstdout, *hstderr;
-
-static int CreateStdHandles(void);
-
/*********************************************************************
* CloseHandle (KERNEL32.23)
*/
BOOL CloseHandle(KERNEL_OBJECT *handle)
{
- int rc;
-
if(ValidateKernelObject(handle) != 0)
{
SetLastError(ERROR_INVALID_HANDLE);
return 0;
}
+ if (handle<0x1000) /* FIXME: hack */
+ return CloseFileHandle(handle);
switch(handle->magic)
{
case KERNEL_OBJECT_UNUSED:
SetLastError(ERROR_INVALID_HANDLE);
return 0;
-
+/* FIXME
case KERNEL_OBJECT_FILE:
rc = CloseFileHandle((FILE_OBJECT *)handle);
break;
+ */
default:
dprintf_win32(stddeb, "CloseHandle: type %ld not implemented yet.\n",
@@ -114,54 +109,5 @@
/* Initialize exception handling */
EXC_Init();
#endif
-
- /* Create the standard system handles
- */
- if(CreateStdHandles() != 0)
- return 0;
-
return 1;
}
-
-/* CreateStdHandles creates the standard input, output, and error handles.
- * These handles aren't likely to be used since they're generally used for
- * console output, but startup code still likes to mess with them. They're
- * also useful for debugging since apps and runtime libraries might write
- * errors to stderr.
- *
- * Returns 0 on success, nonzero on failure.
- */
-static int CreateStdHandles(void)
-{
- /* Create the standard input handle.
- */
- hstdin = (FILE_OBJECT *)CreateKernelObject(sizeof(FILE_OBJECT));
- if(hstdin == NULL)
- return 1;
- hstdin->common.magic = KERNEL_OBJECT_FILE;
- hstdin->fd = 0;
- hstdin->type = FILE_TYPE_CHAR;
- hstdin->misc_flags = 0;
-
- /* Create the standard output handle
- */
- hstdout = (FILE_OBJECT *)CreateKernelObject(sizeof(FILE_OBJECT));
- if(hstdout == NULL)
- return 1;
- hstdout->common.magic = KERNEL_OBJECT_FILE;
- hstdout->fd = 1;
- hstdout->type = FILE_TYPE_CHAR;
- hstdout->misc_flags = 0;
-
- /* Create the standard error handle
- */
- hstderr = (FILE_OBJECT *)CreateKernelObject(sizeof(FILE_OBJECT));
- if(hstderr == NULL)
- return 1;
- hstderr->common.magic = KERNEL_OBJECT_FILE;
- hstderr->fd = 2;
- hstderr->type = FILE_TYPE_CHAR;
- hstderr->misc_flags = 0;
-
- return 0;
-}
diff --git a/windows/defdlg.c b/windows/defdlg.c
index c91c607..d37f1bb 100644
--- a/windows/defdlg.c
+++ b/windows/defdlg.c
@@ -19,7 +19,7 @@
*/
static void DEFDLG_SetFocus( HWND hwndDlg, HWND hwndCtrl )
{
- HWND hwndPrev = GetFocus();
+ HWND32 hwndPrev = GetFocus32();
if (IsChild( hwndDlg, hwndPrev ))
{
@@ -28,7 +28,7 @@
}
if (SendMessage16( hwndCtrl, WM_GETDLGCODE, 0, 0 ) & DLGC_HASSETSEL)
SendMessage16( hwndCtrl, EM_SETSEL, FALSE, MAKELONG( 0, -1 ) );
- SetFocus( hwndCtrl );
+ SetFocus32( hwndCtrl );
}
@@ -37,7 +37,7 @@
*/
static BOOL DEFDLG_SaveFocus( HWND hwnd, DIALOGINFO *infoPtr )
{
- HWND hwndFocus = GetFocus();
+ HWND32 hwndFocus = GetFocus32();
if (!hwndFocus || !IsChild( hwnd, hwndFocus )) return FALSE;
infoPtr->hwndFocus = hwndFocus;
@@ -189,7 +189,7 @@
HWND hwndDest = (HWND)wParam;
if (!lParam)
{
- HWND hwndPrev = GetFocus();
+ HWND32 hwndPrev = GetFocus32();
if (!hwndPrev) /* Set focus to the first item */
hwndDest = DIALOG_GetFirstTabItem( hwnd );
else
diff --git a/windows/defwnd.c b/windows/defwnd.c
index b79fa4b..e1767ae 100644
--- a/windows/defwnd.c
+++ b/windows/defwnd.c
@@ -171,7 +171,7 @@
return MA_ACTIVATE;
case WM_ACTIVATE:
- if (LOWORD(wParam) != WA_INACTIVE) SetFocus( wndPtr->hwndSelf );
+ if (LOWORD(wParam) != WA_INACTIVE) SetFocus32( wndPtr->hwndSelf );
break;
case WM_ERASEBKGND:
diff --git a/windows/dialog.c b/windows/dialog.c
index 3f3bace..44511b3 100644
--- a/windows/dialog.c
+++ b/windows/dialog.c
@@ -599,7 +599,7 @@
if (dlgInfo->hUserFont)
SendMessage32A( hwnd, WM_SETFONT, (WPARAM)dlgInfo->hUserFont, 0 );
if (SendMessage32A(hwnd, WM_INITDIALOG, (WPARAM)dlgInfo->hwndFocus, param))
- SetFocus( dlgInfo->hwndFocus );
+ SetFocus32( dlgInfo->hwndFocus );
if (template.style & WS_VISIBLE) ShowWindow( hwnd, SW_SHOW );
return hwnd;
}
@@ -906,7 +906,7 @@
case VK_DOWN:
if (!(dlgCode & DLGC_WANTARROWS))
{
- SetFocus(GetNextDlgGroupItem(hwndDlg,GetFocus(),FALSE));
+ SetFocus32( GetNextDlgGroupItem(hwndDlg,GetFocus32(),FALSE) );
return TRUE;
}
break;
@@ -915,7 +915,7 @@
case VK_UP:
if (!(dlgCode & DLGC_WANTARROWS))
{
- SetFocus(GetNextDlgGroupItem(hwndDlg,GetFocus(),TRUE));
+ SetFocus32( GetNextDlgGroupItem(hwndDlg,GetFocus32(),TRUE) );
return TRUE;
}
break;
diff --git a/windows/event.c b/windows/event.c
index fb32363..3759ac0 100644
--- a/windows/event.c
+++ b/windows/event.c
@@ -26,6 +26,7 @@
#include "class.h"
#include "clipboard.h"
#include "debugger.h"
+#include "hook.h"
#include "message.h"
#include "module.h"
#include "options.h"
@@ -36,7 +37,6 @@
#include "debug.h"
#include "dde_proc.h"
-
#define NB_BUTTONS 3 /* Windows can handle 3 buttons */
/* X context to associate a hwnd to an X window */
@@ -287,7 +287,7 @@
* Return TRUE if an event is pending, FALSE on timeout or error
* (for instance lost connection with the server).
*/
-BOOL EVENT_WaitXEvent( BOOL sleep )
+BOOL32 EVENT_WaitXEvent( BOOL32 sleep )
{
fd_set read_set;
struct timeval timeout;
@@ -542,7 +542,7 @@
hardware_event( KeyStateTable[VK_MENU] & 0x80 ? WM_SYSKEYDOWN : WM_KEYDOWN,
vkey, keylp.lp2,
event->x_root - desktopX, event->y_root - desktopY,
- event->time, 0 );
+ event->time - MSG_WineStartTicks, 0 );
KeyDown = TRUE;
/* Currently we use reserved field in the scan-code byte to
@@ -572,7 +572,7 @@
hardware_event( sysKey & 0x80 ? WM_SYSKEYUP : WM_KEYUP,
vkey, keylp.lp2,
event->x_root - desktopX, event->y_root - desktopY,
- event->time, 0 );
+ event->time - MSG_WineStartTicks, 0 );
KeyDown = FALSE;
}
}
@@ -585,7 +585,7 @@
{
hardware_event( WM_MOUSEMOVE, EVENT_XStateToKeyState( event->state ), 0L,
event->x_root - desktopX, event->y_root - desktopY,
- event->time, 0 );
+ event->time - MSG_WineStartTicks, 0 );
}
@@ -624,7 +624,7 @@
hardware_event( messages[buttonNum],
EVENT_XStateToKeyState( event->state ), 0L,
event->x_root - desktopX, event->y_root - desktopY,
- event->time, 0 );
+ event->time - MSG_WineStartTicks, 0 );
}
@@ -642,7 +642,7 @@
hardware_event( messages[buttonNum],
EVENT_XStateToKeyState( event->state ), 0L,
event->x_root - desktopX, event->y_root - desktopY,
- event->time, 0 );
+ event->time - MSG_WineStartTicks, 0 );
}
@@ -653,7 +653,8 @@
{
if (event->detail == NotifyPointer) return;
if (hwnd != GetActiveWindow()) WINPOS_ChangeActiveWindow( hwnd, FALSE );
- if ((hwnd != GetFocus()) && !IsChild( hwnd, GetFocus())) SetFocus( hwnd );
+ if ((hwnd != GetFocus32()) && !IsChild( hwnd, GetFocus32()))
+ SetFocus32( hwnd );
}
@@ -666,7 +667,8 @@
{
if (event->detail == NotifyPointer) return;
if (hwnd == GetActiveWindow()) WINPOS_ChangeActiveWindow( 0, FALSE );
- if ((hwnd == GetFocus()) || IsChild( hwnd, GetFocus())) SetFocus( 0 );
+ if ((hwnd == GetFocus32()) || IsChild( hwnd, GetFocus32()))
+ SetFocus32( 0 );
}
@@ -850,7 +852,7 @@
void EVENT_EnterNotify( WND *pWnd, XCrossingEvent *event )
{
if( !Options.managed && rootWindow == DefaultRootWindow(display) &&
- (COLOR_GetSystemPaletteFlags() & COLOR_PRIVATE) && GetFocus() )
+ (COLOR_GetSystemPaletteFlags() & COLOR_PRIVATE) && GetFocus32() )
XInstallColormap( display, COLOR_GetColormap() );
}
*/
@@ -860,10 +862,10 @@
*/
void EVENT_MapNotify( HWND hWnd, XMapEvent *event )
{
- HWND hwndFocus = GetFocus();
+ HWND32 hwndFocus = GetFocus32();
if (hwndFocus && IsChild( hWnd, hwndFocus ))
- FOCUS_SetXFocus(hwndFocus);
+ FOCUS_SetXFocus( hwndFocus );
return;
}
diff --git a/windows/focus.c b/windows/focus.c
index f2c7f20..99654b7 100644
--- a/windows/focus.c
+++ b/windows/focus.c
@@ -7,6 +7,7 @@
*
*/
+#define NO_TRANSITION_TYPES /* This file is Win32-clean */
#include "win.h"
#include "winpos.h"
#include "hook.h"
@@ -14,7 +15,7 @@
#include "message.h"
#include "options.h"
-static HWND hwndFocus = 0;
+static HWND32 hwndFocus = 0;
/*****************************************************************
* FOCUS_SetXFocus
@@ -22,7 +23,7 @@
* Set the X focus.
* Explicit colormap management seems to work only with OLVWM.
*/
-void FOCUS_SetXFocus( HWND hwnd )
+void FOCUS_SetXFocus( HWND32 hwnd )
{
XWindowAttributes win_attr;
Window win;
@@ -55,25 +56,34 @@
/*****************************************************************
* FOCUS_SwitchFocus
*/
-void FOCUS_SwitchFocus(HWND hFocusFrom, HWND hFocusTo)
+void FOCUS_SwitchFocus( HWND32 hFocusFrom, HWND32 hFocusTo )
{
hwndFocus = hFocusTo;
- if (hFocusFrom) SendMessage16( hFocusFrom, WM_KILLFOCUS, (WPARAM)hFocusTo, 0L);
+ if (hFocusFrom) SendMessage32A( hFocusFrom, WM_KILLFOCUS, hFocusTo, 0 );
if( !hFocusTo || hFocusTo != hwndFocus )
return;
- SendMessage16( hFocusTo, WM_SETFOCUS, (WPARAM)hFocusFrom, 0L);
+ SendMessage32A( hFocusTo, WM_SETFOCUS, hFocusFrom, 0 );
FOCUS_SetXFocus( hFocusTo );
}
/*****************************************************************
- * SetFocus (USER.22)
+ * SetFocus16 (USER.22)
*/
-HWND SetFocus(HWND hwnd)
+HWND16 SetFocus16( HWND16 hwnd )
{
- HWND hWndPrevFocus, hwndTop = hwnd;
+ return (HWND16)SetFocus32( hwnd );
+}
+
+
+/*****************************************************************
+ * SetFocus32 (USER32.480)
+ */
+HWND32 SetFocus32( HWND32 hwnd )
+{
+ HWND32 hWndPrevFocus, hwndTop = hwnd;
WND *wndPtr = WIN_FindWndPtr( hwnd );
if (wndPtr)
@@ -91,7 +101,8 @@
if( hwnd == hwndFocus ) return hwnd;
/* call hooks */
- if( HOOK_CallHooks( WH_CBT, HCBT_SETFOCUS, (WPARAM)hwnd, (LPARAM)hwndFocus) )
+ if( HOOK_CallHooks( WH_CBT, HCBT_SETFOCUS, (WPARAM16)hwnd,
+ (LPARAM)hwndFocus) )
return 0;
/* activate hwndTop if needed. */
@@ -115,11 +126,18 @@
/*****************************************************************
- * GetFocus (USER.23)
+ * GetFocus16 (USER.23)
*/
-HWND GetFocus(void)
+HWND16 GetFocus16(void)
{
- return hwndFocus;
+ return (HWND16)hwndFocus;
}
+/*****************************************************************
+ * GetFocus32 (USER32.239)
+ */
+HWND32 GetFocus32(void)
+{
+ return hwndFocus;
+}
diff --git a/windows/hook.c b/windows/hook.c
index f29bf4b..6f9f09a 100644
--- a/windows/hook.c
+++ b/windows/hook.c
@@ -83,8 +83,7 @@
if (!(hQueue = GetTaskQueue( hTask ))) return 0;
}
- if (id == WH_JOURNALPLAYBACK || id == WH_CBT ||
- id == WH_DEBUG || id == WH_SHELL)
+ if (id == WH_CBT || id == WH_DEBUG || id == WH_SHELL)
{
fprintf( stdnimp, "Unimplemented hook set: (%d,%08lx,%04x,%04x)!\n",
id, (DWORD)proc, hInst, hTask );
diff --git a/windows/mdi.c b/windows/mdi.c
index 9dc0890..19b40a6 100644
--- a/windows/mdi.c
+++ b/windows/mdi.c
@@ -573,7 +573,7 @@
if( !hWndChild )
{
if( isActiveFrameWnd )
- SetFocus( clientInfo->self );
+ SetFocus32( clientInfo->self );
return 0;
}
@@ -588,11 +588,11 @@
if( isActiveFrameWnd )
{
SendMessage16( hWndChild, WM_NCACTIVATE, TRUE, 0L);
- if( GetFocus() == clientInfo->self )
+ if( GetFocus32() == clientInfo->self )
SendMessage16( clientInfo->self, WM_SETFOCUS,
(WPARAM)clientInfo->self, 0L );
else
- SetFocus( clientInfo->self );
+ SetFocus32( clientInfo->self );
}
#ifdef WINELIB32
@@ -1096,7 +1096,7 @@
{
w = WIN_FindWndPtr( ci->hwndActiveChild );
if( !(w->dwStyle & WS_MINIMIZE) )
- SetFocus( ci->hwndActiveChild );
+ SetFocus32( ci->hwndActiveChild );
}
return 0;
@@ -1214,7 +1214,7 @@
return 0;
case WM_SETFOCUS:
- SetFocus(hwndMDIClient);
+ SetFocus32(hwndMDIClient);
break;
case WM_SIZE:
diff --git a/windows/message.c b/windows/message.c
index b61ecb3..5dd9fae 100644
--- a/windows/message.c
+++ b/windows/message.c
@@ -215,7 +215,7 @@
/* Should check Ctrl-Esc and PrintScreen here */
- msg->hwnd = GetFocus();
+ msg->hwnd = GetFocus16();
if (!msg->hwnd)
{
/* Send the message to the active window instead, */
@@ -695,8 +695,8 @@
* 'hwnd' must be the handle of the dialog or menu window.
* 'code' is the message filter value (MSGF_??? codes).
*/
-BOOL MSG_InternalGetMessage( MSG16 *msg, HWND hwnd, HWND hwndOwner, short code,
- WORD flags, BOOL sendIdle )
+BOOL32 MSG_InternalGetMessage( MSG16 *msg, HWND32 hwnd, HWND32 hwndOwner,
+ WPARAM32 code, WORD flags, BOOL32 sendIdle )
{
for (;;)
{
diff --git a/windows/msgbox.c b/windows/msgbox.c
index bc73985..f019d41 100644
--- a/windows/msgbox.c
+++ b/windows/msgbox.c
@@ -142,7 +142,7 @@
hItem = GetDlgItem(hwnd, (i + 5) % 7 + 1);
if (GetWindowLong32A(hItem, GWL_STYLE) & WS_VISIBLE) {
if (buttons++ == ((lpmb->type & MB_DEFMASK) >> 8)) {
- SetFocus(hItem);
+ SetFocus32(hItem);
SendMessage32A( hItem, BM_SETSTYLE32, BS_DEFPUSHBUTTON, TRUE );
}
SetWindowPos(hItem, 0, bpos, tiheight, 0, 0,
diff --git a/windows/queue.c b/windows/queue.c
index b827727..ca6b4d9 100644
--- a/windows/queue.c
+++ b/windows/queue.c
@@ -411,7 +411,7 @@
{
if (wakeBit == QS_KEY)
{
- if (!(hwnd = GetFocus())) hwnd = GetActiveWindow();
+ if (!(hwnd = GetFocus32())) hwnd = GetActiveWindow();
}
else hwnd = GetCapture();
}
diff --git a/windows/win.c b/windows/win.c
index 626b35f..80debdf 100644
--- a/windows/win.c
+++ b/windows/win.c
@@ -549,6 +549,47 @@
WIN_LinkWindow( hwnd, (cs->style & WS_CHILD) ? HWND_BOTTOM : HWND_TOP );
+ /* Call the WH_CBT hook */
+
+ if (HOOK_GetHook( WH_CBT, GetTaskQueue(0) ))
+ {
+ CBT_CREATEWND16* cbtc;
+
+ if ((cbtc = SEGPTR_NEW(CBT_CREATEWND16)))
+ {
+ /* Dummy message params to use WINPROC_MapMsg functions */
+ UINT16 msg;
+ WPARAM16 wparam;
+ LPARAM lparam;
+
+ HWND hwndZnew = (cs->style & WS_CHILD) ? HWND_BOTTOM : HWND_TOP;
+
+ /* Map the CREATESTRUCT to 16-bit format */
+ lparam = (LPARAM)cs;
+ if (unicode)
+ WINPROC_MapMsg32WTo16( WM_CREATE, 0, &msg, &wparam, &lparam );
+ else
+ WINPROC_MapMsg32ATo16( WM_CREATE, 0, &msg, &wparam, &lparam );
+ cbtc->lpcs = (CREATESTRUCT16 *)lparam;
+ cbtc->hwndInsertAfter = hwndZnew;
+ wmcreate = !HOOK_CallHooks( WH_CBT, HCBT_CREATEWND, hwnd,
+ (LPARAM)SEGPTR_GET(cbtc) );
+ WINPROC_UnmapMsg32ATo16( WM_CREATE, 0, lparam );
+ if (hwndZnew != cbtc->hwndInsertAfter)
+ {
+ WIN_UnlinkWindow( hwnd );
+ WIN_LinkWindow( hwnd, cbtc->hwndInsertAfter );
+ }
+ SEGPTR_FREE(cbtc);
+ if (!wmcreate)
+ {
+ dprintf_win(stddeb,"CreateWindowEx: CBT-hook returned 0\n" );
+ WIN_DestroyWindow( hwnd );
+ return 0;
+ }
+ }
+ }
+
/* Send the WM_GETMINMAXINFO message and fix the size if needed */
if ((cs->style & WS_THICKFRAME) || !(cs->style & (WS_POPUP | WS_CHILD)))
@@ -1143,8 +1184,8 @@
{
/* Disable window */
wndPtr->dwStyle |= WS_DISABLED;
- if ((hwnd == GetFocus()) || IsChild( hwnd, GetFocus() ))
- SetFocus( 0 ); /* A disabled window can't have the focus */
+ if ((hwnd == GetFocus32()) || IsChild( hwnd, GetFocus32() ))
+ SetFocus32( 0 ); /* A disabled window can't have the focus */
if ((hwnd == GetCapture()) || IsChild( hwnd, GetCapture() ))
ReleaseCapture(); /* A disabled window can't capture the mouse */
SendMessage16( hwnd, WM_ENABLE, FALSE, 0 );
diff --git a/windows/winpos.c b/windows/winpos.c
index ba64e4e..48d43ee 100644
--- a/windows/winpos.c
+++ b/windows/winpos.c
@@ -54,7 +54,7 @@
* Find a suitable place for an iconic window.
* The new position is stored into wndPtr->ptIconPos.
*/
-void WINPOS_FindIconPos( HWND hwnd )
+void WINPOS_FindIconPos( HWND32 hwnd )
{
RECT16 rectParent;
short x, y, xspacing, yspacing;
@@ -711,12 +711,6 @@
MAKELONG(wndPtr->rectClient.left, wndPtr->rectClient.top) );
}
- if (hwnd == GetFocus())
- {
- SetFocus( (wndPtr->dwStyle & WS_CHILD)? wndPtr->parent->hwndSelf: 0 );
- if (hwnd == CARET_GetHwnd()) DestroyCaret();
- }
-
return wasVisible;
}
@@ -867,7 +861,7 @@
*
* back-end to SetActiveWindow
*/
-BOOL WINPOS_SetActiveWindow( HWND hWnd, BOOL fMouse, BOOL fChangeFocus )
+BOOL32 WINPOS_SetActiveWindow( HWND32 hWnd, BOOL32 fMouse, BOOL32 fChangeFocus)
{
WND *wndPtr = WIN_FindWndPtr(hWnd);
WND *wndTemp = WIN_FindWndPtr(hwndActive);
@@ -1010,9 +1004,9 @@
}
/* change focus if possible */
- if( fChangeFocus && GetFocus() )
- if( WIN_GetTopParent(GetFocus()) != hwndActive )
- FOCUS_SwitchFocus( GetFocus(),
+ if( fChangeFocus && GetFocus32() )
+ if( WIN_GetTopParent(GetFocus32()) != hwndActive )
+ FOCUS_SwitchFocus( GetFocus32(),
(wndPtr->dwStyle & WS_MINIMIZE)? 0: hwndActive);
/* if active wnd is minimized redraw icon title
@@ -1031,7 +1025,7 @@
* WINPOS_ChangeActiveWindow
*
*/
-BOOL WINPOS_ChangeActiveWindow( HWND hWnd, BOOL mouseMsg )
+BOOL32 WINPOS_ChangeActiveWindow( HWND32 hWnd, BOOL32 mouseMsg )
{
WND *wndPtr = WIN_FindWndPtr(hWnd);
@@ -1072,7 +1066,7 @@
* oldWindowRect, oldClientRect and winpos must be non-NULL only
* when calcValidRect is TRUE.
*/
-LONG WINPOS_SendNCCalcSize( HWND hwnd, BOOL calcValidRect,
+LONG WINPOS_SendNCCalcSize( HWND32 hwnd, BOOL32 calcValidRect,
RECT16 *newWindowRect, RECT16 *oldWindowRect,
RECT16 *oldClientRect, SEGPTR winpos,
RECT16 *newClientRect )
@@ -1831,8 +1825,13 @@
uFlags |= SMC_NOPARENTERASE;
}
- if ((winpos->hwnd == GetFocus()) || IsChild(winpos->hwnd, GetFocus()))
- SetFocus( GetParent32(winpos->hwnd) ); /* Revert focus to parent */
+ if ((winpos->hwnd == GetFocus32()) ||
+ IsChild( winpos->hwnd, GetFocus32()))
+ {
+ /* Revert focus to parent */
+ SetFocus32( GetParent32(winpos->hwnd) );
+ }
+ if (hwnd == CARET_GetHwnd()) DestroyCaret();
if (winpos->hwnd == hwndActive)
{
diff --git a/windows/winproc.c b/windows/winproc.c
index 8f2cc95..b1107e8 100644
--- a/windows/winproc.c
+++ b/windows/winproc.c
@@ -144,7 +144,7 @@
/* Check for a segmented pointer */
- if (!IsBadReadPtr( (SEGPTR)handle, sizeof(WINDOWPROC)-sizeof(proc->thunk)))
+ if (!IsBadReadPtr16((SEGPTR)handle,sizeof(WINDOWPROC)-sizeof(proc->thunk)))
{
ptr = (BYTE *)PTR_SEG_TO_LIN(handle);
if (!HEAP_IsInsideHeap( WinProcHeap, 0, ptr )) return NULL;