Release 980413
Sun Apr 12 12:22:23 1997 Andreas Mohr <100.30936@germany.net>
* [files/drive.c]
Fixed "no free space" problem with partition sizes between 1 and 2 GB
(cluster_sectors may not exceed 0x40).
* [windows/msgbox.c] [if1632/user.spec] [include/windows.h]
Implemented MessageBoxIndirect16, corrected MSGBOXPARAMS16.
* [loader/task.c]
DOS environment strings may never exceed 127 chars
-> truncate Unix environment strings if necessary.
Sun Apr 12 02:51:44 1998 Dimitrie O. Paun <dimi@mail.cs.toronto.edu>
* [files/*.c]
All fprintf statements were converted to appropriate debug
messages.
* [tools/find_debug_channels]
Updated comments at the beginning of the file.
Sat Apr 11 15:27:21 1998 Alexandre Julliard <julliard@lrc.epfl.ch>
* [loader/module.c] [loader/task.c] [scheduler/process.c]
Moved some code around to prepare the ground for CreateProcess().
* [memory/environ.c] [loader/task.c]
Moved Win32 environment strings functions to environ.c.
Unified Win16 and Win32 environment management.
* [scheduler/handle.c] [scheduler/k32obj.c] [scheduler/*.c]
Implemented handle inheritance and DuplicateHandle().
* [scheduler/thread.c]
Create a 16-bit stack for all threads.
* [windows/dialog.c]
Implemented DIALOGEX resource format.
Fri Apr 10 20:21:51 1998 Marcus Meissner <marcus@mud.de>
* [configure.in][include/acconfig.h][*/*][multimedia/*]
Cleaned up the OSS detection stuff, added some more checks for
headerfiles/functions.
Removed a lot of OS specific #ifdefs.
Lots of dependend multimedia cleanups.
* [loader/pe_image.c]
Enhanced comment, added missing reference count increase.
* [ole/compobj.c]
Replaced broken StringFromGUID2 by working one.
* [misc/winsock.c]
SO_LINGER uses unsigned 16 bit in Win16 and Win32, but unsigned
int (32bit) for UNIX.
* [memory/global.c]
Allow realloc for lockcount 1 too.
Fri Apr 10 15:27:34 1998 Morten Welinder <terra@diku.dk>
* [graphics/x11drv/text.c]
Handle control characters in trace. Ignore terminating newline.
* [multimedia/init.c]
(MULTIMEDIA_Init): Correct allocations.
* [tools/examine-relay]
Tidy up.
* [windows/syscolor.c]
Change highlight colour from lightblue to lightgray. This
looks correct for menus.
Fri Apr 10 01:49:58 1998 Douglas Ridgway <ridgway@winehq.com>
* [configure.in] [Make.rules.in]
Add check for c2man before using it.
Fri Apr 10 02:59:21 1998 Douglas Ridgway <ridgway@winehq.com>
* [DEVELOPERS-HINTS]
Simple description of adding API calls.
* [include/wintypes.h] [include/windows.h]
Get rid of Winelib16, avoid declaring some illegal functions in
Winelib, add prototypes for some enhanced metafile functions, fix
GetTextExtentPoint32 declarations.
* [relay32/gdi32.spec] [objects/enhmetafile.c]
Cosmetic and functional improvements.
* [include/wincon.h] [programs/view/*]
Fixes, improved compatibility with native compilers.
Thu Apr 9 15:48:49 1998 Ulrich Weigand <weigand@informatik.uni-erlangen.de>
* [win32/kernel32.c]
Implemented FT_Thunk / FT_Prolog / FT_Exit / FT_PrologPrime.
Fixed Common32ThkLS thunk function.
* [tools/build.c] [relay32/relay386.c] [if1632/relay.c]
Changed relay code to allow register functions to modify stack layout.
* [memory/selector.c]
Implemented AllocMappedBuffer / FreeMappedBuffer.
* [relay32/kernel32.spec] [if1632/kernel.spec] [win32/ordinals.c]
Added names for undocumented functions.
* [loader/module.c]
Bugfix: LoadLibrary16 should *not* silently load 32-bit DLL.
Thu Apr 9 03:54:58 1998 Jim Peterson <jspeter@birch.ee.vt.edu>
* [windows/keyboard.c]
Fix an erroneous test in TranslateAccelerator{16,32} for the end
of the accelerator table.
Thu Apr 8 20:36:28 1998 Uwe Bonnes <bon@elektron.ikp.physik.tu-darmstadt.de>
* [misc/crtdll.c]
Implement getenv.
* [misc/commdlg.c]
Make Get[Save/Open]FileName work in most situations.
* [misc/lstr.c]
Use wvsprintf32A instead of vsprintf in FormatMessage32X
* [misc/version]
Make NT3.50 a recognised version
* [graphics/x11drv/graphics.c]
Change the algorithme to draw arcs
* [loader/resource.c]
Return an empty buffer in LoadString32A if no resource found.
* [win32/code_page.c]
Try harder to get the right size in MultiByteToWideChar.
* [win32/process.c]
Call WinExec32 for CreateProcess32A.
* [windows/user.c]
Install default Int0 Handler in InitApp().
Thu Apr 8 19:29:48 1998 Eric Kohl <ekohl@abo.rhein-zeitung.de>
* [misc/imagelist.c]
Preliminary fix for drawing selected images.
Various improvements.
* [controls/progress.c][include/progress.c][include/commctrl.h]
Added progress bar messages and styles for IE4.01 (dll version 4.72)
compatibility.
Fixed led size problem.
* [controls/updown.c][include/commctrl.h]
Added UDM_GETRANGE32 and UDM_SETRANGE32.
* [objects/oembitmaps.c][include/windows.h][include/bitmaps/*]
Added Win95 icons and fixed Win95 cursor and restore button bug.
Now they should be visible. Sorry!!!
* [relay32/comctl32.spec]
Added most missing function names.
Tue Apr 6 18:48:36 1998 Matthew Becker <mbecker@glasscity.net>
* [objects/font.c] [if1632/gdi.spec]
GetOutlineTextMetrics: stub
* [objects/text.c]
GetTextCharset should just call GetTextCharsetInfo.
* [misc/mpr.c] [relay32/mpr.spec]
WNetCachePassword: stub
* [scheduler/thread.c] [relay32/user32.spec]
AttachThreadInput: stub
Updated documentation.
* [objects/palette.c]
Updated documentation.
Tue Mar 31 17:06:30 1998 James Juran <jrj120@psu.edu>
* [*/*.c]
Finished fixing USER32 ordinal numbers in function documentation.
Mon Mar 30 20:27:38 1998 Morten Welinder <terra@diku.dk>
* [misc/debugstr.c] [include/debugstr.h]
Moved _dumpstr from relay32/relay386.c. Improved control
character handling.
* [msdos/int21.c]
Implement 215E00 -- get machine name.
* [windows/winpos.c]
SetWindowPos32: Make an extra sync when mapping managed
windows. This makes sure the reconfigure event has been
handled. See Mshearts' what's-your-name window.
Mon Mar 30 01:13:50 1998 Alexander V. Lukyanov <lav@long.yar.ru>
* [Makefile.in]
Install includes from TOPSRCDIR.
diff --git a/loader/task.c b/loader/task.c
index 31218b6..f168427 100644
--- a/loader/task.c
+++ b/loader/task.c
@@ -25,6 +25,7 @@
#include "queue.h"
#include "selectors.h"
#include "stackframe.h"
+#include "task.h"
#include "thread.h"
#include "toolhelp.h"
#include "winnt.h"
@@ -46,21 +47,8 @@
static HTASK16 hTaskToKill = 0;
static HTASK16 hLockedTask = 0;
static UINT16 nTaskCount = 0;
-static HGLOBAL16 hDOSEnvironment = 0;
-static HGLOBAL16 TASK_CreateDOSEnvironment(void);
-static void TASK_YieldToSystem(TDB*);
-
-
-/***********************************************************************
- * TASK_Init
- */
-BOOL32 TASK_Init(void)
-{
- if (!(hDOSEnvironment = TASK_CreateDOSEnvironment()))
- fprintf( stderr, "Not enough memory for DOS Environment\n" );
- return (hDOSEnvironment != 0);
-}
+static void TASK_YieldToSystem(TDB*);
/***********************************************************************
@@ -76,115 +64,6 @@
/***********************************************************************
- * TASK_CreateDOSEnvironment
- *
- * Create the original DOS environment.
- */
-static HGLOBAL16 TASK_CreateDOSEnvironment(void)
-{
- static const char program_name[] = "KRNL386.EXE";
- char **e, *p;
- int initial_size, size, i, winpathlen, sysdirlen;
- HGLOBAL16 handle;
-
- extern char **environ;
-
- /* DOS environment format:
- * ASCIIZ string 1
- * ASCIIZ string 2
- * ...
- * ASCIIZ string n
- * ASCIIZ PATH=xxx
- * BYTE 0
- * WORD 1
- * ASCIIZ program name (e.g. C:\WINDOWS\SYSTEM\KRNL386.EXE)
- */
-
- /* First compute the size of the fixed part of the environment */
-
- for (i = winpathlen = 0; ; i++)
- {
- int len = DIR_GetDosPath( i, NULL, 0 );
- if (!len) break;
- winpathlen += len + 1;
- }
- if (!winpathlen) winpathlen = 1;
- sysdirlen = GetSystemDirectory32A( NULL, 0 ) + 1;
- initial_size = 5 + winpathlen + /* PATH=xxxx */
- 1 + /* BYTE 0 at end */
- sizeof(WORD) + /* WORD 1 */
- sysdirlen + /* program directory */
- strlen(program_name) + 1; /* program name */
-
- /* Compute the total size of the Unix environment (except path) */
-
- for (e = environ, size = initial_size; *e; e++)
- {
- if (lstrncmpi32A(*e, "path=", 5))
- {
- int len = strlen(*e) + 1;
- if (size + len >= 32767)
- {
- fprintf( stderr, "Warning: environment larger than 32k.\n" );
- break;
- }
- size += len;
- }
- }
-
-
- /* Now allocate the environment */
-
- if (!(handle = GlobalAlloc16( GMEM_FIXED, size ))) return 0;
- p = (char *)GlobalLock16( handle );
-
- /* And fill it with the Unix environment */
-
- for (e = environ, size = initial_size; *e; e++)
- {
- if (lstrncmpi32A(*e, "path=", 5))
- {
- int len = strlen(*e) + 1;
- if (size + len >= 32767) break;
- strcpy( p, *e );
- size += len;
- p += len;
- }
- }
-
- /* Now add the path */
-
- strcpy( p, "PATH=" );
- for (i = 0, p += 5; ; i++)
- {
- if (!DIR_GetDosPath( i, p, winpathlen )) break;
- p += strlen(p);
- *p++ = ';';
- }
- if (p[-1] == ';') p[-1] = '\0';
- else p++;
-
- /* Now add the program name */
-
- *p++ = '\0';
- PUT_WORD( p, 1 );
- p += sizeof(WORD);
- GetSystemDirectory32A( p, sysdirlen );
- strcat( p, "\\" );
- strcat( p, program_name );
-
- /* Display it */
-
- p = (char *) GlobalLock16( handle );
- TRACE(task, "Master DOS environment at %p\n", p);
- for (; *p; p += strlen(p) + 1) TRACE(task, " %s\n", p);
- TRACE(task, "Progname: %s\n", p+3 );
-
- return handle;
-}
-
-
-/***********************************************************************
* TASK_LinkTask
*/
static void TASK_LinkTask( HTASK16 hTask )
@@ -390,51 +269,28 @@
/***********************************************************************
- * TASK_CreateTask
+ * TASK_Create
*/
-HTASK16 TASK_CreateTask( HMODULE16 hModule, HINSTANCE16 hInstance,
- HINSTANCE16 hPrevInstance, HANDLE16 hEnvironment,
- LPCSTR cmdLine, UINT16 cmdShow )
+HTASK16 TASK_Create( THDB *thdb, NE_MODULE *pModule, HINSTANCE16 hInstance,
+ HINSTANCE16 hPrevInstance, UINT16 cmdShow)
{
HTASK16 hTask;
TDB *pTask;
- PDB32 *pdb32;
- HGLOBAL16 hParentEnv;
- NE_MODULE *pModule;
- SEGTABLEENTRY *pSegTable;
- LPSTR name;
+ LPSTR name, cmd_line;
WORD sp;
char *stack32Top;
STACK16FRAME *frame16;
STACK32FRAME *frame32;
-
- if (!(pModule = MODULE_GetPtr( hModule ))) return 0;
- pSegTable = NE_SEG_TABLE( pModule );
+ PDB32 *pdb32 = thdb->process;
+ SEGTABLEENTRY *pSegTable = NE_SEG_TABLE( pModule );
/* Allocate the task structure */
hTask = GLOBAL_Alloc( GMEM_FIXED | GMEM_ZEROINIT, sizeof(TDB),
- hModule, FALSE, FALSE, FALSE );
+ pModule->self, FALSE, FALSE, FALSE );
if (!hTask) return 0;
pTask = (TDB *)GlobalLock16( hTask );
- /* Allocate the new environment block */
-
- if (!(hParentEnv = hEnvironment))
- {
- TDB *pParent = (TDB *)GlobalLock16( hCurrentTask );
- hParentEnv = pParent ? pParent->pdb.environment : hDOSEnvironment;
- }
- /* FIXME: do we really need to make a copy also when */
- /* we don't use the parent environment? */
- if (!(hEnvironment = GlobalAlloc16( GMEM_FIXED, GlobalSize16(hParentEnv))))
- {
- GlobalFree16( hTask );
- return 0;
- }
- memcpy( GlobalLock16( hEnvironment ), GlobalLock16( hParentEnv ),
- GlobalSize16( hParentEnv ) );
-
/* Fill the task structure */
pTask->nEvents = 1; /* So the task can be started */
@@ -447,10 +303,11 @@
pTask->version = pModule->expected_version;
pTask->hInstance = hInstance;
pTask->hPrevInstance = hPrevInstance;
- pTask->hModule = hModule;
+ pTask->hModule = pModule->self;
pTask->hParent = hCurrentTask;
pTask->magic = TDB_MAGIC;
pTask->nCmdShow = cmdShow;
+ pTask->thdb = thdb;
pTask->curdrive = DRIVE_GetCurrentDrive() | 0x80;
strcpy( pTask->curdir, "\\" );
lstrcpyn32A( pTask->curdir + 1, DRIVE_GetDosCwd( DRIVE_GetCurrentDrive() ),
@@ -462,13 +319,13 @@
/* Copy the module name */
- name = MODULE_GetModuleName( hModule );
+ name = MODULE_GetModuleName( pModule->self );
strncpy( pTask->module_name, name, sizeof(pTask->module_name) );
/* Allocate a selector for the PDB */
pTask->hPDB = GLOBAL_CreateBlock( GMEM_FIXED, &pTask->pdb, sizeof(PDB),
- hModule, FALSE, FALSE, FALSE, NULL );
+ pModule->self, FALSE, FALSE, FALSE, NULL );
/* Fill the PDB */
@@ -484,9 +341,15 @@
(int)&((PDB *)0)->fileHandles );
pTask->pdb.hFileHandles = 0;
memset( pTask->pdb.fileHandles, 0xff, sizeof(pTask->pdb.fileHandles) );
- pTask->pdb.environment = hEnvironment;
+ pTask->pdb.environment = pdb32->env_db->env_sel;
pTask->pdb.nbFiles = 20;
- lstrcpyn32A( pTask->pdb.cmdLine, cmdLine, sizeof(pTask->pdb.cmdLine) );
+
+ /* Fill the command line */
+
+ cmd_line = pdb32->env_db->cmd_line;
+ while (*cmd_line && (*cmd_line != ' ') && (*cmd_line != '\t')) cmd_line++;
+ lstrcpyn32A( pTask->pdb.cmdLine+1, cmd_line, sizeof(pTask->pdb.cmdLine)-1);
+ pTask->pdb.cmdLine[0] = strlen( pTask->pdb.cmdLine + 1 );
/* Get the compatibility flags */
@@ -507,33 +370,12 @@
pTask->dta = PTR_SEG_OFF_TO_SEGPTR( pTask->hPDB,
(int)&pTask->pdb.cmdLine - (int)&pTask->pdb );
- /* Create the Win32 part of the task */
-
- pdb32 = PROCESS_Create( pTask, cmdLine );
- /* FIXME: check for pdb32 == NULL. */
- pdb32->task = hTask;
- if (pModule->flags & NE_FFLAGS_WIN32)
- {
- /*
- LPTHREAD_START_ROUTINE start =
- (LPTHREAD_START_ROUTINE)(
- PROCESS_Current()->exe_modref->load_addr +
- PROCESS_Current()->exe_modref->pe_module->pe_header->OptionalHeader.AddressOfEntryPoint);
- */
- pTask->thdb = THREAD_Create( pdb32,
- PE_HEADER(pModule->module32)->OptionalHeader.SizeOfStackReserve,
- NULL, NULL );
- }
- else
- pTask->thdb = THREAD_Create( pdb32, 0, NULL, NULL );
- /* FIXME: check for pTask->thdb == NULL. */
-
/* Create the 16-bit stack frame */
if (!(sp = pModule->sp))
sp = pSegTable[pModule->ss-1].minsize + pModule->stack_size;
sp &= ~1;
- pTask->thdb->cur_stack = PTR_SEG_OFF_TO_SEGPTR( hInstance, sp );
+ pTask->thdb->cur_stack = PTR_SEG_OFF_TO_SEGPTR( pTask->hInstance, sp );
pTask->thdb->cur_stack -= sizeof(STACK16FRAME) + sizeof(STACK32FRAME *);
frame16 = (STACK16FRAME *)PTR_SEG_TO_LIN( pTask->thdb->cur_stack );
frame16->ebp = sp + (int)&((STACK16FRAME *)0)->bp;
@@ -564,7 +406,7 @@
TASK_LinkTask( hTask );
TRACE(task, "module='%s' cmdline='%s' task=%04x\n",
- name, cmdLine, hTask );
+ name, cmd_line, hTask );
return hTask;
}
@@ -840,6 +682,14 @@
*/
EAX_reg(context) = 1;
EBX_reg(context) = pTask->pdb.cmdLine[0] ? 0x81 : 0x80;
+
+ if (!pTask->pdb.cmdLine[0]) EBX_reg(context) = 0x80;
+ else
+ {
+ LPBYTE p = &pTask->pdb.cmdLine[1];
+ while ((*p == ' ') || (*p == '\t')) p++;
+ EBX_reg(context) = 0x80 + (p - pTask->pdb.cmdLine);
+ }
ECX_reg(context) = pModule->stack_size;
EDX_reg(context) = pTask->nCmdShow;
ESI_reg(context) = (DWORD)pTask->hPrevInstance;
@@ -1294,7 +1144,7 @@
TDB *pTask;
if (!(pTask = (TDB *)GlobalLock16( hCurrentTask ))) return 0;
- return (SEGPTR)WIN16_GlobalLock16( pTask->pdb.environment );
+ return PTR_SEG_OFF_TO_SEGPTR( pTask->pdb.environment, 0 );
}
@@ -1491,7 +1341,7 @@
/***********************************************************************
- * GetAppCompatFlags32 (USER32.205)
+ * GetAppCompatFlags32 (USER32.206)
*/
DWORD WINAPI GetAppCompatFlags32( HTASK32 hTask )
{