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, |