diff --git a/hook/hr.c b/hook/hr.c new file mode 100644 index 0000000..57eab7f --- /dev/null +++ b/hook/hr.c @@ -0,0 +1,32 @@ +#include + +#include + +#include "hook/hr.h" + +void hr_propagate_win32_(HRESULT hr) +{ + uint32_t result; + + if (SUCCEEDED(hr)) { + result = ERROR_SUCCESS; + } else if (HRESULT_FACILITY(hr) == FACILITY_WIN32) { + result = HRESULT_CODE(hr); + } else { + switch (hr) { + case E_ABORT: result = ERROR_OPERATION_ABORTED; break; + case E_ACCESSDENIED: result = ERROR_ACCESS_DENIED; break; + case E_FAIL: result = ERROR_GEN_FAILURE; break; + case E_HANDLE: result = ERROR_INVALID_HANDLE; break; + case E_INVALIDARG: result = ERROR_INVALID_PARAMETER; break; + case E_NOINTERFACE: result = ERROR_INVALID_FUNCTION; break; + case E_NOTIMPL: result = ERROR_NOT_SUPPORTED; break; + case E_OUTOFMEMORY: result = ERROR_OUTOFMEMORY; break; + case E_POINTER: result = ERROR_INVALID_ADDRESS; break; + case E_UNEXPECTED: result = ERROR_INTERNAL_ERROR; break; + default: result = ERROR_INTERNAL_ERROR; break; + } + } + + SetLastError(result); +} diff --git a/hook/hr.h b/hook/hr.h new file mode 100644 index 0000000..283d29b --- /dev/null +++ b/hook/hr.h @@ -0,0 +1,7 @@ +#pragma once + +#include + +#define hr_propagate_win32(hr, r) (hr_propagate_win32_(hr), r) + +void hr_propagate_win32_(HRESULT hr); diff --git a/hook/meson.build b/hook/meson.build index 985599b..f0d8f58 100644 --- a/hook/meson.build +++ b/hook/meson.build @@ -3,6 +3,8 @@ hook_lib = static_library( include_directories : inc, c_pch : '../precompiled.h', sources : [ + 'hr.c', + 'hr.h', 'pe.c', 'pe.h', 'peb.c',