diff --git a/reactos/include/ascii.h b/reactos/include/ascii.h index b0071e4c865..3c065e1a7c7 100644 --- a/reactos/include/ascii.h +++ b/reactos/include/ascii.h @@ -2078,14 +2078,14 @@ CreateProcessA( DWORD dwCreationFlags, LPVOID lpEnvironment, LPCSTR lpCurrentDirectory, - LPSTARTUPINFO lpStartupInfo, + LPSTARTUPINFOA lpStartupInfo, LPPROCESS_INFORMATION lpProcessInformation ); VOID STDCALL GetStartupInfoA( - LPSTARTUPINFO lpStartupInfo + LPSTARTUPINFOA lpStartupInfo ); HANDLE @@ -2979,7 +2979,7 @@ DdeQueryStringA (DWORD, HSZ, char *, DWORD, int); WINBOOL STDCALL LogonUserA (LPSTR, LPSTR, LPSTR, DWORD, DWORD, HANDLE *); WINBOOL STDCALL CreateProcessAsUserA (HANDLE, LPCTSTR, LPTSTR, SECURITY_ATTRIBUTES*, SECURITY_ATTRIBUTES*, WINBOOL, DWORD, LPVOID, - LPCTSTR, STARTUPINFO*, PROCESS_INFORMATION*); + LPCTSTR, STARTUPINFOA*, PROCESS_INFORMATION*); #ifdef __cplusplus } diff --git a/reactos/include/ddk/pstypes.h b/reactos/include/ddk/pstypes.h index 021b4efdf63..50e198951e6 100644 --- a/reactos/include/ddk/pstypes.h +++ b/reactos/include/ddk/pstypes.h @@ -13,7 +13,7 @@ typedef NTSTATUS (*PKSTART_ROUTINE)(PVOID StartContext); -typedef struct _STACK_INFORMATION +typedef struct _STACK_INFORMATION { PVOID BaseAddress; PVOID UpperAddress; @@ -46,30 +46,31 @@ typedef struct linux_sigcontext { typedef ULONG THREADINFOCLASS; -typedef struct _STARTUPINFOW { - DWORD cb; - WCHAR WindowTitle[MAX_PATH]; - WCHAR ImageFile[MAX_PATH]; - WCHAR CommandLine[MAX_PATH]; - WCHAR DllPath[MAX_PATH]; - WCHAR Reserved[MAX_PATH]; - WCHAR Desktop[MAX_PATH]; - WCHAR Title[MAX_PATH]; - DWORD dwX; - DWORD dwY; - DWORD dwXSize; - DWORD dwYSize; - DWORD dwXCountChars; - DWORD dwYCountChars; - DWORD dwFillAttribute; - DWORD dwFlags; - WORD wShowWindow; - WORD cbReserved2; - unsigned char * lpReserved2; - HANDLE hStdInput; - HANDLE hStdOutput; - HANDLE hStdError; -} PROCESSINFOW, *PPROCESSINFOW; +typedef struct _PROCESSINFO +{ + WCHAR WindowTitle[MAX_PATH]; + WCHAR ImageFile[MAX_PATH]; + WCHAR CommandLine[MAX_PATH]; + WCHAR DllPath[MAX_PATH]; + WCHAR Reserved[MAX_PATH]; + WCHAR Desktop[MAX_PATH]; + WCHAR Title[MAX_PATH]; + PVOID Environment; + DWORD dwX; + DWORD dwY; + DWORD dwXSize; + DWORD dwYSize; + DWORD dwXCountChars; + DWORD dwYCountChars; + DWORD dwFillAttribute; + DWORD dwFlags; + WORD wShowWindow; + WORD cbReserved2; + unsigned char *lpReserved2; + HANDLE hStdInput; + HANDLE hStdOutput; + HANDLE hStdError; +} PROCESSINFO, *PPROCESSINFO; @@ -92,7 +93,7 @@ typedef struct _NT_PEB WORD NumberOfProcessors; // 11h WORD NtGlobalFlag; // 13h - PPROCESSINFOW StartupInfo; // 15h + PPROCESSINFO ProcessInfo; // 15h HANDLE ProcessHeap; // 19h ATOMTABLE LocalAtomTable; // 1Dh LPCRITICAL_SECTION CriticalSection; // 35h @@ -100,15 +101,15 @@ typedef struct _NT_PEB WORD MajorVersion; // 3Dh WORD MinorVersion; // 3Fh WORD BuildNumber; // 41h - WORD PlatformId; // 43h -} NT_PEB, *PNT_PEB; + WORD PlatformId; // 43h +} NT_PEB, *PNT_PEB; -typedef struct _CLIENT_ID +typedef struct _CLIENT_ID { HANDLE UniqueProcess; HANDLE UniqueThread; } CLIENT_ID, *PCLIENT_ID; - + typedef struct _NT_TIB { struct _EXCEPTION_REGISTRATION_RECORD *ExceptionList; // 00h PVOID StackBase; // 04h @@ -124,25 +125,25 @@ typedef struct _NT_TIB { typedef struct _NT_TEB { - NT_TIB Tib; // 00h - ULONG reserved1; // 1Ch ??? - CLIENT_ID Cid; // 20h - ULONG reserved2; // 28h ??? - ULONG reserved3; // 2Ch ??? - NT_PEB *Peb; // 30h - DWORD LastErrorCode; // 34h + NT_TIB Tib; // 00h + ULONG reserved1; // 1Ch ??? + CLIENT_ID Cid; // 20h + ULONG reserved2; // 28h ??? + ULONG reserved3; // 2Ch ??? + PNT_PEB Peb; // 30h + DWORD LastErrorCode; // 34h - HANDLE RPCHandle; // 36 - PVOID TlsData[TLS_MINIMUM_AVAILABLE]; // 40 - DWORD dwTlsIndex; // 230 + HANDLE RPCHandle; // 36 + PVOID TlsData[TLS_MINIMUM_AVAILABLE]; // 40 + DWORD dwTlsIndex; // 230 NTSTATUS LastStatusValue; // 242 DWORD LockCount; // 244 UCHAR HardErrorMode; // 248 - /* reactos only ??? (Eric Kohl) */ - PVOID StackCommit; - PVOID StackCommitMax; - PVOID StackReserved; + /* reactos only ??? (Eric Kohl) */ + PVOID StackCommit; + PVOID StackCommitMax; + PVOID StackReserved; } NT_TEB, *PNT_TEB; struct _KPROCESS; @@ -233,9 +234,10 @@ typedef struct _KTHREAD // According to documentation the stack should have a commited [ 1 page ] and // a reserved part [ 1 M ] but can be specified otherwise in the image file. -typedef struct _INITIAL_TEB { +typedef struct _INITIAL_TEB +{ PVOID StackBase; - PVOID StackLimit; + PVOID StackLimit; PVOID StackCommit; PVOID StackCommitMax; PVOID StackReserved; @@ -289,7 +291,7 @@ typedef struct _ETHREAD { UCHAR LpcExitThreadCalled; UCHAR HardErrorsAreDisabled; - + /* * Added by David Welch (welch@cwcom.net) */ diff --git a/reactos/include/structs.h b/reactos/include/structs.h index 71e68e1cdf2..816751e13b9 100644 --- a/reactos/include/structs.h +++ b/reactos/include/structs.h @@ -3971,11 +3971,11 @@ typedef struct tagSOUNDSENTRY { DWORD iWindowsEffectOrdinal; } SOUNDSENTRY, *LPSOUNDSENTRY; -typedef struct _STARTUPINFO { +typedef struct _STARTUPINFOA { DWORD cb; - LPTSTR lpReserved; - LPTSTR lpDesktop; - LPTSTR lpTitle; + LPSTR lpReserved; + LPSTR lpDesktop; + LPSTR lpTitle; DWORD dwX; DWORD dwY; DWORD dwXSize; @@ -3990,7 +3990,36 @@ typedef struct _STARTUPINFO { HANDLE hStdInput; HANDLE hStdOutput; HANDLE hStdError; -} STARTUPINFO, *LPSTARTUPINFO; +} STARTUPINFOA, *LPSTARTUPINFOA; + +typedef struct _STARTUPINFOW { + DWORD cb; + LPWSTR lpReserved; + LPWSTR lpDesktop; + LPWSTR lpTitle; + DWORD dwX; + DWORD dwY; + DWORD dwXSize; + DWORD dwYSize; + DWORD dwXCountChars; + DWORD dwYCountChars; + DWORD dwFillAttribute; + DWORD dwFlags; + WORD wShowWindow; + WORD cbReserved2; + LPBYTE lpReserved2; + HANDLE hStdInput; + HANDLE hStdOutput; + HANDLE hStdError; +} STARTUPINFOW, *LPSTARTUPINFOW; + +#ifdef UNICODE +typedef STARTUPINFOW STARTUPINFO; +typedef LPSTARTUPINFOW LPSTARTUPINFO; +#else +typedef STARTUPINFOA STARTUPINFO; +typedef LPSTARTUPINFOA LPSTARTUPINFO; +#endif /* UNICODE */ typedef struct tagSTICKYKEYS { DWORD cbSize; diff --git a/reactos/include/unicode.h b/reactos/include/unicode.h index d8608b6041e..b7fd879a9b5 100644 --- a/reactos/include/unicode.h +++ b/reactos/include/unicode.h @@ -2093,14 +2093,14 @@ CreateProcessW( DWORD dwCreationFlags, LPVOID lpEnvironment, LPCWSTR lpCurrentDirectory, - LPSTARTUPINFO lpStartupInfo, + LPSTARTUPINFOW lpStartupInfo, LPPROCESS_INFORMATION lpProcessInformation ); VOID STDCALL GetStartupInfoW( - LPSTARTUPINFO lpStartupInfo + LPSTARTUPINFOW lpStartupInfo ); HANDLE @@ -2999,7 +2999,7 @@ DdeQueryStringW (DWORD, HSZ, LPCWSTR, DWORD, int); WINBOOL STDCALL LogonUserW (LPWSTR, LPWSTR, LPWSTR, DWORD, DWORD, HANDLE *); WINBOOL STDCALL CreateProcessAsUserW (HANDLE, LPCWSTR, LPWSTR, SECURITY_ATTRIBUTES*, SECURITY_ATTRIBUTES*, WINBOOL, - DWORD, LPVOID, LPCWSTR, STARTUPINFO*, + DWORD, LPVOID, LPCWSTR, STARTUPINFOW*, PROCESS_INFORMATION*); #ifdef __cplusplus diff --git a/reactos/lib/kernel32/process/cmdline.c b/reactos/lib/kernel32/process/cmdline.c index 6c7042ad4ab..3f5cf16265d 100644 --- a/reactos/lib/kernel32/process/cmdline.c +++ b/reactos/lib/kernel32/process/cmdline.c @@ -41,6 +41,6 @@ LPSTR STDCALL GetCommandLineA(VOID) LPWSTR STDCALL GetCommandLineW(VOID) { - return(NtCurrentPeb()->StartupInfo->CommandLine); + return(NtCurrentPeb()->ProcessInfo->CommandLine); } diff --git a/reactos/lib/kernel32/process/create.c b/reactos/lib/kernel32/process/create.c index 702f47c20a9..a8546ed973d 100644 --- a/reactos/lib/kernel32/process/create.c +++ b/reactos/lib/kernel32/process/create.c @@ -1,4 +1,5 @@ -/* +/* $Id: create.c,v 1.12 1999/10/13 22:35:55 ekohl Exp $ + * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries * FILE: lib/kernel32/proc/proc.c @@ -36,7 +37,7 @@ WINBOOL STDCALL CreateProcessA(LPCSTR lpApplicationName, DWORD dwCreationFlags, LPVOID lpEnvironment, LPCSTR lpCurrentDirectory, - LPSTARTUPINFO lpStartupInfo, + LPSTARTUPINFOA lpStartupInfo, LPPROCESS_INFORMATION lpProcessInformation) /* * FUNCTION: The CreateProcess function creates a new process and its @@ -65,24 +66,24 @@ WINBOOL STDCALL CreateProcessA(LPCSTR lpApplicationName, DPRINT("CreateProcessA\n"); PApplicationNameW = InternalAnsiToUnicode(ApplicationNameW, - lpApplicationName, + lpApplicationName, MAX_PATH); PCommandLineW = InternalAnsiToUnicode(CommandLineW, lpCommandLine, MAX_PATH); PCurrentDirectoryW = InternalAnsiToUnicode(CurrentDirectoryW, lpCurrentDirectory, - MAX_PATH); + MAX_PATH); return CreateProcessW(PApplicationNameW, - PCommandLineW, + PCommandLineW, lpProcessAttributes, lpThreadAttributes, bInheritHandles, dwCreationFlags, lpEnvironment, PCurrentDirectoryW, - lpStartupInfo, - lpProcessInformation); + (LPSTARTUPINFOW)lpStartupInfo, + lpProcessInformation); } #define STACK_TOP (0xb0000000) @@ -98,7 +99,7 @@ HANDLE STDCALL CreateFirstThread(HANDLE ProcessHandle, HANDLE NTDllSectionHandle, HANDLE SectionHandle, PVOID ImageBase) -{ +{ NTSTATUS Status; HANDLE ThreadHandle; OBJECT_ATTRIBUTES ObjectAttributes; @@ -109,7 +110,7 @@ HANDLE STDCALL CreateFirstThread(HANDLE ProcessHandle, PVOID BaseAddress; ULONG BytesWritten; HANDLE DupNTDllSectionHandle, DupSectionHandle; - + ObjectAttributes.Length = sizeof(OBJECT_ATTRIBUTES); ObjectAttributes.RootDirectory = NULL; ObjectAttributes.ObjectName = NULL; @@ -141,7 +142,6 @@ HANDLE STDCALL CreateFirstThread(HANDLE ProcessHandle, { return(NULL); } - memset(&ThreadContext,0,sizeof(CONTEXT)); ThreadContext.Eip = (ULONG)lpStartAddress; @@ -150,7 +150,7 @@ HANDLE STDCALL CreateFirstThread(HANDLE ProcessHandle, ThreadContext.SegEs = USER_DS; ThreadContext.SegDs = USER_DS; ThreadContext.SegCs = USER_CS; - ThreadContext.SegSs = USER_DS; + ThreadContext.SegSs = USER_DS; ThreadContext.Esp = STACK_TOP - 16; ThreadContext.EFlags = (1<<1) + (1<<9); @@ -348,57 +348,50 @@ static NTSTATUS CreatePeb(HANDLE ProcessHandle, PWSTR CommandLine) ULONG PebSize; NT_PEB Peb; ULONG BytesWritten; - PVOID StartupInfoBase; - ULONG StartupInfoSize; - PROCESSINFOW StartupInfo; - + PVOID ProcessInfoBase; + ULONG ProcessInfoSize; + PROCESSINFO ProcessInfo; + PebBase = (PVOID)PEB_BASE; PebSize = 0x1000; - Status = ZwAllocateVirtualMemory(ProcessHandle, - &PebBase, - 0, - &PebSize, - MEM_COMMIT, - PAGE_READWRITE); - if (!NT_SUCCESS(Status)) - { - return(Status); - } - - - memset(&Peb, 0, sizeof(Peb)); - Peb.StartupInfo = (PPROCESSINFOW)PEB_STARTUPINFO; - ZwWriteVirtualMemory(ProcessHandle, + NtReadVirtualMemory(ProcessHandle, + (PVOID)PEB_BASE, + &Peb, + sizeof(Peb), + &BytesWritten); + + Peb.ProcessInfo = (PPROCESSINFO)PEB_STARTUPINFO; + + NtWriteVirtualMemory(ProcessHandle, (PVOID)PEB_BASE, &Peb, sizeof(Peb), &BytesWritten); - - StartupInfoBase = (PVOID)PEB_STARTUPINFO; - StartupInfoSize = 0x1000; - Status = ZwAllocateVirtualMemory(ProcessHandle, - &StartupInfoBase, + + ProcessInfoBase = (PVOID)PEB_STARTUPINFO; + ProcessInfoSize = 0x1000; + Status = NtAllocateVirtualMemory(ProcessHandle, + &ProcessInfoBase, 0, - &StartupInfoSize, + &ProcessInfoSize, MEM_COMMIT, PAGE_READWRITE); if (!NT_SUCCESS(Status)) { return(Status); } - - - memset(&StartupInfo, 0, sizeof(StartupInfo)); - wcscpy(StartupInfo.CommandLine, CommandLine); - - DPRINT("StartupInfoSize %x\n",StartupInfoSize); + + memset(&ProcessInfo, 0, sizeof(PROCESSINFO)); + wcscpy(ProcessInfo.CommandLine, CommandLine); + + DPRINT("ProcessInfoSize %x\n",ProcessInfoSize); ZwWriteVirtualMemory(ProcessHandle, (PVOID)PEB_STARTUPINFO, - &StartupInfo, - StartupInfoSize, + &ProcessInfo, + ProcessInfoSize, &BytesWritten); - + return(STATUS_SUCCESS); } @@ -411,7 +404,7 @@ WINBOOL STDCALL CreateProcessW(LPCWSTR lpApplicationName, DWORD dwCreationFlags, LPVOID lpEnvironment, LPCWSTR lpCurrentDirectory, - LPSTARTUPINFO lpStartupInfo, + LPSTARTUPINFOW lpStartupInfo, LPPROCESS_INFORMATION lpProcessInformation) { HANDLE hSection, hProcess, hThread; @@ -500,13 +493,13 @@ WINBOOL STDCALL CreateProcessW(LPCWSTR lpApplicationName, SetLastError(RtlNtStatusToDosError(Status)); return FALSE; } - + /* - * + * Create Process Environment Block */ DPRINT("Creating peb\n"); CreatePeb(hProcess, TempCommandLine); - + DPRINT("Creating thread for process\n"); lpStartAddress = (LPTHREAD_START_ROUTINE) ((PIMAGE_OPTIONAL_HEADER)OPTHDROFFSET(NTDLL_BASE))-> @@ -526,10 +519,11 @@ WINBOOL STDCALL CreateProcessW(LPCWSTR lpApplicationName, if ( hThread == NULL ) return FALSE; - + lpProcessInformation->hProcess = hProcess; lpProcessInformation->hThread = hThread; - return TRUE; + return TRUE; } +/* EOF */ \ No newline at end of file diff --git a/reactos/lib/kernel32/process/proc.c b/reactos/lib/kernel32/process/proc.c index ff952c368be..0c0ddc39382 100644 --- a/reactos/lib/kernel32/process/proc.c +++ b/reactos/lib/kernel32/process/proc.c @@ -1,4 +1,4 @@ -/* $Id: proc.c,v 1.21 1999/10/07 23:45:25 ekohl Exp $ +/* $Id: proc.c,v 1.22 1999/10/13 22:35:55 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -11,7 +11,7 @@ /* INCLUDES ****************************************************************/ -#define UNICODE +//#define UNICODE #include #include #include @@ -25,7 +25,7 @@ #include /* TYPES *********************************************************************/ - +/* typedef struct _WSTARTUPINFO { DWORD cb; LPWSTR lpReserved; @@ -45,7 +45,8 @@ typedef struct _WSTARTUPINFO { HANDLE hStdInput; HANDLE hStdOutput; HANDLE hStdError; -} WSTARTUPINFO, *LPWSTARTUPINFO; +} WSTARTUPINFO, *LPWSTARTUPINFO; +*/ /* GLOBALS *******************************************************************/ @@ -113,8 +114,8 @@ GetCurrentThread (VOID) DWORD STDCALL GetCurrentProcessId (VOID) -{ - return (DWORD) (GetTeb()->Cid).UniqueProcess; +{ + return (DWORD) (GetTeb()->Cid).UniqueProcess; } @@ -186,13 +187,13 @@ InternalAnsiToUnicode ( else { i = 0; - while ((*In)!=0 && i < MaxLength) + while ((*In)!=0 && i < MaxLength) { Out[i] = *In; In++; i++; } - Out[i] = 0; + Out[i] = 0; return(Out); } } @@ -245,15 +246,15 @@ WinExec ( UINT uCmdShow ) { - STARTUPINFO StartupInfo; - PROCESS_INFORMATION ProcessInformation; + STARTUPINFOA StartupInfo; + PROCESS_INFORMATION ProcessInformation; HINSTANCE hInst; DWORD dosErr; - StartupInfo.cb = sizeof(STARTUPINFO); - StartupInfo.wShowWindow = uCmdShow ; + StartupInfo.cb = sizeof(STARTUPINFOA); + StartupInfo.wShowWindow = uCmdShow; StartupInfo.dwFlags = 0; - + hInst = (HINSTANCE)CreateProcessA(NULL, (PVOID)lpCmdLine, NULL, @@ -335,112 +336,89 @@ SleepEx ( VOID STDCALL GetStartupInfoW ( - LPSTARTUPINFO _lpStartupInfo + LPSTARTUPINFOW lpStartupInfo ) { NT_PEB *pPeb = NtCurrentPeb(); - LPWSTARTUPINFO lpStartupInfo = (LPWSTARTUPINFO)_lpStartupInfo; - + if (lpStartupInfo == NULL) { SetLastError(ERROR_INVALID_PARAMETER); return; } - - lpStartupInfo->cb = sizeof(STARTUPINFO); -// lstrcpyW(lpStartupInfo->lpDesktop, pPeb->StartupInfo->Desktop); -// lstrcpyW(lpStartupInfo->lpTitle, pPeb->StartupInfo->Title); - lpStartupInfo->dwX = pPeb->StartupInfo->dwX; - lpStartupInfo->dwY = pPeb->StartupInfo->dwY; - lpStartupInfo->dwXSize = pPeb->StartupInfo->dwXSize; - lpStartupInfo->dwYSize = pPeb->StartupInfo->dwYSize; - lpStartupInfo->dwXCountChars = pPeb->StartupInfo->dwXCountChars; - lpStartupInfo->dwYCountChars = pPeb->StartupInfo->dwYCountChars; - lpStartupInfo->dwFillAttribute = pPeb->StartupInfo->dwFillAttribute; - lpStartupInfo->dwFlags = pPeb->StartupInfo->dwFlags; - lpStartupInfo->wShowWindow = pPeb->StartupInfo->wShowWindow; - //lpStartupInfo->cbReserved2 = pPeb->StartupInfo->cbReserved; - //lpStartupInfo->lpReserved = pPeb->StartupInfo->lpReserved1; - //lpStartupInfo->lpReserved2 = pPeb->StartupInfo->lpReserved2; - - lpStartupInfo->cb = sizeof(STARTUPINFO); - lstrcpyW(lpStartupInfo->lpDesktop, pPeb->StartupInfo->Desktop); - lstrcpyW(lpStartupInfo->lpTitle, pPeb->StartupInfo->Title); - lpStartupInfo->dwX = pPeb->StartupInfo->dwX; - lpStartupInfo->dwY = pPeb->StartupInfo->dwY; - lpStartupInfo->dwXSize = pPeb->StartupInfo->dwXSize; - lpStartupInfo->dwYSize = pPeb->StartupInfo->dwYSize; - lpStartupInfo->dwXCountChars = pPeb->StartupInfo->dwXCountChars; - lpStartupInfo->dwYCountChars = pPeb->StartupInfo->dwYCountChars; - lpStartupInfo->dwFillAttribute = pPeb->StartupInfo->dwFillAttribute; - lpStartupInfo->dwFlags = pPeb->StartupInfo->dwFlags; - lpStartupInfo->wShowWindow = pPeb->StartupInfo->wShowWindow; - //lpStartupInfo->cbReserved2 = pPeb->StartupInfo->cbReserved; - //lpStartupInfo->lpReserved = pPeb->StartupInfo->lpReserved1; - //lpStartupInfo->lpReserved2 = pPeb->StartupInfo->lpReserved2; - - lpStartupInfo->hStdInput = pPeb->StartupInfo->hStdInput; - lpStartupInfo->hStdOutput = pPeb->StartupInfo->hStdOutput; - lpStartupInfo->hStdError = pPeb->StartupInfo->hStdError; - - - - return; + + lpStartupInfo->cb = sizeof(STARTUPINFOW); +// lstrcpyW(lpStartupInfo->lpDesktop, pPeb->ProcessInfo->Desktop); +// lstrcpyW(lpStartupInfo->lpTitle, pPeb->ProcessInfo->Title); + lpStartupInfo->dwX = pPeb->ProcessInfo->dwX; + lpStartupInfo->dwY = pPeb->ProcessInfo->dwY; + lpStartupInfo->dwXSize = pPeb->ProcessInfo->dwXSize; + lpStartupInfo->dwYSize = pPeb->ProcessInfo->dwYSize; + lpStartupInfo->dwXCountChars = pPeb->ProcessInfo->dwXCountChars; + lpStartupInfo->dwYCountChars = pPeb->ProcessInfo->dwYCountChars; + lpStartupInfo->dwFillAttribute = pPeb->ProcessInfo->dwFillAttribute; + lpStartupInfo->dwFlags = pPeb->ProcessInfo->dwFlags; + lpStartupInfo->wShowWindow = pPeb->ProcessInfo->wShowWindow; +// lpStartupInfo->cbReserved2 = pPeb->ProcessInfo->cbReserved; +// lpStartupInfo->lpReserved = pPeb->ProcessInfo->lpReserved1; +// lpStartupInfo->lpReserved2 = pPeb->ProcessInfo->lpReserved2; + + lpStartupInfo->hStdInput = pPeb->ProcessInfo->hStdInput; + lpStartupInfo->hStdOutput = pPeb->ProcessInfo->hStdOutput; + lpStartupInfo->hStdError = pPeb->ProcessInfo->hStdError; } VOID STDCALL GetStartupInfoA ( - LPSTARTUPINFO lpStartupInfo + LPSTARTUPINFOA lpStartupInfo ) { NT_PEB *pPeb = NtCurrentPeb(); ULONG i = 0; - - if (lpStartupInfo == NULL) + + if (lpStartupInfo == NULL) { SetLastError(ERROR_INVALID_PARAMETER); return; } - - lpStartupInfo->cb = sizeof(STARTUPINFO); + + lpStartupInfo->cb = sizeof(STARTUPINFOA); + i = 0; - - while ((pPeb->StartupInfo->Desktop[i])!=0 && i < MAX_PATH) + while ((pPeb->ProcessInfo->Desktop[i])!=0 && i < MAX_PATH) { lpStartupInfo->lpDesktop[i] = (unsigned char) - pPeb->StartupInfo->Desktop[i]; + pPeb->ProcessInfo->Desktop[i]; i++; } lpStartupInfo->lpDesktop[i] = 0; - + i = 0; - while ((pPeb->StartupInfo->Title[i])!=0 && i < MAX_PATH) + while ((pPeb->ProcessInfo->Title[i])!=0 && i < MAX_PATH) { - lpStartupInfo->lpTitle[i] = (unsigned char)pPeb->StartupInfo->Title[i]; + lpStartupInfo->lpTitle[i] = (unsigned char)pPeb->ProcessInfo->Title[i]; i++; } lpStartupInfo->lpTitle[i] = 0; - - lpStartupInfo->dwX = pPeb->StartupInfo->dwX; - lpStartupInfo->dwY = pPeb->StartupInfo->dwY; - lpStartupInfo->dwXSize = pPeb->StartupInfo->dwXSize; - lpStartupInfo->dwYSize = pPeb->StartupInfo->dwYSize; - lpStartupInfo->dwXCountChars = pPeb->StartupInfo->dwXCountChars; - lpStartupInfo->dwYCountChars = pPeb->StartupInfo->dwYCountChars; - lpStartupInfo->dwFillAttribute = pPeb->StartupInfo->dwFillAttribute; - lpStartupInfo->dwFlags = pPeb->StartupInfo->dwFlags; - lpStartupInfo->wShowWindow = pPeb->StartupInfo->wShowWindow; - //lpStartupInfo->cbReserved2 = pPeb->StartupInfo->cbReserved; - //lpStartupInfo->lpReserved = pPeb->StartupInfo->lpReserved1; - //lpStartupInfo->lpReserved2 = pPeb->StartupInfo->lpReserved2; - - lpStartupInfo->hStdInput = pPeb->StartupInfo->hStdInput; - lpStartupInfo->hStdOutput = pPeb->StartupInfo->hStdOutput; - lpStartupInfo->hStdError = pPeb->StartupInfo->hStdError; - - return; + + lpStartupInfo->dwX = pPeb->ProcessInfo->dwX; + lpStartupInfo->dwY = pPeb->ProcessInfo->dwY; + lpStartupInfo->dwXSize = pPeb->ProcessInfo->dwXSize; + lpStartupInfo->dwYSize = pPeb->ProcessInfo->dwYSize; + lpStartupInfo->dwXCountChars = pPeb->ProcessInfo->dwXCountChars; + lpStartupInfo->dwYCountChars = pPeb->ProcessInfo->dwYCountChars; + lpStartupInfo->dwFillAttribute = pPeb->ProcessInfo->dwFillAttribute; + lpStartupInfo->dwFlags = pPeb->ProcessInfo->dwFlags; + lpStartupInfo->wShowWindow = pPeb->ProcessInfo->wShowWindow; +// lpStartupInfo->cbReserved2 = pPeb->ProcessInfo->cbReserved; +// lpStartupInfo->lpReserved = pPeb->ProcessInfo->lpReserved1; +// lpStartupInfo->lpReserved2 = pPeb->ProcessInfo->lpReserved2; + + lpStartupInfo->hStdInput = pPeb->ProcessInfo->hStdInput; + lpStartupInfo->hStdOutput = pPeb->ProcessInfo->hStdOutput; + lpStartupInfo->hStdError = pPeb->ProcessInfo->hStdError; } @@ -515,12 +493,11 @@ FatalAppExitA ( i++; } MessageTextW[i] = 0; - + return FatalAppExitW(uAction,MessageTextW); } - VOID STDCALL FatalAppExitW ( @@ -528,7 +505,7 @@ FatalAppExitW ( LPCWSTR lpMessageText ) { - return; + return; } diff --git a/reactos/lib/ntdll/rtl/process.c b/reactos/lib/ntdll/rtl/process.c index 3fa4a219150..ae39a1468cb 100644 --- a/reactos/lib/ntdll/rtl/process.c +++ b/reactos/lib/ntdll/rtl/process.c @@ -124,7 +124,6 @@ RtlpCreateFirstThread(HANDLE ProcessHandle, sizeof(DupSectionHandle), &BytesWritten); - Status = NtCreateThread(&ThreadHandle, THREAD_ALL_ACCESS, &ObjectAttributes, @@ -230,23 +229,21 @@ RtlpCreatePeb(HANDLE ProcessHandle, PUNICODE_STRING CommandLine) ULONG PebSize; NT_PEB Peb; ULONG BytesWritten; - PVOID StartupInfoBase; - ULONG StartupInfoSize; - PROCESSINFOW StartupInfo; + PVOID ProcessInfoBase; + ULONG ProcessInfoSize; + PROCESSINFO ProcessInfo; PebBase = (PVOID)PEB_BASE; PebSize = 0x1000; - Status = NtAllocateVirtualMemory(ProcessHandle, - &PebBase, - 0, - &PebSize, - MEM_COMMIT, - PAGE_READWRITE); - if (!NT_SUCCESS(Status)) - return(Status); + + NtReadVirtualMemory(ProcessHandle, + (PVOID)PEB_BASE, + &Peb, + sizeof(Peb), + &BytesWritten); memset(&Peb, 0, sizeof(Peb)); - Peb.StartupInfo = (PPROCESSINFOW)PEB_STARTUPINFO; + Peb.ProcessInfo = (PPROCESSINFO)PEB_STARTUPINFO; NtWriteVirtualMemory(ProcessHandle, (PVOID)PEB_BASE, @@ -254,25 +251,25 @@ RtlpCreatePeb(HANDLE ProcessHandle, PUNICODE_STRING CommandLine) sizeof(Peb), &BytesWritten); - StartupInfoBase = (PVOID)PEB_STARTUPINFO; - StartupInfoSize = 0x1000; + ProcessInfoBase = (PVOID)PEB_STARTUPINFO; + ProcessInfoSize = 0x1000; Status = NtAllocateVirtualMemory(ProcessHandle, - &StartupInfoBase, + &ProcessInfoBase, 0, - &StartupInfoSize, + &ProcessInfoSize, MEM_COMMIT, PAGE_READWRITE); if (!NT_SUCCESS(Status)) return(Status); - memset(&StartupInfo, 0, sizeof(StartupInfo)); - wcscpy(StartupInfo.CommandLine, CommandLine->Buffer); + memset(&ProcessInfo, 0, sizeof(PROCESSINFO)); + wcscpy(ProcessInfo.CommandLine, CommandLine->Buffer); - DPRINT("StartupInfoSize %x\n",StartupInfoSize); + DPRINT("ProcessInfoSize %x\n",ProcessInfoSize); NtWriteVirtualMemory(ProcessHandle, (PVOID)PEB_STARTUPINFO, - &StartupInfo, - StartupInfoSize, + &ProcessInfo, + ProcessInfoSize, &BytesWritten); return STATUS_SUCCESS; @@ -283,14 +280,11 @@ NTSTATUS STDCALL RtlCreateUserProcess(PUNICODE_STRING ApplicationName, PSECURITY_DESCRIPTOR ProcessSd, PSECURITY_DESCRIPTOR ThreadSd, - WINBOOL bInheritHandles, - DWORD dwCreationFlags, -// LPVOID lpEnvironment, -// LPCWSTR lpCurrentDirectory, -// LPSTARTUPINFO lpStartupInfo, - PCLIENT_ID ClientId, - PHANDLE ProcessHandle, - PHANDLE ThreadHandle) + WINBOOL bInheritHandles, + DWORD dwCreationFlags, + PCLIENT_ID ClientId, + PHANDLE ProcessHandle, + PHANDLE ThreadHandle) { HANDLE hSection, hProcess, hThread; NTSTATUS Status; @@ -398,3 +392,4 @@ RtlCreateUserProcess(PUNICODE_STRING ApplicationName, return STATUS_SUCCESS; } +/* EOF */ diff --git a/reactos/ntoskrnl/ldr/init.c b/reactos/ntoskrnl/ldr/init.c index 37096df8fc8..d251649da79 100644 --- a/reactos/ntoskrnl/ldr/init.c +++ b/reactos/ntoskrnl/ldr/init.c @@ -62,32 +62,22 @@ static NTSTATUS LdrCreatePeb(HANDLE ProcessHandle) ULONG PebSize; NT_PEB Peb; ULONG BytesWritten; - - + PebBase = (PVOID)PEB_BASE; PebSize = 0x1000; - Status = ZwAllocateVirtualMemory(ProcessHandle, - &PebBase, - 0, - &PebSize, - MEM_COMMIT, - PAGE_READWRITE); - if (!NT_SUCCESS(Status)) - { - return(Status); - } - - + memset(&Peb, 0, sizeof Peb); - - Peb.StartupInfo = (PPROCESSINFOW) PEB_STARTUPINFO; + + Peb.ProcessInfo = (PPROCESSINFO) PEB_STARTUPINFO; ZwWriteVirtualMemory(ProcessHandle, (PVOID)PEB_BASE, &Peb, sizeof(Peb), &BytesWritten); - + + /* FIXME: Create ProcessInfo block */ + return(STATUS_SUCCESS); } diff --git a/reactos/ntoskrnl/ps/process.c b/reactos/ntoskrnl/ps/process.c index aba40962278..7f444391412 100644 --- a/reactos/ntoskrnl/ps/process.c +++ b/reactos/ntoskrnl/ps/process.c @@ -18,6 +18,7 @@ #include #include #include +#include //#define NDEBUG #include @@ -109,6 +110,44 @@ VOID PiDeleteProcess(PVOID ObjectBody) (VOID)MmReleaseMmInfo((PEPROCESS)ObjectBody); } + +static NTSTATUS +PsCreatePeb(HANDLE ProcessHandle) +{ + NTSTATUS Status; + PVOID PebBase; + ULONG PebSize; + NT_PEB Peb; + ULONG BytesWritten; + + PebBase = (PVOID)PEB_BASE; + PebSize = 0x1000; + Status = NtAllocateVirtualMemory(ProcessHandle, + &PebBase, + 0, + &PebSize, + MEM_COMMIT, + PAGE_READWRITE); + if (!NT_SUCCESS(Status)) + { + return(Status); + } + + memset(&Peb, 0, sizeof(Peb)); + + ZwWriteVirtualMemory(ProcessHandle, + (PVOID)PEB_BASE, + &Peb, + sizeof(Peb), + &BytesWritten); + + DbgPrint ("PsCreatePeb: Peb created at %x\n", PebBase); +// DPRINT("PsCreatePeb: Peb created at %x\n", PebBase); + + return(STATUS_SUCCESS); +} + + PKPROCESS KeGetCurrentProcess(VOID) /* * FUNCTION: Returns a pointer to the current process @@ -210,7 +249,15 @@ NtCreateProcess ( KeAcquireSpinLock(&PsProcessListLock, &oldIrql); InsertHeadList(&PsProcessListHead, &KProcess->ProcessListEntry); KeReleaseSpinLock(&PsProcessListLock, oldIrql); - + + Status = PsCreatePeb (*ProcessHandle); + if (!NT_SUCCESS(Status)) + { +// DPRINT("NtCreateProcess() Peb creation failed: Status %x\n",Status); + DbgPrint ("NtCreateProcess() Peb creation failed: Status %x\n",Status); + return(Status); + } + /* * FIXME: I don't what I'm supposed to know with a section handle */