[SYSSETUP] Add the type library registration to the Register Components task on the process page

This commit is contained in:
Eric Kohl
2025-02-06 23:14:28 +01:00
parent d969be0fb4
commit 2d8a2944ba
3 changed files with 102 additions and 36 deletions
+7 -2
View File
@@ -68,10 +68,15 @@ extern HINSTANCE hDllInstance;
extern HINF hSysSetupInf;
extern ADMIN_INFO AdminInfo;
BOOL RegisterTypeLibraries (HINF hinf, LPCWSTR szSection);
/* install */
BOOL
RegisterTypeLibraries(
_In_ PITEMSDATA pItemsData,
_In_ PREGISTRATIONNOTIFY pNotify,
_In_ HINF hinf,
_In_ LPCWSTR szSection);
VOID
InstallStartMenuItems(
_In_ PITEMSDATA pItemsData);
+21 -4
View File
@@ -336,11 +336,9 @@ InstallStartMenuItems(
INF_STYLE_WIN4,
NULL);
// Steps = SetupGetLineCountW(hShortcutsInf1, L"ShortcutFolders");
Steps = CountShortcuts(hShortcutsInf1, L"ShortcutFolders");
if (hShortcutsInf2 != INVALID_HANDLE_VALUE)
Steps += CountShortcuts(hShortcutsInf2, L"ShortcutFolders");
// Steps += SetupGetLineCountW(hShortcutsInf2, L"ShortcutFolders");
SendMessage(pItemsData->hwndDlg, PM_ITEM_START, 1, (LPARAM)Steps);
@@ -538,7 +536,11 @@ InstallSysSetupInfComponents(VOID)
BOOL
RegisterTypeLibraries(HINF hinf, LPCWSTR szSection)
RegisterTypeLibraries(
_In_ PITEMSDATA pItemsData,
_In_ PREGISTRATIONNOTIFY pNotify,
_In_ HINF hinf,
_In_ LPCWSTR szSection)
{
INFCONTEXT InfContext;
BOOL res;
@@ -575,6 +577,15 @@ RegisterTypeLibraries(HINF hinf, LPCWSTR szSection)
p = PathAddBackslash(szPath);
wcscpy(p, szName);
if (pItemsData && pNotify)
{
pNotify->Progress++;
pNotify->CurrentItem = szName;
DPRINT("RegisterTypeLibraries: Start step %ld\n", pNotify->Progress);
SendMessage(pItemsData->hwndDlg, PM_STEP_START, 0, (LPARAM)pNotify);
}
hmod = LoadLibraryW(szPath);
if (hmod == NULL)
{
@@ -584,6 +595,12 @@ RegisterTypeLibraries(HINF hinf, LPCWSTR szSection)
__wine_register_resources(hmod);
if (pItemsData && pNotify)
{
DPRINT("RegisterTypeLibraries: End step %ld\n", pNotify->Progress);
SendMessage(pItemsData->hwndDlg, PM_STEP_END, 0, (LPARAM)pNotify);
}
} while (SetupFindNextLine(&InfContext, &InfContext));
return TRUE;
@@ -1073,7 +1090,7 @@ InstallLiveCD(VOID)
DPRINT1("SetupInstallFromInfSectionW failed!\n");
}
RegisterTypeLibraries(hSysSetupInf, L"TypeLibraries");
RegisterTypeLibraries(NULL, NULL, hSysSetupInf, L"TypeLibraries");
}
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
{
+74 -30
View File
@@ -33,6 +33,7 @@ typedef struct _REGISTRATIONDATA
ULONG DllCount;
ULONG Registered;
PVOID DefaultContext;
PREGISTRATIONNOTIFY pNotify;
} REGISTRATIONDATA, *PREGISTRATIONDATA;
typedef struct _TIMEZONE_ENTRY
@@ -1991,7 +1992,6 @@ RegistrationNotificationProc(PVOID Context,
UINT_PTR Param2)
{
PREGISTRATIONDATA RegistrationData;
REGISTRATIONNOTIFY RegistrationNotify;
PSP_REGISTER_CONTROL_STATUSW StatusInfo;
UINT MessageID;
@@ -2001,23 +2001,24 @@ RegistrationNotificationProc(PVOID Context,
Notification == SPFILENOTIFY_ENDREGISTRATION)
{
StatusInfo = (PSP_REGISTER_CONTROL_STATUSW) Param1;
RegistrationNotify.CurrentItem = wcsrchr(StatusInfo->FileName, L'\\');
if (RegistrationNotify.CurrentItem == NULL)
RegistrationData->pNotify->CurrentItem = wcsrchr(StatusInfo->FileName, L'\\');
if (RegistrationData->pNotify->CurrentItem == NULL)
{
RegistrationNotify.CurrentItem = StatusInfo->FileName;
RegistrationData->pNotify->CurrentItem = StatusInfo->FileName;
}
else
{
RegistrationNotify.CurrentItem++;
RegistrationData->pNotify->CurrentItem++;
}
if (Notification == SPFILENOTIFY_STARTREGISTRATION)
{
DPRINT("Received SPFILENOTIFY_STARTREGISTRATION notification for %S\n",
StatusInfo->FileName);
// RegistrationNotify.ErrorMessage = NULL;
RegistrationNotify.Progress = RegistrationData->Registered;
SendMessage(RegistrationData->hwndDlg, PM_STEP_START, 0, (LPARAM)&RegistrationNotify);
RegistrationData->pNotify->Progress = RegistrationData->Registered;
DPRINT("RegisterDll: Start step %ld\n", RegistrationData->pNotify->Progress);
SendMessage(RegistrationData->hwndDlg, PM_STEP_START, 0, (LPARAM)RegistrationData->pNotify);
}
else
{
@@ -2049,13 +2050,13 @@ RegistrationNotificationProc(PVOID Context,
break;
}
RegistrationNotify.MessageID = MessageID;
RegistrationNotify.LastError = StatusInfo->Win32Error;
RegistrationData->pNotify->MessageID = MessageID;
RegistrationData->pNotify->LastError = StatusInfo->Win32Error;
}
else
{
RegistrationNotify.MessageID = 0;
RegistrationNotify.LastError = ERROR_SUCCESS;
RegistrationData->pNotify->MessageID = 0;
RegistrationData->pNotify->LastError = ERROR_SUCCESS;
}
if (RegistrationData->Registered < RegistrationData->DllCount)
@@ -2063,8 +2064,9 @@ RegistrationNotificationProc(PVOID Context,
RegistrationData->Registered++;
}
RegistrationNotify.Progress = RegistrationData->Registered;
SendMessage(RegistrationData->hwndDlg, PM_STEP_END, 0, (LPARAM)&RegistrationNotify);
RegistrationData->pNotify->Progress = RegistrationData->Registered;
DPRINT("RegisterDll: End step %ld\n", RegistrationData->pNotify->Progress);
SendMessage(RegistrationData->hwndDlg, PM_STEP_END, 0, (LPARAM)RegistrationData->pNotify);
}
return FILEOP_DOIT;
@@ -2081,13 +2083,14 @@ RegistrationNotificationProc(PVOID Context,
static
DWORD
RegisterDlls(
PITEMSDATA pItemsData)
_In_ PITEMSDATA pItemsData,
_In_ PREGISTRATIONNOTIFY pNotify)
{
REGISTRATIONDATA RegistrationData;
WCHAR SectionName[512];
INFCONTEXT Context;
LONG DllCount = 0;
DWORD LastError = NO_ERROR;
DWORD Error = NO_ERROR;
ZeroMemory(&RegistrationData, sizeof(REGISTRATIONDATA));
RegistrationData.hwndDlg = pItemsData->hwndDlg;
@@ -2097,7 +2100,7 @@ RegisterDlls(
L"RegisterDlls", &Context))
{
DPRINT1("No RegistrationPhase2 section found\n");
return FALSE;
return GetLastError();
}
if (!SetupGetStringFieldW(&Context, 1, SectionName,
@@ -2105,21 +2108,19 @@ RegisterDlls(
NULL))
{
DPRINT1("Unable to retrieve section name\n");
return FALSE;
return GetLastError();
}
DllCount = SetupGetLineCountW(hSysSetupInf, SectionName);
DPRINT1("SectionName %S DllCount %ld\n", SectionName, DllCount);
DPRINT("SectionName %S DllCount %ld\n", SectionName, DllCount);
if (DllCount < 0)
{
SetLastError(STATUS_NOT_FOUND);
return FALSE;
return STATUS_NOT_FOUND;
}
RegistrationData.DllCount = (ULONG)DllCount;
RegistrationData.DefaultContext = SetupInitDefaultQueueCallback(RegistrationData.hwndDlg);
SendMessage(pItemsData->hwndDlg, PM_ITEM_START, 0, (LPARAM)RegistrationData.DllCount);
RegistrationData.pNotify = pNotify;
_SEH2_TRY
{
@@ -2135,21 +2136,66 @@ RegisterDlls(
NULL,
NULL))
{
LastError = GetLastError();
Error = GetLastError();
}
}
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
{
DPRINT("Catching exception\n");
LastError = RtlNtStatusToDosError(_SEH2_GetExceptionCode());
Error = RtlNtStatusToDosError(_SEH2_GetExceptionCode());
}
_SEH2_END;
SetupTermDefaultQueueCallback(RegistrationData.DefaultContext);
SendMessage(pItemsData->hwndDlg, PM_ITEM_END, 0, LastError);
return Error;
}
return 0;
static
VOID
RegisterComponents(
PITEMSDATA pItemsData)
{
WCHAR SectionName[512];
INFCONTEXT Context;
LONG Steps = 0;
DWORD Error = NO_ERROR;
REGISTRATIONNOTIFY Notify;
ZeroMemory(&Notify, sizeof(Notify));
/* Count the 'RegisterDlls' steps */
if (!SetupFindFirstLineW(hSysSetupInf, L"RegistrationPhase2",
L"RegisterDlls", &Context))
{
DPRINT1("No RegistrationPhase2 section found\n");
return;
}
if (!SetupGetStringFieldW(&Context, 1, SectionName,
ARRAYSIZE(SectionName),
NULL))
{
DPRINT1("Unable to retrieve section name\n");
return;
}
Steps += SetupGetLineCountW(hSysSetupInf, SectionName);
/* Count the 'TypeLibratries' steps */
Steps += SetupGetLineCountW(hSysSetupInf, L"TypeLibraries");
/* Start the item */
DPRINT("Register Components: %ld Steps\n", Steps);
SendMessage(pItemsData->hwndDlg, PM_ITEM_START, 0, (LPARAM)Steps);
Error = RegisterDlls(pItemsData, &Notify);
if (Error == ERROR_SUCCESS)
RegisterTypeLibraries(pItemsData, &Notify, hSysSetupInf, L"TypeLibraries");
/* End the item */
DPRINT("Register Components: done\n");
SendMessage(pItemsData->hwndDlg, PM_ITEM_END, 0, Error);
}
@@ -2166,9 +2212,7 @@ ItemCompletionThread(
hwndDlg = pItemsData->hwndDlg;
/* Step 0 - Registering components */
RegisterDlls(pItemsData);
RegisterTypeLibraries(hSysSetupInf, L"TypeLibraries");
RegisterComponents(pItemsData);
/* Step 1 - Installing start menu items */
InstallStartMenuItems(pItemsData);