summaryrefslogtreecommitdiffhomepage
path: root/windows/driverlogic/src/wireguard.h
diff options
context:
space:
mode:
authorDavid Lönnhager <david.l@mullvad.net>2021-08-13 17:06:57 +0200
committerDavid Lönnhager <david.l@mullvad.net>2021-09-28 12:41:47 +0200
commitce84bcf44cd923f5d178c8a39eaec6eee8165e5f (patch)
tree0fe0b776d5b4c3df0eece0ba010df450eb52c29c /windows/driverlogic/src/wireguard.h
parent77eddaf311f1c77132b500dbc35d4f3af41c2069 (diff)
downloadmullvadvpn-ce84bcf44cd923f5d178c8a39eaec6eee8165e5f.tar.xz
mullvadvpn-ce84bcf44cd923f5d178c8a39eaec6eee8165e5f.zip
Update installer for wgnt
Diffstat (limited to 'windows/driverlogic/src/wireguard.h')
-rw-r--r--windows/driverlogic/src/wireguard.h58
1 files changed, 58 insertions, 0 deletions
diff --git a/windows/driverlogic/src/wireguard.h b/windows/driverlogic/src/wireguard.h
new file mode 100644
index 0000000000..5892b248f1
--- /dev/null
+++ b/windows/driverlogic/src/wireguard.h
@@ -0,0 +1,58 @@
+#pragma once
+
+#include <wireguard-nt/wireguard.h>
+#include <libcommon/error.h>
+#include "util.h"
+
+class WireGuardNtDll
+{
+public:
+
+ WireGuardNtDll() : dllHandle(nullptr)
+ {
+ auto path = GetProcessModulePath().replace_filename(L"wireguard.dll");
+ dllHandle = LoadLibraryExW(path.c_str(), nullptr, LOAD_WITH_ALTERED_SEARCH_PATH);
+
+ if (nullptr == dllHandle)
+ {
+ THROW_WINDOWS_ERROR(GetLastError(), "LoadLibraryExW");
+ }
+
+ try
+ {
+ deletePoolDriver = getProcAddressOrThrow<WIREGUARD_DELETE_POOL_DRIVER_FUNC*>("WireGuardDeletePoolDriver");
+ }
+ catch (...)
+ {
+ FreeLibrary(dllHandle);
+ throw;
+ }
+ }
+
+ ~WireGuardNtDll()
+ {
+ if (nullptr != dllHandle)
+ {
+ FreeLibrary(dllHandle);
+ }
+ }
+
+ WIREGUARD_DELETE_POOL_DRIVER_FUNC *deletePoolDriver;
+
+private:
+
+ template<typename T>
+ T getProcAddressOrThrow(const char *procName)
+ {
+ const T result = reinterpret_cast<T>(GetProcAddress(dllHandle, procName));
+
+ if (nullptr == result)
+ {
+ THROW_WINDOWS_ERROR(GetLastError(), "GetProcAddress");
+ }
+
+ return result;
+ }
+
+ HMODULE dllHandle;
+};