From ce296e920c516c2f6ddb8442ca55e9426f0fae07 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Fri, 17 May 2013 21:40:46 +0000 Subject: [PATCH] [SYSSETUP] * Add a way to register typelibs using the TypeLibraries section in syssetup.inf. Brought to you by Giannis Adamopoulos. svn path=/trunk/; revision=59028 --- reactos/dll/win32/syssetup/CMakeLists.txt | 2 +- reactos/dll/win32/syssetup/globals.h | 2 + reactos/dll/win32/syssetup/install.c | 59 +++++++++++++++++++++++ reactos/dll/win32/syssetup/wizard.c | 2 + 4 files changed, 64 insertions(+), 1 deletion(-) diff --git a/reactos/dll/win32/syssetup/CMakeLists.txt b/reactos/dll/win32/syssetup/CMakeLists.txt index 419edde3cf3..77c86e86203 100644 --- a/reactos/dll/win32/syssetup/CMakeLists.txt +++ b/reactos/dll/win32/syssetup/CMakeLists.txt @@ -15,7 +15,7 @@ list(APPEND SOURCE add_library(syssetup SHARED ${SOURCE}) add_pch(syssetup precomp.h) set_module_type(syssetup win32dll UNICODE) -target_link_libraries(syssetup uuid ${PSEH_LIB}) +target_link_libraries(syssetup uuid wine ${PSEH_LIB}) add_importlibs(syssetup msvcrt diff --git a/reactos/dll/win32/syssetup/globals.h b/reactos/dll/win32/syssetup/globals.h index 385b5c810c4..7ee3690fc16 100644 --- a/reactos/dll/win32/syssetup/globals.h +++ b/reactos/dll/win32/syssetup/globals.h @@ -61,6 +61,8 @@ extern HINSTANCE hDllInstance; extern HINF hSysSetupInf; extern SETUPDATA SetupData; +BOOL RegisterTypeLibraries (HINF hinf, LPCWSTR szSection); + /* security.c */ NTSTATUS SetAccountDomain(LPCWSTR DomainName, PSID DomainSid); diff --git a/reactos/dll/win32/syssetup/install.c b/reactos/dll/win32/syssetup/install.c index 713fadb6760..3de2935c7d4 100644 --- a/reactos/dll/win32/syssetup/install.c +++ b/reactos/dll/win32/syssetup/install.c @@ -28,6 +28,8 @@ #include "precomp.h" +#include + #define NDEBUG #include @@ -393,6 +395,61 @@ InstallSysSetupInfComponents(VOID) return TRUE; } + + + +BOOL +RegisterTypeLibraries (HINF hinf, LPCWSTR szSection) +{ + INFCONTEXT InfContext; + BOOL res; + WCHAR szName[MAX_PATH]; + WCHAR szPath[MAX_PATH]; + INT csidl; + LPWSTR p; + HMODULE hmod; + HRESULT hret; + + /* Begin iterating the entries in the inf section */ + res = SetupFindFirstLine(hinf, szSection, NULL, &InfContext); + if (!res) return FALSE; + + do + { + /* Get the name of the current type library */ + if (!SetupGetStringFieldW(&InfContext, 1, szName, MAX_PATH, NULL)) + { + FatalError("SetupGetStringFieldW failed\n"); + continue; + } + + if (!SetupGetIntField(&InfContext, 2, &csidl)) + csidl = CSIDL_SYSTEM; + + hret = SHGetFolderPathW(NULL, csidl, NULL, 0, szPath); + if (FAILED(hret)) + { + FatalError("SHGetSpecialFolderPathW failed hret=0x%d\n", hret); + continue; + } + + p = PathAddBackslash(szPath); + _tcscpy(p, szName); + + hmod = LoadLibraryW(szName); + if (hmod == NULL) + { + FatalError("LoadLibraryW failed\n"); + continue; + } + + __wine_register_resources(hmod); + + }while (SetupFindNextLine(&InfContext, &InfContext)); + + return TRUE; +} + static BOOL EnableUserModePnpManager(VOID) { @@ -668,6 +725,8 @@ InstallLiveCD(IN HINSTANCE hInstance) { DPRINT1("SetupInstallFromInfSectionW failed!\n"); } + + RegisterTypeLibraries(hSysSetupInf, L"TypeLibraries"); } _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) { diff --git a/reactos/dll/win32/syssetup/wizard.c b/reactos/dll/win32/syssetup/wizard.c index ff181e34bce..7803fa23ee0 100644 --- a/reactos/dll/win32/syssetup/wizard.c +++ b/reactos/dll/win32/syssetup/wizard.c @@ -1685,6 +1685,8 @@ RegistrationProc(LPVOID Parameter) SetupTermDefaultQueueCallback(RegistrationData->DefaultContext); HeapFree(GetProcessHeap(), 0, RegistrationData); + RegisterTypeLibraries(hSysSetupInf, L"TypeLibraries"); + // FIXME: Move this call to a separate cleanup page! RtlCreateBootStatusDataFile();