From 4edf5167a4e18d11f57ea2e3108bffc797e9a59f Mon Sep 17 00:00:00 2001 From: Alex Ionescu Date: Wed, 4 Sep 2013 07:07:08 +0000 Subject: [PATCH] [BASESRV]: Add INIFILE_MAPPING structures, and set a valid IniFileMapping pointer in the shared static data. Windows' kernel32 needs this whenever an INI API is called, which is why UserInit was crashing on load (our pointer was set to NULL). Now userinit.exe loads/works, and explorer.exe is the one that fails to initialize. But one can CTRL-ALT-DEL and launch Task Manager (works!), Calc (but not Notepad). svn path=/trunk/; revision=59984 --- reactos/include/reactos/subsys/win/base.h | 38 +++++++++++++++++++++++ reactos/subsystems/win/basesrv/init.c | 28 ++++++++++++++++- 2 files changed, 65 insertions(+), 1 deletion(-) diff --git a/reactos/include/reactos/subsys/win/base.h b/reactos/include/reactos/subsys/win/base.h index ad5dacaa7bc..e2254f60212 100644 --- a/reactos/include/reactos/subsys/win/base.h +++ b/reactos/include/reactos/subsys/win/base.h @@ -62,6 +62,44 @@ typedef struct _NLS_USER_INFO } NLS_USER_INFO, *PNLS_USER_INFO; C_ASSERT(sizeof(NLS_USER_INFO) == 0x1870); +typedef struct _INIFILE_MAPPING_TARGET +{ + struct _INIFILE_MAPPING_TARGET *Next; + UNICODE_STRING RegistryPath; +} INIFILE_MAPPING_TARGET, *PINIFILE_MAPPING_TARGET; + +typedef struct _INIFILE_MAPPING_VARNAME +{ + struct _INIFILE_MAPPING_VARNAME *Next; + UNICODE_STRING Name; + ULONG MappingFlags; + PINIFILE_MAPPING_TARGET MappingTarget; +} INIFILE_MAPPING_VARNAME, *PINIFILE_MAPPING_VARNAME; + +typedef struct _INIFILE_MAPPING_APPNAME +{ + struct _INIFILE_MAPPING_APPNAME *Next; + UNICODE_STRING Name; + PINIFILE_MAPPING_VARNAME VariableNames; + PINIFILE_MAPPING_VARNAME DefaultVarNameMapping; +} INIFILE_MAPPING_APPNAME, *PINIFILE_MAPPING_APPNAME; + +typedef struct _INIFILE_MAPPING_FILENAME +{ + struct _INIFILE_MAPPING_FILENAME *Next; + UNICODE_STRING Name; + PINIFILE_MAPPING_APPNAME ApplicationNames; + PINIFILE_MAPPING_APPNAME DefaultAppNameMapping; +} INIFILE_MAPPING_FILENAME, *PINIFILE_MAPPING_FILENAME; + +typedef struct _INIFILE_MAPPING +{ + PINIFILE_MAPPING_FILENAME FileNames; + PINIFILE_MAPPING_FILENAME DefaultFileNameMapping; + PINIFILE_MAPPING_FILENAME WinIniFileMapping; + ULONG Reserved; +} INIFILE_MAPPING, *PINIFILE_MAPPING; + typedef struct _BASE_STATIC_SERVER_DATA { UNICODE_STRING WindowsDirectory; diff --git a/reactos/subsystems/win/basesrv/init.c b/reactos/subsystems/win/basesrv/init.c index 54f5a44e60e..c13925e2649 100644 --- a/reactos/subsystems/win/basesrv/init.c +++ b/reactos/subsystems/win/basesrv/init.c @@ -24,6 +24,8 @@ HANDLE BaseSrvHeap = NULL; // Our own heap. HANDLE BaseSrvSharedHeap = NULL; // Shared heap with CSR. (CsrSrvSharedSectionHeap) PBASE_STATIC_SERVER_DATA BaseStaticServerData = NULL; // Data that we can share amongst processes. Initialized inside BaseSrvSharedHeap. +PINIFILE_MAPPING BaseSrvIniFileMapping; + // Windows Server 2003 table from http://j00ru.vexillium.org/csrss_list/api_list.html#Windows_2k3 PCSR_API_ROUTINE BaseServerApiDispatchTable[BasepMaxApiNumber - BASESRV_FIRST_API_NUMBER] = { @@ -130,9 +132,29 @@ PCHAR BaseServerApiNameTable[BasepMaxApiNumber - BASESRV_FIRST_API_NUMBER] = "BaseNlsGetUserInfo", }; - /* FUNCTIONS ******************************************************************/ +NTSTATUS +NTAPI +BaseSrvInitializeIniFileMappings(IN PBASE_STATIC_SERVER_DATA StaticServerData) +{ + /* Allocate the mapping blob */ + BaseSrvIniFileMapping = RtlAllocateHeap(BaseSrvHeap, + HEAP_ZERO_MEMORY, + sizeof(*BaseSrvIniFileMapping)); + if (BaseSrvIniFileMapping == NULL) + { + DPRINT1("BASESRV: Unable to allocate memory in shared heap for IniFileMapping\n"); + return STATUS_NO_MEMORY; + } + + /* Set it*/ + StaticServerData->IniFileMapping = BaseSrvIniFileMapping; + + /* FIXME: Do the work to initialize the mappings */ + return STATUS_SUCCESS; +} + NTSTATUS NTAPI CreateBaseAcls(OUT PACL* Dacl, @@ -418,6 +440,10 @@ BaseInitializeStaticServerData(IN PCSR_SERVER_DLL LoadedServerDll) NULL); ASSERT(NT_SUCCESS(Status)); + /* Setup the ini file mappings */ + Status = BaseSrvInitializeIniFileMappings(BaseStaticServerData); + ASSERT(NT_SUCCESS(Status)); + /* FIXME: Should query the registry for these */ BaseStaticServerData->DefaultSeparateVDM = FALSE; BaseStaticServerData->IsWowTaskReady = FALSE;