ReactOS  0.4.15-dev-3175-g222acf5
ppb.c File Reference
#include <rtl.h>
#include <debug.h>
Include dependency graph for ppb.c:

Go to the source code of this file.

Macros

#define NDEBUG
 
#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

static __inline VOID RtlpCopyParameterString (PWCHAR *Ptr, PUNICODE_STRING Destination, PUNICODE_STRING Source, USHORT Size)
 
NTSTATUS NTAPI 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 RuntimeData)
 
NTSTATUS NTAPI RtlDestroyProcessParameters (IN PRTL_USER_PROCESS_PARAMETERS ProcessParameters)
 
PRTL_USER_PROCESS_PARAMETERS NTAPI RtlDeNormalizeProcessParams (PRTL_USER_PROCESS_PARAMETERS Params)
 
PRTL_USER_PROCESS_PARAMETERS NTAPI RtlNormalizeProcessParams (PRTL_USER_PROCESS_PARAMETERS Params)
 

Macro Definition Documentation

◆ ALIGN

#define ALIGN (   x,
  align 
)    (((ULONG)(x)+(align)-1UL)&(~((align)-1UL)))

Definition at line 20 of file ppb.c.

◆ DENORMALIZE

#define DENORMALIZE (   x,
  addr 
)    {if(x) x=(PVOID)((ULONG_PTR)(x)-(ULONG_PTR)(addr));}

Definition at line 19 of file ppb.c.

◆ NDEBUG

#define NDEBUG

Definition at line 13 of file ppb.c.

◆ NORMALIZE

#define NORMALIZE (   x,
  addr 
)    {if(x) x=(PVOID)((ULONG_PTR)(x)+(ULONG_PTR)(addr));}

Definition at line 18 of file ppb.c.

Function Documentation

◆ RtlCreateProcessParameters()

NTSTATUS NTAPI 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  RuntimeData 
)

Definition at line 45 of file ppb.c.

