ipc: use more clever PnP enumerator
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
This commit is contained in:
		
							parent
							
								
									3ba6527130
								
							
						
					
					
						commit
						1ee37b8e48
					
				@ -62,7 +62,7 @@ ifeq ($(PLATFORM),windows)
 | 
				
			|||||||
CC := x86_64-w64-mingw32-clang
 | 
					CC := x86_64-w64-mingw32-clang
 | 
				
			||||||
WINDRES := $(shell $(CC) $(CFLAGS) -print-prog-name=windres 2>/dev/null)
 | 
					WINDRES := $(shell $(CC) $(CFLAGS) -print-prog-name=windres 2>/dev/null)
 | 
				
			||||||
CFLAGS += -Iwincompat/include -include wincompat/compat.h -DWINVER=0x0601 -D_WIN32_WINNT=0x0601 -flto
 | 
					CFLAGS += -Iwincompat/include -include wincompat/compat.h -DWINVER=0x0601 -D_WIN32_WINNT=0x0601 -flto
 | 
				
			||||||
LDLIBS += -lws2_32 -lsetupapi -lole32 -ladvapi32 -Lwincompat
 | 
					LDLIBS += -lws2_32 -lsetupapi -lole32 -ladvapi32 -lntdll -Lwincompat
 | 
				
			||||||
LDFLAGS += -flto -Wl,--dynamicbase -Wl,--nxcompat -Wl,--tsaware -mconsole
 | 
					LDFLAGS += -flto -Wl,--dynamicbase -Wl,--nxcompat -Wl,--tsaware -mconsole
 | 
				
			||||||
LDFLAGS += -Wl,--major-os-version=6 -Wl,--minor-os-version=1 -Wl,--major-subsystem-version=6 -Wl,--minor-subsystem-version=1
 | 
					LDFLAGS += -Wl,--major-os-version=6 -Wl,--minor-os-version=1 -Wl,--major-subsystem-version=6 -Wl,--minor-subsystem-version=1
 | 
				
			||||||
# The use of -Wl,/delayload: here implies we're using llvm-mingw
 | 
					# The use of -Wl,/delayload: here implies we're using llvm-mingw
 | 
				
			||||||
 | 
				
			|||||||
@ -19,10 +19,11 @@
 | 
				
			|||||||
static bool have_cached_kernel_interfaces;
 | 
					static bool have_cached_kernel_interfaces;
 | 
				
			||||||
static struct hashtable cached_kernel_interfaces;
 | 
					static struct hashtable cached_kernel_interfaces;
 | 
				
			||||||
