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

Unified Diff: util/win/nt_internals.cc

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/get_function_test.cc ('k') | util/win/process_info.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: util/win/nt_internals.cc
diff --git a/util/win/nt_internals.cc b/util/win/nt_internals.cc
index 3fb5ef204c0e655db3390278f4f35fa6d022b85c..46192b353c6432240f4ca847e00e86289e73460c 100644
--- a/util/win/nt_internals.cc
+++ b/util/win/nt_internals.cc
@@ -15,6 +15,16 @@
#include "util/win/nt_internals.h"
#include "base/logging.h"
+#include "util/win/get_function.h"
+
+// Declarations that the system headers should provide but don’t.
+
+struct CLIENT_ID;
+
+NTSTATUS NTAPI NtOpenThread(HANDLE* ThreadHandle,
+ ACCESS_MASK DesiredAccess,
+ OBJECT_ATTRIBUTES* ObjectAttributes,
+ CLIENT_ID* ClientId);
namespace crashpad {
@@ -23,10 +33,8 @@ NTSTATUS NtQuerySystemInformation(
PVOID system_information,
ULONG system_information_length,
PULONG return_length) {
- static decltype(::NtQuerySystemInformation)* nt_query_system_information =
- reinterpret_cast<decltype(::NtQuerySystemInformation)*>(GetProcAddress(
- LoadLibrary(L"ntdll.dll"), "NtQuerySystemInformation"));
- DCHECK(nt_query_system_information);
+ static const auto nt_query_system_information =
+ GET_FUNCTION_REQUIRED(L"ntdll.dll", ::NtQuerySystemInformation);
return nt_query_system_information(system_information_class,
system_information,
system_information_length,
@@ -38,10 +46,8 @@ NTSTATUS NtQueryInformationThread(HANDLE thread_handle,
PVOID thread_information,
ULONG thread_information_length,
PULONG return_length) {
- static decltype(::NtQueryInformationThread)* nt_query_information_thread =
- reinterpret_cast<decltype(::NtQueryInformationThread)*>(GetProcAddress(
- LoadLibrary(L"ntdll.dll"), "NtQueryInformationThread"));
- DCHECK(nt_query_information_thread);
+ static const auto nt_query_information_thread =
+ GET_FUNCTION_REQUIRED(L"ntdll.dll", ::NtQueryInformationThread);
return nt_query_information_thread(thread_handle,
thread_information_class,
thread_information,
@@ -49,27 +55,18 @@ NTSTATUS NtQueryInformationThread(HANDLE thread_handle,
return_length);
}
-// The 4th argument is CLIENT_ID*, but as we can't typedef that, we simply cast
-// to void* here.
-typedef NTSTATUS(WINAPI* NtOpenThreadFunction)(
- PHANDLE ThreadHandle,
- ACCESS_MASK DesiredAccess,
- POBJECT_ATTRIBUTES ObjectAttributes,
- const void* ClientId);
-
template <class Traits>
NTSTATUS NtOpenThread(PHANDLE thread_handle,
ACCESS_MASK desired_access,
POBJECT_ATTRIBUTES object_attributes,
const process_types::CLIENT_ID<Traits>* client_id) {
- static NtOpenThreadFunction nt_open_thread =
- reinterpret_cast<NtOpenThreadFunction>(
- GetProcAddress(LoadLibrary(L"ntdll.dll"), "NtOpenThread"));
- DCHECK(nt_open_thread);
- return nt_open_thread(thread_handle,
- desired_access,
- object_attributes,
- static_cast<const void*>(client_id));
+ static const auto nt_open_thread =
+ GET_FUNCTION_REQUIRED(L"ntdll.dll", ::NtOpenThread);
+ return nt_open_thread(
+ thread_handle,
+ desired_access,
+ object_attributes,
+ const_cast<CLIENT_ID*>(reinterpret_cast<const CLIENT_ID*>(client_id)));
}
NTSTATUS NtQueryObject(HANDLE handle,
@@ -77,10 +74,8 @@ NTSTATUS NtQueryObject(HANDLE handle,
void* object_information,
ULONG object_information_length,
ULONG* return_length) {
- static decltype(::NtQueryObject)* nt_query_object =
- reinterpret_cast<decltype(::NtQueryObject)*>(
- GetProcAddress(LoadLibrary(L"ntdll.dll"), "NtQueryObject"));
- DCHECK(nt_query_object);
+ static const auto nt_query_object =
+ GET_FUNCTION_REQUIRED(L"ntdll.dll", ::NtQueryObject);
return nt_query_object(handle,
object_information_class,
object_information,
« no previous file with comments | « util/win/get_function_test.cc ('k') | util/win/process_info.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698