Convert to unix line endings.
[wincetools.git] / loader / kernel32_process.c
1 /* From wine1.2-1.1.42/dlls/kernel32/process.c  */
2
3 /*
4  * Win32 processes
5  *
6  * Copyright 1996, 1998 Alexandre Julliard
7  * Copyright 2010 g10 Code GmbH
8  *
9  * This library is free software; you can redistribute it and/or
10  * modify it under the terms of the GNU Lesser General Public
11  * License as published by the Free Software Foundation; either
12  * version 2.1 of the License, or (at your option) any later version.
13  *
14  * This library is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
17  * Lesser General Public License for more details.
18  *
19  * You should have received a copy of the GNU Lesser General Public
20  * License along with this library; if not, write to the Free Software
21  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
22  */
23
24 #include <windef.h>
25 #include "wine.h"
26 #include "kernel32_kernel_private.h"
27
28 \f
29 typedef int (APIENTRY *ENTRY_POINT) (HINSTANCE hInstance,
30                                      HINSTANCE hPrevInstance,
31                                      LPWSTR lpCmdLine, int nCmdShow);
32
33 static BOOL start_process( PEB *peb )
34 {
35   IMAGE_NT_HEADERS *nt;
36   ENTRY_POINT entry;
37   
38   nt = MyRtlImageNtHeader( peb->ImageBaseAddress );
39   entry = (ENTRY_POINT)((char *)peb->ImageBaseAddress +
40                         nt->OptionalHeader.AddressOfEntryPoint);
41   
42   if (!nt->OptionalHeader.AddressOfEntryPoint)
43     {
44       ERR( "%S doesn't have an entry point, it cannot be executed\n",
45              peb->ImagePathName );
46       SetLastError (ERROR_BAD_EXE_FORMAT);
47       return FALSE;
48     }
49
50   TRACE( "Starting process %S (entryproc=%p)\n",
51          peb->ImagePathName, entry );
52
53   SetLastError( 0 );  /* clear error code */
54   peb->ExitStatus = entry (GetModuleHandle (NULL), NULL, peb->CommandLine, 0);
55
56   return 0;
57 }
58
59
60 static BOOL __wine_kernel_init (HANDLE hFile, LPCWSTR main_exe_name,
61                                 LPWSTR cmd_line, int *exit_code)
62 {
63   PEB *peb = current_peb();
64
65   peb->CommandLine = cmd_line;
66   peb->ImageBaseAddress = MyLoadLibraryExW( main_exe_name, 0,
67                                             DONT_RESOLVE_DLL_REFERENCES );
68
69   if (! peb->ImageBaseAddress)
70     {
71       ERR ("can not load %S: %i\n", main_exe_name, GetLastError());
72       return FALSE;
73     }
74
75   /* FIXME: Error checking?  */
76   MyLdrInitializeThunk( start_process, 0, 0, 0 );
77
78   *exit_code = peb->ExitStatus;
79   return TRUE;
80 }
81
82
83 static HANDLE open_exe_file (LPCWSTR name, struct binary_info *binary_info)
84 {
85   HANDLE handle;
86   
87   handle = CreateFileForMappingW( name, GENERIC_READ, FILE_SHARE_READ,
88                                   NULL, OPEN_EXISTING, 0, 0 );
89   if (handle != INVALID_HANDLE_VALUE)
90     MODULE_get_binary_info( handle, binary_info );
91   
92   return handle;
93 }
94
95
96 BOOL MyCreateProcessW (LPCWSTR app_name, LPWSTR cmd_line,
97                        int *exit_code)
98 {
99   BOOL retv = FALSE;
100   HANDLE hFile = 0;
101   struct binary_info binary_info;
102   
103   hFile = open_exe_file (app_name, &binary_info);
104   if (hFile == INVALID_HANDLE_VALUE)
105     {
106       ERR ("could not open file %S: %i\n", app_name, GetLastError());
107       goto err;
108     }
109   
110   TRACE ("MyCreateProcessW: 0x%p type=0x%x flags=0x%x "
111          "res_start=0x%p res_end=0x%p\n",
112          hFile, binary_info.type, binary_info.flags,
113          binary_info.res_start, binary_info.res_end);
114
115   /* Some sanity checks.  */
116   if (binary_info.flags & BINARY_FLAG_DLL)
117     {
118       ERR ("not starting %S since it is a DLL\n", app_name);
119       SetLastError( ERROR_BAD_EXE_FORMAT );
120       goto err;
121     }
122
123   if (binary_info.flags & BINARY_FLAG_64BIT)
124     {
125       ERR( "starting 64-bit process %S not supported on this platform\n",
126            app_name);
127       SetLastError( ERROR_BAD_EXE_FORMAT );
128       return FALSE;
129     }
130
131   if (binary_info.type != BINARY_PE)
132     {
133       ERR ("not starting %S of type %i (expected %i)\n", app_name,
134            binary_info.type, BINARY_PE);
135       SetLastError( ERROR_BAD_EXE_FORMAT );
136       return FALSE;
137     }
138
139   retv = __wine_kernel_init (hFile, app_name, cmd_line, exit_code);
140
141  err:
142   if (hFile)
143     CloseHandle( hFile );
144   
145   return retv;
146 }
147