diff --git a/hook/hr.c b/hook/hr.c index 57eab7f..02a8642 100644 --- a/hook/hr.c +++ b/hook/hr.c @@ -4,29 +4,30 @@ #include "hook/hr.h" -void hr_propagate_win32_(HRESULT hr) +uint32_t hr_to_win32_error(HRESULT hr) { - uint32_t result; - if (SUCCEEDED(hr)) { - result = ERROR_SUCCESS; + return ERROR_SUCCESS; } else if (HRESULT_FACILITY(hr) == FACILITY_WIN32) { - result = HRESULT_CODE(hr); + return 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; + case E_ABORT: return ERROR_OPERATION_ABORTED; + case E_ACCESSDENIED: return ERROR_ACCESS_DENIED; + case E_FAIL: return ERROR_GEN_FAILURE; + case E_HANDLE: return ERROR_INVALID_HANDLE; + case E_INVALIDARG: return ERROR_INVALID_PARAMETER; + case E_NOINTERFACE: return ERROR_INVALID_FUNCTION; + case E_NOTIMPL: return ERROR_NOT_SUPPORTED; + case E_OUTOFMEMORY: return ERROR_OUTOFMEMORY; + case E_POINTER: return ERROR_INVALID_ADDRESS; + case E_UNEXPECTED: return ERROR_INTERNAL_ERROR; + default: return ERROR_INTERNAL_ERROR; } } +} - SetLastError(result); +void hr_propagate_win32_(HRESULT hr) +{ + SetLastError(hr_to_win32_error(hr)); } diff --git a/hook/hr.h b/hook/hr.h index 283d29b..29615cc 100644 --- a/hook/hr.h +++ b/hook/hr.h @@ -2,6 +2,9 @@ #include +#include + #define hr_propagate_win32(hr, r) (hr_propagate_win32_(hr), r) +uint32_t hr_to_win32_error(HRESULT hr); void hr_propagate_win32_(HRESULT hr);