Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(890)

Unified Diff: util/win/get_function.h

Issue 1405323003: win: Add and use GET_FUNCTION() and GET_FUNCTION_REQUIRED() (Closed) Base URL: https://chromium.googlesource.com/crashpad/crashpad@master
Patch Set: Address review feedback Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « util/win/exception_handler_server.cc ('k') | util/win/get_function.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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_
« no previous file with comments | « util/win/exception_handler_server.cc ('k') | util/win/get_function.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698