Exec a separate wine binary for every win32 process so that they run
in separate address spaces.
Run 16-bit tasks as Win32 threads, not processes.
diff --git a/loader/task.c b/loader/task.c
index cce67b5..7725545 100644
--- a/loader/task.c
+++ b/loader/task.c
@@ -274,11 +274,10 @@
* by entering the Win16Lock while linking the task into the
* global task list.
*/
-BOOL TASK_Create( NE_MODULE *pModule, UINT16 cmdShow)
+BOOL TASK_Create( NE_MODULE *pModule, UINT16 cmdShow, TEB *teb, LPCSTR cmdline, BYTE len )
{
HTASK16 hTask;
TDB *pTask;
- LPSTR cmd_line;
char name[10];
PDB *pdb32 = PROCESS_Current();
@@ -310,7 +309,7 @@
pTask->hParent = GetCurrentTask();
pTask->magic = TDB_MAGIC;
pTask->nCmdShow = cmdShow;
- pTask->teb = NtCurrentTeb();
+ pTask->teb = teb;
pTask->curdrive = DRIVE_GetCurrentDrive() | 0x80;
strcpy( pTask->curdir, "\\" );
lstrcpynA( pTask->curdir + 1, DRIVE_GetDosCwd( DRIVE_GetCurrentDrive() ),
@@ -349,11 +348,17 @@
/* Fill the command line */
- cmd_line = pdb32->env_db->cmd_line;
- while (*cmd_line && (*cmd_line != ' ') && (*cmd_line != '\t')) cmd_line++;
- while ((*cmd_line == ' ') || (*cmd_line == '\t')) cmd_line++;
- lstrcpynA( pTask->pdb.cmdLine+1, cmd_line, sizeof(pTask->pdb.cmdLine)-1);
- pTask->pdb.cmdLine[0] = strlen( pTask->pdb.cmdLine + 1 );
+ if (!cmdline)
+ {
+ cmdline = pdb32->env_db->cmd_line;
+ while (*cmdline && (*cmdline != ' ') && (*cmdline != '\t')) cmdline++;
+ while ((*cmdline == ' ') || (*cmdline == '\t')) cmdline++;
+ len = strlen(cmdline);
+ }
+ if (len >= sizeof(pTask->pdb.cmdLine)) len = sizeof(pTask->pdb.cmdLine)-1;
+ pTask->pdb.cmdLine[0] = len;
+ memcpy( pTask->pdb.cmdLine + 1, cmdline, len );
+ /* pTask->pdb.cmdLine[len+1] = 0; */
/* Get the compatibility flags */
@@ -384,10 +389,10 @@
/* Enter task handle into thread and process */
- pTask->teb->htask16 = pTask->teb->process->task = hTask;
+ teb->htask16 = hTask;
if (!initial_task) initial_task = hTask;
- TRACE("module='%s' cmdline='%s' task=%04x\n", name, cmd_line, hTask );
+ TRACE("module='%s' cmdline='%.*s' task=%04x\n", name, *cmdline, cmdline+1, hTask );
/* Add the task to the linked list */
@@ -932,7 +937,7 @@
hInstanceSelector = GlobalHandleToSel16(hInstance);
- TRACE("(%08lx, %04x);", (DWORD)func, hInstance);
+ TRACE("(%08lx, %04x);\n", (DWORD)func, hInstance);
if (!HIWORD(func)) {
/* Win95 actually protects via SEH, but this is better for debugging */
@@ -1168,8 +1173,8 @@
{
teb->queue = hQueue;
- if ( GetTaskQueue16( teb->process->task ) == oldQueue )
- SetTaskQueue16( teb->process->task, hQueue );
+ if ( GetTaskQueue16( teb->htask16 ) == oldQueue )
+ SetTaskQueue16( teb->htask16, hQueue );
}
return oldQueue;
@@ -1334,7 +1339,7 @@
*/
HTASK16 WINAPI GetCurrentTask(void)
{
- return PROCESS_Current()->task;
+ return NtCurrentTeb()->htask16;
}
DWORD WINAPI WIN16_GetCurrentTask(void)