mirror of
https://github.com/2dust/v2rayN.git
synced 2025-08-29 22:36:20 +00:00
Change Remove hidden Adapter Device way
This commit is contained in:
parent
dc3f07ee84
commit
49f3684210
2 changed files with 249 additions and 1 deletions
|
@ -48,7 +48,15 @@ namespace v2rayN.Handler
|
||||||
if (_config.tunModeItem.enableTun)
|
if (_config.tunModeItem.enableTun)
|
||||||
{
|
{
|
||||||
Thread.Sleep(1000);
|
Thread.Sleep(1000);
|
||||||
Utils.RemoveTunDevice();
|
try
|
||||||
|
{
|
||||||
|
NetAdapterSettings.RemoveHiddenAdapter("singbox_tun");
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Logging.SaveLog(ex.Message, ex);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
CoreStart(node);
|
CoreStart(node);
|
||||||
|
|
240
v2rayN/v2rayN/Handler/NetAdapterSettings.cs
Normal file
240
v2rayN/v2rayN/Handler/NetAdapterSettings.cs
Normal file
|
@ -0,0 +1,240 @@
|
||||||
|
// https://github.com/Valkirie/Thunderbolt-Switch/blob/d0d7fd38b1b557dfe2543e37bedcb4db648841d2/DockerForm/VideoController.cs
|
||||||
|
// https://github.com/rzak23/Utilities/blob/master/Get_Ghost_Devices.ps1
|
||||||
|
// https://github.com/alexjebens/ghost-network-adapters
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
using System.Text;
|
||||||
|
|
||||||
|
namespace v2rayN.Handler
|
||||||
|
{
|
||||||
|
internal class NetAdapterSettings
|
||||||
|
{
|
||||||
|
public static bool RemoveHiddenAdapter(string interfaceName)
|
||||||
|
{
|
||||||
|
string FriendlyName = "sing-tun Tunnel";
|
||||||
|
Guid networkGuid = new("{4d36e972-e325-11ce-bfc1-08002be10318}");
|
||||||
|
// Get all devices of {4d36e972-e325-11ce-bfc1-08002be10318}
|
||||||
|
var devices = SetupAPI.SetupDiGetClassDevs(ref networkGuid, IntPtr.Zero, IntPtr.Zero, (int)DiGetClassFlags.DIGCF_PROFILE);
|
||||||
|
|
||||||
|
// Initialise Struct to hold device info Data
|
||||||
|
SP_DEVINFO_DATA deviceinfo = new();
|
||||||
|
deviceinfo.cbSize = (uint)Marshal.SizeOf(deviceinfo);
|
||||||
|
|
||||||
|
DEVPROPKEY devPropKey = new()
|
||||||
|
{
|
||||||
|
fmtid = new("{3361c968-2f2e-4660-b47e-699cdc4c32b9}"),
|
||||||
|
pid = 3
|
||||||
|
};
|
||||||
|
UnicodeEncoding unicodeEncoding = new();
|
||||||
|
bool result = true;
|
||||||
|
// Enumerate Devices
|
||||||
|
for (uint deviceIndex = 0; SetupAPI.SetupDiEnumDeviceInfo(devices, deviceIndex, ref deviceinfo); deviceIndex++)
|
||||||
|
{
|
||||||
|
SetupAPI.SetupDiGetDeviceProperty(devices, ref deviceinfo, ref devPropKey, out uint propTypeDK, null, 0, out int propBufferDKSize, 0);
|
||||||
|
byte[] propBufferDK = new byte[propBufferDKSize];
|
||||||
|
|
||||||
|
var success = SetupAPI.SetupDiGetDeviceProperty(devices, ref deviceinfo, ref devPropKey, out propTypeDK, propBufferDK, propBufferDKSize, out propBufferDKSize, 0);
|
||||||
|
if (!success)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
var interfaceDKName = unicodeEncoding.GetString(propBufferDK);
|
||||||
|
if (interfaceDKName.Length > 1)
|
||||||
|
{
|
||||||
|
interfaceDKName = interfaceDKName.Substring(0, interfaceDKName.Length - 1);
|
||||||
|
}
|
||||||
|
if (!interfaceName.Equals(interfaceDKName))
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
result &= RemoveHiddenAdapter(devices, ref deviceinfo, FriendlyName);
|
||||||
|
}
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
// throw the error codes, they might be helpful
|
||||||
|
throw new ApplicationException($"Remove Hidden Adapter failed with error code: {Marshal.GetLastWin32Error()}");
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
private static bool RemoveHiddenAdapter(IntPtr devices, ref SP_DEVINFO_DATA deviceinfo, string FriendlyName)
|
||||||
|
{
|
||||||
|
// Will contain an enum depending on the type of the registry Property, not used but required for call
|
||||||
|
// Buffer is initially null and buffer size 0 so that we can get the required Buffer size first
|
||||||
|
SetupAPI.SetupDiGetDeviceRegistryProperty(devices, ref deviceinfo, (uint)SetupDiGetDeviceRegistryPropertyEnum.SPDRP_FRIENDLYNAME, out uint propTypeFN, null, 0, out uint propBufferFNSize);
|
||||||
|
byte[] propBufferFN = new byte[propBufferFNSize];
|
||||||
|
|
||||||
|
SetupAPI.SetupDiGetDeviceRegistryProperty(devices, ref deviceinfo, (uint)SetupDiGetDeviceRegistryPropertyEnum.SPDRP_DEVICEDESC, out uint propTypeDD, null, 0, out uint propBufferSizeDD);
|
||||||
|
|
||||||
|
SetupAPI.SetupDiGetDeviceRegistryProperty(devices, ref deviceinfo, (uint)SetupDiGetDeviceRegistryPropertyEnum.SPDRP_INSTALL_STATE, out uint propTypeIS, null, 0, out uint propBufferSizeIS);
|
||||||
|
|
||||||
|
bool result = true;
|
||||||
|
string FName;
|
||||||
|
UnicodeEncoding unicodeEncoding = new();
|
||||||
|
|
||||||
|
if (!SetupAPI.SetupDiGetDeviceRegistryProperty(devices, ref deviceinfo, (uint)SetupDiGetDeviceRegistryPropertyEnum.SPDRP_FRIENDLYNAME, out propTypeFN, propBufferFN, propBufferFNSize, out propBufferFNSize))
|
||||||
|
{
|
||||||
|
byte[] propBufferDD = new byte[propBufferSizeDD];
|
||||||
|
var success = SetupAPI.SetupDiGetDeviceRegistryProperty(devices, ref deviceinfo, (uint)SetupDiGetDeviceRegistryPropertyEnum.SPDRP_DEVICEDESC, out propTypeDD, propBufferDD, propBufferSizeDD, out propBufferSizeDD);
|
||||||
|
if (!success)
|
||||||
|
{
|
||||||
|
throw new ApplicationException($"Get The DEVPKEY_Device_FriendlyName device property represents the friendly name of a device instance failed with error code: {Marshal.GetLastWin32Error()}");
|
||||||
|
}
|
||||||
|
FName = unicodeEncoding.GetString(propBufferDD);
|
||||||
|
if (FName.Length > 1)
|
||||||
|
{
|
||||||
|
FName = FName.Substring(0, FName.Length - 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Get Unicode String from Buffer
|
||||||
|
FName = unicodeEncoding.GetString(propBufferFN);
|
||||||
|
// The friendly Name ends with a weird character
|
||||||
|
FName = FName.Substring(0, FName.Length - 1);
|
||||||
|
|
||||||
|
}
|
||||||
|
byte[] propBufferIS = new byte[propBufferSizeIS];
|
||||||
|
var installstatus = SetupAPI.SetupDiGetDeviceRegistryProperty(devices, ref deviceinfo, (uint)SetupDiGetDeviceRegistryPropertyEnum.SPDRP_INSTALL_STATE, out propTypeIS, propBufferIS, propBufferSizeIS, out propBufferSizeIS);
|
||||||
|
if (FriendlyName.Equals(FName) && !installstatus)
|
||||||
|
{
|
||||||
|
result &= SetupAPI.SetupDiRemoveDevice(devices, ref deviceinfo);
|
||||||
|
}
|
||||||
|
result &= SetupAPI.SetupDiDestroyDeviceInfoList(devices);
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
// throw the error codes, they might be helpful
|
||||||
|
throw new ApplicationException($"Remove Hidden Adapter failed with error code: {Marshal.GetLastWin32Error()}");
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#region SetupApi structures
|
||||||
|
[StructLayout(LayoutKind.Sequential)]
|
||||||
|
internal struct SP_DEVINFO_DATA
|
||||||
|
{
|
||||||
|
public uint cbSize;
|
||||||
|
public Guid classGuid;
|
||||||
|
public uint devInst;
|
||||||
|
public IntPtr reserved;
|
||||||
|
}
|
||||||
|
[StructLayout(LayoutKind.Sequential)]
|
||||||
|
internal struct DEVPROPKEY
|
||||||
|
{
|
||||||
|
public Guid fmtid;
|
||||||
|
public uint pid;
|
||||||
|
}
|
||||||
|
#endregion SetupApi structures
|
||||||
|
|
||||||
|
#region SetupApi enums
|
||||||
|
[Flags]
|
||||||
|
public enum DiGetClassFlags : uint
|
||||||
|
{
|
||||||
|
DIGCF_DEFAULT = 0x00000001, // only valid with DIGCF_DEVICEINTERFACE
|
||||||
|
DIGCF_PRESENT = 0x00000002,
|
||||||
|
DIGCF_ALLCLASSES = 0x00000004,
|
||||||
|
DIGCF_PROFILE = 0x00000008,
|
||||||
|
DIGCF_DEVICEINTERFACE = 0x00000010,
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum SetupDiGetDeviceRegistryPropertyEnum : uint
|
||||||
|
{
|
||||||
|
SPDRP_DEVICEDESC = 0x00000000, // DeviceDesc (R/W)
|
||||||
|
SPDRP_HARDWAREID = 0x00000001, // HardwareID (R/W)
|
||||||
|
SPDRP_COMPATIBLEIDS = 0x00000002, // CompatibleIDs (R/W)
|
||||||
|
SPDRP_UNUSED0 = 0x00000003, // unused
|
||||||
|
SPDRP_SERVICE = 0x00000004, // Service (R/W)
|
||||||
|
SPDRP_UNUSED1 = 0x00000005, // unused
|
||||||
|
SPDRP_UNUSED2 = 0x00000006, // unused
|
||||||
|
SPDRP_CLASS = 0x00000007, // Class (R--tied to ClassGUID)
|
||||||
|
SPDRP_CLASSGUID = 0x00000008, // ClassGUID (R/W)
|
||||||
|
SPDRP_DRIVER = 0x00000009, // Driver (R/W)
|
||||||
|
SPDRP_CONFIGFLAGS = 0x0000000A, // ConfigFlags (R/W)
|
||||||
|
SPDRP_MFG = 0x0000000B, // Mfg (R/W)
|
||||||
|
SPDRP_FRIENDLYNAME = 0x0000000C, // FriendlyName (R/W)
|
||||||
|
SPDRP_LOCATION_INFORMATION = 0x0000000D, // LocationInformation (R/W)
|
||||||
|
SPDRP_PHYSICAL_DEVICE_OBJECT_NAME = 0x0000000E, // PhysicalDeviceObjectName (R)
|
||||||
|
SPDRP_CAPABILITIES = 0x0000000F, // Capabilities (R)
|
||||||
|
SPDRP_UI_NUMBER = 0x00000010, // UiNumber (R)
|
||||||
|
SPDRP_UPPERFILTERS = 0x00000011, // UpperFilters (R/W)
|
||||||
|
SPDRP_LOWERFILTERS = 0x00000012, // LowerFilters (R/W)
|
||||||
|
SPDRP_BUSTYPEGUID = 0x00000013, // BusTypeGUID (R)
|
||||||
|
SPDRP_LEGACYBUSTYPE = 0x00000014, // LegacyBusType (R)
|
||||||
|
SPDRP_BUSNUMBER = 0x00000015, // BusNumber (R)
|
||||||
|
SPDRP_ENUMERATOR_NAME = 0x00000016, // Enumerator Name (R)
|
||||||
|
SPDRP_SECURITY = 0x00000017, // Security (R/W, binary form)
|
||||||
|
SPDRP_SECURITY_SDS = 0x00000018, // Security (W, SDS form)
|
||||||
|
SPDRP_DEVTYPE = 0x00000019, // Device Type (R/W)
|
||||||
|
SPDRP_EXCLUSIVE = 0x0000001A, // Device is exclusive-access (R/W)
|
||||||
|
SPDRP_CHARACTERISTICS = 0x0000001B, // Device Characteristics (R/W)
|
||||||
|
SPDRP_ADDRESS = 0x0000001C, // Device Address (R)
|
||||||
|
SPDRP_UI_NUMBER_DESC_FORMAT = 0X0000001D, // UiNumberDescFormat (R/W)
|
||||||
|
SPDRP_DEVICE_POWER_DATA = 0x0000001E, // Device Power Data (R)
|
||||||
|
SPDRP_REMOVAL_POLICY = 0x0000001F, // Removal Policy (R)
|
||||||
|
SPDRP_REMOVAL_POLICY_HW_DEFAULT = 0x00000020, // Hardware Removal Policy (R)
|
||||||
|
SPDRP_REMOVAL_POLICY_OVERRIDE = 0x00000021, // Removal Policy Override (RW)
|
||||||
|
SPDRP_INSTALL_STATE = 0x00000022, // Device Install State (R)
|
||||||
|
SPDRP_LOCATION_PATHS = 0x00000023, // Device Location Paths (R)
|
||||||
|
SPDRP_BASE_CONTAINERID = 0x00000024 // Base ContainerID (R)
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion SetupApi enums
|
||||||
|
|
||||||
|
internal static class SetupAPI
|
||||||
|
{
|
||||||
|
// 1st form using a ClassGUID only, with Enumerator = IntPtr.Zero
|
||||||
|
[DllImport("setupapi.dll", CharSet = CharSet.Auto)]
|
||||||
|
public static extern IntPtr SetupDiGetClassDevs(
|
||||||
|
ref Guid ClassGuid,
|
||||||
|
IntPtr Enumerator,
|
||||||
|
IntPtr hwndParent,
|
||||||
|
int Flags
|
||||||
|
);
|
||||||
|
|
||||||
|
// 2nd form uses an Enumerator only, with ClassGUID = IntPtr.Zero
|
||||||
|
[DllImport("setupapi.dll", CharSet = CharSet.Auto)]
|
||||||
|
public static extern IntPtr SetupDiGetClassDevs(
|
||||||
|
IntPtr ClassGuid,
|
||||||
|
string Enumerator,
|
||||||
|
IntPtr hwndParent,
|
||||||
|
int Flags
|
||||||
|
);
|
||||||
|
|
||||||
|
[DllImport("setupapi.dll", CharSet = CharSet.Auto, SetLastError = true)]
|
||||||
|
public static extern bool SetupDiEnumDeviceInfo(
|
||||||
|
IntPtr DeviceInfoSet,
|
||||||
|
uint MemberIndex,
|
||||||
|
ref SP_DEVINFO_DATA DeviceInfoData
|
||||||
|
);
|
||||||
|
|
||||||
|
[DllImport("setupapi.dll", SetLastError = true)]
|
||||||
|
public static extern bool SetupDiDestroyDeviceInfoList(
|
||||||
|
IntPtr DeviceInfoSet
|
||||||
|
);
|
||||||
|
|
||||||
|
[DllImport("setupapi.dll", CharSet = CharSet.Auto, SetLastError = true)]
|
||||||
|
public static extern bool SetupDiGetDeviceRegistryProperty(
|
||||||
|
IntPtr deviceInfoSet,
|
||||||
|
ref SP_DEVINFO_DATA deviceInfoData,
|
||||||
|
uint property,
|
||||||
|
out UInt32 propertyRegDataType,
|
||||||
|
byte[]? propertyBuffer,
|
||||||
|
uint propertyBufferSize,
|
||||||
|
out UInt32 requiredSize
|
||||||
|
);
|
||||||
|
|
||||||
|
[DllImport("setupapi.dll", CharSet = CharSet.Auto, SetLastError = true)]
|
||||||
|
public static extern bool SetupDiGetDeviceProperty(
|
||||||
|
IntPtr deviceInfo,
|
||||||
|
ref SP_DEVINFO_DATA deviceInfoData,
|
||||||
|
ref DEVPROPKEY propkey,
|
||||||
|
out uint propertyDataType,
|
||||||
|
byte[]? propertyBuffer,
|
||||||
|
int propertyBufferSize,
|
||||||
|
out int requiredSize,
|
||||||
|
uint flags
|
||||||
|
);
|
||||||
|
|
||||||
|
[DllImport("setupapi.dll", CharSet = CharSet.Auto, SetLastError = true)]
|
||||||
|
public static extern bool SetupDiRemoveDevice(IntPtr DeviceInfoSet, ref SP_DEVINFO_DATA DeviceInfoData);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue