// Native userspace process-loader declarations. #pragma once #include #include #include #include #include #include #define NTL_PROCESS_LOAD_FLAG_NONE 0x00000000u // Describes one source capability to duplicate into a constructing child. typedef struct NTL_PROCESS_STARTUP_CAPABILITY { uint32_t Tag; SYS_HANDLE SourceHandle; SYS_RIGHTS DesiredRights; uint32_t DuplicateFlags; } NTL_PROCESS_STARTUP_CAPABILITY; // Creates and starts one PE32+ process entirely through the userspace image loader. typedef struct NTL_CREATE_PROCESS_AT_REQUEST { uint32_t Size; uint32_t Flags; SYS_HANDLE RootHandle; SYS_STRING_VIEW Path; SYS_STRING_VIEW CommandLine; // Empty inherits the caller's userspace CWD; non-empty is normalized as a native resource path. SYS_STRING_VIEW CurrentDirectory; SYS_HANDLE SecurityContext; SYS_HANDLE ModuleRootHandle; SYS_STRING_VIEW ModuleDirectory; NTL_MODULE_NAME_RESOLVER ResolveModuleName; void* ResolveContext; const NTL_PROCESS_STARTUP_CAPABILITY* StartupCapabilities; uint32_t StartupCapabilityCount; SYS_HANDLE* ProcessHandleOut; } NTL_CREATE_PROCESS_AT_REQUEST; // Creates one process beneath the globally published /SystemRoot volume. Path remains a // canonical volume-relative native path; RSSRV is used only to obtain the volume capability. typedef struct NTL_CREATE_SYSTEM_PROCESS_REQUEST { uint32_t Size; uint32_t Flags; // Optional pre-opened executable file. When supplied, Path is diagnostic/PEB identity only. SYS_HANDLE ImageFile; SYS_STRING_VIEW Path; SYS_STRING_VIEW CommandLine; // Empty inherits the caller's userspace CWD; non-empty is normalized as a native resource path. SYS_STRING_VIEW CurrentDirectory; SYS_HANDLE SecurityContext; NTL_MODULE_NAME_RESOLVER ResolveModuleName; void* ResolveContext; const NTL_PROCESS_STARTUP_CAPABILITY* StartupCapabilities; uint32_t StartupCapabilityCount; SYS_HANDLE* ProcessHandleOut; } NTL_CREATE_SYSTEM_PROCESS_REQUEST; #if defined(NTL_SYSCALL_STATIC) #define NTL_PROCESS_LOADER_API #elif defined(NTL_SYSCALL_BUILD) #define NTL_PROCESS_LOADER_API __declspec(dllexport) #else #define NTL_PROCESS_LOADER_API #endif NTL_PROCESS_LOADER_API KSTATUS NtlCreateProcessAt(const NTL_CREATE_PROCESS_AT_REQUEST* request); NTL_PROCESS_LOADER_API KSTATUS NtlCreateSystemProcess(const NTL_CREATE_SYSTEM_PROCESS_REQUEST* request); #undef NTL_PROCESS_LOADER_API