55 {
57  ULONG Length = 0;
58  PWCHAR Dest;
59  UNICODE_STRING EmptyString;
60  HANDLE CurrentDirectoryHandle;
61  HANDLE ConsoleHandle;
62  ULONG ConsoleFlags;
63 
64  DPRINT ("RtlCreateProcessParameters\n");
65 
67 
68  EmptyString.Length = 0;
69  EmptyString.MaximumLength = sizeof(WCHAR);
70  EmptyString.Buffer = L"";
71 
72  if (RtlpGetMode() == UserMode)
73  {
74  if (DllPath == NULL)
75  DllPath = &NtCurrentPeb()->ProcessParameters->DllPath;
76  if (Environment == NULL)
77  Environment = NtCurrentPeb()->ProcessParameters->Environment;
78  if (CurrentDirectory == NULL)
79  CurrentDirectory = &NtCurrentPeb()->ProcessParameters->CurrentDirectory.DosPath;
80  CurrentDirectoryHandle = NtCurrentPeb()->ProcessParameters->CurrentDirectory.Handle;
81  ConsoleHandle = NtCurrentPeb()->ProcessParameters->ConsoleHandle;
82  ConsoleFlags = NtCurrentPeb()->ProcessParameters->ConsoleFlags;
83  }
84  else
85  {
86  if (DllPath == NULL)
87  DllPath = &EmptyString;
88  if (CurrentDirectory == NULL)
89  CurrentDirectory = &EmptyString;
90  CurrentDirectoryHandle = NULL;
91  ConsoleHandle = NULL;
92  ConsoleFlags = 0;
93  }
94 
95  if (CommandLine == NULL)
96  CommandLine = &EmptyString;
97  if (WindowTitle == NULL)
98  WindowTitle = &EmptyString;
99  if (DesktopInfo == NULL)
100  DesktopInfo = &EmptyString;
101  if (ShellInfo == NULL)
102  ShellInfo = &EmptyString;
103  if (RuntimeData == NULL)
104  RuntimeData = &EmptyString;
105 
106  /* size of process parameter block */
108 
109  /* size of current directory buffer */
110  Length += (MAX_PATH * sizeof(WCHAR));
111 
112  /* add string lengths */
113  Length += ALIGN(DllPath->MaximumLength, sizeof(ULONG));
114  Length += ALIGN(ImagePathName->Length + sizeof(WCHAR), sizeof(ULONG));
115  Length += ALIGN(CommandLine->Length + sizeof(WCHAR), sizeof(ULONG));
116  Length += ALIGN(WindowTitle->MaximumLength, sizeof(ULONG));
117  Length += ALIGN(DesktopInfo->MaximumLength, sizeof(ULONG));
118  Length += ALIGN(ShellInfo->MaximumLength, sizeof(ULONG));
119  Length += ALIGN(RuntimeData->MaximumLength, sizeof(ULONG));
120 
121  /* Calculate the required block size */
122  Param = RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY, Length);
123  if (!Param)
124  {
127  }
128 
129  DPRINT ("Process parameters allocated\n");
130 
131  Param->MaximumLength = Length;
132  Param->Length = Length;
134  Param->Environment = Environment;
135  Param->CurrentDirectory.Handle = CurrentDirectoryHandle;
136  Param->ConsoleHandle = ConsoleHandle;
137  Param->ConsoleFlags = ConsoleFlags;
138 
139  Dest = (PWCHAR)(((PBYTE)Param) + sizeof(RTL_USER_PROCESS_PARAMETERS));
140 
141  /* copy current directory */
143  &Param->CurrentDirectory.DosPath,
145  MAX_PATH * sizeof(WCHAR));
146 
147  /* make sure the current directory has a trailing backslash */
148  if (Param->CurrentDirectory.DosPath.Length > 0)
149  {
150  Length = Param->CurrentDirectory.DosPath.Length / sizeof(WCHAR);
151  if (Param->CurrentDirectory.DosPath.Buffer[Length-1] != L'\\')
152  {
153  Param->CurrentDirectory.DosPath.Buffer[Length] = L'\\';
154  Param->CurrentDirectory.DosPath.Buffer[Length + 1] = 0;
155  Param->CurrentDirectory.DosPath.Length += sizeof(WCHAR);
156  }
157  }
158 
159  /* copy dll path */
161  &Param->DllPath,
162  DllPath,
163  0);
164 
165  /* copy image path name */
167  &Param->ImagePathName,
168  ImagePathName,
169  ImagePathName->Length + sizeof(WCHAR));
170 
171  /* copy command line */
173  &Param->CommandLine,
174  CommandLine,
175  CommandLine->Length + sizeof(WCHAR));
176 
177  /* copy title */
179  &Param->WindowTitle,
180  WindowTitle,
181  0);
182 
183  /* copy desktop */
185  &Param->DesktopInfo,
186  DesktopInfo,
187  0);
188 
189  /* copy shell info */
191  &Param->ShellInfo,
192  ShellInfo,
193  0);
194 
195  /* copy runtime info */
197  &Param->RuntimeData,
198  RuntimeData,
199  0);
200 
202  *ProcessParameters = Param;
204 
205  return STATUS_SUCCESS;
206 }
PVOID PVOID PWCHAR PVOID Environment
Definition: env.c:47
#define STATUS_INSUFFICIENT_RESOURCES
Definition: udferr_usr.h:158
KPROCESSOR_MODE NTAPI RtlpGetMode(VOID)
Definition: libsupp.c:53
_In_ ULONG _In_ ULONG _In_ ULONG Length
Definition: ntddpcm.h:101
USHORT MaximumLength
Definition: env_spec_w32.h:370
WCHAR CurrentDirectory[1024]
Definition: chkdsk.c:74
PRTL_USER_PROCESS_PARAMETERS NTAPI RtlDeNormalizeProcessParams(PRTL_USER_PROCESS_PARAMETERS Params)
Definition: ppb.c:225
VOID NTAPI RtlReleasePebLock(VOID)
Definition: libsupp.c:82
uint16_t * PWCHAR
Definition: typedefs.h:56
struct _RTL_USER_PROCESS_PARAMETERS RTL_USER_PROCESS_PARAMETERS
PVOID NTAPI RtlAllocateHeap(IN PVOID HeapHandle, IN ULONG Flags, IN SIZE_T Size)
Definition: heap.c:588
__wchar_t WCHAR
Definition: xmlstorage.h:180
#define MAX_PATH
Definition: compat.h:34
#define ALIGN(x, align)
Definition: ppb.c:20
static const WCHAR L[]
Definition: oid.c:1250
#define NtCurrentPeb()
Definition: FLS.c:22
static const char const char * DllPath
Definition: image.c:34
#define NULL
Definition: types.h:112
#define HEAP_ZERO_MEMORY
Definition: compat.h:134
VOID NTAPI RtlAcquirePebLock(VOID)
Definition: libsupp.c:72
HANDLE Handle
Definition: rtltypes.h:1367
unsigned int ULONG
Definition: retypes.h:1
#define RTL_USER_PROCESS_PARAMETERS_NORMALIZED
Definition: rtltypes.h:41
#define STATUS_SUCCESS
Definition: shellext.h:65
#define DPRINT
Definition: sndvol32.h:71
BYTE * PBYTE
Definition: pedump.c:66
static __inline VOID RtlpCopyParameterString(PWCHAR *Ptr, PUNICODE_STRING Destination, PUNICODE_STRING Source, USHORT Size)
Definition: ppb.c:26

