-move ppb from ntdll to rtl
smapiexec.c: free ppb on failure. resume thread (RtlCreateUserProcess is
supposed to create the thread suspended)
Modified: trunk/reactos/lib/ntdll/makefile
Deleted: trunk/reactos/lib/ntdll/rtl/ppb.c
Modified: trunk/reactos/lib/ntdll/rtl/teb.c
Modified: trunk/reactos/lib/rtl/makefile
Added: trunk/reactos/lib/rtl/ppb.c
Modified: trunk/reactos/ntoskrnl/rtl/libsupp.c
Modified: trunk/reactos/subsys/smss/smapiexec.c
_____
Modified: trunk/reactos/lib/ntdll/makefile
--- trunk/reactos/lib/ntdll/makefile 2005-04-01 00:30:29 UTC (rev
14401)
+++ trunk/reactos/lib/ntdll/makefile 2005-04-01 00:39:52 UTC (rev
14402)
@@ -76,7 +76,6 @@
rtl/message.o \
rtl/misc.o \
rtl/path.o \
- rtl/ppb.o \
rtl/process.o \
rtl/propvar.o \
rtl/rangelist.o \
_____
Deleted: trunk/reactos/lib/ntdll/rtl/ppb.c
--- trunk/reactos/lib/ntdll/rtl/ppb.c 2005-04-01 00:30:29 UTC (rev
14401)
+++ trunk/reactos/lib/ntdll/rtl/ppb.c 2005-04-01 00:39:52 UTC (rev
14402)
@@ -1,312 +0,0 @@
-/* $Id$
- *
- * COPYRIGHT: See COPYING in the top level directory
- * PROJECT: ReactOS system libraries
- * FILE: lib/ntdll/rtl/ppb.c
- * PURPOSE: Process parameters functions
- * PROGRAMMER: Ariadne ( ariadne(a)xs4all.nl)
- * UPDATE HISTORY:
- * Created 01/11/98
- */
-
-/* INCLUDES
****************************************************************/
-
-#include <ddk/ntddk.h>
-#include <windows.h>
-#include <ntdll/ldr.h>
-#include <napi/teb.h>
-#include <ntdll/base.h>
-#include <ntdll/rtl.h>
-
-#define NDEBUG
-#include <ntdll/ntdll.h>
-
-/* MACROS
****************************************************************/
-
-#define NORMALIZE(x,addr) {if(x)
x=(PVOID)((ULONG_PTR)(x)+(ULONG_PTR)(addr));}
-#define DENORMALIZE(x,addr) {if(x)
x=(PVOID)((ULONG_PTR)(x)-(ULONG_PTR)(addr));}
-#define ALIGN(x,align) (((ULONG)(x)+(align)-1UL)&(~((align)-1UL)))
-
-
-/* FUNCTIONS
****************************************************************/
-
-/*
- * @implemented
- */
-VOID STDCALL
-RtlAcquirePebLock(VOID)
-{
- PPEB Peb = NtCurrentPeb ();
- Peb->FastPebLockRoutine (Peb->FastPebLock);
-}
-
-
-/*
- * @implemented
- */
-VOID STDCALL
-RtlReleasePebLock(VOID)
-{
- PPEB Peb = NtCurrentPeb ();
- Peb->FastPebUnlockRoutine (Peb->FastPebLock);
-}
-
-static inline VOID
-RtlpCopyParameterString(PWCHAR *Ptr,
- PUNICODE_STRING Destination,
- PUNICODE_STRING Source,
- ULONG Size)
-{
- Destination->Length = Source->Length;
- Destination->MaximumLength = Size ? Size : Source->MaximumLength;
- Destination->Buffer = (PWCHAR)(*Ptr);
- if (Source->Length)
- memmove (Destination->Buffer, Source->Buffer, Source->Length);
- Destination->Buffer[Destination->Length / sizeof(WCHAR)] = 0;
- *Ptr += Destination->MaximumLength/sizeof(WCHAR);
-}
-
-
-/*
- * @implemented
- */
-NTSTATUS STDCALL
-RtlCreateProcessParameters(PRTL_USER_PROCESS_PARAMETERS
*ProcessParameters,
- PUNICODE_STRING ImagePathName,
- PUNICODE_STRING DllPath,
- PUNICODE_STRING CurrentDirectory,
- PUNICODE_STRING CommandLine,
- PWSTR Environment,
- PUNICODE_STRING WindowTitle,
- PUNICODE_STRING DesktopInfo,
- PUNICODE_STRING ShellInfo,
- PUNICODE_STRING RuntimeInfo)
-{
- NTSTATUS Status = STATUS_SUCCESS;
- PRTL_USER_PROCESS_PARAMETERS Param = NULL;
- ULONG RegionSize = 0;
- ULONG Length = 0;
- PWCHAR Dest;
- UNICODE_STRING EmptyString;
- HANDLE CurrentDirectoryHandle;
- HANDLE ConsoleHandle;
- ULONG ConsoleFlags;
-
- DPRINT ("RtlCreateProcessParameters\n");
-
- RtlAcquirePebLock();
-
- EmptyString.Length = 0;
- EmptyString.MaximumLength = sizeof(WCHAR);
- EmptyString.Buffer = L"";
-
- if (NtCurrentPeb()->ProcessParameters)
- {
- if (DllPath == NULL)
- DllPath = &NtCurrentPeb()->ProcessParameters->DllPath;
- if (Environment == NULL)
- Environment = NtCurrentPeb()->ProcessParameters->Environment;
- if (CurrentDirectory == NULL)
- CurrentDirectory =
&NtCurrentPeb()->ProcessParameters->CurrentDirectoryName;
- CurrentDirectoryHandle =
NtCurrentPeb()->ProcessParameters->CurrentDirectoryHandle;
- ConsoleHandle = NtCurrentPeb()->ProcessParameters->hConsole;
- ConsoleFlags = NtCurrentPeb()->ProcessParameters->ProcessGroup;
- }
- else
- {
- if (DllPath == NULL)
- DllPath = &EmptyString;
- if (CurrentDirectory == NULL)
- CurrentDirectory = &EmptyString;
- CurrentDirectoryHandle = NULL;
- ConsoleHandle = NULL;
- ConsoleFlags = 0;
- }
-
- if (CommandLine == NULL)
- CommandLine = &EmptyString;
- if (WindowTitle == NULL)
- WindowTitle = &EmptyString;
- if (DesktopInfo == NULL)
- DesktopInfo = &EmptyString;
- if (ShellInfo == NULL)
- ShellInfo = &EmptyString;
- if (RuntimeInfo == NULL)
- RuntimeInfo = &EmptyString;
-
- /* size of process parameter block */
- Length = sizeof(RTL_USER_PROCESS_PARAMETERS);
-
- /* size of current directory buffer */
- Length += (MAX_PATH * sizeof(WCHAR));
-
- /* add string lengths */
- Length += ALIGN(DllPath->MaximumLength, sizeof(ULONG));
- Length += ALIGN(ImagePathName->Length + sizeof(WCHAR),
sizeof(ULONG));
- Length += ALIGN(CommandLine->Length + sizeof(WCHAR), sizeof(ULONG));
- Length += ALIGN(WindowTitle->MaximumLength, sizeof(ULONG));
- Length += ALIGN(DesktopInfo->MaximumLength, sizeof(ULONG));
- Length += ALIGN(ShellInfo->MaximumLength, sizeof(ULONG));
- Length += ALIGN(RuntimeInfo->MaximumLength, sizeof(ULONG));
-
- /* Calculate the required block size */
- RegionSize = ROUNDUP(Length, PAGE_SIZE);
-
- Status = NtAllocateVirtualMemory(NtCurrentProcess(),
- (PVOID*)&Param,
- 0,
- &RegionSize,
- MEM_RESERVE | MEM_COMMIT,
- PAGE_READWRITE);
- if (!NT_SUCCESS(Status))
- {
- RtlReleasePebLock();
- return Status;
- }
-
- DPRINT ("Process parameters allocated\n");
-
- Param->AllocationSize = RegionSize;
- Param->Size = Length;
- Param->Flags = PPF_NORMALIZED;
- Param->Environment = Environment;
- Param->CurrentDirectoryHandle = CurrentDirectoryHandle;
- Param->hConsole = ConsoleHandle;
- Param->ProcessGroup = ConsoleFlags;
-
- Dest = (PWCHAR)(((PBYTE)Param) +
sizeof(RTL_USER_PROCESS_PARAMETERS));
-
- /* copy current directory */
- RtlpCopyParameterString(&Dest,
- &Param->CurrentDirectoryName,
- CurrentDirectory,
- MAX_PATH * sizeof(WCHAR));
-
- /* make sure the current directory has a trailing backslash */
- if (Param->CurrentDirectoryName.Length > 0)
- {
- ULONG Length;
-
- Length = Param->CurrentDirectoryName.Length / sizeof(WCHAR);
- if (Param->CurrentDirectoryName.Buffer[Length-1] != L'\\')
- {
- Param->CurrentDirectoryName.Buffer[Length] = L'\\';
- Param->CurrentDirectoryName.Buffer[Length + 1] = 0;
- Param->CurrentDirectoryName.Length += sizeof(WCHAR);
- }
- }
-
- /* copy dll path */
- RtlpCopyParameterString(&Dest,
- &Param->DllPath,
- DllPath,
- 0);
-
- /* copy image path name */
- RtlpCopyParameterString(&Dest,
- &Param->ImagePathName,
- ImagePathName,
- ImagePathName->Length + sizeof(WCHAR));
-
- /* copy command line */
- RtlpCopyParameterString(&Dest,
- &Param->CommandLine,
- CommandLine,
- CommandLine->Length + sizeof(WCHAR));
-
- /* copy title */
- RtlpCopyParameterString(&Dest,
- &Param->WindowTitle,
- WindowTitle,
- 0);
-
- /* copy desktop */
- RtlpCopyParameterString(&Dest,
- &Param->DesktopInfo,
- DesktopInfo,
- 0);
-
- /* copy shell info */
- RtlpCopyParameterString(&Dest,
- &Param->ShellInfo,
- ShellInfo,
- 0);
-
- /* copy runtime info */
- RtlpCopyParameterString(&Dest,
- &Param->RuntimeInfo,
- RuntimeInfo,
- 0);
-
- RtlDeNormalizeProcessParams(Param);
- *ProcessParameters = Param;
- RtlReleasePebLock();
-
- return STATUS_SUCCESS;
-}
-
-/*
- * @implemented
- */
-NTSTATUS STDCALL
-RtlDestroyProcessParameters(PRTL_USER_PROCESS_PARAMETERS
ProcessParameters)
-{
- ULONG RegionSize = 0;
-
- return NtFreeVirtualMemory (NtCurrentProcess (),
- (PVOID)ProcessParameters,
- &RegionSize,
- MEM_RELEASE);
-}
-
-/*
- * denormalize process parameters (Pointer-->Offset)
- *
- * @implemented
- */
-PRTL_USER_PROCESS_PARAMETERS STDCALL
-RtlDeNormalizeProcessParams(PRTL_USER_PROCESS_PARAMETERS Params)
-{
- if (Params && (Params->Flags & PPF_NORMALIZED))
- {
- DENORMALIZE(Params->CurrentDirectoryName.Buffer, Params);
- DENORMALIZE(Params->DllPath.Buffer, Params);
- DENORMALIZE(Params->ImagePathName.Buffer, Params);
- DENORMALIZE(Params->CommandLine.Buffer, Params);
- DENORMALIZE(Params->WindowTitle.Buffer, Params);
- DENORMALIZE(Params->DesktopInfo.Buffer, Params);
- DENORMALIZE(Params->ShellInfo.Buffer, Params);
- DENORMALIZE(Params->RuntimeInfo.Buffer, Params);
-
- Params->Flags &= ~PPF_NORMALIZED;
- }
-
- return Params;
-}
-
-/*
- * normalize process parameters (Offset-->Pointer)
- *
- * @implemented
- */
-PRTL_USER_PROCESS_PARAMETERS STDCALL
-RtlNormalizeProcessParams(PRTL_USER_PROCESS_PARAMETERS Params)
-{
- if (Params && !(Params->Flags & PPF_NORMALIZED))
- {
- NORMALIZE(Params->CurrentDirectoryName.Buffer, Params);
- NORMALIZE(Params->DllPath.Buffer, Params);
- NORMALIZE(Params->ImagePathName.Buffer, Params);
- NORMALIZE(Params->CommandLine.Buffer, Params);
- NORMALIZE(Params->WindowTitle.Buffer, Params);
- NORMALIZE(Params->DesktopInfo.Buffer, Params);
- NORMALIZE(Params->ShellInfo.Buffer, Params);
- NORMALIZE(Params->RuntimeInfo.Buffer, Params);
-
- Params->Flags |= PPF_NORMALIZED;
- }
-
- return Params;
-}
-
-/* EOF */
_____
Modified: trunk/reactos/lib/ntdll/rtl/teb.c
--- trunk/reactos/lib/ntdll/rtl/teb.c 2005-04-01 00:30:29 UTC (rev
14401)
+++ trunk/reactos/lib/ntdll/rtl/teb.c 2005-04-01 00:39:52 UTC (rev
14402)
@@ -9,7 +9,30 @@
#include <ddk/ntddk.h>
#include <napi/teb.h>
+
PTEB STDCALL
_NtCurrentTeb() { return NtCurrentTeb(); }
+
+/*
+ * @implemented
+ */
+VOID STDCALL
+RtlAcquirePebLock(VOID)
+{
+ PPEB Peb = NtCurrentPeb ();
+ Peb->FastPebLockRoutine (Peb->FastPebLock);
+}
+
+
+/*
+ * @implemented
+ */
+VOID STDCALL
+RtlReleasePebLock(VOID)
+{
+ PPEB Peb = NtCurrentPeb ();
+ Peb->FastPebUnlockRoutine (Peb->FastPebLock);
+}
+
/* EOF */
_____
Modified: trunk/reactos/lib/rtl/makefile
--- trunk/reactos/lib/rtl/makefile 2005-04-01 00:30:29 UTC (rev
14401)
+++ trunk/reactos/lib/rtl/makefile 2005-04-01 00:39:52 UTC (rev
14402)
@@ -18,6 +18,7 @@
TARGET_OBJECTS = \
acl.o \
+ ppb.o \
bit.o \
bitmap.o \
bootdata.o \
_____
Copied: trunk/reactos/lib/rtl/ppb.c (from rev 14394,
trunk/reactos/lib/ntdll/rtl/ppb.c)
--- trunk/reactos/lib/ntdll/rtl/ppb.c 2005-03-31 19:54:03 UTC (rev
14394)
+++ trunk/reactos/lib/rtl/ppb.c 2005-04-01 00:39:52 UTC (rev 14402)
@@ -0,0 +1,296 @@
+/* $Id$
+ *
+ * COPYRIGHT: See COPYING in the top level directory
+ * PROJECT: ReactOS system libraries
+ * FILE: lib/ntdll/rtl/ppb.c
+ * PURPOSE: Process parameters functions
+ * PROGRAMMER: Ariadne ( ariadne(a)xs4all.nl)
+ * UPDATE HISTORY:
+ * Created 01/11/98
+ */
+
+/* INCLUDES
****************************************************************/
+
+#include <ddk/ntddk.h>
+#include <windows.h>
+#include <ntdll/ldr.h>
+#include <napi/teb.h>
+#include <ntdll/base.h>
+#include <ntdll/rtl.h>
+
+#define NDEBUG
+#include <ntdll/ntdll.h>
+
+/* MACROS
****************************************************************/
+
+#define NORMALIZE(x,addr) {if(x)
x=(PVOID)((ULONG_PTR)(x)+(ULONG_PTR)(addr));}
+#define DENORMALIZE(x,addr) {if(x)
x=(PVOID)((ULONG_PTR)(x)-(ULONG_PTR)(addr));}
+#define ALIGN(x,align) (((ULONG)(x)+(align)-1UL)&(~((align)-1UL)))
+
+
+KPROCESSOR_MODE
+RtlpGetMode();
+
+
+/* FUNCTIONS
****************************************************************/
+
+
+static inline VOID
+RtlpCopyParameterString(PWCHAR *Ptr,
+ PUNICODE_STRING Destination,
+ PUNICODE_STRING Source,
+ ULONG Size)
+{
+ Destination->Length = Source->Length;
+ Destination->MaximumLength = Size ? Size : Source->MaximumLength;
+ Destination->Buffer = (PWCHAR)(*Ptr);
+ if (Source->Length)
+ memmove (Destination->Buffer, Source->Buffer, Source->Length);
+ Destination->Buffer[Destination->Length / sizeof(WCHAR)] = 0;
+ *Ptr += Destination->MaximumLength/sizeof(WCHAR);
+}
+
+
+/*
+ * @implemented
+ */
+NTSTATUS STDCALL
+RtlCreateProcessParameters(PRTL_USER_PROCESS_PARAMETERS
*ProcessParameters,
+ PUNICODE_STRING ImagePathName,
+ PUNICODE_STRING DllPath,
+ PUNICODE_STRING CurrentDirectory,
+ PUNICODE_STRING CommandLine,
+ PWSTR Environment,
+ PUNICODE_STRING WindowTitle,
+ PUNICODE_STRING DesktopInfo,
+ PUNICODE_STRING ShellInfo,
+ PUNICODE_STRING RuntimeInfo)
+{
+ NTSTATUS Status = STATUS_SUCCESS;
+ PRTL_USER_PROCESS_PARAMETERS Param = NULL;
+ ULONG RegionSize = 0;
+ ULONG Length = 0;
+ PWCHAR Dest;
+ UNICODE_STRING EmptyString;
+ HANDLE CurrentDirectoryHandle;
+ HANDLE ConsoleHandle;
+ ULONG ConsoleFlags;
+
+ DPRINT ("RtlCreateProcessParameters\n");
+
+ RtlAcquirePebLock();
+
+ EmptyString.Length = 0;
+ EmptyString.MaximumLength = sizeof(WCHAR);
+ EmptyString.Buffer = L"";
+
+ if (RtlpGetMode() == UserMode)
+ {
+ if (DllPath == NULL)
+ DllPath = &NtCurrentPeb()->ProcessParameters->DllPath;
+ if (Environment == NULL)
+ Environment = NtCurrentPeb()->ProcessParameters->Environment;
+ if (CurrentDirectory == NULL)
+ CurrentDirectory =
&NtCurrentPeb()->ProcessParameters->CurrentDirectoryName;
+ CurrentDirectoryHandle =
NtCurrentPeb()->ProcessParameters->CurrentDirectoryHandle;
+ ConsoleHandle = NtCurrentPeb()->ProcessParameters->hConsole;
+ ConsoleFlags = NtCurrentPeb()->ProcessParameters->ProcessGroup;
+ }
+ else
+ {
+ if (DllPath == NULL)
+ DllPath = &EmptyString;
+ if (CurrentDirectory == NULL)
+ CurrentDirectory = &EmptyString;
+ CurrentDirectoryHandle = NULL;
+ ConsoleHandle = NULL;
+ ConsoleFlags = 0;
+ }
+
+ if (CommandLine == NULL)
+ CommandLine = &EmptyString;
+ if (WindowTitle == NULL)
+ WindowTitle = &EmptyString;
+ if (DesktopInfo == NULL)
+ DesktopInfo = &EmptyString;
+ if (ShellInfo == NULL)
+ ShellInfo = &EmptyString;
+ if (RuntimeInfo == NULL)
+ RuntimeInfo = &EmptyString;
+
+ /* size of process parameter block */
+ Length = sizeof(RTL_USER_PROCESS_PARAMETERS);
+
+ /* size of current directory buffer */
+ Length += (MAX_PATH * sizeof(WCHAR));
+
+ /* add string lengths */
+ Length += ALIGN(DllPath->MaximumLength, sizeof(ULONG));
+ Length += ALIGN(ImagePathName->Length + sizeof(WCHAR),
sizeof(ULONG));
+ Length += ALIGN(CommandLine->Length + sizeof(WCHAR), sizeof(ULONG));
+ Length += ALIGN(WindowTitle->MaximumLength, sizeof(ULONG));
+ Length += ALIGN(DesktopInfo->MaximumLength, sizeof(ULONG));
+ Length += ALIGN(ShellInfo->MaximumLength, sizeof(ULONG));
+ Length += ALIGN(RuntimeInfo->MaximumLength, sizeof(ULONG));
+
+ /* Calculate the required block size */
+ RegionSize = ROUNDUP(Length, PAGE_SIZE);
+
+ Status = ZwAllocateVirtualMemory(NtCurrentProcess(),
+ (PVOID*)&Param,
+ 0,
+ &RegionSize,
+ MEM_RESERVE | MEM_COMMIT,
+ PAGE_READWRITE);
+ if (!NT_SUCCESS(Status))
+ {
+ RtlReleasePebLock();
+ return Status;
+ }
+
+ DPRINT ("Process parameters allocated\n");
+
+ Param->AllocationSize = RegionSize;
+ Param->Size = Length;
+ Param->Flags = PPF_NORMALIZED;
+ Param->Environment = Environment;
+ Param->CurrentDirectoryHandle = CurrentDirectoryHandle;
+ Param->hConsole = ConsoleHandle;
+ Param->ProcessGroup = ConsoleFlags;
+
+ Dest = (PWCHAR)(((PBYTE)Param) +
sizeof(RTL_USER_PROCESS_PARAMETERS));
+
+ /* copy current directory */
+ RtlpCopyParameterString(&Dest,
+ &Param->CurrentDirectoryName,
+ CurrentDirectory,
+ MAX_PATH * sizeof(WCHAR));
+
+ /* make sure the current directory has a trailing backslash */
+ if (Param->CurrentDirectoryName.Length > 0)
+ {
+ ULONG Length;
+
+ Length = Param->CurrentDirectoryName.Length / sizeof(WCHAR);
+ if (Param->CurrentDirectoryName.Buffer[Length-1] != L'\\')
+ {
+ Param->CurrentDirectoryName.Buffer[Length] = L'\\';
+ Param->CurrentDirectoryName.Buffer[Length + 1] = 0;
+ Param->CurrentDirectoryName.Length += sizeof(WCHAR);
+ }
+ }
+
+ /* copy dll path */
+ RtlpCopyParameterString(&Dest,
+ &Param->DllPath,
+ DllPath,
+ 0);
+
+ /* copy image path name */
+ RtlpCopyParameterString(&Dest,
+ &Param->ImagePathName,
+ ImagePathName,
+ ImagePathName->Length + sizeof(WCHAR));
+
+ /* copy command line */
+ RtlpCopyParameterString(&Dest,
+ &Param->CommandLine,
+ CommandLine,
+ CommandLine->Length + sizeof(WCHAR));
+
+ /* copy title */
+ RtlpCopyParameterString(&Dest,
+ &Param->WindowTitle,
+ WindowTitle,
+ 0);
+
+ /* copy desktop */
+ RtlpCopyParameterString(&Dest,
+ &Param->DesktopInfo,
+ DesktopInfo,
+ 0);
+
+ /* copy shell info */
+ RtlpCopyParameterString(&Dest,
+ &Param->ShellInfo,
+ ShellInfo,
+ 0);
+
+ /* copy runtime info */
+ RtlpCopyParameterString(&Dest,
+ &Param->RuntimeInfo,
+ RuntimeInfo,
+ 0);
+
+ RtlDeNormalizeProcessParams(Param);
+ *ProcessParameters = Param;
+ RtlReleasePebLock();
+
+ return STATUS_SUCCESS;
+}
+
+/*
+ * @implemented
+ */
+NTSTATUS STDCALL
+RtlDestroyProcessParameters(PRTL_USER_PROCESS_PARAMETERS
ProcessParameters)
+{
+ ULONG RegionSize = 0;
+
+ return ZwFreeVirtualMemory (NtCurrentProcess (),
+ (PVOID)ProcessParameters,
+ &RegionSize,
+ MEM_RELEASE);
+}
+
+/*
+ * denormalize process parameters (Pointer-->Offset)
+ *
+ * @implemented
+ */
+PRTL_USER_PROCESS_PARAMETERS STDCALL
+RtlDeNormalizeProcessParams(PRTL_USER_PROCESS_PARAMETERS Params)
+{
+ if (Params && (Params->Flags & PPF_NORMALIZED))
+ {
+ DENORMALIZE(Params->CurrentDirectoryName.Buffer, Params);
+ DENORMALIZE(Params->DllPath.Buffer, Params);
+ DENORMALIZE(Params->ImagePathName.Buffer, Params);
+ DENORMALIZE(Params->CommandLine.Buffer, Params);
+ DENORMALIZE(Params->WindowTitle.Buffer, Params);
+ DENORMALIZE(Params->DesktopInfo.Buffer, Params);
+ DENORMALIZE(Params->ShellInfo.Buffer, Params);
+ DENORMALIZE(Params->RuntimeInfo.Buffer, Params);
+
+ Params->Flags &= ~PPF_NORMALIZED;
+ }
+
+ return Params;
+}
+
+/*
+ * normalize process parameters (Offset-->Pointer)
+ *
+ * @implemented
+ */
+PRTL_USER_PROCESS_PARAMETERS STDCALL
+RtlNormalizeProcessParams(PRTL_USER_PROCESS_PARAMETERS Params)
+{
+ if (Params && !(Params->Flags & PPF_NORMALIZED))
+ {
+ NORMALIZE(Params->CurrentDirectoryName.Buffer, Params);
+ NORMALIZE(Params->DllPath.Buffer, Params);
+ NORMALIZE(Params->ImagePathName.Buffer, Params);
+ NORMALIZE(Params->CommandLine.Buffer, Params);
+ NORMALIZE(Params->WindowTitle.Buffer, Params);
+ NORMALIZE(Params->DesktopInfo.Buffer, Params);
+ NORMALIZE(Params->ShellInfo.Buffer, Params);
+ NORMALIZE(Params->RuntimeInfo.Buffer, Params);
+
+ Params->Flags |= PPF_NORMALIZED;
+ }
+
+ return Params;
+}
+
+/* EOF */
_____
Modified: trunk/reactos/ntoskrnl/rtl/libsupp.c
--- trunk/reactos/ntoskrnl/rtl/libsupp.c 2005-04-01 00:30:29 UTC
(rev 14401)
+++ trunk/reactos/ntoskrnl/rtl/libsupp.c 2005-04-01 00:39:52 UTC
(rev 14402)
@@ -20,6 +20,13 @@
/* FUNCTIONS
*****************************************************************/
+
+KPROCESSOR_MODE
+RtlpGetMode()
+{
+ return KernelMode;
+}
+
/*
* @implemented
*/
@@ -38,11 +45,12 @@
}
+
PPEB
STDCALL
RtlpCurrentPeb(VOID)
{
- return ((PEPROCESS)(KeGetCurrentThread()->ApcState.Process))->Peb;
+ return ((PEPROCESS)(KeGetCurrentThread()->ApcState.Process))->Peb;
}
NTSTATUS
_____
Modified: trunk/reactos/subsys/smss/smapiexec.c
--- trunk/reactos/subsys/smss/smapiexec.c 2005-04-01 00:30:29 UTC
(rev 14401)
+++ trunk/reactos/subsys/smss/smapiexec.c 2005-04-01 00:39:52 UTC
(rev 14402)
@@ -81,6 +81,9 @@
NULL,
NULL,
pProcessInfo);
+
+ RtlDestroyProcessParameters (ProcessParameters);
+
if (!NT_SUCCESS(Status))
{
DPRINT1("SM: %s: Running \"%S\" failed
(Status=0x%08lx)\n",
@@ -88,8 +91,9 @@
return Status;
}
- RtlDestroyProcessParameters (ProcessParameters);
+ NtResumeThread(pProcessInfo->ThreadHandle, NULL);
+
/* Wait for process termination */
if(WaitForIt)
{