Release 950430
Sat Apr 29 20:42:01 1995 Alexandre Julliard (julliard@sunsite.unc.edu)
* [controls/static.c]
Fixed painting of SS_*FRAME controls.
* [if1632/callback.c]
Pass the window instance as DS to the 16-bit window procedure.
Rewrote Catch() and Throw() to make them work with multiple tasks.
* [loader/main.c]
New function MAIN_Init() to perform initializations before the
first task is started instead of doing them in InitApp().
Temporary hack to command-line parsing to load one program per
command-line argument, to make testing task-switching easier.
* [loader/*.c]
Reimplemented modules to use a Windows-compatible layout and to
allow multiple tasks and multiple module instances. Not really
finished yet.
* [loader/task.c] [misc/exec.c]
Reimplemented tasks to use a common address space, and implemented
preliminary task-switching capabilities.
* [memory/global.c]
Fixed bug in GlobalNext().
* [misc/main.c]
Updated the list of contributors. Let me know if I forgot someone.
* [miscemu/int21.c]
Use one DTA per task instead of a global one.
* [objects/bitblt.c]
Fixed bug in BitBlt() that could cause BadMatch errors.
* [tools/build.c]
Added new function type 'stub', that makes possible to export an
unimplemented function by name as well as by ordinal. This will
avoid loading errors for unimplemented functions.
Generate an in-memory module layout for built-in DLLs so that the
same code can be used for built-in and loaded modules.
Changed relay code to make it unnecessary to save the value of the
BP register.
* [windows/message.c]
Implemented multiple message queues and preliminary task-switching
capabilities. Inter-task SendMessage() calls are not implemented
yet and will probably cause crashes if used.
* [windows/property.c]
Reimplemented properties and allocate them on the USER heap.
* [windows/win.c]
Fixed bug in SetWindowWord().
Reimplemented EnumWindows() and EnumTaskWindows().
Tue Apr 18 09:48:38 1995 Bernd Schmidt <crux@pool.informatik.rwth-aachen.de>
* [misc/main.c]
GetSystemParametersInfo(): Additional action SPI_GETICONTITLEFONT.
* [loader/resource.c]
Removed the check for NE_SEGFLAGS_EXECUTEONLY, since it broke
control.exe.
Fixed icon loading.
* [objects/font.c] [include/windows.h]
Fixed a bug in InitFontsList() and worked on the EnumFonts()
functions to make them comprehensible.
* [controls/button.c]
Fixed my previous patch to handle LBUTTONUP messages.
Fri Apr 14 11:41:28 1995 Cameron Heide (heide@ee.ualberta.ca)
* [misc/network.c, misc/dos_fs.c]
Implemented WNetGetConnection. All that is currently
supported are drives, for which the remote name is simply
the redirected UNIX directory name.
* [miscemu/int2?.c]
More drive number validity checking.
Wed Apr 12 11:28:37 1995 Bernd Schmidt <crux@pool.informatik.rwth-aachen.de>
* [controls/listbox.c]
Oops, my previous change to ListBoxDirectory broke the Borland
file open dialog. Fixed.
Mon Apr 10 23:17:12 1995 Martin von Loewis <loewis@informatik.hu-berlin.de>
* [if1632/ole2nls.spec] [misc/ole2nls.c] [misc/Imakefile]
New file ole2nls.c. Added stubs for GetUserDefaultLCID,
GetSystemDefaultLCID, GetUserDefaultLangID, GetSystemDefaultLangID.
Mon Apr 10 10:05:18 1995 Bernd Schmidt <crux@pool.informatik.rwth-aachen.de>
* [memory/global.c] [memory/local.c] [include/windows.h]
GlobalReAlloc(): If GMEM_MODIFY is set, don't resize the block.
LocalReAlloc(): Same for LMEM_MODIFY.
* [controls/listbox.c]
Fixed a bug in ListBoxDirectory that prevented commdlg from working.
Check for errors in some more places.
* [if1632/gdi.spec] [if1632/user.spec]
16 bit callback functions should be passed as segptrs.
* [include/dlls.h] [loader/ne_image.c] [loader/selector.c]
[loader/library.c]
Prevent a DLL from being initialized twice (Borlands Resource
Workshop used to do this).
Provide an additional flag for each w_file that indicates whether
it's an EXE or a DLL, for combinations like pbrush.exe/.dll.
* [controls/button.c]
Handle LBUTTONUP messages even if the button no longer has the
capture (for WinHelp).
* [include/wintypes.h]
FARPROC is now a segptr for the emulator and a function
pointer for the library.
* [misc/commdlg.c] [misc/commdlg.h]
Cleaned the file dialogs up a little. They now work reasonably well,
although there are still some problems (e.g. files are initially
invisible).
* [windows/class.c] [if1632/user.spec] [include/windows.h]
GetClassInfo() must take a segptr, as it checks whether the
highword is zero.
GetClassName() called the wrong atom function. No surprise it didn't
find anything.
* [misc/lstr.c]
AnsiToOem() and OemToAnsi() didn't terminate the strings. Fixed.
Removed some warnings.
* [if1632/relay.c] [if1632/ddeml.spec] [include/dlls.h]
New spec file for the 3.1 DDEML DDL.
* [controls/menu.c]
Small fix to ChangeMenu - mask out the obsolete flags
(MF_APPEND == MF_OWNERDRAW, this led to problems). It also had
problems with the MF_BYPOSITION flag.
* [windows/message.c]
SendMessage(): call the WH_CALLWNDPROC hook function. This is rather
ugly, I'm afraid. Windows probably passes a pointer to the 16 bit
stack for speed reasons.
* [windows/hook.c] [include/windows.h]
Set/HookWindowsHook() shouldn't just call their *Ex counterparts, as
they have slightly different semantics.
MS Hearts now works somewhat, if you disable the new builtin DDEML.
The graphics are completely messed up, though.
diff --git a/include/task.h b/include/task.h
index 8be9787..a69fea7 100644
--- a/include/task.h
+++ b/include/task.h
@@ -1,27 +1,114 @@
/*
* Task definitions
+ *
+ * Copyright 1995 Alexandre Julliard
*/
-#ifndef TASK_H
-#define TASK_H
+#ifndef _WINE_TASK_H
+#define _WINE_TASK_H
-#include "toolhelp.h"
+#include "wintypes.h"
-typedef struct {
- TASKENTRY te;
- int unix_pid;
- HICON hIcon;
- HWND *lpWndList;
- void *lpPrevTask;
- void *lpNextTask;
-} WINETASKENTRY;
-typedef WINETASKENTRY *LPWINETASKENTRY;
+#ifndef WINELIB
+#pragma pack(1)
+#endif
-#define MAXWIN_PER_TASK 256
+ /* Process database (i.e. a normal DOS PSP) */
-HANDLE CreateNewTask(HINSTANCE hInst, HTASK hTaskParent);
-BOOL RemoveWindowFromTask(HTASK hTask, HWND hWnd);
-BOOL AddWindowToTask(HTASK hTask, HWND hWnd);
+typedef struct
+{
+ WORD int20; /* int 20h instruction */
+ WORD nextParagraph; /* Segment of next paragraph */
+ BYTE reserved1;
+ BYTE dispatcher[5]; /* Long call to DOS */
+ DWORD savedint22; /* Saved int 22h handler */
+ DWORD savedint23; /* Saved int 23h handler */
+ DWORD savedint24; /* Saved int 24h handler */
+ WORD parentPSP; /* Selector of parent PSP */
+ BYTE fileHandles[20]; /* Open file handles */
+ HANDLE environment; /* Selector of environment */
+ WORD reserved2[23];
+ BYTE fcb1[16]; /* First FCB */
+ BYTE fcb2[20]; /* Second FCB */
+ BYTE cmdLine[128]; /* Command-line (first byte is length) */
+} PDB;
-#endif /* TASK_H */
+ /* Segment containing MakeProcInstance() thunks */
+typedef struct
+{
+ WORD next; /* Selector of next segment */
+ WORD magic; /* Thunks signature */
+ WORD unused;
+ WORD free; /* Head of the free list */
+ WORD thunks[4]; /* Each thunk is 4 words long */
+} THUNKS;
+
+#define THUNK_MAGIC ('P' | ('T' << 8))
+
+
+ /* Task database. See 'Windows Internals' p. 226 */
+typedef struct
+{
+ HTASK hNext; /* Selector of next TDB */
+ WORD sp; /* Stack pointer of task */
+ WORD ss; /* Stack segment of task */
+ WORD nEvents; /* Events for this task */
+ char priority; /* Task priority, between -32 and 15 */
+ BYTE unused1;
+ HGLOBAL hStack32; /* Handle to 32-bit stack */
+ WORD hSelf; /* Selector of this TDB */
+ WORD unused3;
+ DWORD esp; /* 32-bit stack pointer */
+ WORD ctrlword8087; /* 80x87 control word */
+ WORD flags; /* Task flags */
+ WORD error_flags; /* Error handling flags */
+ WORD version; /* Expected Windows version */
+ HANDLE hInstance; /* Instance handle for this task */
+ HMODULE hModule; /* Module handle */
+ HANDLE hQueue; /* Selector of task message queue */
+ HTASK hParent; /* Selector of TDB of parent task */
+ WORD signal_flags; /* Flags related to signal handler */
+ DWORD sighandler WINE_PACKED; /* Signal handler */
+ DWORD userhandler WINE_PACKED; /* USER signal handler */
+ DWORD discardhandler WINE_PACKED; /* Handler for GlobalDiscard() */
+ DWORD int0 WINE_PACKED; /* int 0 (divide by zero) handler */
+ DWORD int2 WINE_PACKED; /* int 2 (NMI) handler */
+ DWORD int4 WINE_PACKED; /* int 4 (INTO) handler */
+ DWORD int6 WINE_PACKED; /* int 6 (invalid opcode) handler */
+ DWORD int7 WINE_PACKED; /* int 7 (coprocessor) handler */
+ DWORD int3e WINE_PACKED; /* int 3e (80x87 emulator) handler */
+ DWORD int75 WINE_PACKED; /* int 75 (80x87 error) handler */
+ DWORD compat_flags WINE_PACKED; /* Compatibility flags */
+ BYTE unused4[14];
+ HANDLE hPDB; /* Selector of PDB (i.e. PSP) */
+ DWORD dta WINE_PACKED; /* Current DTA */
+ BYTE curdrive; /* Current drive */
+ BYTE curdir[65]; /* Current directory */
+ WORD unused5;
+ HTASK hYieldTo; /* Next task to schedule */
+ DWORD dlls_to_init; /* Ptr to list of DLL to initialize */
+ HANDLE hCSAlias; /* Code segment alias for this TDB */
+ THUNKS thunks WINE_PACKED; /* Make proc instance thunks */
+ WORD more_thunks[6*4]; /* Space for 6 more thunks */
+ BYTE module_name[8]; /* Module name for task */
+ WORD magic; /* TDB signature */
+ DWORD unused7;
+ PDB pdb; /* PDB for this task */
+} TDB;
+
+#define TDB_MAGIC ('T' | ('D' << 8))
+
+ /* TDB flags */
+#define TDBF_WINOLDAP 0x0001
+#define TDBF_OS2APP 0x0008
+#define TDBF_WIN32S 0x0010
+
+#ifndef WINELIB
+#pragma pack(4)
+#endif
+
+ /* TASK_Reschedule() 16-bit entry point */
+extern FARPROC RELAY_RescheduleProcAddr;
+
+#endif /* _WINE_TASK_H */