mirror of
https://github.com/reactos/reactos.git
synced 2025-02-25 01:39:30 +00:00
pointer to PEB becomes first parameter in call to NtProcessStartup
svn path=/trunk/; revision=838
This commit is contained in:
parent
904da6e474
commit
9d84d82bd7
5 changed files with 200 additions and 133 deletions
|
@ -1,4 +1,4 @@
|
|||
typedef NTSTATUS (*PEPFUNC)(VOID);
|
||||
typedef NTSTATUS (*PEPFUNC)(PPEB);
|
||||
|
||||
typedef struct _DLL
|
||||
{
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $Id: create.c,v 1.14 1999/12/06 00:23:40 ekohl Exp $
|
||||
/* $Id: create.c,v 1.15 1999/12/08 12:58:44 ekohl Exp $
|
||||
*
|
||||
* COPYRIGHT: See COPYING in the top level directory
|
||||
* PROJECT: ReactOS system libraries
|
||||
|
@ -93,10 +93,9 @@ HANDLE STDCALL CreateFirstThread(HANDLE ProcessHandle,
|
|||
LPSECURITY_ATTRIBUTES lpThreadAttributes,
|
||||
DWORD dwStackSize,
|
||||
LPTHREAD_START_ROUTINE lpStartAddress,
|
||||
LPVOID lpParameter,
|
||||
PPEB Peb,
|
||||
DWORD dwCreationFlags,
|
||||
LPDWORD lpThreadId,
|
||||
PWSTR lpCommandLine,
|
||||
HANDLE NTDllSectionHandle,
|
||||
HANDLE SectionHandle,
|
||||
PVOID ImageBase)
|
||||
|
@ -151,7 +150,7 @@ HANDLE STDCALL CreateFirstThread(HANDLE ProcessHandle,
|
|||
ThreadContext.SegDs = USER_DS;
|
||||
ThreadContext.SegCs = USER_CS;
|
||||
ThreadContext.SegSs = USER_DS;
|
||||
ThreadContext.Esp = STACK_TOP - 16;
|
||||
ThreadContext.Esp = STACK_TOP - 20;
|
||||
ThreadContext.EFlags = (1<<1) + (1<<9);
|
||||
|
||||
DPRINT("ThreadContext.Eip %x\n",ThreadContext.Eip);
|
||||
|
@ -186,6 +185,11 @@ HANDLE STDCALL CreateFirstThread(HANDLE ProcessHandle,
|
|||
&DupSectionHandle,
|
||||
sizeof(DupSectionHandle),
|
||||
&BytesWritten);
|
||||
NtWriteVirtualMemory(ProcessHandle,
|
||||
(PVOID)(STACK_TOP - 16),
|
||||
&Peb,
|
||||
sizeof(PPEB),
|
||||
&BytesWritten);
|
||||
|
||||
|
||||
Status = NtCreateThread(&ThreadHandle,
|
||||
|
@ -343,6 +347,7 @@ HANDLE KERNEL32_MapFile(LPCWSTR lpApplicationName,
|
|||
|
||||
static NTSTATUS
|
||||
CreatePeb (
|
||||
PPEB *PebPtr,
|
||||
HANDLE ProcessHandle,
|
||||
PPPB Ppb)
|
||||
{
|
||||
|
@ -391,6 +396,8 @@ CreatePeb (
|
|||
Ppb->TotalSize,
|
||||
&BytesWritten);
|
||||
|
||||
*PebPtr = (PPEB)PebBase;
|
||||
|
||||
return(STATUS_SUCCESS);
|
||||
}
|
||||
|
||||
|
@ -412,7 +419,6 @@ CreateProcessW (
|
|||
HANDLE hSection, hProcess, hThread;
|
||||
NTSTATUS Status;
|
||||
LPTHREAD_START_ROUTINE lpStartAddress = NULL;
|
||||
LPVOID lpParameter = NULL;
|
||||
WCHAR TempCommandLine[256];
|
||||
PVOID BaseAddress;
|
||||
LARGE_INTEGER SectionOffset;
|
||||
|
@ -425,6 +431,7 @@ CreateProcessW (
|
|||
DWORD len = 0;
|
||||
PPPB Ppb;
|
||||
UNICODE_STRING CommandLine_U;
|
||||
PPEB Peb;
|
||||
|
||||
DPRINT("CreateProcessW(lpApplicationName '%w', lpCommandLine '%w')\n",
|
||||
lpApplicationName,lpCommandLine);
|
||||
|
@ -519,7 +526,7 @@ CreateProcessW (
|
|||
* Create Process Environment Block
|
||||
*/
|
||||
DPRINT("Creating peb\n");
|
||||
CreatePeb(hProcess, Ppb);
|
||||
CreatePeb(&Peb, hProcess, Ppb);
|
||||
|
||||
RtlDestroyProcessParameters (Ppb);
|
||||
|
||||
|
@ -532,10 +539,9 @@ CreateProcessW (
|
|||
lpThreadAttributes,
|
||||
Headers.OptionalHeader.SizeOfStackReserve,
|
||||
lpStartAddress,
|
||||
lpParameter,
|
||||
Peb,
|
||||
dwCreationFlags,
|
||||
&lpProcessInformation->dwThreadId,
|
||||
TempCommandLine,
|
||||
NTDllSection,
|
||||
hSection,
|
||||
(PVOID)Headers.OptionalHeader.ImageBase);
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $Id: startup.c,v 1.12 1999/11/25 10:47:55 dwelch Exp $
|
||||
/* $Id: startup.c,v 1.13 1999/12/08 12:58:06 ekohl Exp $
|
||||
*
|
||||
* COPYRIGHT: See COPYING in the top level directory
|
||||
* PROJECT: ReactOS kernel
|
||||
|
@ -81,7 +81,8 @@ NTSTATUS LdrMapNTDllForProcess (HANDLE ProcessHandle,
|
|||
* ARGUMENTS:
|
||||
* DWORD ImageBase The base address of the process image
|
||||
*/
|
||||
VOID LdrStartup(HANDLE SectionHandle,
|
||||
VOID LdrStartup(PPEB Peb,
|
||||
HANDLE SectionHandle,
|
||||
DWORD ImageBase,
|
||||
HANDLE NTDllSectionHandle)
|
||||
{
|
||||
|
@ -90,9 +91,9 @@ VOID LdrStartup(HANDLE SectionHandle,
|
|||
NTSTATUS Status;
|
||||
PIMAGE_NT_HEADERS NTHeaders;
|
||||
|
||||
DPRINT("LdrStartup(ImageBase %x, SectionHandle %x, "
|
||||
"NTDllSectionHandle %x)\n",ImageBase,
|
||||
SectionHandle, NTDllSectionHandle);
|
||||
DPRINT("LdrStartup(Peb %x SectionHandle %x, ImageBase %x, "
|
||||
"NTDllSectionHandle %x )\n",
|
||||
Peb, SectionHandle, ImageBase, NTDllSectionHandle);
|
||||
|
||||
LdrDllListHead.BaseAddress = (PVOID)&_image_base__;
|
||||
LdrDllListHead.Prev = &LdrDllListHead;
|
||||
|
@ -128,9 +129,8 @@ VOID LdrStartup(HANDLE SectionHandle,
|
|||
}
|
||||
|
||||
// dprintf("Transferring control to image at %x\n",EntryPoint);
|
||||
Status = EntryPoint();
|
||||
Status = EntryPoint(Peb);
|
||||
ZwTerminateProcess(NtCurrentProcess(),Status);
|
||||
}
|
||||
|
||||
|
||||
/* EOF */
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $Id: process.c,v 1.5 1999/12/06 00:22:43 ekohl Exp $
|
||||
/* $Id: process.c,v 1.6 1999/12/08 12:58:26 ekohl Exp $
|
||||
*
|
||||
* COPYRIGHT: See COPYING in the top level directory
|
||||
* PROJECT: ReactOS system libraries
|
||||
|
@ -35,10 +35,9 @@ RtlpCreateFirstThread(HANDLE ProcessHandle,
|
|||
PSECURITY_DESCRIPTOR SecurityDescriptor,
|
||||
DWORD dwStackSize,
|
||||
LPTHREAD_START_ROUTINE lpStartAddress,
|
||||
LPVOID lpParameter,
|
||||
PPEB Peb,
|
||||
DWORD dwCreationFlags,
|
||||
LPDWORD lpThreadId,
|
||||
PWSTR lpCommandLine,
|
||||
HANDLE NTDllSectionHandle,
|
||||
HANDLE SectionHandle,
|
||||
PVOID ImageBase)
|
||||
|
@ -67,6 +66,7 @@ RtlpCreateFirstThread(HANDLE ProcessHandle,
|
|||
else
|
||||
CreateSuspended = FALSE;
|
||||
|
||||
/* create the process stack (first thead) */
|
||||
BaseAddress = (PVOID)(STACK_TOP - dwStackSize);
|
||||
Status = NtAllocateVirtualMemory(ProcessHandle,
|
||||
&BaseAddress,
|
||||
|
@ -88,7 +88,7 @@ RtlpCreateFirstThread(HANDLE ProcessHandle,
|
|||
ThreadContext.SegDs = USER_DS;
|
||||
ThreadContext.SegCs = USER_CS;
|
||||
ThreadContext.SegSs = USER_DS;
|
||||
ThreadContext.Esp = STACK_TOP - 16;
|
||||
ThreadContext.Esp = STACK_TOP - 20;
|
||||
ThreadContext.EFlags = (1<<1) + (1<<9);
|
||||
|
||||
DPRINT("ThreadContext.Eip %x\n",ThreadContext.Eip);
|
||||
|
@ -123,6 +123,11 @@ RtlpCreateFirstThread(HANDLE ProcessHandle,
|
|||
&DupSectionHandle,
|
||||
sizeof(DupSectionHandle),
|
||||
&BytesWritten);
|
||||
NtWriteVirtualMemory(ProcessHandle,
|
||||
(PVOID)(STACK_TOP - 16),
|
||||
&Peb,
|
||||
sizeof(PPEB),
|
||||
&BytesWritten);
|
||||
|
||||
Status = NtCreateThread(&ThreadHandle,
|
||||
THREAD_ALL_ACCESS,
|
||||
|
@ -221,7 +226,8 @@ RtlpMapFile(PUNICODE_STRING ApplicationName,
|
|||
|
||||
|
||||
static NTSTATUS
|
||||
RtlpCreatePeb (
|
||||
RtlpCreatePpbAndPeb (
|
||||
PPEB *PebPtr,
|
||||
HANDLE ProcessHandle,
|
||||
PPPB Ppb)
|
||||
{
|
||||
|
@ -233,9 +239,31 @@ RtlpCreatePeb (
|
|||
PVOID PpbBase;
|
||||
ULONG PpbSize;
|
||||
|
||||
/* create the PPB */
|
||||
PpbBase = (PVOID)PEB_STARTUPINFO;
|
||||
PpbSize = Ppb->TotalSize;
|
||||
Status = NtAllocateVirtualMemory (
|
||||
ProcessHandle,
|
||||
&PpbBase,
|
||||
0,
|
||||
&PpbSize,
|
||||
MEM_COMMIT,
|
||||
PAGE_READWRITE);
|
||||
|
||||
if (!NT_SUCCESS(Status))
|
||||
return(Status);
|
||||
|
||||
DPRINT("Ppb size %x\n", PpbSize);
|
||||
NtWriteVirtualMemory (
|
||||
ProcessHandle,
|
||||
PpbBase,
|
||||
Ppb,
|
||||
Ppb->TotalSize,
|
||||
&BytesWritten);
|
||||
|
||||
/* create the PEB */
|
||||
PebBase = (PVOID)PEB_BASE;
|
||||
PebSize = 0x1000;
|
||||
|
||||
Status = NtAllocateVirtualMemory (
|
||||
ProcessHandle,
|
||||
&PebBase,
|
||||
|
@ -244,34 +272,18 @@ RtlpCreatePeb (
|
|||
MEM_COMMIT,
|
||||
PAGE_READWRITE);
|
||||
|
||||
memset(&Peb, 0, sizeof(Peb));
|
||||
Peb.Ppb = (PPPB)PEB_STARTUPINFO;
|
||||
memset (&Peb, 0, sizeof(PEB));
|
||||
Peb.Ppb = (PPPB)PpbBase;
|
||||
|
||||
NtWriteVirtualMemory(ProcessHandle,
|
||||
(PVOID)PEB_BASE,
|
||||
&Peb,
|
||||
sizeof(Peb),
|
||||
&BytesWritten);
|
||||
|
||||
PpbBase = (PVOID)PEB_STARTUPINFO;
|
||||
PpbSize = Ppb->TotalSize;
|
||||
Status = NtAllocateVirtualMemory(ProcessHandle,
|
||||
&PpbBase,
|
||||
0,
|
||||
&PpbSize,
|
||||
MEM_COMMIT,
|
||||
PAGE_READWRITE);
|
||||
if (!NT_SUCCESS(Status))
|
||||
return(Status);
|
||||
|
||||
DPRINT("Ppb size %x\n", PpbSize);
|
||||
NtWriteVirtualMemory (
|
||||
ProcessHandle,
|
||||
(PVOID)PEB_STARTUPINFO,
|
||||
Ppb,
|
||||
Ppb->TotalSize,
|
||||
PebBase,
|
||||
&Peb,
|
||||
sizeof(PEB),
|
||||
&BytesWritten);
|
||||
|
||||
*PebPtr = (PPEB)PebBase;
|
||||
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
|
@ -293,8 +305,6 @@ RtlCreateUserProcess (
|
|||
HANDLE hSection, hProcess, hThread;
|
||||
NTSTATUS Status;
|
||||
LPTHREAD_START_ROUTINE lpStartAddress = NULL;
|
||||
LPVOID lpParameter = NULL;
|
||||
WCHAR TempCommandLine[256];
|
||||
PVOID BaseAddress;
|
||||
LARGE_INTEGER SectionOffset;
|
||||
IMAGE_NT_HEADERS Headers;
|
||||
|
@ -304,6 +314,7 @@ RtlCreateUserProcess (
|
|||
PROCESS_BASIC_INFORMATION ProcessBasicInfo;
|
||||
CLIENT_ID LocalClientId;
|
||||
ULONG retlen;
|
||||
PPEB Peb;
|
||||
|
||||
DPRINT ("RtlCreateUserProcess(CommandLine '%w')\n",
|
||||
CommandLine->Buffer);
|
||||
|
@ -358,8 +369,8 @@ RtlCreateUserProcess (
|
|||
/*
|
||||
*
|
||||
*/
|
||||
DPRINT("Creating peb\n");
|
||||
RtlpCreatePeb (hProcess, Ppb);
|
||||
DPRINT("Creating PPB and PEB\n");
|
||||
RtlpCreatePpbAndPeb (&Peb, hProcess, Ppb);
|
||||
|
||||
DPRINT("Creating thread for process\n");
|
||||
lpStartAddress = (LPTHREAD_START_ROUTINE)
|
||||
|
@ -371,10 +382,9 @@ RtlCreateUserProcess (
|
|||
ThreadSd,
|
||||
Headers.OptionalHeader.SizeOfStackReserve,
|
||||
lpStartAddress,
|
||||
lpParameter,
|
||||
Peb,
|
||||
dwCreationFlags,
|
||||
&LocalClientId.UniqueThread,
|
||||
TempCommandLine,
|
||||
NTDllSection,
|
||||
hSection,
|
||||
(PVOID)Headers.OptionalHeader.ImageBase);
|
||||
|
|
|
@ -37,72 +37,21 @@
|
|||
|
||||
/* FUNCTIONS ****************************************************************/
|
||||
|
||||
/**********************************************************************
|
||||
* NAME
|
||||
* LdrLoadImage
|
||||
*
|
||||
* FUNCTION:
|
||||
* Builds the initial environment for a process. Should be used
|
||||
* to load the initial user process.
|
||||
*
|
||||
* ARGUMENTS:
|
||||
* HANDLE ProcessHandle handle of the process to load the module into
|
||||
* PUNICODE_STRING Filename name of the module to load
|
||||
*
|
||||
* RETURNS:
|
||||
* NTSTATUS
|
||||
*/
|
||||
|
||||
#define STACK_TOP (0xb0000000)
|
||||
|
||||
static NTSTATUS LdrCreatePeb(HANDLE ProcessHandle)
|
||||
static NTSTATUS
|
||||
LdrCreatePpb (
|
||||
PPPB *PpbPtr,
|
||||
HANDLE ProcessHandle
|
||||
)
|
||||
{
|
||||
PVOID PebBase;
|
||||
ULONG PebSize;
|
||||
PEB Peb;
|
||||
PVOID PpbBase;
|
||||
ULONG PpbSize;
|
||||
PPB Ppb;
|
||||
ULONG BytesWritten;
|
||||
NTSTATUS Status;
|
||||
|
||||
PebBase = (PVOID)PEB_BASE;
|
||||
PebSize = 0x1000;
|
||||
|
||||
memset(&Peb, 0, sizeof Peb);
|
||||
|
||||
Peb.Ppb = (PPPB)PEB_STARTUPINFO;
|
||||
|
||||
Status = ZwAllocateVirtualMemory (
|
||||
ProcessHandle,
|
||||
(PVOID*)&PebBase,
|
||||
0,
|
||||
&PebSize,
|
||||
MEM_COMMIT,
|
||||
PAGE_READWRITE
|
||||
);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
DbgPrint ("Peb allocation failed \n");
|
||||
DbgPrintErrorMessage (Status);
|
||||
}
|
||||
|
||||
ZwWriteVirtualMemory (
|
||||
ProcessHandle,
|
||||
PebBase,
|
||||
&Peb,
|
||||
sizeof(Peb),
|
||||
&BytesWritten);
|
||||
|
||||
/* write pointer to peb on the stack (parameter of NtProcessStartup) */
|
||||
ZwWriteVirtualMemory(
|
||||
ProcessHandle,
|
||||
(PVOID) (STACK_TOP - 16),
|
||||
&PebBase,
|
||||
sizeof (PVOID),
|
||||
& BytesWritten
|
||||
);
|
||||
|
||||
/* Create process parameters block (PPB)*/
|
||||
PpbBase = (PVOID)PEB_STARTUPINFO;
|
||||
PpbSize = sizeof (PPB);
|
||||
|
@ -119,8 +68,10 @@ static NTSTATUS LdrCreatePeb(HANDLE ProcessHandle)
|
|||
{
|
||||
DbgPrint ("Ppb allocation failed \n");
|
||||
DbgPrintErrorMessage (Status);
|
||||
return Status;
|
||||
}
|
||||
|
||||
/* initialize the ppb */
|
||||
memset (&Ppb, 0, sizeof(PPB));
|
||||
|
||||
ZwWriteVirtualMemory (
|
||||
|
@ -130,10 +81,75 @@ static NTSTATUS LdrCreatePeb(HANDLE ProcessHandle)
|
|||
sizeof(PPB),
|
||||
&BytesWritten);
|
||||
|
||||
*PpbPtr = PpbBase;
|
||||
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
static NTSTATUS
|
||||
LdrCreatePeb (
|
||||
PPEB *PebPtr,
|
||||
HANDLE ProcessHandle,
|
||||
PPPB Ppb
|
||||
)
|
||||
{
|
||||
PPEB PebBase;
|
||||
ULONG PebSize;
|
||||
PEB Peb;
|
||||
ULONG BytesWritten;
|
||||
NTSTATUS Status;
|
||||
|
||||
PebBase = (PVOID)PEB_BASE;
|
||||
PebSize = 0x1000;
|
||||
|
||||
Status = ZwAllocateVirtualMemory (
|
||||
ProcessHandle,
|
||||
(PVOID*)&PebBase,
|
||||
0,
|
||||
&PebSize,
|
||||
MEM_COMMIT,
|
||||
PAGE_READWRITE
|
||||
);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
DbgPrint ("Peb allocation failed \n");
|
||||
DbgPrintErrorMessage (Status);
|
||||
}
|
||||
|
||||
/* initialize the peb */
|
||||
memset(&Peb, 0, sizeof Peb);
|
||||
Peb.Ppb = Ppb;
|
||||
|
||||
ZwWriteVirtualMemory (
|
||||
ProcessHandle,
|
||||
PebBase,
|
||||
&Peb,
|
||||
sizeof(Peb),
|
||||
&BytesWritten);
|
||||
|
||||
*PebPtr = (PPEB)PebBase;
|
||||
|
||||
return(STATUS_SUCCESS);
|
||||
}
|
||||
|
||||
|
||||
/**********************************************************************
|
||||
* NAME
|
||||
* LdrLoadImage
|
||||
*
|
||||
* FUNCTION:
|
||||
* Builds the initial environment for a process. Should be used
|
||||
* to load the initial user process.
|
||||
*
|
||||
* ARGUMENTS:
|
||||
* HANDLE ProcessHandle handle of the process to load the module into
|
||||
* PUNICODE_STRING Filename name of the module to load
|
||||
*
|
||||
* RETURNS:
|
||||
* NTSTATUS
|
||||
*/
|
||||
|
||||
NTSTATUS LdrLoadImage(HANDLE ProcessHandle,
|
||||
PUNICODE_STRING Filename)
|
||||
{
|
||||
|
@ -161,6 +177,9 @@ NTSTATUS LdrLoadImage(HANDLE ProcessHandle,
|
|||
|
||||
WCHAR TmpNameBuffer [MAX_PATH];
|
||||
|
||||
PPPB Ppb;
|
||||
PPEB Peb;
|
||||
|
||||
|
||||
/* -- PART I -- */
|
||||
|
||||
|
@ -440,6 +459,36 @@ NTSTATUS LdrLoadImage(HANDLE ProcessHandle,
|
|||
|
||||
/* -- PART III -- */
|
||||
|
||||
/* Create the process parameter block (PPB) */
|
||||
Status = LdrCreatePpb (&Ppb,
|
||||
ProcessHandle);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
DPRINT("PPB creation failed ");
|
||||
DbgPrintErrorMessage(Status);
|
||||
|
||||
/* FIXME: unmap the section here */
|
||||
/* FIXME: destroy the section here */
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
/* Create the process environment block (PEB) */
|
||||
Status = LdrCreatePeb (&Peb,
|
||||
ProcessHandle,
|
||||
Ppb);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
DPRINT("PEB creation failed ");
|
||||
DbgPrintErrorMessage(Status);
|
||||
|
||||
/* FIXME: unmap the section here */
|
||||
/* FIXME: destroy the section here */
|
||||
/* FIXME: free the PPB */
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
/*
|
||||
* Create page backed section for stack
|
||||
*/
|
||||
|
@ -449,6 +498,7 @@ NTSTATUS LdrLoadImage(HANDLE ProcessHandle,
|
|||
);
|
||||
StackSize =
|
||||
NTHeaders->OptionalHeader.SizeOfStackReserve;
|
||||
DbgPrint ("Stack size %x\n", StackSize);
|
||||
|
||||
Status = ZwAllocateVirtualMemory(
|
||||
ProcessHandle,
|
||||
|
@ -509,22 +559,23 @@ NTSTATUS LdrLoadImage(HANDLE ProcessHandle,
|
|||
sizeof (DupSectionHandle),
|
||||
& BytesWritten
|
||||
);
|
||||
/*
|
||||
* Create a peb (grungy)
|
||||
*/
|
||||
Status = LdrCreatePeb(ProcessHandle);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
DbgPrint("LDR: Failed to create initial peb\n");
|
||||
return (Status);
|
||||
}
|
||||
|
||||
/* write pointer to peb on the stack (parameter of NtProcessStartup) */
|
||||
ZwWriteVirtualMemory(
|
||||
ProcessHandle,
|
||||
(PVOID) (STACK_TOP - 16),
|
||||
&Peb,
|
||||
sizeof (ULONG),
|
||||
&BytesWritten
|
||||
);
|
||||
|
||||
DbgPrint ("NTOSKRNL: Peb = %x\n", Peb);
|
||||
/*
|
||||
* Initialize context to point to LdrStartup
|
||||
*/
|
||||
memset(&Context,0,sizeof(CONTEXT));
|
||||
Context.SegSs = USER_DS;
|
||||
Context.Esp = STACK_TOP - 16;
|
||||
Context.Esp = STACK_TOP - 20;
|
||||
Context.EFlags = 0x202;
|
||||
Context.SegCs = USER_CS;
|
||||
Context.Eip = LdrStartupAddr;
|
||||
|
|
Loading…
Reference in a new issue