bba: automatically get TAP guid on windows
git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@3295 8ced0084-cf51-0410-be5f-012b33b47a6e
This commit is contained in:
parent
b059284b55
commit
8ff30a74a4
|
@ -21,6 +21,143 @@
|
||||||
#include "TAP_Win32.h"
|
#include "TAP_Win32.h"
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
|
|
||||||
|
namespace Win32TAPHelper
|
||||||
|
{
|
||||||
|
|
||||||
|
bool IsTAPDevice(const char *guid)
|
||||||
|
{
|
||||||
|
HKEY netcard_key;
|
||||||
|
LONG status;
|
||||||
|
DWORD len;
|
||||||
|
int i = 0;
|
||||||
|
|
||||||
|
status = RegOpenKeyEx(HKEY_LOCAL_MACHINE, ADAPTER_KEY, 0, KEY_READ, &netcard_key);
|
||||||
|
|
||||||
|
if (status != ERROR_SUCCESS)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
for (;;)
|
||||||
|
{
|
||||||
|
char enum_name[256];
|
||||||
|
char unit_string[256];
|
||||||
|
HKEY unit_key;
|
||||||
|
char component_id_string[] = "ComponentId";
|
||||||
|
char component_id[256];
|
||||||
|
char net_cfg_instance_id_string[] = "NetCfgInstanceId";
|
||||||
|
char net_cfg_instance_id[256];
|
||||||
|
DWORD data_type;
|
||||||
|
|
||||||
|
len = sizeof(enum_name);
|
||||||
|
status = RegEnumKeyEx(netcard_key, i, enum_name, &len, NULL, NULL, NULL, NULL);
|
||||||
|
|
||||||
|
if (status == ERROR_NO_MORE_ITEMS)
|
||||||
|
break;
|
||||||
|
else if (status != ERROR_SUCCESS)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
snprintf(unit_string, sizeof(unit_string), "%s\\%s", ADAPTER_KEY, enum_name);
|
||||||
|
|
||||||
|
status = RegOpenKeyEx(HKEY_LOCAL_MACHINE, unit_string, 0, KEY_READ, &unit_key);
|
||||||
|
|
||||||
|
if (status != ERROR_SUCCESS)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
len = sizeof(component_id);
|
||||||
|
status = RegQueryValueEx(unit_key, component_id_string, NULL, &data_type, (LPBYTE)component_id, &len);
|
||||||
|
|
||||||
|
if (!(status != ERROR_SUCCESS || data_type != REG_SZ))
|
||||||
|
{
|
||||||
|
len = sizeof(net_cfg_instance_id);
|
||||||
|
status = RegQueryValueEx(unit_key, net_cfg_instance_id_string, NULL, &data_type, (LPBYTE)net_cfg_instance_id, &len);
|
||||||
|
|
||||||
|
if (status == ERROR_SUCCESS && data_type == REG_SZ)
|
||||||
|
{
|
||||||
|
if (!strcmp(component_id, TAP_COMPONENT_ID) && !strcmp(net_cfg_instance_id, guid))
|
||||||
|
{
|
||||||
|
RegCloseKey(unit_key);
|
||||||
|
RegCloseKey(netcard_key);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
RegCloseKey(unit_key);
|
||||||
|
}
|
||||||
|
++i;
|
||||||
|
}
|
||||||
|
|
||||||
|
RegCloseKey(netcard_key);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool GetGUID(char *name, int name_size)
|
||||||
|
{
|
||||||
|
LONG status;
|
||||||
|
HKEY control_net_key;
|
||||||
|
DWORD len;
|
||||||
|
int i = 0;
|
||||||
|
bool stop = false;
|
||||||
|
|
||||||
|
status = RegOpenKeyEx(HKEY_LOCAL_MACHINE, NETWORK_CONNECTIONS_KEY, 0, KEY_READ, &control_net_key);
|
||||||
|
|
||||||
|
if (status != ERROR_SUCCESS)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
while (!stop)
|
||||||
|
{
|
||||||
|
char enum_name[256];
|
||||||
|
char connection_string[256];
|
||||||
|
HKEY connection_key;
|
||||||
|
char name_data[256];
|
||||||
|
DWORD name_type;
|
||||||
|
const char name_string[] = "Name";
|
||||||
|
|
||||||
|
len = sizeof(enum_name);
|
||||||
|
status = RegEnumKeyEx(control_net_key, i, enum_name, &len, NULL, NULL, NULL, NULL);
|
||||||
|
|
||||||
|
if (status == ERROR_NO_MORE_ITEMS)
|
||||||
|
break;
|
||||||
|
else if (status != ERROR_SUCCESS)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
snprintf(connection_string, sizeof(connection_string), "%s\\%s\\Connection", NETWORK_CONNECTIONS_KEY, enum_name);
|
||||||
|
|
||||||
|
status = RegOpenKeyEx(HKEY_LOCAL_MACHINE, connection_string, 0, KEY_READ, &connection_key);
|
||||||
|
|
||||||
|
if (status == ERROR_SUCCESS)
|
||||||
|
{
|
||||||
|
len = sizeof(name_data);
|
||||||
|
status = RegQueryValueEx(connection_key, name_string, NULL, &name_type, (LPBYTE)name_data, &len);
|
||||||
|
|
||||||
|
if (status != ERROR_SUCCESS || name_type != REG_SZ)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (IsTAPDevice(enum_name))
|
||||||
|
{
|
||||||
|
snprintf(name, name_size, "%s", enum_name);
|
||||||
|
stop = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
RegCloseKey(connection_key);
|
||||||
|
}
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
|
||||||
|
RegCloseKey(control_net_key);
|
||||||
|
|
||||||
|
if (!stop)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace Win32TAPHelper
|
||||||
|
|
||||||
bool CEXIETHERNET::deactivate()
|
bool CEXIETHERNET::deactivate()
|
||||||
{
|
{
|
||||||
|
@ -39,37 +176,39 @@ bool CEXIETHERNET::isActivated()
|
||||||
return mHAdapter != INVALID_HANDLE_VALUE;
|
return mHAdapter != INVALID_HANDLE_VALUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CEXIETHERNET::activate() {
|
bool CEXIETHERNET::activate()
|
||||||
if(isActivated())
|
{
|
||||||
|
|
||||||
|
if (isActivated())
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
DEBUGPRINT("\nActivating BBA...\n");
|
DEBUGPRINT("\nActivating BBA...\n");
|
||||||
|
|
||||||
DWORD len;
|
DWORD len;
|
||||||
|
char device_path[256];
|
||||||
|
char device_guid[0x100];
|
||||||
|
|
||||||
#if 0
|
if (!Win32TAPHelper::GetGUID(device_guid, sizeof(device_guid)))
|
||||||
device_guid = get_device_guid (dev_node, guid_buffer, sizeof (guid_buffer), tap_reg, panel_reg, &gc);
|
{
|
||||||
|
DEBUGPRINT("Failed to find a TAP GUID");
|
||||||
if (!device_guid)
|
return false;
|
||||||
DEGUB("TAP-Win32 adapter '%s' not found\n", dev_node);
|
}
|
||||||
|
|
||||||
/* Open Windows TAP-Win32 adapter */
|
/* Open Windows TAP-Win32 adapter */
|
||||||
openvpn_snprintf (device_path, sizeof(device_path), "%s%s%s",
|
snprintf(device_path, sizeof(device_path), "%s%s%s", USERMODEDEVICEDIR, device_guid, TAPSUFFIX);
|
||||||
USERMODEDEVICEDIR,
|
|
||||||
device_guid,
|
|
||||||
TAPSUFFIX);
|
|
||||||
#endif //0
|
|
||||||
|
|
||||||
mHAdapter = CreateFile (/*device_path*/
|
mHAdapter = CreateFile (
|
||||||
//{DF0B593D-F759-4FE5-BCC8-844BC89245D7}
|
device_path,
|
||||||
//{E0277714-28A6-4EB6-8AA2-7DF4870C04F6}
|
GENERIC_READ | GENERIC_WRITE,
|
||||||
USERMODEDEVICEDIR "{E0277714-28A6-4EB6-8AA2-7DF4870C04F6}" TAPSUFFIX,
|
0,
|
||||||
GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING,
|
0,
|
||||||
FILE_ATTRIBUTE_SYSTEM | FILE_FLAG_OVERLAPPED, 0);
|
OPEN_EXISTING,
|
||||||
DEBUGPRINT("TAP-WIN32 device opened: %s\n",
|
FILE_ATTRIBUTE_SYSTEM | FILE_FLAG_OVERLAPPED,
|
||||||
USERMODEDEVICEDIR "{E0277714-28A6-4EB6-8AA2-7DF4870C04F6}" TAPSUFFIX);
|
0 );
|
||||||
if(mHAdapter == INVALID_HANDLE_VALUE) {
|
|
||||||
DEBUGPRINT("mHAdapter is invalid\n");
|
if (mHAdapter == INVALID_HANDLE_VALUE)
|
||||||
|
{
|
||||||
|
DEBUGPRINT("Failed to open TAP at %s\n", device_path);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue