mirror of
https://github.com/reactos/reactos.git
synced 2024-07-21 19:58:08 +00:00
PEB will be created in NtCreateProcess.
svn path=/trunk/; revision=695
This commit is contained in:
parent
81a9f1c4b0
commit
babfe77ea9
|
@ -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
|
||||
}
|
||||
|
|
|
@ -46,8 +46,8 @@ typedef struct linux_sigcontext {
|
|||
|
||||
typedef ULONG THREADINFOCLASS;
|
||||
|
||||
typedef struct _STARTUPINFOW {
|
||||
DWORD cb;
|
||||
typedef struct _PROCESSINFO
|
||||
{
|
||||
WCHAR WindowTitle[MAX_PATH];
|
||||
WCHAR ImageFile[MAX_PATH];
|
||||
WCHAR CommandLine[MAX_PATH];
|
||||
|
@ -55,6 +55,7 @@ typedef struct _STARTUPINFOW {
|
|||
WCHAR Reserved[MAX_PATH];
|
||||
WCHAR Desktop[MAX_PATH];
|
||||
WCHAR Title[MAX_PATH];
|
||||
PVOID Environment;
|
||||
DWORD dwX;
|
||||
DWORD dwY;
|
||||
DWORD dwXSize;
|
||||
|
@ -69,7 +70,7 @@ typedef struct _STARTUPINFOW {
|
|||
HANDLE hStdInput;
|
||||
HANDLE hStdOutput;
|
||||
HANDLE hStdError;
|
||||
} PROCESSINFOW, *PPROCESSINFOW;
|
||||
} 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
|
||||
|
@ -129,7 +130,7 @@ typedef struct _NT_TEB
|
|||
CLIENT_ID Cid; // 20h
|
||||
ULONG reserved2; // 28h ???
|
||||
ULONG reserved3; // 2Ch ???
|
||||
NT_PEB *Peb; // 30h
|
||||
PNT_PEB Peb; // 30h
|
||||
DWORD LastErrorCode; // 34h
|
||||
|
||||
HANDLE RPCHandle; // 36
|
||||
|
@ -233,7 +234,8 @@ 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 StackCommit;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -41,6 +41,6 @@ LPSTR STDCALL GetCommandLineA(VOID)
|
|||
|
||||
LPWSTR STDCALL GetCommandLineW(VOID)
|
||||
{
|
||||
return(NtCurrentPeb()->StartupInfo->CommandLine);
|
||||
return(NtCurrentPeb()->ProcessInfo->CommandLine);
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
@ -81,7 +82,7 @@ WINBOOL STDCALL CreateProcessA(LPCSTR lpApplicationName,
|
|||
dwCreationFlags,
|
||||
lpEnvironment,
|
||||
PCurrentDirectoryW,
|
||||
lpStartupInfo,
|
||||
(LPSTARTUPINFOW)lpStartupInfo,
|
||||
lpProcessInformation);
|
||||
}
|
||||
|
||||
|
@ -142,7 +143,6 @@ HANDLE STDCALL CreateFirstThread(HANDLE ProcessHandle,
|
|||
return(NULL);
|
||||
}
|
||||
|
||||
|
||||
memset(&ThreadContext,0,sizeof(CONTEXT));
|
||||
ThreadContext.Eip = (ULONG)lpStartAddress;
|
||||
ThreadContext.SegGs = USER_DS;
|
||||
|
@ -348,39 +348,33 @@ 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);
|
||||
|
||||
StartupInfoBase = (PVOID)PEB_STARTUPINFO;
|
||||
StartupInfoSize = 0x1000;
|
||||
Status = ZwAllocateVirtualMemory(ProcessHandle,
|
||||
&StartupInfoBase,
|
||||
Peb.ProcessInfo = (PPROCESSINFO)PEB_STARTUPINFO;
|
||||
|
||||
NtWriteVirtualMemory(ProcessHandle,
|
||||
(PVOID)PEB_BASE,
|
||||
&Peb,
|
||||
sizeof(Peb),
|
||||
&BytesWritten);
|
||||
|
||||
ProcessInfoBase = (PVOID)PEB_STARTUPINFO;
|
||||
ProcessInfoSize = 0x1000;
|
||||
Status = NtAllocateVirtualMemory(ProcessHandle,
|
||||
&ProcessInfoBase,
|
||||
0,
|
||||
&StartupInfoSize,
|
||||
&ProcessInfoSize,
|
||||
MEM_COMMIT,
|
||||
PAGE_READWRITE);
|
||||
if (!NT_SUCCESS(Status))
|
||||
|
@ -388,15 +382,14 @@ static NTSTATUS CreatePeb(HANDLE ProcessHandle, PWSTR CommandLine)
|
|||
return(Status);
|
||||
}
|
||||
|
||||
memset(&ProcessInfo, 0, sizeof(PROCESSINFO));
|
||||
wcscpy(ProcessInfo.CommandLine, CommandLine);
|
||||
|
||||
memset(&StartupInfo, 0, sizeof(StartupInfo));
|
||||
wcscpy(StartupInfo.CommandLine, CommandLine);
|
||||
|
||||
DPRINT("StartupInfoSize %x\n",StartupInfoSize);
|
||||
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;
|
||||
|
@ -502,7 +495,7 @@ WINBOOL STDCALL CreateProcessW(LPCWSTR lpApplicationName,
|
|||
}
|
||||
|
||||
/*
|
||||
*
|
||||
* Create Process Environment Block
|
||||
*/
|
||||
DPRINT("Creating peb\n");
|
||||
CreatePeb(hProcess, TempCommandLine);
|
||||
|
@ -533,3 +526,4 @@ WINBOOL STDCALL CreateProcessW(LPCWSTR lpApplicationName,
|
|||
return TRUE;
|
||||
}
|
||||
|
||||
/* EOF */
|
|
@ -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 <ddk/ntddk.h>
|
||||
#include <windows.h>
|
||||
#include <kernel32/proc.h>
|
||||
|
@ -25,7 +25,7 @@
|
|||
#include <kernel32/kernel32.h>
|
||||
|
||||
/* TYPES *********************************************************************/
|
||||
|
||||
/*
|
||||
typedef struct _WSTARTUPINFO {
|
||||
DWORD cb;
|
||||
LPWSTR lpReserved;
|
||||
|
@ -46,6 +46,7 @@ typedef struct _WSTARTUPINFO {
|
|||
HANDLE hStdOutput;
|
||||
HANDLE hStdError;
|
||||
} WSTARTUPINFO, *LPWSTARTUPINFO;
|
||||
*/
|
||||
|
||||
/* GLOBALS *******************************************************************/
|
||||
|
||||
|
@ -245,12 +246,12 @@ WinExec (
|
|||
UINT uCmdShow
|
||||
)
|
||||
{
|
||||
STARTUPINFO StartupInfo;
|
||||
STARTUPINFOA StartupInfo;
|
||||
PROCESS_INFORMATION ProcessInformation;
|
||||
HINSTANCE hInst;
|
||||
DWORD dosErr;
|
||||
|
||||
StartupInfo.cb = sizeof(STARTUPINFO);
|
||||
StartupInfo.cb = sizeof(STARTUPINFOA);
|
||||
StartupInfo.wShowWindow = uCmdShow;
|
||||
StartupInfo.dwFlags = 0;
|
||||
|
||||
|
@ -335,11 +336,10 @@ SleepEx (
|
|||
VOID
|
||||
STDCALL
|
||||
GetStartupInfoW (
|
||||
LPSTARTUPINFO _lpStartupInfo
|
||||
LPSTARTUPINFOW lpStartupInfo
|
||||
)
|
||||
{
|
||||
NT_PEB *pPeb = NtCurrentPeb();
|
||||
LPWSTARTUPINFO lpStartupInfo = (LPWSTARTUPINFO)_lpStartupInfo;
|
||||
|
||||
if (lpStartupInfo == NULL)
|
||||
{
|
||||
|
@ -347,52 +347,32 @@ GetStartupInfoW (
|
|||
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(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->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->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();
|
||||
|
@ -404,43 +384,41 @@ GetStartupInfoA (
|
|||
return;
|
||||
}
|
||||
|
||||
lpStartupInfo->cb = sizeof(STARTUPINFO);
|
||||
i = 0;
|
||||
lpStartupInfo->cb = sizeof(STARTUPINFOA);
|
||||
|
||||
while ((pPeb->StartupInfo->Desktop[i])!=0 && i < MAX_PATH)
|
||||
i = 0;
|
||||
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->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->StartupInfo->hStdInput;
|
||||
lpStartupInfo->hStdOutput = pPeb->StartupInfo->hStdOutput;
|
||||
lpStartupInfo->hStdError = pPeb->StartupInfo->hStdError;
|
||||
|
||||
return;
|
||||
lpStartupInfo->hStdInput = pPeb->ProcessInfo->hStdInput;
|
||||
lpStartupInfo->hStdOutput = pPeb->ProcessInfo->hStdOutput;
|
||||
lpStartupInfo->hStdError = pPeb->ProcessInfo->hStdError;
|
||||
}
|
||||
|
||||
|
||||
|
@ -520,7 +498,6 @@ FatalAppExitA (
|
|||
}
|
||||
|
||||
|
||||
|
||||
VOID
|
||||
STDCALL
|
||||
FatalAppExitW (
|
||||
|
|
|
@ -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;
|
||||
|
@ -285,9 +282,6 @@ RtlCreateUserProcess(PUNICODE_STRING ApplicationName,
|
|||
PSECURITY_DESCRIPTOR ThreadSd,
|
||||
WINBOOL bInheritHandles,
|
||||
DWORD dwCreationFlags,
|
||||
// LPVOID lpEnvironment,
|
||||
// LPCWSTR lpCurrentDirectory,
|
||||
// LPSTARTUPINFO lpStartupInfo,
|
||||
PCLIENT_ID ClientId,
|
||||
PHANDLE ProcessHandle,
|
||||
PHANDLE ThreadHandle)
|
||||
|
@ -398,3 +392,4 @@ RtlCreateUserProcess(PUNICODE_STRING ApplicationName,
|
|||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
/* EOF */
|
||||
|
|
|
@ -63,24 +63,12 @@ static NTSTATUS LdrCreatePeb(HANDLE ProcessHandle)
|
|||
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,
|
||||
|
@ -88,6 +76,8 @@ static NTSTATUS LdrCreatePeb(HANDLE ProcessHandle)
|
|||
sizeof(Peb),
|
||||
&BytesWritten);
|
||||
|
||||
/* FIXME: Create ProcessInfo block */
|
||||
|
||||
return(STATUS_SUCCESS);
|
||||
}
|
||||
|
||||
|
|
|
@ -18,6 +18,7 @@
|
|||
#include <string.h>
|
||||
#include <internal/string.h>
|
||||
#include <internal/id.h>
|
||||
#include <internal/teb.h>
|
||||
|
||||
//#define NDEBUG
|
||||
#include <internal/debug.h>
|
||||
|
@ -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
|
||||
|
@ -211,6 +250,14 @@ NtCreateProcess (
|
|||
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
|
||||
*/
|
||||
|
|
Loading…
Reference in a new issue