2252{
2253
2254
2255
2265 ULONG ParameterFlags, PrivilegeValue, HardErrorMode, ErrorResponse;
2267 BOOLEAN InJob, SaferNeeded, UseLargePages, HavePrivilege;
2268 BOOLEAN QuerySection, SkipSaferAndAppCompat;
2278 NTSTATUS Status, AppCompatStatus, SaferStatus, IFEOStatus, ImageDbgStatus;
2288
2289
2290
2296 SIZE_T EnvironmentLength, CmdLineLength;
2301 BOOLEAN SearchRetry, QuotesNeeded, CmdLineIsAppName, HasQuotes;
2302
2303
2304
2305
2307#if _SXS_SUPPORT_ENABLED_
2315 PVOID CapturedStrings[3];
2319 PWCHAR SxsConglomeratedBuffer, StaticBuffer;
2320 ULONG ConglomeratedBufferSizeBytes, StaticBufferSize,
i;
2321#endif
2323
2324
2325
2326
2327 PWCHAR FilePart, PathBuffer, FreeBuffer;
2331
2332
2333
2334
2335 PVOID AppCompatSxsData, AppCompatData;
2336 ULONG AppCompatSxsDataSize, AppCompatDataSize;
2337
2338
2339
2340 ULONG BinarySubType, VdmBinaryType, VdmTask, VdmReserve;
2348
2349
2350 QuerySection =
FALSE;
2352 SkipSaferAndAppCompat =
FALSE;
2353 ParameterFlags = 0;
2359 SectionHandle =
NULL;
2361 ThreadHandle =
NULL;
2364
2365
2366 AppCompatData =
NULL;
2367 AppCompatDataSize = 0;
2368 AppCompatSxsData =
NULL;
2369 AppCompatSxsDataSize = 0;
2370 CaptureBuffer =
NULL;
2371#if _SXS_SUPPORT_ENABLED_
2372 SxsConglomeratedBuffer =
NULL;
2373#endif
2375
2376
2377 DebuggerCmdLine =
NULL;
2387 QuotedCmdLine =
NULL;
2388
2389
2393 VdmTask = 0;
2394 VdmUndoLevel = 0;
2395 VdmBinaryType = 0;
2396 VdmReserve = 0;
2397 VdmWaitObject =
NULL;
2398 UseVdmReserve =
FALSE;
2400
2401
2404
2405
2407#if _SXS_SUPPORT_ENABLED_
2411#endif
2413 RtlZeroMemory(&LocalProcessAttributes,
sizeof(LocalProcessAttributes));
2414 RtlZeroMemory(&LocalThreadAttributes,
sizeof(LocalThreadAttributes));
2415
2416
2417 RtlZeroMemory(lpProcessInformation,
sizeof(*lpProcessInformation));
2418 if (hNewToken) *hNewToken =
NULL;
2419
2420
2422 dwCreationFlags &= ~CREATE_NO_WINDOW;
2423
2424#if _SXS_SUPPORT_ENABLED_
2425
2426 SxsStaticBuffers[0] = &SxsWin32ManifestPath;
2427 SxsStaticBuffers[1] = &SxsWin32PolicyPath;
2428 SxsStaticBuffers[2] = &SxsWin32AssemblyDirectory;
2429 SxsStaticBuffers[3] = &SxsNtManifestPath;
2430 SxsStaticBuffers[4] = &SxsNtPolicyPath;
2431 ExePathPair.
Win32 = &SxsWin32ExePath;
2432 ExePathPair.
Nt = &SxsNtExePath;
2433 ManifestPathPair.
Win32 = &SxsWin32ManifestPath.
String;
2434 ManifestPathPair.
Nt = &SxsNtManifestPath.
String;
2435 PolicyPathPair.
Win32 = &SxsWin32PolicyPath.
String;
2436 PolicyPathPair.
Nt = &SxsNtPolicyPath.
String;
2437#endif
2438
2439 DPRINT(
"CreateProcessInternalW: '%S' '%S' %lx\n", lpApplicationName, lpCommandLine, dwCreationFlags);
2440
2441
2444
2445
2448 {
2449 DPRINT1(
"Invalid flag combo used\n");
2452 }
2453
2454
2456 {
2458 }
2460 {
2462 }
2464 {
2466 }
2468 {
2470 }
2472 {
2474 }
2476 {
2479 }
2480 else
2481 {
2483 }
2484
2485
2493
2494
2497 {
2498
2499 DPRINT1(
"Invalid WOW flags\n");
2502 }
2505 {
2506
2508 }
2509
2510
2513 {
2514
2515 dwCreationFlags = (dwCreationFlags &~ CREATE_SHARED_WOW_VDM) |
2517 }
2518
2519
2521 {
2522
2524 while ((*pcScan) || (*(pcScan + 1))) ++pcScan;
2525
2526
2527 EnvironmentLength = (pcScan +
sizeof(
ANSI_NULL) - (
PCHAR)lpEnvironment);
2529 {
2530
2533 }
2534
2535
2538
2539
2544 0,
2549 {
2550
2553 }
2554
2555
2559 {
2560
2567 }
2568
2569
2570 lpEnvironment = UnicodeEnv.
Buffer;
2571 }
2572
2573
2574 StartupInfo = *lpStartupInfo;
2575
2576
2579 {
2580
2581 StartupInfo.
dwFlags &= ~STARTF_USESTDHANDLES;
2582 }
2583
2584
2585AppNameRetry:
2586
2587 if (NameBuffer)
2588 {
2591 }
2592
2593
2594 if (FreeBuffer)
2595 {
2598 }
2599
2600
2602 {
2605 }
2606
2607
2610 QuotesNeeded =
FALSE;
2611 CmdLineIsAppName =
FALSE;
2612
2613
2614 if (!lpApplicationName)
2615 {
2616
2618
2619
2621 0,
2623 if (!NameBuffer)
2624 {
2627 goto Quickie;
2628 }
2629
2630
2631 lpApplicationName = NullBuffer = ScanString = lpCommandLine;
2632
2633
2634 if (*lpCommandLine ==
L'\"')
2635 {
2636
2637 SearchRetry =
FALSE;
2638 ScanString++;
2639 lpApplicationName = ScanString;
2640 while (*ScanString)
2641 {
2642
2643 if (*ScanString ==
L'\"')
2644 {
2645
2646 NullBuffer = ScanString;
2648 break;
2649 }
2650
2651
2652 ScanString++;
2653 NullBuffer = ScanString;
2654 }
2655 }
2656 else
2657 {
2658StartScan:
2659
2660 lpApplicationName = lpCommandLine;
2661 while (*ScanString)
2662 {
2663
2664 if ((*ScanString ==
L' ') || (*ScanString ==
L'\t'))
2665 {
2666
2667 NullBuffer = ScanString;
2668 break;
2669 }
2670
2671
2672 ScanString++;
2673 NullBuffer = ScanString;
2674 }
2675 }
2676
2677
2678 SaveChar = *NullBuffer;
2680
2681
2683 {
2686 }
2687
2688
2692 {
2695 goto Quickie;
2696 }
2697
2698
2700 lpApplicationName,
2703 NameBuffer,
2705
2706
2708 {
2709
2713 {
2714
2716 }
2717 else
2718 {
2719
2721 }
2722 }
2723
2724 DPRINT(
"Length: %lu Buffer: %S\n",
Length, NameBuffer);
2725
2726
2728 {
2729
2730 *NullBuffer = SaveChar;
2731 lpApplicationName = NameBuffer;
2732 }
2733 else
2734 {
2735
2738 {
2739
2749 {
2750
2754 }
2755 }
2756 else
2757 {
2758
2760 }
2761
2762
2764 {
2765
2767 }
2768 else
2769 {
2770
2772 }
2773
2774
2775 *NullBuffer = SaveChar;
2776 lpApplicationName = NameBuffer;
2777
2778
2779 if (!(*ScanString) || !(SearchRetry))
2780 {
2781
2783 goto Quickie;
2784 }
2785
2786
2787 ScanString++;
2788 NullBuffer = ScanString;
2789
2790
2791 QuotesNeeded =
TRUE;
2793 goto StartScan;
2794 }
2795 }
2796 else if (!(lpCommandLine) || !(*lpCommandLine))
2797 {
2798
2799 CmdLineIsAppName =
TRUE;
2800 lpCommandLine = (
LPWSTR)lpApplicationName;
2801 }
2802
2803
2805 &PathName,
2807 &SxsWin32RelativePath);
2808 if (!TranslationStatus)
2809 {
2810
2811 DPRINT1(
"Path translation for SxS failed\n");
2814 goto Quickie;
2815 }
2816
2817
2819 FreeBuffer = PathName.
Buffer;
2820
2821
2828 {
2829
2830 RtlInitEmptyUnicodeString(&PathBufferString,
NULL, 0);
2833 &PathBufferString,
2837 &SxsPathType,
2840 {
2841
2845 goto Quickie;
2846 }
2847
2848
2849 SxsWin32ExePath = PathBufferString;
2850 PathBuffer = PathBufferString.
Buffer;
2852 DPRINT(
"SxS Path: %S\n", PathBuffer);
2853 }
2854
2855
2856#if _SXS_SUPPORT_ENABLED_
2857 SxsNtExePath = PathName;
2858#endif
2860 {
2861
2863 }
2864 else
2865 {
2866
2868 }
2869
2870
2873 &PathName,
2882 &LocalObjectAttributes,
2888 {
2889
2892 &LocalObjectAttributes,
2897 }
2898
2899
2901 DPRINT1(
"Open file failed: %lx (%wZ)\n",
Status, &PathName);
2902
2903
2905
2907 {
2908
2910 {
2911
2914 goto Quickie;
2915 }
2916 else
2917 {
2918
2921 goto Quickie;
2922 }
2923 }
2924
2925
2927 {
2928
2930 }
2931
2932
2942 {
2943
2948 {
2949
2952 {
2953
2954 DPRINT1(
"Invalid Blade hashes!\n");
2957 goto Quickie;
2958 }
2959
2960
2962 {
2963
2964 DPRINT1(
"Tampered Blade hashes!\n");
2967 goto Quickie;
2968 }
2969 }
2970
2971
2974 {
2975
2978 if (SectionHandle)
2979 {
2981 SectionHandle =
NULL;
2982 }
2984 goto Quickie;
2985 }
2986
2987
2990 {
2991
2994
2995
2997 UseVdmReserve =
TRUE;
2998
2999
3001 SectionHandle =
NULL;
3002
3003
3004 QuerySection =
FALSE;
3005 }
3006 }
3007
3008
3009 if (!SkipSaferAndAppCompat)
3010 {
3011
3015 {
3016
3017 ImageMachine = 0;
3018
3019
3021 AppCompatData =
NULL;
3022 AppCompatSxsData =
NULL;
3023
3024
3025 if (SectionHandle)
3026 {
3027
3028 if (QuerySection)
3029 {
3030
3032 }
3033 else
3034 {
3035
3038 &ImageInformation,
3039 sizeof(ImageInformation),
3041 }
3042
3043
3045 {
3046
3047 QuerySection =
TRUE;
3048 ImageMachine = ImageInformation.
Machine;
3049 }
3050 }
3051
3052
3054 FreeBuffer,
3055 lpEnvironment,
3056 ImageMachine,
3057 &AppCompatData,
3058 &AppCompatDataSize,
3059 &AppCompatSxsData,
3060 &AppCompatSxsDataSize,
3063 {
3064
3065 DPRINT1(
"App compat launch failure: %lx\n", AppCompatStatus);
3067 {
3068
3070 }
3071 else
3072 {
3073
3075 }
3076
3077
3078 if (SectionHandle)
3079 {
3080
3082 SectionHandle =
NULL;
3083 }
3084
3085
3087 goto Quickie;
3088 }
3089 }
3090 }
3091
3092
3093
3094
3095 if (!(SkipSaferAndAppCompat) &&
3097 {
3098
3101 {
3106
3107 break;
3108
3110
3112
3113 default:
3114
3116 {
3117 SaferNeeded =
FALSE;
3118 }
3119
3120
3121 break;
3122 }
3123
3124
3125 if (SaferNeeded)
3126 {
3127
3129 (
LPWSTR)lpApplicationName,
3131 &InJob,
3133 &JobHandle);
3134 if (SaferStatus == 0xFFFFFFFF)
3135 {
3136
3137 DPRINT1(
"WinSafer blocking process launch\n");
3140 goto Quickie;
3141 }
3142
3143
3145 {
3146 DPRINT1(
"Error checking WinSafer: %lx\n", SaferStatus);
3149 goto Quickie;
3150 }
3151 }
3152 }
3153
3154
3156 {
3158 {
3159
3161 {
3162
3164
3165
3167 &VdmAnsiEnv,
3168 &VdmUnicodeEnv);
3170 {
3171 DPRINT1(
"VDM environment for WOW app failed\n");
3172 goto Quickie;
3173 }
3174
3175
3177 {
3178
3179 VdmBinaryType = (dwCreationFlags &
3182
3183
3185 lpApplicationName,
3186 lpCommandLine,
3187 lpCurrentDirectory,
3188 &VdmAnsiEnv,
3189 &CsrMsg[1],
3190 &VdmTask,
3191 dwCreationFlags,
3192 &StartupInfo,
3194
3195
3197
3198
3203 {
3204
3207 goto Quickie;
3208 }
3209
3210
3212 }
3213
3214
3218 {
3220
3222
3223
3224 if (UseVdmReserve) VdmReserve = 1;
3225
3226
3228 VdmTask,
3229 VdmBinaryType,
3230 &VdmString,
3231 &VdmReserve);
3233 {
3234 DPRINT1(
"VDM Configuration failed for WOW\n");
3236 goto Quickie;
3237 }
3238
3239
3240 lpCommandLine = VdmString.
Buffer;
3241 lpApplicationName =
NULL;
3242
3243
3246
3247
3249 break;
3250
3251
3253
3255
3256
3258 break;
3259
3261
3262 DPRINT1(
"VDM is not ready for WOW\n");
3265 goto Quickie;
3266
3267 default:
3268 break;
3269 }
3270
3271
3272 VdmReserve--;
3273
3274
3275 if (VdmWaitObject) goto VdmShortCircuit;
3276
3277
3278 bInheritHandles =
FALSE;
3279
3280
3281 if ((lpEnvironment) &&
3283 {
3285 }
3286
3287
3288 SkipSaferAndAppCompat =
TRUE;
3289 goto AppNameRetry;
3290 }
3291
3292
3293 }
3294
3298 {
3299
3301
3302
3306 {
3307
3309
3310
3312 &VdmAnsiEnv,
3313 &VdmUnicodeEnv);
3315 {
3316 DPRINT1(
"VDM environment for DOS failed\n");
3317 goto Quickie;
3318 }
3319
3320
3322 lpApplicationName,
3323 lpCommandLine,
3324 lpCurrentDirectory,
3325 &VdmAnsiEnv,
3326 &CsrMsg[1],
3327 &VdmTask,
3328 dwCreationFlags,
3329 &StartupInfo,
3332 {
3333
3337 goto Quickie;
3338 };
3339
3340
3344 {
3346
3348
3349
3351 {
3352 DPRINT1(
"Detached process but no VDM, not allowed\n");
3355 }
3356
3357
3359 VdmTask,
3360 VdmBinaryType,
3361 &VdmString,
3362 &VdmReserve);
3364 {
3365 DPRINT1(
"VDM Configuration failed for DOS\n");
3367 goto Quickie;
3368 }
3369
3370
3371 lpCommandLine = VdmString.
Buffer;
3372 lpApplicationName =
NULL;
3373 break;
3374
3376
3378
3379
3381 break;
3382
3384
3385 DPRINT1(
"VDM is not ready for DOS\n");
3388 goto Quickie;
3389
3390 default:
3391 break;
3392 }
3393
3394
3395 VdmReserve--;
3396
3397
3398 if (VdmWaitObject) goto VdmShortCircuit;
3399
3400
3401 bInheritHandles =
FALSE;
3402
3403
3404 if ((lpEnvironment) &&
3406 {
3408 }
3409
3410
3411 lpEnvironment = VdmUnicodeEnv.
Buffer;
3412 }
3413 else
3414 {
3415
3417
3418
3422 {
3423 DPRINT1(
"'%wZ': Invalid EXE, and not a batch or script file\n", &PathName);
3426 goto Quickie;
3427 }
3428
3429
3430 CmdQuoteLength = CmdLineIsAppName || HasQuotes;
3431 if (!CmdLineIsAppName)
3432 {
3433 if (HasQuotes) CmdQuoteLength++;
3434 }
3435 else
3436 {
3437 CmdQuoteLength++;
3438 }
3439
3440
3441 CmdLineLength =
wcslen(lpCommandLine);
3443 CmdLineLength += CmdQuoteLength +
sizeof(
ANSI_NULL);
3444 CmdLineLength *=
sizeof(
WCHAR);
3445
3446
3448 0,
3449 CmdLineLength);
3450 if (!AnsiCmdCommand)
3451 {
3454 goto Quickie;
3455 }
3456
3457
3459 if ((CmdLineIsAppName) || (HasQuotes))
3460 {
3461 wcscat(AnsiCmdCommand,
L"\"");
3462 }
3463 wcscat(AnsiCmdCommand, lpCommandLine);
3464 if ((CmdLineIsAppName) || (HasQuotes))
3465 {
3466 wcscat(AnsiCmdCommand,
L"\"");
3467 }
3468
3469
3471
3472
3473 lpCommandLine = DebuggerString.
Buffer;
3474 lpApplicationName =
NULL;
3475 DPRINT1(
"Retrying with: %S\n", lpCommandLine);
3476 }
3477
3478
3479 SkipSaferAndAppCompat =
TRUE;
3480 goto AppNameRetry;
3481 }
3482
3484 {
3485
3486 DPRINT1(
"64-bit binary, failing\n");
3489 goto Quickie;
3490 }
3491
3493 {
3494
3495 DPRINT1(
"File is offline, failing\n");
3497 break;
3498 }
3499
3500 default:
3501 {
3502
3504 {
3508 goto Quickie;
3509 }
3510
3511
3513 break;
3514 }
3515 }
3516
3517
3519 {
3520
3521 dwCreationFlags &= ~CREATE_SEPARATE_WOW_VDM;
3522 }
3523
3524
3525 if (!QuerySection)
3526 {
3527
3530 &ImageInformation,
3531 sizeof(ImageInformation),
3534 {
3535
3536 DPRINT1(
"Section query failed\n");
3539 goto Quickie;
3540 }
3541
3542
3543 QuerySection =
TRUE;
3544 }
3545
3546
3548 {
3549
3550 DPRINT1(
"Trying to launch a DLL, failing\n");
3553 goto Quickie;
3554 }
3555
3556
3557 Flags &= ~PROCESS_CREATE_FLAGS_LARGE_PAGES;
3558
3559
3560 ParameterFlags &= ~2;
3561
3562
3565 {
3566
3569 {
3570
3572 }
3573 else
3574 {
3575
3576 if (!DebuggerCmdLine)
3577 {
3578
3580 0,
3582 if (!DebuggerCmdLine)
3583 {
3584
3587
3588
3591 goto Quickie;
3592 }
3593 }
3594
3595
3599 DebuggerCmdLine,
3601 &ResultSize);
3603 (ResultSize <
sizeof(
WCHAR)) ||
3605 {
3606
3607 RtlFreeHeap(RtlGetProcessHeap(), 0, DebuggerCmdLine);
3608 DebuggerCmdLine =
NULL;
3609 }
3610
3611
3615 &UseLargePages,
3616 sizeof(UseLargePages),
3618 if ((
NT_SUCCESS(IFEOStatus)) && (UseLargePages))
3619 {
3620
3622 }
3623
3624
3627 }
3628 }
3629
3630
3633 {
3634
3636 ErrorParameters[0] = (
ULONG_PTR)&PathName;
3638 1,
3639 1,
3640 ErrorParameters,
3642 &ErrorResponse);
3644 {
3645
3647 }
3648 else
3649 {
3650
3652 }
3653
3654
3655 DPRINT1(
"Invalid image architecture: %lx\n", ImageInformation.
Machine);
3657 goto Quickie;
3658 }
3659
3660
3663 {
3664
3666 SectionHandle =
NULL;
3667 QuerySection =
FALSE;
3668
3669
3671 {
3672
3675 goto Quickie;
3676 }
3677
3678
3680 lpApplicationName,
3681 lpCommandLine,
3682 &DebuggerString);
3684 {
3685
3686 DPRINT1(
"Subsystem command line failed\n");
3687 goto Quickie;
3688 }
3689
3690
3691 lpCommandLine = DebuggerString.
Buffer;
3692 lpApplicationName =
NULL;
3693
3694
3695 SkipSaferAndAppCompat =
TRUE;
3696 DPRINT1(
"Retrying with: %S\n", lpCommandLine);
3697 goto AppNameRetry;
3698 }
3699
3700
3704 {
3705
3706 DPRINT1(
"Invalid subsystem version: %hu.%hu\n",
3710 goto Quickie;
3711 }
3712
3713
3714 if (DebuggerCmdLine)
3715 {
3716
3719 {
3720
3721 lpCommandLine = (
LPWSTR)lpApplicationName;
3723 }
3724
3725
3727 {
3730 goto Quickie;
3731 }
3732
3733
3735
3736
3738 {
3741 goto Quickie;
3742 }
3743
3744
3746
3747
3750 {
3753 goto Quickie;
3754 }
3755
3756
3758 if (!DebuggerString.
Buffer)
3759 {
3762 goto Quickie;
3763 }
3764
3765
3766 RtlInitEmptyUnicodeString(&DebuggerString,
3769
3770
3772 DebuggerCmdLine);
3778
3779
3780 DbgPrint(
"BASE: Calling debugger with '%wZ'\n", &DebuggerString);
3781
3782
3783 lpCommandLine = DebuggerString.
Buffer;
3784 lpApplicationName =
NULL;
3785
3786
3788 SectionHandle =
NULL;
3789 QuerySection =
FALSE;
3790
3791
3796 RtlFreeHeap(RtlGetProcessHeap(), 0, DebuggerCmdLine);
3797 DebuggerCmdLine =
NULL;
3798 DPRINT1(
"Retrying with: %S\n", lpCommandLine);
3799 goto AppNameRetry;
3800 }
3801
3802
3804 lpProcessAttributes,
3807 {
3808
3809
3810 LocalProcessAttributes = *lpProcessAttributes;
3813 &LocalProcessAttributes,
3815 }
3816
3817
3819 {
3820
3822 }
3823
3824
3826 {
3827
3830 {
3831 DPRINT1(
"Failed to connect to DbgUI!\n");
3834 goto Quickie;
3835 }
3836
3837
3839
3840
3842 {
3843
3845 }
3846 }
3847
3848
3850
3851
3852 HavePrivilege =
FALSE;
3853 PrivilegeState =
NULL;
3855 {
3856
3860 {
3861
3862 HavePrivilege =
TRUE;
3863 }
3864 }
3865
3866
3868
3869
3875 SectionHandle,
3876 DebugHandle,
3878 InJob);
3879
3880
3882
3883
3885
3886
3888
3889
3891 {
3892
3896 goto Quickie;
3897 }
3898
3899
3901 {
3902
3903 RealTimePrivilegeState =
NULL;
3904
3905
3907 {
3908
3910 }
3911
3912
3915 &PriorityClass,
3918
3919
3921 {
3922
3926 goto Quickie;
3927 }
3928 }
3929
3930
3932 {
3933
3937 &HardErrorMode,
3939 }
3940
3941
3942 if (VdmBinaryType)
3943 {
3944
3947 &VdmWaitObject,
3948 VdmTask,
3949 VdmBinaryType);
3950
3952 {
3953
3954 DPRINT1(
"Failed to update VDM with wait object\n");
3955 VdmWaitObject =
NULL;
3956 goto Quickie;
3957 }
3958
3959
3961 }
3962
3963
3964 if (VdmReserve)
3965 {
3966
3970 0,
3975 {
3976
3980 goto Quickie;
3981 }
3982
3984 }
3985
3986
3987 if (!QuerySection)
3988 {
3989
3992 &ImageInformation,
3993 sizeof(ImageInformation),
3996 {
3997
4001 goto Quickie;
4002 }
4003
4004
4005 QuerySection =
TRUE;
4006 }
4007
4008
4010 {
4011
4012 DPRINT(
"Image should receive SxS Fusion Isolation\n");
4013 }
4014
4015
4017
4018
4019 if (lpCurrentDirectory)
4020 {
4021
4022 DPRINT(
"Current directory: %S\n", lpCurrentDirectory);
4024 0,
4028 {
4029
4032 goto Quickie;
4033 }
4034
4035
4039 &FilePart);
4041 {
4042
4045 goto Quickie;
4046 }
4047
4048
4052 {
4053
4054 DPRINT1(
"Current directory is invalid\n");
4057 goto Quickie;
4058 }
4059 }
4060
4061
4062 if ((QuotesNeeded) || (CmdLineIsAppName))
4063 {
4064
4066 0,
4069 if (QuotedCmdLine)
4070 {
4071
4073
4074
4075 if (QuotesNeeded)
4076 {
4077 SaveChar = *NullBuffer;
4079 }
4080
4081
4082 wcscat(QuotedCmdLine, lpCommandLine);
4084
4085
4086 if (QuotesNeeded)
4087 {
4088 *NullBuffer = SaveChar;
4089 wcscat(QuotedCmdLine, NullBuffer);
4090 }
4091 }
4092 else
4093 {
4094
4095 if (QuotesNeeded) QuotesNeeded =
FALSE;
4096 if (CmdLineIsAppName) CmdLineIsAppName =
FALSE;
4097 }
4098 }
4099
4100
4101 if (CreateProcessMsg->
Sxs.
Flags & 1) ParameterFlags |= 1;
4102
4103
4104 if ((QuotesNeeded) || (CmdLineIsAppName)) lpCommandLine = QuotedCmdLine;
4105
4106
4109 RemotePeb,
4110 lpApplicationName,
4112 lpCommandLine,
4113 lpEnvironment,
4114 &StartupInfo,
4115 dwCreationFlags | NoWindow,
4116 bInheritHandles,
4118 AppCompatData,
4119 AppCompatDataSize);
4121 {
4122
4123 DPRINT1(
"BasePushProcessParameters failed\n");
4124 goto Quickie;
4125 }
4126
4127
4130
4131
4132 if (!(VdmBinaryType) &&
4133 !(bInheritHandles) &&
4139 {
4140
4143 &ProcessParameters,
4147 {
4148
4150 {
4154 }
4155
4156
4158 {
4162 }
4163
4164
4166 {
4170 }
4171 }
4172 }
4173
4174
4179 &InitialTeb);
4181 {
4185 goto Quickie;
4186 }
4187
4188
4190 RemotePeb,
4193 0);
4194
4195
4197 lpThreadAttributes,
4200 {
4201
4202 LocalThreadAttributes = *lpThreadAttributes;
4205 &LocalThreadAttributes,
4207 }
4208
4209
4216 &InitialTeb,
4219 {
4220
4224 goto Quickie;
4225 }
4226
4227
4231
4232
4234#ifdef _WIN64
4235 DPRINT(
"TODO: WOW64 is not supported yet\n");
4237#else
4239#endif
4241
4242
4243 switch (ImageInformation.
Machine)
4244 {
4245
4248 break;
4251 break;
4254 break;
4255
4256
4257 default:
4258 DbgPrint(
"kernel32: No mapping for ImageInformation.Machine == %04x\n",
4261 break;
4262 }
4263
4264
4267
4268
4270 (IsWowApp))
4271 {
4272
4273
4274
4275
4276
4278
4279
4281 if ((NtHeaders) &&
4283 {
4284
4286 }
4287 }
4288
4289
4290
4292 {
4294 }
4296 {
4298 }
4299
4300
4302
4303
4304 if (VdmBinaryType)
4305 {
4306
4308 CreateProcessMsg->
VdmTask = VdmTask;
4309 }
4310 else if (VdmReserve)
4311 {
4312
4314 }
4315
4316
4318 {
4319
4320 DPRINT1(
"This is an SxS Message -- should not happen yet\n");
4324 goto Quickie;
4325 }
4326
4327
4329 CaptureBuffer,
4332 sizeof(*CreateProcessMsg));
4333
4334
4335 if (CaptureBuffer)
4336 {
4338 CaptureBuffer =
NULL;
4339 }
4340
4341
4343 {
4344
4345 DPRINT1(
"Failed to tell csrss about new process\n");
4349 goto Quickie;
4350 }
4351
4352
4354 {
4355
4358 ThreadHandle);
4360 {
4361
4366 goto Quickie;
4367 }
4368 }
4369
4370
4371 if (JobHandle)
4372 {
4373
4376 {
4377
4382 goto Quickie;
4383 }
4384 }
4385
4386
4388 {
4390 }
4391
4392VdmShortCircuit:
4393
4395
4396
4398
4399
4400 if (VdmWaitObject)
4401 {
4402
4404 {
4405
4407 lpProcessInformation->hProcess = VdmWaitObject;
4408
4409
4411 {
4412
4415 }
4416 }
4417 else
4418 {
4419
4420
4422 lpProcessInformation->hProcess = VdmWaitObject;
4423 }
4424
4425
4427 }
4428 else
4429 {
4430
4432 }
4433
4434
4435 lpProcessInformation->hThread = ThreadHandle;
4438
4439
4441 ThreadHandle =
NULL;
4442
4443Quickie:
4444
4445 if (DebuggerCmdLine)
RtlFreeHeap(RtlGetProcessHeap(), 0, DebuggerCmdLine);
4446
4447
4448 if (PathBuffer)
4449 {
4450
4451 RtlInitEmptyUnicodeString(&SxsWin32ExePath,
NULL, 0);
4452 SxsWin32ExePath.
Length = 0;
4453
4454
4456 }
4457
4458#if _SXS_SUPPORT_ENABLED_
4459
4460 if (!VdmBinaryType)
4461 {
4462
4465
4466
4467 if (SxsConglomeratedBuffer)
4468 {
4469
4470 for (
i = 0;
i < 5;
i++)
4471 {
4472
4473 ThisBuffer = SxsStaticBuffers[
i];
4474 if (ThisBuffer)
4475 {
4476
4478 if ((ThisBuffer != (
PVOID)-8) && (ByteBuffer->
Buffer))
4479 {
4480
4482 {
4483
4486 }
4487
4488
4491 }
4492
4493
4494 RtlInitEmptyUnicodeString(&ThisBuffer->
String,
4498 {
4499
4501 }
4502 }
4503 }
4504 }
4505 }
4506#endif
4507
4509 {
4510
4512
4513
4515 lpEnvironment =
NULL;
4516 }
4517
4518
4519 RtlFreeHeap(RtlGetProcessHeap(), 0, QuotedCmdLine);
4523
4524
4526 if (SectionHandle)
NtClose(SectionHandle);
4527
4528
4529 if (ThreadHandle)
4530 {
4531
4534 }
4535
4536
4538
4539
4540 if (JobHandle)
NtClose(JobHandle);
4541
4542
4544 {
4545
4547 {
4548
4550 }
4551 else
4552 {
4553
4555 }
4556 }
4557
4558
4560
4561
4564
4565
4567 {
4568
4570 }
4571
4572
4574 {
4575
4578 VdmUndoLevel,
4579 VdmBinaryType);
4580
4581
4582 if (VdmWaitObject)
NtClose(VdmWaitObject);
4583 }
4584
4585
4587
4588
4590}
NTSTATUS NTAPI NtCreateSection(OUT PHANDLE SectionHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, IN PLARGE_INTEGER MaximumSize OPTIONAL, IN ULONG SectionPageProtection OPTIONAL, IN ULONG AllocationAttributes, IN HANDLE FileHandle OPTIONAL)
static IN ULONG IN PWSTR OUT PCWSTR OUT PBOOLEAN OUT PATH_TYPE_AND_UNKNOWN * PathType
NTSTATUS WINAPI BasepCheckBadapp(IN HANDLE FileHandle, IN PWCHAR ApplicationName, IN PWCHAR Environment, IN USHORT ExeType, IN PVOID *SdbQueryAppCompatData, IN PULONG SdbQueryAppCompatDataSize, IN PVOID *SxsData, IN PULONG SxsDataSize, OUT PULONG FusionFlags)
VOID WINAPI BasepFreeAppCompatData(IN PVOID AppCompatData, IN PVOID AppCompatSxsData)
#define FILE_NON_DIRECTORY_FILE
#define BASESRV_SERVERDLL_INDEX
IN PUNICODE_STRING IN POBJECT_ATTRIBUTES ObjectAttributes
#define CSR_CREATE_API_NUMBER(ServerId, ApiId)
NTSTATUS NTAPI DbgUiConnectToDbg(VOID)
HANDLE NTAPI DbgUiGetThreadDebugObject(VOID)
#define ERROR_INVALID_PARAMETER
#define INVALID_HANDLE_VALUE
#define FILE_ATTRIBUTE_NORMAL
#define ERROR_ACCESS_DENIED
PBASE_STATIC_SERVER_DATA BaseStaticServerData
DWORD WINAPI GetFileAttributesW(LPCWSTR lpFileName)
LPWSTR WINAPI BaseComputeProcessExePath(IN LPWSTR FullPath)
DWORD WINAPI SearchPathW(IN LPCWSTR lpPath OPTIONAL, IN LPCWSTR lpFileName, IN LPCWSTR lpExtension OPTIONAL, IN DWORD nBufferLength, OUT LPWSTR lpBuffer, OUT LPWSTR *lpFilePart OPTIONAL)
BOOLEAN WINAPI BasePushProcessParameters(IN ULONG ParameterFlags, IN HANDLE ProcessHandle, IN PPEB RemotePeb, IN LPCWSTR ApplicationPathName, IN LPWSTR lpCurrentDirectory, IN LPWSTR lpCommandLine, IN LPVOID lpEnvironment, IN LPSTARTUPINFOW StartupInfo, IN DWORD CreationFlags, IN BOOL InheritHandles, IN ULONG ImageSubsystem, IN PVOID AppCompatData, IN ULONG AppCompatDataSize)
NTSTATUS WINAPI BasepCheckWebBladeHashes(IN HANDLE FileHandle)
VOID WINAPI StuffStdHandle(IN HANDLE ProcessHandle, IN HANDLE StandardHandle, IN PHANDLE Address)
BOOLEAN WINAPI BuildSubSysCommandLine(IN LPCWSTR SubsystemName, IN LPCWSTR ApplicationName, IN LPCWSTR CommandLine, OUT PUNICODE_STRING SubsysCommandLine)
NTSTATUS WINAPI BasepIsProcessAllowed(IN LPWSTR ApplicationName)
#define AddToHandle(x, y)
NTSTATUS WINAPI BasepReplaceProcessThreadTokens(IN HANDLE TokenHandle, IN HANDLE ProcessHandle, IN HANDLE ThreadHandle)
VOID WINAPI BasepSxsCloseHandles(IN PBASE_MSG_SXS_HANDLES Handles)
#define RemoveFromHandle(x, y)
BOOLEAN WINAPI BasepIsImageVersionOk(IN ULONG ImageMajorVersion, IN ULONG ImageMinorVersion)
NTSTATUS WINAPI BaseCreateStack(_In_ HANDLE hProcess, _In_opt_ SIZE_T StackCommit, _In_opt_ SIZE_T StackReserve, _Out_ PINITIAL_TEB InitialTeb)
VOID WINAPI BaseInitializeContext(IN PCONTEXT Context, IN PVOID Parameter, IN PVOID StartAddress, IN PVOID StackAddress, IN ULONG ContextType)
POBJECT_ATTRIBUTES WINAPI BaseFormatObjectAttributes(OUT POBJECT_ATTRIBUTES ObjectAttributes, IN PSECURITY_ATTRIBUTES SecurityAttributes OPTIONAL, IN PUNICODE_STRING ObjectName)
NTSTATUS WINAPI BasepCheckWinSaferRestrictions(IN HANDLE UserToken, IN LPWSTR ApplicationName, IN HANDLE FileHandle, OUT PBOOLEAN InJob, OUT PHANDLE NewToken, OUT PHANDLE JobHandle)
PVOID WINAPI BasepIsRealtimeAllowed(IN BOOLEAN Keep)
ULONG WINAPI BaseIsDosApplication(IN PUNICODE_STRING PathName, IN NTSTATUS Status)
BOOL NTAPI BaseDestroyVDMEnvironment(IN PANSI_STRING AnsiEnv, IN PUNICODE_STRING UnicodeEnv)
BOOL WINAPI BaseGetVdmConfigInfo(IN LPCWSTR CommandLineReserved, IN ULONG DosSeqId, IN ULONG BinaryType, IN PUNICODE_STRING CmdLineString, OUT PULONG VdmSize)
BOOL WINAPI BaseUpdateVDMEntry(IN ULONG UpdateIndex, IN OUT PHANDLE WaitHandle, IN ULONG IndexInfo, IN ULONG BinaryType)
BOOL NTAPI BaseCreateVDMEnvironment(IN PWCHAR lpEnvironment, OUT PANSI_STRING AnsiEnv, OUT PUNICODE_STRING UnicodeEnv)
NTSTATUS WINAPI BaseCheckVDM(IN ULONG BinaryType, IN PCWCH ApplicationName, IN PCWCH CommandLine, IN PCWCH CurrentDirectory, IN PANSI_STRING AnsiEnvironment, IN PBASE_API_MESSAGE ApiMessage, IN OUT PULONG iTask, IN DWORD CreationFlags, IN LPSTARTUPINFOW StartupInfo, IN HANDLE hUserToken OPTIONAL)
#define FILE_SYNCHRONOUS_IO_NONALERT
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
NTSTATUS NTAPI NtRaiseHardError(IN NTSTATUS ErrorStatus, IN ULONG NumberOfParameters, IN ULONG UnicodeStringParameterMask, IN PULONG_PTR Parameters, IN ULONG ValidResponseOptions, OUT PULONG Response)
_CRTIMP size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
#define PROCESS_CREATE_FLAGS_BREAKAWAY
#define PROCESS_PRIORITY_CLASS_IDLE
#define PROCESS_CREATE_FLAGS_INHERIT_HANDLES
#define PROCESS_PRIORITY_CLASS_INVALID
#define PROCESS_PRIORITY_CLASS_NORMAL
#define PROCESS_PRIORITY_CLASS_HIGH
#define PROCESS_PRIORITY_CLASS_ABOVE_NORMAL
#define PROCESS_CREATE_FLAGS_LARGE_PAGES
#define PROCESS_PRIORITY_CLASS_BELOW_NORMAL
#define PROCESS_PRIORITY_CLASS_REALTIME
#define PROCESS_CREATE_FLAGS_NO_DEBUG_INHERIT
@ ProcessDefaultHardErrorMode
NTSTATUS NTAPI LdrQueryImageFileKeyOption(_In_ HANDLE KeyHandle, _In_ PCWSTR ValueName, _In_ ULONG Type, _Out_ PVOID Buffer, _In_ ULONG BufferSize, _Out_opt_ PULONG ReturnedLength)
NTSTATUS NTAPI LdrOpenImageFileOptionsKey(_In_ PUNICODE_STRING SubKey, _In_ BOOLEAN Wow64, _Out_ PHANDLE NewKeyHandle)
PVOID PVOID PWCHAR PVOID USHORT PULONG PVOID PULONG PVOID PULONG PULONG FusionFlags
#define SE_LOCK_MEMORY_PRIVILEGE
static OUT PIO_STATUS_BLOCK IoStatusBlock
#define InitializeObjectAttributes(p, n, a, r, s)
_In_ NDIS_ERROR_CODE ErrorCode
#define PROCESSOR_ARCHITECTURE_IA64
#define PROCESSOR_ARCHITECTURE_UNKNOWN
#define PROCESSOR_ARCHITECTURE_AMD64
#define PROCESSOR_ARCHITECTURE_INTEL
_In_ HANDLE _Outptr_result_bytebuffer_ ViewSize PVOID * BaseAddress
__kernel_entry _Inout_ _Inout_ PSIZE_T RegionSize
@ SectionImageInformation
NTSYSAPI ULONG NTAPI RtlIsDosDeviceName_U(_In_ PCWSTR Name)
NTSYSAPI NTSTATUS NTAPI RtlAcquirePrivilege(_In_ PULONG Privilege, _In_ ULONG NumPriv, _In_ ULONG Flags, _Out_ PVOID *ReturnedState)
NTSTATUS NTAPI RtlGetFullPathName_UstrEx(_In_ PUNICODE_STRING FileName, _In_opt_ PUNICODE_STRING StaticString, _In_opt_ PUNICODE_STRING DynamicString, _Out_opt_ PUNICODE_STRING *StringUsed, _Out_opt_ PSIZE_T FilePartSize, _Out_opt_ PBOOLEAN NameInvalid, _Out_ RTL_PATH_TYPE *PathType, _Out_opt_ PSIZE_T LengthNeeded)
VOID NTAPI RtlReleaseRelativeName(_In_ PRTL_RELATIVE_NAME_U RelativeName)
NTSYSAPI VOID NTAPI RtlDestroyEnvironment(_In_ PWSTR Environment)
NTSYSAPI RTL_PATH_TYPE NTAPI RtlDetermineDosPathNameType_U(_In_ PCWSTR Path)
NTSYSAPI VOID NTAPI RtlReleasePrivilege(_In_ PVOID ReturnedState)
NTSYSAPI BOOLEAN NTAPI RtlDosPathNameToRelativeNtPathName_U(_In_ PCWSTR DosName, _Out_ PUNICODE_STRING NtName, _Out_ PCWSTR *PartName, _Out_ PRTL_RELATIVE_NAME_U RelativeName)
#define SEM_FAILCRITICALERRORS
@ RtlPathTypeRootLocalDevice
@ RtlPathTypeDriveAbsolute
enum _RTL_PATH_TYPE RTL_PATH_TYPE
#define THREAD_ALL_ACCESS
NTSYSAPI NTSTATUS NTAPI NtOpenFile(OUT PHANDLE phFile, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes, OUT PIO_STATUS_BLOCK pIoStatusBlock, IN ULONG ShareMode, IN ULONG OpenMode)
#define SECTION_ALL_ACCESS
#define FILE_READ_ATTRIBUTES
#define PROCESS_ALL_ACCESS
NTSYSAPI NTSTATUS NTAPI RtlAnsiStringToUnicodeString(PUNICODE_STRING DestinationString, PANSI_STRING SourceString, BOOLEAN AllocateDestinationString)
NTSTATUS NTAPI NtTerminateProcess(HANDLE ProcessHandle, LONG ExitStatus)
#define FILE_SHARE_DELETE
#define FILE_ATTRIBUTE_DIRECTORY
NTSYSAPI NTSTATUS NTAPI NtCreateThread(OUT PHANDLE phThread, IN ACCESS_MASK AccessMask, IN POBJECT_ATTRIBUTES ObjectAttributes, IN HANDLE hProcess, OUT PCLIENT_ID pClientId, IN PCONTEXT pContext, OUT PSTACKINFO pStackInfo, IN BOOLEAN bSuspended)
#define PAGE_EXECUTE_READWRITE
#define UNICODE_STRING_MAX_CHARS
#define UNICODE_STRING_MAX_BYTES
#define VER_SUITE_DATACENTER
#define VER_SUITE_PERSONAL
#define IMAGE_SUBSYSTEM_POSIX_CUI
#define IMAGE_SUBSYSTEM_WINDOWS_CUI
#define IMAGE_SUBSYSTEM_WINDOWS_GUI
#define IMAGE_DLLCHARACTERISTICS_NO_ISOLATION
#define IMAGE_FILE_MACHINE_AMD64
#define IMAGE_FILE_MACHINE_IA64
NTSTATUS NTAPI NtFreeVirtualMemory(IN HANDLE ProcessHandle, IN PVOID *UBaseAddress, IN PSIZE_T URegionSize, IN ULONG FreeType)
NTSTATUS NTAPI NtReadVirtualMemory(IN HANDLE ProcessHandle, IN PVOID BaseAddress, OUT PVOID Buffer, IN SIZE_T NumberOfBytesToRead, OUT PSIZE_T NumberOfBytesRead OPTIONAL)
NTSTATUS NTAPI NtIsProcessInJob(IN HANDLE ProcessHandle, IN HANDLE JobHandle OPTIONAL)
NTSTATUS NTAPI NtAssignProcessToJobObject(HANDLE JobHandle, HANDLE ProcessHandle)
NTSTATUS NTAPI NtCreateProcessEx(OUT PHANDLE ProcessHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, IN HANDLE ParentProcess, IN ULONG Flags, IN HANDLE SectionHandle OPTIONAL, IN HANDLE DebugPort OPTIONAL, IN HANDLE ExceptionPort OPTIONAL, IN BOOLEAN InJob)
NTSTATUS NTAPI NtSetInformationProcess(IN HANDLE ProcessHandle, IN PROCESSINFOCLASS ProcessInformationClass, IN PVOID ProcessInformation, IN ULONG ProcessInformationLength)
NTSTATUS NTAPI NtResumeThread(IN HANDLE ThreadHandle, OUT PULONG SuspendCount OPTIONAL)
#define STATUS_INVALID_IMAGE_WIN_64
#define STATUS_INVALID_IMAGE_WIN_16
#define STATUS_INVALID_IMAGE_NE_FORMAT
#define STATUS_IMAGE_MACHINE_TYPE_MISMATCH_EXE
#define STATUS_INVALID_IMAGE_NOT_MZ
#define STATUS_INVALID_IMAGE_PROTECT
#define STATUS_VDM_DISALLOWED
#define STATUS_FILE_IS_OFFLINE
#define STATUS_NAME_TOO_LONG
#define IMAGE_FILE_MACHINE_I386
_CRTIMP wchar_t *__cdecl wcscpy(_Out_writes_z_(_String_length_(_Source)+1) wchar_t *_Dest, _In_z_ const wchar_t *_Source)
_CRTIMP wchar_t *__cdecl wcscat(_Inout_updates_z_(_String_length_(_Dest)+_String_length_(_Source)+1) wchar_t *_Dest, _In_z_ const wchar_t *_Source)
_Check_return_ _CRTIMP int __cdecl _wcsnicmp(_In_reads_or_z_(_MaxCount) const wchar_t *_Str1, _In_reads_or_z_(_MaxCount) const wchar_t *_Str2, _In_ size_t _MaxCount)
VOID NTAPI CsrFreeCaptureBuffer(_In_ _Frees_ptr_ PCSR_CAPTURE_BUFFER CaptureBuffer)
NTSTATUS NTAPI CsrClientCallServer(_Inout_ PCSR_API_MESSAGE ApiMessage, _Inout_opt_ PCSR_CAPTURE_BUFFER CaptureBuffer, _In_ CSR_API_NUMBER ApiNumber, _In_ ULONG DataLength)
#define VDM_UNDO_COMPLETED
#define BINARY_TYPE_WOW_EX
#define BINARY_TYPE_SEPARATE_WOW
NTSTATUS NTAPI NtQuerySection(_In_ HANDLE SectionHandle, _In_ SECTION_INFORMATION_CLASS SectionInformationClass, _Out_ PVOID SectionInformation, _In_ SIZE_T SectionInformationLength, _Out_opt_ PSIZE_T ResultLength)
BASE_CREATE_PROCESS CreateProcessRequest
union _BASE_API_MESSAGE::@3541 Data
BASE_CHECK_VDM CheckVDMRequest
HANDLE WaitObjectForParent
BASE_SXS_CREATEPROCESS_MSG Sxs
USHORT ProcessorArchitecture
BOOLEAN DefaultSeparateVDM
PVOID ArbitraryUserPointer
BOOLEAN ReadImageFileExecOptions
ULONG ImageSubsystemMajorVersion
UNICODE_STRING RelativeName
HANDLE ContainingDirectory
UNICODE_STRING DesktopInfo
LPVOID lpSecurityDescriptor
#define RtlZeroMemory(Destination, Length)
#define STATUS_ACCESS_DENIED
#define INVALID_FILE_ATTRIBUTES
#define NORMAL_PRIORITY_CLASS
#define STARTF_FORCEOFFFEEDBACK
DWORD WINAPI GetLastError(void)
#define REALTIME_PRIORITY_CLASS
#define BELOW_NORMAL_PRIORITY_CLASS
#define CREATE_UNICODE_ENVIRONMENT
#define HIGH_PRIORITY_CLASS
#define CREATE_SHARED_WOW_VDM
#define CREATE_DEFAULT_ERROR_MODE
#define CREATE_SEPARATE_WOW_VDM
#define DEBUG_ONLY_THIS_PROCESS
#define CREATE_PRESERVE_CODE_AUTHZ_LEVEL
#define IDLE_PRIORITY_CLASS
#define STARTF_FORCEONFEEDBACK
#define ABOVE_NORMAL_PRIORITY_CLASS
#define ERROR_PATH_NOT_FOUND
#define ERROR_BAD_EXE_FORMAT
#define ERROR_CHILD_NOT_COMPLETE
#define ERROR_ACCESS_DISABLED_BY_POLICY
#define ERROR_EXE_MACHINE_TYPE_MISMATCH
#define ERROR_ACCESS_DISABLED_WEBBLADE_TAMPER
#define ERROR_ACCESS_DISABLED_WEBBLADE
#define ERROR_FILE_OFFLINE
_Must_inspect_result_ _In_ ULONG Flags
_Out_ PCLIENT_ID ClientId