101{
117
118
120 {
122 }
123
124
127
128
131 {
134 }
135
136
140 if (!ShortAppName)
141 {
144 }
145
146
148 {
149
151 {
153 {
155 break;
156 }
157
159 {
161 break;
162 }
163
164 default:
165 {
167 }
168 }
169
171 }
172
173
174 while (*CommandLine ==
L' ' || *CommandLine ==
L'\t')
175 ++CommandLine;
176
177
178
179
180
181
182
183
184
185
186
187 if (*CommandLine)
188 {
189
193 {
194
196 }
197
198
199
200
201 else
202 {
203
204 while (*CommandLine && !(*CommandLine ==
L' ' || *CommandLine ==
L'\t'))
205 {
206 if (*CommandLine ==
L'\"')
207 {
208
209 ++CommandLine;
210 while (*CommandLine && *CommandLine++ !=
L'\"') ;
211 }
212 else
213 {
214
215 ++CommandLine;
216 }
217 }
218 }
219 }
220
221
222
223
224
225 while (*CommandLine ==
L' ' || *CommandLine ==
L'\t')
226 ++CommandLine;
227
228
230 {
231
236 if (CurrentDir ==
NULL)
237 {
240 }
241
242
245 }
246
247
249
250
254 if (!ShortCurrentDir)
255 {
258 }
259
260
262 {
263
265 {
267 {
269 break;
270 }
271
273 {
275 break;
276 }
277
278 default:
279 {
281 }
282 }
284 }
285
286
289 {
292 }
293
294
304 CheckVdm->
EnvLen = AnsiEnvironment->Length;
305 CheckVdm->
DesktopLen = (StartupInfo->lpDesktop !=
NULL) ? (
wcslen(StartupInfo->lpDesktop) + 1) : 0;
306 CheckVdm->
TitleLen = (StartupInfo->lpTitle !=
NULL) ? (
wcslen(StartupInfo->lpTitle) + 1) : 0;
307 CheckVdm->
ReservedLen = (StartupInfo->lpReserved !=
NULL) ? (
wcslen(StartupInfo->lpReserved) + 1) : 0;
308
310 {
311
312 CheckVdm->
StdIn = StartupInfo->hStdInput;
313 CheckVdm->
StdOut = StartupInfo->hStdOutput;
314 CheckVdm->
StdErr = StartupInfo->hStdError;
315 }
316
317
318
322 if (StartupInfo->lpDesktop)
326 if (StartupInfo->lpTitle)
330 if (StartupInfo->lpReserved)
334
335 if (!AnsiCmdLine
336 || !AnsiAppName
337 || !AnsiCurDirectory
338 || (StartupInfo->lpDesktop && !AnsiDesktop)
339 || (StartupInfo->lpTitle && !AnsiTitle)
340 || (StartupInfo->lpReserved && !AnsiReserved))
341 {
344 }
345
346
348 0,
349 CommandLine,
351 AnsiCmdLine,
355
357 AnsiCmdLine[CheckVdm->
CmdLen++] =
'\r';
358 AnsiCmdLine[CheckVdm->
CmdLen++] =
'\n';
359 AnsiCmdLine[CheckVdm->
CmdLen++] = 0;
360
361
363 0,
364 ShortAppName,
366 AnsiAppName,
370
371
373 0,
374 ShortCurrentDir,
376 AnsiCurDirectory,
380
381 if (StartupInfo->lpDesktop)
382 {
383
385 0,
386 StartupInfo->lpDesktop,
388 AnsiDesktop,
393 }
394
395 if (StartupInfo->lpTitle)
396 {
397
399 0,
400 StartupInfo->lpTitle,
402 AnsiTitle,
407 }
408
409 if (StartupInfo->lpReserved)
410 {
411
413 0,
414 StartupInfo->lpReserved,
416 AnsiReserved,
421 }
422
423
424 RtlCopyMemory(&AnsiStartupInfo, StartupInfo,
sizeof(AnsiStartupInfo));
427 AnsiStartupInfo.
lpTitle = AnsiTitle;
428
429
440 if (CaptureBuffer ==
NULL)
441 {
444 }
445
446
448 AnsiCmdLine,
451
452
454 AnsiAppName,
457
459
460
462 AnsiCurDirectory,
465
466
468 AnsiEnvironment->Buffer,
471
472
474 &AnsiStartupInfo,
477
478 if (StartupInfo->lpDesktop)
479 {
480
482 AnsiDesktop,
485 }
487
488 if (StartupInfo->lpTitle)
489 {
490
492 AnsiTitle,
495 }
497
498 if (StartupInfo->lpReserved)
499 {
500
502 AnsiReserved,
505 }
507
508
510 CaptureBuffer,
512 sizeof(*CheckVdm));
513
514
515 *iTask = CheckVdm->
iTask;
516
518
519
520 if (AnsiCmdLine)
RtlFreeHeap(RtlGetProcessHeap(), 0, AnsiCmdLine);
521 if (AnsiAppName)
RtlFreeHeap(RtlGetProcessHeap(), 0, AnsiAppName);
522 if (AnsiCurDirectory)
RtlFreeHeap(RtlGetProcessHeap(), 0, AnsiCurDirectory);
523 if (AnsiDesktop)
RtlFreeHeap(RtlGetProcessHeap(), 0, AnsiDesktop);
524 if (AnsiTitle)
RtlFreeHeap(RtlGetProcessHeap(), 0, AnsiTitle);
525 if (AnsiReserved)
RtlFreeHeap(RtlGetProcessHeap(), 0, AnsiReserved);
526
527
529
530
531 if (ShortCurrentDir)
RtlFreeHeap(RtlGetProcessHeap(), 0, ShortCurrentDir);
532 if (CurrentDir)
RtlFreeHeap(RtlGetProcessHeap(), 0, CurrentDir);
533
534
535 if (ShortAppName)
RtlFreeHeap(RtlGetProcessHeap(), 0, ShortAppName);
536
538}
WCHAR CurrentDirectory[1024]
PVOID NTAPI RtlAllocateHeap(IN PVOID HeapHandle, IN ULONG Flags, IN SIZE_T Size)
BOOLEAN NTAPI RtlFreeHeap(IN PVOID HeapHandle, IN ULONG Flags, IN PVOID HeapBase)
#define ERROR_NOT_ENOUGH_MEMORY
#define ERROR_INVALID_PARAMETER
#define GetCurrentDirectoryW(x, y)
#define WideCharToMultiByte
DWORD WINAPI GetShortPathNameW(IN LPCWSTR lpszLongPath, OUT LPWSTR lpszShortPath, IN DWORD cchBuffer)
_ACRTIMP size_t __cdecl wcslen(const wchar_t *)
_ACRTIMP int __cdecl _wcsnicmp(const wchar_t *, const wchar_t *, size_t)
static const WCHAR Cleanup[]
PVOID PVOID PWCHAR ApplicationName
_In_ NDIS_STATUS _In_ ULONG _In_ USHORT NumStrings
#define UNICODE_STRING_MAX_CHARS
_In_ ULONG _In_ ULONG _In_ ULONG Length
#define STATUS_OBJECT_PATH_INVALID
PCSR_CAPTURE_BUFFER NTAPI CsrAllocateCaptureBuffer(_In_ ULONG ArgumentCount, _In_ ULONG BufferSize)
VOID NTAPI CsrFreeCaptureBuffer(_In_ _Frees_ptr_ PCSR_CAPTURE_BUFFER CaptureBuffer)
VOID NTAPI CsrCaptureMessageBuffer(_Inout_ PCSR_CAPTURE_BUFFER CaptureBuffer, _In_opt_ PVOID MessageBuffer, _In_ ULONG MessageLength, _Out_ PVOID *CapturedData)
LPSTARTUPINFOA StartupInfo
#define RtlCopyMemory(Destination, Source, Length)
#define STATUS_INVALID_PARAMETER
DWORD WINAPI GetLastError(void)
#define STARTF_USESTDHANDLES