// Init service-configuration declarations. services.ini is strict policy owned by init. #pragma once #include #include #include #include #define INIT_SERVICES_PATH "system/services.ini" #define INIT_SERVICES_MAX_FILE_BYTES (64u * 1024u) #define INIT_SERVICE_MAX_COUNT 32u #define INIT_SERVICE_ID_MAX 31u #define INIT_SERVICE_DEPENDENCY_MAX 8u #define INIT_SERVICE_GRANT_MAX 8u #define INIT_SERVICE_GRANT_NAME_MAX SYS_STARTUP_CAPABILITY_NAME_MAX #define INIT_SERVICE_EXPORT_MAX 8u typedef enum INIT_SERVICE_START_POLICY { InitServiceStartAuto = 0, InitServiceStartDisabled, } INIT_SERVICE_START_POLICY; typedef enum INIT_SERVICE_RESTART_POLICY { InitServiceRestartNever = 0, InitServiceRestartOnFailure, } INIT_SERVICE_RESTART_POLICY; typedef struct INIT_SERVICE_DESCRIPTOR { char Id[INIT_SERVICE_ID_MAX + 1u]; char ImagePath[SYS_PATH_MAX]; INIT_SERVICE_START_POLICY StartPolicy; bool Critical; INIT_SERVICE_RESTART_POLICY RestartPolicy; uint32_t ReadyTimeoutMilliseconds; uint32_t StopTimeoutMilliseconds; uint32_t DependencyCount; uint16_t Dependencies[INIT_SERVICE_DEPENDENCY_MAX]; uint32_t GrantCount; char Grants[INIT_SERVICE_GRANT_MAX][INIT_SERVICE_GRANT_NAME_MAX + 1u]; uint32_t ExportCount; char Exports[INIT_SERVICE_EXPORT_MAX][NTL_SERVICE_EXPORT_NAME_MAX + 1u]; } INIT_SERVICE_DESCRIPTOR; typedef struct INIT_SERVICE_CONFIG { INIT_SERVICE_DESCRIPTOR Services[INIT_SERVICE_MAX_COUNT]; uint16_t StartupOrder[INIT_SERVICE_MAX_COUNT]; uint32_t ServiceCount; uint32_t StartupCount; } INIT_SERVICE_CONFIG; // Loads, strictly parses, and validates services.ini beneath the bootstrap system volume. KSTATUS InitLoadServiceConfig(SYS_HANDLE systemVolume, INIT_SERVICE_CONFIG* configOut, uint32_t* errorLineOut);