◆ RtlDeNormalizeProcessParams()

PRTL_USER_PROCESS_PARAMETERS NTAPI RtlDeNormalizeProcessParams ( PRTL_USER_PROCESS_PARAMETERS  Params)

Definition at line 225 of file ppb.c.

226 {
228  {
229  DENORMALIZE(Params->CurrentDirectory.DosPath.Buffer, Params);
230  DENORMALIZE(Params->DllPath.Buffer, Params);
231  DENORMALIZE(Params->ImagePathName.Buffer, Params);
232  DENORMALIZE(Params->CommandLine.Buffer, Params);
233  DENORMALIZE(Params->WindowTitle.Buffer, Params);
234  DENORMALIZE(Params->DesktopInfo.Buffer, Params);
235  DENORMALIZE(Params->ShellInfo.Buffer, Params);
236  DENORMALIZE(Params->RuntimeData.Buffer, Params);
237 
239  }
240 
241  return Params;
242 }
_In_ WDFIOTARGET _In_ PWDF_REQUEST_COMPLETION_PARAMS Params
Definition: wdfrequest.h:306
#define DENORMALIZE(x, addr)
Definition: ppb.c:19
#define RTL_USER_PROCESS_PARAMETERS_NORMALIZED
Definition: rtltypes.h:41

Referenced by RtlCreateProcessParameters().

◆ RtlDestroyProcessParameters()

NTSTATUS NTAPI RtlDestroyProcessParameters ( IN PRTL_USER_PROCESS_PARAMETERS  ProcessParameters)

Definition at line 213 of file ppb.c.

214 {
215  RtlFreeHeap(RtlGetProcessHeap(), 0, ProcessParameters);
216  return STATUS_SUCCESS;
217 }
BOOLEAN NTAPI RtlFreeHeap(IN PVOID HeapHandle, IN ULONG Flags, IN PVOID HeapBase)
Definition: heap.c:606
#define STATUS_SUCCESS
Definition: shellext.h:65

◆ RtlNormalizeProcessParams()

PRTL_USER_PROCESS_PARAMETERS NTAPI RtlNormalizeProcessParams ( PRTL_USER_PROCESS_PARAMETERS  Params)

Definition at line 250 of file ppb.c.

251 {
253  {
254  NORMALIZE(Params->CurrentDirectory.DosPath.Buffer, Params);
255  NORMALIZE(Params->DllPath.Buffer, Params);
256  NORMALIZE(Params->ImagePathName.Buffer, Params);
257  NORMALIZE(Params->CommandLine.Buffer, Params);
258  NORMALIZE(Params->WindowTitle.Buffer, Params);
259  NORMALIZE(Params->DesktopInfo.Buffer, Params);
260  NORMALIZE(Params->ShellInfo.Buffer, Params);
261  NORMALIZE(Params->RuntimeData.Buffer, Params);
262 
264  }
265 
266  return Params;
267 }
#define NORMALIZE(x, addr)
Definition: ppb.c:18
_In_ WDFIOTARGET _In_ PWDF_REQUEST_COMPLETION_PARAMS Params
Definition: wdfrequest.h:306
#define RTL_USER_PROCESS_PARAMETERS_NORMALIZED
Definition: rtltypes.h:41

◆ RtlpCopyParameterString()

static __inline VOID RtlpCopyParameterString ( PWCHAR Ptr,
PUNICODE_STRING  Destination,
PUNICODE_STRING  Source,
USHORT  Size 
)
static

Definition at line 26 of file ppb.c.

30 {
31  Destination->Length = Source->Length;
32  Destination->MaximumLength = Size ? Size : Source->MaximumLength;
34  if (Source->Length)
35  memmove (Destination->Buffer, Source->Buffer, Source->Length);
36  Destination->Buffer[Destination->Length / sizeof(WCHAR)] = 0;
37  *Ptr += Destination->MaximumLength/sizeof(WCHAR);
38 }
#define memmove(s1, s2, n)
Definition: mkisofs.h:881
USHORT MaximumLength
Definition: env_spec_w32.h:370
_Must_inspect_result_ _In_ PFSRTL_PER_STREAM_CONTEXT Ptr
Definition: fsrtlfuncs.h:898
IN PVOID IN PVOID IN USHORT IN USHORT Size
Definition: pci.h:361
uint16_t * PWCHAR
Definition: typedefs.h:56
__wchar_t WCHAR
Definition: xmlstorage.h:180
_In_ PUNICODE_STRING _Inout_ PUNICODE_STRING Destination
Definition: rtlfuncs.h:2950
_In_ UINT _In_ UINT _In_ PNDIS_PACKET Source
Definition: ndis.h:3167

Referenced by RtlCreateProcessParameters().