Index: util/win/get_function.h |
diff --git a/util/win/get_function.h b/util/win/get_function.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..50e5f1505ca56e8e445375babc92612a3d37b6be |
--- /dev/null |
+++ b/util/win/get_function.h |
@@ -0,0 +1,121 @@ |
+// Copyright 2015 The Crashpad Authors. All rights reserved. |
+// |
+// Licensed under the Apache License, Version 2.0 (the "License"); |
+// you may not use this file except in compliance with the License. |
+// You may obtain a copy of the License at |
+// |
+// http://www.apache.org/licenses/LICENSE-2.0 |
+// |
+// Unless required by applicable law or agreed to in writing, software |
+// distributed under the License is distributed on an "AS IS" BASIS, |
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
+// See the License for the specific language governing permissions and |
+// limitations under the License. |
+ |
+#ifndef CRASHPAD_UTIL_WIN_GET_FUNCTION_H_ |
+#define CRASHPAD_UTIL_WIN_GET_FUNCTION_H_ |
+ |
+#include <windows.h> |
+ |
+//! \file |
+ |
+namespace crashpad { |
+namespace internal { |
+ |
+//! \brief Returns a function pointer to a named function in a library. |
+//! |
+//! Do not call this directly, use the GET_FUNCTION() or GET_FUNCTION_REQUIRED() |
+//! macros instead. |
+//! |
+//! This accesses \a library by calling `LoadLibrary()` and is subject to the |
+//! same restrictions as that function. Notably, it can’t be used from a |
+//! `DllMain()` entry point. |
+//! |
+//! \param[in] library The library to search in. |
+//! \param[in] function The function to search for. If a leading `::` is |
+//! present, it will be stripped. |
+//! \param[in] required If `true`, require the function to resolve by `DCHECK`. |
+//! |
+//! \return A pointer to the requested function on success. If \a required is |
+//! `true`, triggers a `DCHECK` assertion on failure, otherwise, `nullptr` |
+//! on failure. |
+FARPROC GetFunctionInternal( |
+ const wchar_t* library, const char* function, bool required); |
+ |
+//! \copydoc GetFunctionInternal |
+template <typename FunctionType> |
+FunctionType* GetFunction( |
+ const wchar_t* library, const char* function, bool required) { |
+ return reinterpret_cast<FunctionType*>( |
+ internal::GetFunctionInternal(library, function, required)); |
+} |
+ |
+} // namespace internal |
+} // namespace crashpad |
+ |
+//! \brief Returns a function pointer to a named function in a library without |
+//! requiring that it be found. |
+//! |
+//! If the library or function cannot be found, this will return `nullptr`. This |
+//! macro is intended to be used to access functions that may not be available |
+//! at runtime. |
+//! |
+//! This macro returns a properly-typed function pointer. It is expected to be |
+//! used in this way: |
+//! \code |
+//! static const auto get_named_pipe_client_process_id = |
+//! GET_FUNCTION(L"kernel32.dll", ::GetNamedPipeClientProcessId); |
+//! if (get_named_pipe_client_process_id) { |
+//! BOOL rv = get_named_pipe_client_process_id(pipe, &client_process_id); |
+//! } |
+//! \endcode |
+//! |
+//! This accesses \a library by calling `LoadLibrary()` and is subject to the |
+//! same restrictions as that function. Notably, it can’t be used from a |
+//! `DllMain()` entry point. |
+//! |
+//! \param[in] library The library to search in. |
+//! \param[in] function The function to search for. A leading `::` is |
+//! recommended when a wrapper function of the same name is present. |
+//! |
+//! \return A pointer to the requested function on success, or `nullptr` on |
+//! failure. |
+//! |
+//! \sa GET_FUNCTION_REQUIRED |
+#define GET_FUNCTION(library, function) \ |
+ crashpad::internal::GetFunction<decltype(function)>( \ |
+ library, #function, false) |
+ |
+//! \brief Returns a function pointer to a named function in a library, |
+//! requiring that it be found. |
+//! |
+//! If the library or function cannot be found, this will trigger a `DCHECK` |
+//! assertion. This macro is intended to be used to access functions that are |
+//! always expected to be available at runtime but which are not present in any |
+//! import library. |
+//! |
+//! This macro returns a properly-typed function pointer. It is expected to be |
+//! used in this way: |
+//! \code |
+//! static const auto nt_query_object = |
+//! GET_FUNCTION_REQUIRED(L"ntdll.dll", ::NtQueryObject); |
+//! NTSTATUS status = |
+//! nt_query_object(handle, type, &info, info_length, &return_length); |
+//! \endcode |
+//! |
+//! This accesses \a library by calling `LoadLibrary()` and is subject to the |
+//! same restrictions as that function. Notably, it can’t be used from a |
+//! `DllMain()` entry point. |
+//! |
+//! \param[in] library The library to search in. |
+//! \param[in] function The function to search for. A leading `::` is |
+//! recommended when a wrapper function of the same name is present. |
+//! |
+//! \return A pointer to the requested function. |
+//! |
+//! \sa GET_FUNCTION |
+#define GET_FUNCTION_REQUIRED(library, function) \ |
+ crashpad::internal::GetFunction<decltype(function)>( \ |
+ library, #function, true) |
+ |
+#endif // CRASHPAD_UTIL_WIN_GET_FUNCTION_H_ |