this serie of 4 patches is dedicated to moving all client console code from ntdll (DLL and directory) and put it into kernel (DLL and directory) 3 preliminary patches are necessary: 1/ one to fix the process creation code (and mode the console related bits from ntdll to kernel). This is done by 1/ moving the creation flag from a static var into the env db, and then let the kernel initialisation code take care of the console creation 2/ one to dispatch properly from ntdll some signals (by installing some hooks) 3/ the last one is to let the (Read|Write)File code (which is in ntdll) callback (Read|Write)Console (in kernel) by using a function pointer and getting its address dynamically. This may disappear when the file handling code is properly separated between ntdll and kernel 4/ then the remaining code from win32 directory is moved into dlls/kernel A+
Name: con_cp ChangeLog: moved console creation code while in CreateProcess from ntdll to kernel put most of Wine internal Wine structures into wine/process.h License: X11 GenDate: 2002/07/30 19:13:29 UTC ModifiedFiles: dlls/kernel/kernel_main.c memory/environ.c scheduler/process.c AddedFiles: include/wine/process.h =================================================================== RCS file: /home/cvs/cvsroot/wine/wine/dlls/kernel/kernel_main.c,v retrieving revision 1.29 diff -u -u -r1.29 kernel_main.c --- dlls/kernel/kernel_main.c 16 May 2002 20:32:16 -0000 1.29 +++ dlls/kernel/kernel_main.c 30 Jul 2002 18:56:49 -0000 @@ -24,20 +24,22 @@ #include <ctype.h> #include <string.h> #include <sys/stat.h> #include "winbase.h" #include "wine/winbase16.h" #include "wine/library.h" +#include "wine/process.h" #include "file.h" #include "global.h" #include "miscemu.h" #include "module.h" #include "task.h" +#include "wincon.h" extern void CODEPAGE_Init(void); extern BOOL RELAY_Init(void); /*********************************************************************** * KERNEL process initialisation routine @@ -45,6 +50,7 @@ static BOOL process_attach(void) { HMODULE16 hModule; + struct _PDB *pdb; /* Get the umask */ FILE_umask = umask(0777); @@ -99,6 +105,11 @@ /* Create the shared heap for broken win95 native dlls */ HeapCreate( HEAP_SHARED, 0, 0 ); + + pdb = (struct _PDB*)GetProcessDword(0, GPD_PDB); + if (pdb->flags & PDB32_CONSOLE_PROC && + (pdb->env_db->dwCreationFlags & CREATE_NEW_CONSOLE)) + AllocConsole(); return TRUE; } Index: memory/environ.c =================================================================== RCS file: /home/cvs/cvsroot/wine/wine/memory/environ.c,v retrieving revision 1.34 diff -u -u -r1.34 environ.c --- memory/environ.c 31 May 2002 23:06:52 -0000 1.34 +++ memory/environ.c 30 Jul 2002 08:43:23 -0000 @@ -33,27 +33,7 @@ #include "heap.h" #include "ntddk.h" #include "selectors.h" - -/* Win32 process environment database */ -typedef struct _ENVDB -{ - LPSTR env; /* 00 Process environment strings */ - DWORD unknown1; /* 04 Unknown */ - LPSTR cmd_line; /* 08 Command line */ - LPSTR cur_dir; /* 0c Current directory */ - STARTUPINFOA *startup_info; /* 10 Startup information */ - HANDLE hStdin; /* 14 Handle for standard input */ - HANDLE hStdout; /* 18 Handle for standard output */ - HANDLE hStderr; /* 1c Handle for standard error */ - DWORD unknown2; /* 20 Unknown */ - DWORD inherit_console; /* 24 Inherit console flag */ - DWORD break_type; /* 28 Console events flag */ - void *break_sem; /* 2c SetConsoleCtrlHandler semaphore */ - void *break_event; /* 30 SetConsoleCtrlHandler event */ - void *break_thread; /* 34 SetConsoleCtrlHandler thread */ - void *break_handlers; /* 38 List of console handlers */ -} ENVDB; - +#include "wine/process.h" /* Format of an environment block: * ASCIIZ string 1 (xx=yy format) @@ -74,7 +54,7 @@ /* Maximum length of a Win16 environment string (including NULL) */ #define MAX_WIN16_LEN 128 -STARTUPINFOA current_startupinfo = +static STARTUPINFOA current_startupinfo = { sizeof(STARTUPINFOA), /* cb */ 0, /* lpReserved */ Index: scheduler/process.c =================================================================== RCS file: /home/cvs/cvsroot/wine/wine/scheduler/process.c,v retrieving revision 1.191 diff -u -u -r1.191 process.c --- scheduler/process.c 23 Jul 2002 21:02:31 -0000 1.191 +++ scheduler/process.c 30 Jul 2002 11:57:29 -0000 @@ -34,13 +34,13 @@ #include "wine/winuser16.h" #include "wine/exception.h" #include "wine/library.h" +#include "wine/process.h" #include "drive.h" #include "module.h" #include "file.h" #include "heap.h" #include "thread.h" #include "winerror.h" -#include "wincon.h" #include "wine/server.h" #include "options.h" #include "wine/debug.h" @@ -50,72 +50,11 @@ WINE_DECLARE_DEBUG_CHANNEL(snoop); WINE_DECLARE_DEBUG_CHANNEL(win32); -struct _ENVDB; - -/* Win32 process database */ -typedef struct _PDB -{ - LONG header[2]; /* 00 Kernel object header */ - HMODULE module; /* 08 Main exe module (NT) */ - void *event; /* 0c Pointer to an event object (unused) */ - DWORD exit_code; /* 10 Process exit code */ - DWORD unknown2; /* 14 Unknown */ - HANDLE heap; /* 18 Default process heap */ - HANDLE mem_context; /* 1c Process memory context */ - DWORD flags; /* 20 Flags */ - void *pdb16; /* 24 DOS PSP */ - WORD PSP_sel; /* 28 Selector to DOS PSP */ - WORD imte; /* 2a IMTE for the process module */ - WORD threads; /* 2c Number of threads */ - WORD running_threads; /* 2e Number of running threads */ - WORD free_lib_count; /* 30 Recursion depth of FreeLibrary calls */ - WORD ring0_threads; /* 32 Number of ring 0 threads */ - HANDLE system_heap; /* 34 System heap to allocate handles */ - HTASK task; /* 38 Win16 task */ - void *mem_map_files; /* 3c Pointer to mem-mapped files */ - struct _ENVDB *env_db; /* 40 Environment database */ - void *handle_table; /* 44 Handle table */ - struct _PDB *parent; /* 48 Parent process */ - void *modref_list; /* 4c MODREF list */ - void *thread_list; /* 50 List of threads */ - void *debuggee_CB; /* 54 Debuggee context block */ - void *local_heap_free; /* 58 Head of local heap free list */ - DWORD unknown4; /* 5c Unknown */ - CRITICAL_SECTION crit_section; /* 60 Critical section */ - DWORD unknown5[3]; /* 78 Unknown */ - void *console; /* 84 Console */ - DWORD tls_bits[2]; /* 88 TLS in-use bits */ - DWORD process_dword; /* 90 Unknown */ - struct _PDB *group; /* 94 Process group */ - void *exe_modref; /* 98 MODREF for the process EXE */ - void *top_filter; /* 9c Top exception filter */ - DWORD priority; /* a0 Priority level */ - HANDLE heap_list; /* a4 Head of process heap list */ - void *heap_handles; /* a8 Head of heap handles list */ - DWORD unknown6; /* ac Unknown */ - void *console_provider; /* b0 Console provider (??) */ - WORD env_selector; /* b4 Selector to process environment */ - WORD error_mode; /* b6 Error mode */ - HANDLE load_done_evt; /* b8 Event for process loading done */ - void *UTState; /* bc Head of Univeral Thunk list */ - DWORD unknown8; /* c0 Unknown (NT) */ - LCID locale; /* c4 Locale to be queried by GetThreadLocale (NT) */ -} PDB; - PDB current_process; -/* Process flags */ -#define PDB32_DEBUGGED 0x0001 /* Process is being debugged */ -#define PDB32_WIN16_PROC 0x0008 /* Win16 process */ -#define PDB32_DOS_PROC 0x0010 /* Dos process */ -#define PDB32_CONSOLE_PROC 0x0020 /* Console process */ -#define PDB32_FILE_APIS_OEM 0x0040 /* File APIs are OEM */ -#define PDB32_WIN32S_PROC 0x8000 /* Win32s process */ - static char main_exe_name[MAX_PATH]; static char *main_exe_name_ptr = main_exe_name; static HANDLE main_exe_file; -static int main_create_flags; static unsigned int server_startticks; @@ -123,7 +62,6 @@ extern struct _ENVDB *ENV_InitStartupInfo( size_t info_size, char *main_exe_name, size_t main_exe_size ); extern BOOL ENV_BuildCommandLine( char **argv ); -extern STARTUPINFOA current_startupinfo; /* scheduler/pthread.c */ extern void PTHREAD_init_done(void); @@ -222,13 +160,13 @@ if ( dwFlags & USIG_FLAGS_GUI ) { /* Feedback defaults to ON */ - if ( !(current_startupinfo.dwFlags & STARTF_FORCEOFFFEEDBACK) ) + if ( !(current_envdb.startup_info->dwFlags & STARTF_FORCEOFFFEEDBACK) ) dwFlags |= USIG_FLAGS_FEEDBACK; } else { /* Feedback defaults to OFF */ - if (current_startupinfo.dwFlags & STARTF_FORCEONFEEDBACK) + if (current_envdb.startup_info->dwFlags & STARTF_FORCEONFEEDBACK) dwFlags |= USIG_FLAGS_FEEDBACK; } @@ -383,13 +321,13 @@ req->ppid = getppid(); if ((ret = !wine_server_call_err( req ))) { - main_exe_file = reply->exe_file; - main_create_flags = reply->create_flags; - info_size = reply->info_size; - server_startticks = reply->server_start; - current_startupinfo.hStdInput = reply->hstdin; - current_startupinfo.hStdOutput = reply->hstdout; - current_startupinfo.hStdError = reply->hstderr; + main_exe_file = reply->exe_file; + current_envdb.dwCreationFlags = reply->create_flags; + info_size = reply->info_size; + server_startticks = reply->server_start; + current_envdb.startup_info->hStdInput = reply->hstdin; + current_envdb.startup_info->hStdOutput = reply->hstdout; + current_envdb.startup_info->hStdError = reply->hstderr; } } SERVER_END_REQ; @@ -398,10 +336,10 @@ /* Create the process heap */ current_process.heap = HeapCreate( HEAP_GROWABLE, 0, 0 ); - if (main_create_flags == 0 && - current_startupinfo.hStdInput == 0 && - current_startupinfo.hStdOutput == 0 && - current_startupinfo.hStdError == 0) + if (current_envdb.dwCreationFlags == 0 && + current_envdb.startup_info->hStdInput == 0 && + current_envdb.startup_info->hStdOutput == 0 && + current_envdb.startup_info->hStdError == 0) { /* no parent, and no new console requested, create a simple console with bare handles to * unix stdio input & output streams (aka simple console) @@ -414,11 +352,11 @@ wine_server_fd_to_handle( 1, GENERIC_WRITE|SYNCHRONIZE, TRUE, &handle ); SetStdHandle( STD_ERROR_HANDLE, handle ); } - else if (!(main_create_flags & (DETACHED_PROCESS|CREATE_NEW_CONSOLE))) + else if (!(current_envdb.dwCreationFlags & (DETACHED_PROCESS|CREATE_NEW_CONSOLE))) { - SetStdHandle( STD_INPUT_HANDLE, current_startupinfo.hStdInput ); - SetStdHandle( STD_OUTPUT_HANDLE, current_startupinfo.hStdOutput ); - SetStdHandle( STD_ERROR_HANDLE, current_startupinfo.hStdError ); + SetStdHandle( STD_INPUT_HANDLE, current_envdb.startup_info->hStdInput ); + SetStdHandle( STD_OUTPUT_HANDLE, current_envdb.startup_info->hStdOutput ); + SetStdHandle( STD_ERROR_HANDLE, current_envdb.startup_info->hStdError ); } /* Now we can use the pthreads routines */ @@ -472,7 +410,6 @@ if (console_app) { current_process.flags |= PDB32_CONSOLE_PROC; - if (main_create_flags & CREATE_NEW_CONSOLE) AllocConsole(); } /* Signal the parent process to continue */ @@ -1347,30 +1284,30 @@ return (DWORD)¤t_process; case GPD_STARTF_SHELLDATA: /* return stdoutput handle from startupinfo ??? */ - return current_startupinfo.hStdOutput; + return current_envdb.startup_info->hStdOutput; case GPD_STARTF_HOTKEY: /* return stdinput handle from startupinfo ??? */ - return current_startupinfo.hStdInput; + return current_envdb.startup_info->hStdInput; case GPD_STARTF_SHOWWINDOW: - return current_startupinfo.wShowWindow; + return current_envdb.startup_info->wShowWindow; case GPD_STARTF_SIZE: - x = current_startupinfo.dwXSize; + x = current_envdb.startup_info->dwXSize; if ( (INT)x == CW_USEDEFAULT ) x = CW_USEDEFAULT16; - y = current_startupinfo.dwYSize; + y = current_envdb.startup_info->dwYSize; if ( (INT)y == CW_USEDEFAULT ) y = CW_USEDEFAULT16; return MAKELONG( x, y ); case GPD_STARTF_POSITION: - x = current_startupinfo.dwX; + x = current_envdb.startup_info->dwX; if ( (INT)x == CW_USEDEFAULT ) x = CW_USEDEFAULT16; - y = current_startupinfo.dwY; + y = current_envdb.startup_info->dwY; if ( (INT)y == CW_USEDEFAULT ) y = CW_USEDEFAULT16; return MAKELONG( x, y ); case GPD_STARTF_FLAGS: - return current_startupinfo.dwFlags; + return current_envdb.startup_info->dwFlags; case GPD_PARENT: return 0; --- /dev/null Thu Jan 1 01:00:00 1970 +++ include/wine/process.h Tue Jul 30 13:57:42 2002 @@ -0,0 +1,103 @@ +/* + * Win32 processes + * + * Copyright 1996, 1998 Alexandre Julliard + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifdef __WINE__ + +/* Win32 process environment database */ +typedef struct _ENVDB +{ + LPSTR env; /* 00 Process environment strings */ + DWORD dwCreationFlags; /* 04 Unknown: in Wine, flags from CreateProcess parameters */ + LPSTR cmd_line; /* 08 Command line */ + LPSTR cur_dir; /* 0c Current directory */ + STARTUPINFOA *startup_info; /* 10 Startup information */ + HANDLE hStdin; /* 14 Handle for standard input */ + HANDLE hStdout; /* 18 Handle for standard output */ + HANDLE hStderr; /* 1c Handle for standard error */ + DWORD unknown2; /* 20 Unknown */ + DWORD inherit_console; /* 24 Inherit console flag */ + DWORD break_type; /* 28 Console events flag */ + void *break_sem; /* 2c SetConsoleCtrlHandler semaphore */ + void *break_event; /* 30 SetConsoleCtrlHandler event */ + void *break_thread; /* 34 SetConsoleCtrlHandler thread */ + void *break_handlers; /* 38 List of console handlers */ +} ENVDB; + +extern ENVDB current_envdb; + +/* Win32 process database */ +typedef struct _PDB +{ + LONG header[2]; /* 00 Kernel object header */ + HMODULE module; /* 08 Main exe module (NT) */ + void *event; /* 0c Pointer to an event object (unused) */ + DWORD exit_code; /* 10 Process exit code */ + DWORD unknown2; /* 14 Unknown */ + HANDLE heap; /* 18 Default process heap */ + HANDLE mem_context; /* 1c Process memory context */ + DWORD flags; /* 20 Flags */ + void *pdb16; /* 24 DOS PSP */ + WORD PSP_sel; /* 28 Selector to DOS PSP */ + WORD imte; /* 2a IMTE for the process module */ + WORD threads; /* 2c Number of threads */ + WORD running_threads; /* 2e Number of running threads */ + WORD free_lib_count; /* 30 Recursion depth of FreeLibrary calls */ + WORD ring0_threads; /* 32 Number of ring 0 threads */ + HANDLE system_heap; /* 34 System heap to allocate handles */ + HTASK task; /* 38 Win16 task */ + void *mem_map_files; /* 3c Pointer to mem-mapped files */ + struct _ENVDB *env_db; /* 40 Environment database */ + void *handle_table; /* 44 Handle table */ + struct _PDB *parent; /* 48 Parent process */ + void *modref_list; /* 4c MODREF list */ + void *thread_list; /* 50 List of threads */ + void *debuggee_CB; /* 54 Debuggee context block */ + void *local_heap_free; /* 58 Head of local heap free list */ + DWORD unknown4; /* 5c Unknown */ + CRITICAL_SECTION crit_section; /* 60 Critical section */ + DWORD unknown5[3]; /* 78 Unknown */ + void *console; /* 84 Console */ + DWORD tls_bits[2]; /* 88 TLS in-use bits */ + DWORD process_dword; /* 90 Unknown */ + struct _PDB *group; /* 94 Process group */ + void *exe_modref; /* 98 MODREF for the process EXE */ + void *top_filter; /* 9c Top exception filter */ + DWORD priority; /* a0 Priority level */ + HANDLE heap_list; /* a4 Head of process heap list */ + void *heap_handles; /* a8 Head of heap handles list */ + DWORD unknown6; /* ac Unknown */ + void *console_provider; /* b0 Console provider (??) */ + WORD env_selector; /* b4 Selector to process environment */ + WORD error_mode; /* b6 Error mode */ + HANDLE load_done_evt; /* b8 Event for process loading done */ + void *UTState; /* bc Head of Univeral Thunk list */ + DWORD unknown8; /* c0 Unknown (NT) */ + LCID locale; /* c4 Locale to be queried by GetThreadLocale (NT) */ +} PDB; + +/* Process flags */ +#define PDB32_DEBUGGED 0x0001 /* Process is being debugged */ +#define PDB32_WIN16_PROC 0x0008 /* Win16 process */ +#define PDB32_DOS_PROC 0x0010 /* Dos process */ +#define PDB32_CONSOLE_PROC 0x0020 /* Console process */ +#define PDB32_FILE_APIS_OEM 0x0040 /* File APIs are OEM */ +#define PDB32_WIN32S_PROC 0x8000 /* Win32s process */ + +#endif