Handle failures in InstallHooks and fix a random COMException when P/Invoking winrtact_Initialize (#784)

* remove "PreserveSig=true" from the P/Invoke signature of winrtact_Initialize as it returns Void.

* Add error checking for the Detour calls in InstallHooks.
Dllmain now returns False in case an error occured in InstallHooks or ExtRoLoadCatalog

* Update src/UndockedRegFreeWinRT/UndockedRegFreeWinRT/dllmain.cpp

Co-authored-by: Scott Jones <scottj1s@gmail.com>

* Update src/UndockedRegFreeWinRT/UndockedRegFreeWinRT/dllmain.cpp

Co-authored-by: Scott Jones <scottj1s@gmail.com>

* Update src/UndockedRegFreeWinRT/UndockedRegFreeWinRT/dllmain.cpp

Co-authored-by: Scott Jones <scottj1s@gmail.com>

* Update src/UndockedRegFreeWinRT/UndockedRegFreeWinRT/dllmain.cpp

Co-authored-by: Scott Jones <scottj1s@gmail.com>

* Update src/UndockedRegFreeWinRT/UndockedRegFreeWinRT/dllmain.cpp

Co-authored-by: Scott Jones <scottj1s@gmail.com>

Co-authored-by: Scott Jones <scottj1s@gmail.com>
This commit is contained in:
Eric Detoc 2022-12-12 20:41:35 +01:00 коммит произвёл GitHub
Родитель cfe510d0d2
Коммит 952e2e6288
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 4AEE18F83AFDEB23
2 изменённых файлов: 21 добавлений и 16 удалений

Просмотреть файл

@ -321,21 +321,23 @@ HRESULT WINAPI RoResolveNamespaceDetour(
return hr;
}
void InstallHooks()
HRESULT InstallHooks()
{
if (DetourIsHelperProcess()) {
return;
}
// If this is loaded in a Detours helper process and not the actual process
// to be hooked, just return without performing any other operations.
if (DetourIsHelperProcess())
return S_OK;
DetourRestoreAfterWith();
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
DetourAttach(&(PVOID&)TrueRoActivateInstance, RoActivateInstanceDetour);
DetourAttach(&(PVOID&)TrueRoGetActivationFactory, RoGetActivationFactoryDetour);
DetourAttach(&(PVOID&)TrueRoGetMetaDataFile, RoGetMetaDataFileDetour);
DetourAttach(&(PVOID&)TrueRoResolveNamespace, RoResolveNamespaceDetour);
DetourTransactionCommit();
RETURN_IF_WIN32_ERROR(DetourTransactionBegin());
RETURN_IF_WIN32_ERROR(DetourUpdateThread(GetCurrentThread()));
RETURN_IF_WIN32_ERROR(DetourAttach(&(PVOID&)TrueRoActivateInstance, RoActivateInstanceDetour));
RETURN_IF_WIN32_ERROR(DetourAttach(&(PVOID&)TrueRoGetActivationFactory, RoGetActivationFactoryDetour));
RETURN_IF_WIN32_ERROR(DetourAttach(&(PVOID&)TrueRoGetMetaDataFile, RoGetMetaDataFileDetour));
RETURN_IF_WIN32_ERROR(DetourAttach(&(PVOID&)TrueRoResolveNamespace, RoResolveNamespaceDetour));
RETURN_IF_WIN32_ERROR(DetourTransactionCommit());
return S_OK;
}
void RemoveHooks()
@ -443,16 +445,17 @@ HRESULT ExtRoLoadCatalog()
BOOL WINAPI DllMain(HINSTANCE hmodule, DWORD reason, LPVOID /*lpvReserved*/)
{
if (IsWindows1019H1OrGreater())
{
return true;
}
if (reason == DLL_PROCESS_ATTACH)
{
DisableThreadLibraryCalls(hmodule);
InstallHooks();
try
{
ExtRoLoadCatalog();
if (!SUCCEEDED(InstallHooks()) || !SUCCEEDED(ExtRoLoadCatalog()))
return false;
}
catch (...)
{
@ -460,10 +463,12 @@ BOOL WINAPI DllMain(HINSTANCE hmodule, DWORD reason, LPVOID /*lpvReserved*/)
return false;
}
}
if (reason == DLL_PROCESS_DETACH)
{
RemoveHooks();
}
return true;
}

Просмотреть файл

@ -4,7 +4,7 @@ namespace Microsoft.Windows
{
public static class UndockedRegFreeWinrt
{
[DllImport("winrtact.dll", PreserveSig=true)]
[DllImport("winrtact.dll")]
static extern void winrtact_Initialize();
public static void Initialize()