static const DEVPROPKEY devpkey_name = DEVPKEY_WG_NAME;
 | 
					static const DEVPROPKEY devpkey_name = DEVPKEY_WG_NAME;
 | 
				
			||||||
 | 
					extern bool is_win7;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int kernel_get_wireguard_interfaces(struct string_list *list)
 | 
					static int kernel_get_wireguard_interfaces(struct string_list *list)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	HDEVINFO dev_info = SetupDiGetClassDevsExW(&GUID_DEVCLASS_NET, NULL, NULL, DIGCF_PRESENT, NULL, NULL, NULL);
 | 
						HDEVINFO dev_info = SetupDiGetClassDevsExW(&GUID_DEVCLASS_NET, is_win7 ? L"ROOT\\WIREGUARD" : L"SWD\\WireGuard", NULL, DIGCF_PRESENT, NULL, NULL, NULL);
 | 
				
			||||||
	bool will_have_cached_kernel_interfaces = true;
 | 
						bool will_have_cached_kernel_interfaces = true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (dev_info == INVALID_HANDLE_VALUE) {
 | 
						if (dev_info == INVALID_HANDLE_VALUE) {
 | 
				
			||||||
@ -31,9 +32,8 @@ static int kernel_get_wireguard_interfaces(struct string_list *list)
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for (DWORD i = 0;; ++i) {
 | 
						for (DWORD i = 0;; ++i) {
 | 
				
			||||||
		bool found = false;
 | 
							DWORD buf_len;
 | 
				
			||||||
		DWORD buf_len = 0, value_type;
 | 
							WCHAR adapter_name[MAX_ADAPTER_NAME];
 | 
				
			||||||
		WCHAR *buf = NULL, adapter_name[MAX_ADAPTER_NAME];
 | 
					 | 
				
			||||||
		SP_DEVINFO_DATA dev_info_data = { .cbSize = sizeof(SP_DEVINFO_DATA) };
 | 
							SP_DEVINFO_DATA dev_info_data = { .cbSize = sizeof(SP_DEVINFO_DATA) };
 | 
				
			||||||
		DEVPROPTYPE prop_type;
 | 
							DEVPROPTYPE prop_type;
 | 
				
			||||||
		ULONG status, problem_code;
 | 
							ULONG status, problem_code;
 | 
				
			||||||
@ -46,31 +46,6 @@ static int kernel_get_wireguard_interfaces(struct string_list *list)
 | 
				
			|||||||
			continue;
 | 
								continue;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		while (!SetupDiGetDeviceRegistryPropertyW(dev_info, &dev_info_data, SPDRP_HARDWAREID, &value_type, (BYTE *)buf, buf_len, &buf_len)) {
 | 
					 | 
				
			||||||
			free(buf);
 | 
					 | 
				
			||||||
			buf = NULL;
 | 
					 | 
				
			||||||
			if (GetLastError() != ERROR_INSUFFICIENT_BUFFER)
 | 
					 | 
				
			||||||
				break;
 | 
					 | 
				
			||||||
			buf = malloc(buf_len);
 | 
					 | 
				
			||||||
			if (!buf)
 | 
					 | 
				
			||||||
				break;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		if (!buf || value_type != REG_MULTI_SZ || buf_len < sizeof(*buf) * 2 || buf[buf_len / sizeof(*buf) - 1] || buf[buf_len / sizeof(*buf) - 2]) {
 | 
					 | 
				
			||||||
			free(buf);
 | 
					 | 
				
			||||||
			continue;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		for (WCHAR *item = buf; *item; item += wcslen(item) + 1) {
 | 
					 | 
				
			||||||
			if (!_wcsicmp(item, L"wireguard")) {
 | 
					 | 
				
			||||||
				found = true;
 | 
					 | 
				
			||||||
				break;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		free(buf);
 | 
					 | 
				
			||||||
		if (!found)
 | 
					 | 
				
			||||||
			continue;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		if (!SetupDiGetDevicePropertyW(dev_info, &dev_info_data, &devpkey_name,
 | 
							if (!SetupDiGetDevicePropertyW(dev_info, &dev_info_data, &devpkey_name,
 | 
				
			||||||
					       &prop_type, (PBYTE)adapter_name,
 | 
										       &prop_type, (PBYTE)adapter_name,
 | 
				
			||||||
					       sizeof(adapter_name), NULL, 0) ||
 | 
										       sizeof(adapter_name), NULL, 0) ||
 | 
				
			||||||
@ -155,14 +130,14 @@ err_hash:
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	dev_info = SetupDiGetClassDevsExW(&GUID_DEVCLASS_NET, NULL, NULL, DIGCF_PRESENT, NULL, NULL, NULL);
 | 
						dev_info = SetupDiGetClassDevsExW(&GUID_DEVCLASS_NET, is_win7 ? L"ROOT\\WIREGUARD" : L"SWD\\WireGuard", NULL, DIGCF_PRESENT, NULL, NULL, NULL);
 | 
				
			||||||
	if (dev_info == INVALID_HANDLE_VALUE)
 | 
						if (dev_info == INVALID_HANDLE_VALUE)
 | 
				
			||||||
		return NULL;
 | 
							return NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for (DWORD i = 0; !interfaces; ++i) {
 | 
						for (DWORD i = 0; !interfaces; ++i) {
 | 
				
			||||||
		bool found = false;
 | 
							bool found;
 | 
				
			||||||
		DWORD buf_len = 0, value_type;
 | 
							DWORD buf_len;
 | 
				
			||||||
		WCHAR *buf = NULL, adapter_name[MAX_ADAPTER_NAME];
 | 
							WCHAR *buf, adapter_name[MAX_ADAPTER_NAME];
 | 
				
			||||||
		SP_DEVINFO_DATA dev_info_data = { .cbSize = sizeof(SP_DEVINFO_DATA) };
 | 
							SP_DEVINFO_DATA dev_info_data = { .cbSize = sizeof(SP_DEVINFO_DATA) };
 | 
				
			||||||
		DEVPROPTYPE prop_type;
 | 
							DEVPROPTYPE prop_type;
 | 
				
			||||||
		char *interface_name;
 | 
							char *interface_name;
 | 
				
			||||||
@ -173,31 +148,6 @@ err_hash:
 | 
				
			|||||||
			continue;
 | 
								continue;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		while (!SetupDiGetDeviceRegistryPropertyW(dev_info, &dev_info_data, SPDRP_HARDWAREID, &value_type, (BYTE *)buf, buf_len, &buf_len)) {
 | 
					 | 
				
			||||||
			free(buf);
 | 
					 | 
				
			||||||
			buf = NULL;
 | 
					 | 
				
			||||||
			if (GetLastError() != ERROR_INSUFFICIENT_BUFFER)
 | 
					 | 
				
			||||||
				break;
 | 
					 | 
				
			||||||
			buf = malloc(buf_len);
 | 
					 | 
				
			||||||
			if (!buf)
 | 
					 | 
				
			||||||
				break;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		if (!buf || value_type != REG_MULTI_SZ || buf_len < sizeof(*buf) * 2 || buf[buf_len / sizeof(*buf) - 1] || buf[buf_len / sizeof(*buf) - 2]) {
 | 
					 | 
				
			||||||
			free(buf);
 | 
					 | 
				
			||||||
			continue;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		for (WCHAR *item = buf; *item; item += wcslen(item) + 1) {
 | 
					 | 
				
			||||||
			if (!_wcsicmp(item, L"wireguard")) {
 | 
					 | 
				
			||||||
				found = true;
 | 
					 | 
				
			||||||
				break;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		free(buf);
 | 
					 | 
				
			||||||
		if (!found)
 | 
					 | 
				
			||||||
			continue;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		if (!SetupDiGetDevicePropertyW(dev_info, &dev_info_data, &devpkey_name,
 | 
							if (!SetupDiGetDevicePropertyW(dev_info, &dev_info_data, &devpkey_name,
 | 
				
			||||||
					       &prop_type, (PBYTE)adapter_name,
 | 
										       &prop_type, (PBYTE)adapter_name,
 | 
				
			||||||
					       sizeof(adapter_name), NULL, 0) ||
 | 
										       sizeof(adapter_name), NULL, 0) ||
 | 
				
			||||||
 | 
				
			|||||||
@ -10,16 +10,22 @@
 | 
				
			|||||||
#define ENABLE_VIRTUAL_TERMINAL_PROCESSING 0x4
 | 
					#define ENABLE_VIRTUAL_TERMINAL_PROCESSING 0x4
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					extern void NTAPI RtlGetNtVersionNumbers(DWORD *major, DWORD *minor, DWORD *build);
 | 
				
			||||||
 | 
					bool is_win7 = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
__attribute__((constructor)) static void init(void)
 | 
					__attribute__((constructor)) static void init(void)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	char *colormode;
 | 
						char *colormode;
 | 
				
			||||||
	DWORD console_mode;
 | 
						DWORD console_mode, major, minor;
 | 
				
			||||||
	HANDLE stdout_handle;
 | 
						HANDLE stdout_handle;
 | 
				
			||||||
	WSADATA wsaData;
 | 
						WSADATA wsaData;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!SetDllDirectoryA("") || !SetDefaultDllDirectories(LOAD_LIBRARY_SEARCH_SYSTEM32))
 | 
						if (!SetDllDirectoryA("") || !SetDefaultDllDirectories(LOAD_LIBRARY_SEARCH_SYSTEM32))
 | 
				
			||||||
		abort();
 | 
							abort();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						RtlGetNtVersionNumbers(&major, &minor, NULL);
 | 
				
			||||||
 | 
						is_win7 = (major == 6 && minor <= 1) || major < 6;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	WSAStartup(MAKEWORD(2, 2), &wsaData);
 | 
						WSAStartup(MAKEWORD(2, 2), &wsaData);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	stdout_handle = GetStdHandle(STD_OUTPUT_HANDLE); // We don't close this.
 | 
						stdout_handle = GetStdHandle(STD_OUTPUT_HANDLE); // We don't close this.
 | 
				
			||||||
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user