// Create an adapter list item SU_ADAPTER_LIST *SuAdapterInfoToAdapterList(SL_ADAPTER_INFO *info) { SU_ADAPTER_LIST t; char tmp[MAX_SIZE]; // Validate arguments if (info == NULL) { return NULL; } Zero(&t, sizeof(t)); Copy(&t.Info, info, sizeof(SL_ADAPTER_INFO)); UniToStr(tmp, sizeof(tmp), info->AdapterId); if (IsEmptyStr(tmp) || IsEmptyStr(info->FriendlyName) || StartWith(tmp, SL_ADAPTER_ID_PREFIX) == false) { // Name is invalid return NULL; } // GUID (Part after "SELOW_A_" prefix) StrCpy(t.Guid, sizeof(t.Guid), tmp + StrLen(SL_ADAPTER_ID_PREFIX)); // Name StrCpy(t.Name, sizeof(t.Name), tmp); // Key for sort if (GetClassRegKeyWin32(t.SortKey, sizeof(t.SortKey), tmp, sizeof(tmp), t.Guid) == false) { // Can not be found return NULL; } return Clone(&t, sizeof(t)); }
// Get the state of VLAN tag pass-through void GetVLanEnableStatus(RPC_ENUM_ETH_VLAN_ITEM *e) { char key[MAX_SIZE]; char short_key[MAX_SIZE]; char tcpkey[MAX_SIZE]; // Validate arguments if (e == NULL) { return; } e->Enabled = false; if (e->Support == false) { return; } if (GetClassRegKeyWin32(key, sizeof(key), short_key, sizeof(short_key), e->Guid) == false) { return; } Format(tcpkey, sizeof(tcpkey), "SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters\\Interfaces\\%s", e->Guid); if (StrCmpi(e->DriverType, "Intel") == 0) { char *VlanFiltering = MsRegReadStr(REG_LOCAL_MACHINE, key, "VlanFiltering"); UINT MonitorMode = MsRegReadInt(REG_LOCAL_MACHINE, key, "MonitorMode"); UINT MonitorModeEnabled = MsRegReadInt(REG_LOCAL_MACHINE, key, "MonitorModeEnabled"); char *TaggingMode = MsRegReadStr(REG_LOCAL_MACHINE, key, "TaggingMode"); if (StrCmpi(VlanFiltering, "0") == 0 && MonitorMode == 1 && MonitorModeEnabled == 1 && StrCmpi(TaggingMode, "0") == 0) { e->Enabled = true; } Free(VlanFiltering); Free(TaggingMode); } else if (StrCmpi(e->DriverType, "Broadcom") == 0) { char *PreserveVlanInfoInRxPacket = MsRegReadStr(REG_LOCAL_MACHINE, key, "PreserveVlanInfoInRxPacket"); if (StrCmpi(PreserveVlanInfoInRxPacket, "1") == 0) { e->Enabled = true; } Free(PreserveVlanInfoInRxPacket); } else if (StrCmpi(e->DriverType, "Marvell") == 0) { DWORD SkDisableVlanStrip = MsRegReadInt(REG_LOCAL_MACHINE, key, "SkDisableVlanStrip"); if (SkDisableVlanStrip == 1) { e->Enabled = true; } } if (MsRegIsValue(REG_LOCAL_MACHINE, tcpkey, "MTU") == false) { e->Enabled = false; } }
// Get VLAN tag pass-through availability of all devices bool EnumEthVLanWin32(RPC_ENUM_ETH_VLAN *t) { UINT i; LIST *o; // Validate arguments if (t == NULL) { return false; } Zero(t, sizeof(RPC_ENUM_ETH_VLAN)); if (MsIsWin2000OrGreater() == false) { return false; } if (IsEthSupported() == false) { return false; } // Get device list Lock(eth_list_lock); InitEthAdaptersList(); o = NewListFast(CmpRpcEnumEthVLan); for (i = 0;i < LIST_NUM(eth_list);i++) { WP_ADAPTER *a = LIST_DATA(eth_list, i); if (IsEmptyStr(a->Guid) == false) { char class_key[MAX_SIZE]; char short_key[MAX_SIZE]; if (GetClassRegKeyWin32(class_key, sizeof(class_key), short_key, sizeof(short_key), a->Guid)) { char *device_instance_id = MsRegReadStr(REG_LOCAL_MACHINE, class_key, "DeviceInstanceID"); if (IsEmptyStr(device_instance_id)) { Free(device_instance_id); device_instance_id = SearchDeviceInstanceIdFromShortKey(short_key); } if (IsEmptyStr(device_instance_id) == false) { char device_key[MAX_SIZE]; char *service_name; Format(device_key, sizeof(device_key), "SYSTEM\\CurrentControlSet\\Enum\\%s", device_instance_id); service_name = MsRegReadStr(REG_LOCAL_MACHINE, device_key, "Service"); if (IsEmptyStr(service_name) == false) { char service_key[MAX_SIZE]; char *sys; Format(service_key, sizeof(service_key), "SYSTEM\\CurrentControlSet\\services\\%s", service_name); sys = MsRegReadStr(REG_LOCAL_MACHINE, service_key, "ImagePath"); if (IsEmptyStr(sys) == false) { char sysname[MAX_PATH]; GetFileNameFromFilePath(sysname, sizeof(sysname), sys); Trim(sysname); if (EndWith(sysname, ".sys")) { // device found RPC_ENUM_ETH_VLAN_ITEM *e = ZeroMalloc(sizeof(RPC_ENUM_ETH_VLAN_ITEM)); StrCpy(e->DeviceName, sizeof(e->DeviceName), a->Title); StrCpy(e->Guid, sizeof(e->Guid), a->Guid); StrCpy(e->DeviceInstanceId, sizeof(e->DeviceInstanceId), device_instance_id); StrCpy(e->DriverName, sizeof(e->DriverName), sysname); // Get VLAN tag pass-through availability of the device GetVLanSupportStatus(e); // Get current pass-through setting of the device GetVLanEnableStatus(e); Insert(o, e); } } Free(sys); } Free(service_name); } Free(device_instance_id); } } } t->NumItem = LIST_NUM(o); t->Items = ZeroMalloc(sizeof(RPC_ENUM_ETH_VLAN_ITEM) * i); for (i = 0;i < LIST_NUM(o);i++) { RPC_ENUM_ETH_VLAN_ITEM *e = LIST_DATA(o, i); Copy(&t->Items[i], e, sizeof(RPC_ENUM_ETH_VLAN_ITEM)); Free(e); } ReleaseList(o); Unlock(eth_list_lock); return true; }
// Set the state of VLAN tag pass-through bool SetVLanEnableStatus(char *title, bool enable) { RPC_ENUM_ETH_VLAN t; RPC_ENUM_ETH_VLAN_ITEM *e; bool ret = false; char key[MAX_SIZE]; char tcpkey[MAX_SIZE]; char short_key[MAX_SIZE]; // Validate arguments if (title == NULL) { return false; } Zero(&t, sizeof(t)); if (EnumEthVLanWin32(&t) == false) { return false; } e = FindEthVLanItem(&t, title); if (e != NULL) { if (GetClassRegKeyWin32(key, sizeof(key), short_key, sizeof(short_key), e->Guid)) { if (StrCmpi(e->DriverType, "Intel") == 0) { if (enable) { MsRegWriteStr(REG_LOCAL_MACHINE, key, "VlanFiltering", "0"); MsRegWriteStr(REG_LOCAL_MACHINE, key, "TaggingMode", "0"); MsRegWriteInt(REG_LOCAL_MACHINE, key, "MonitorMode", 1); MsRegWriteInt(REG_LOCAL_MACHINE, key, "MonitorModeEnabled", 1); } else { if (MsRegReadInt(REG_LOCAL_MACHINE, key, "TaggingMode") == 0) { MsRegDeleteValue(REG_LOCAL_MACHINE, key, "TaggingMode"); } if (MsRegReadInt(REG_LOCAL_MACHINE, key, "MonitorMode") == 1) { MsRegDeleteValue(REG_LOCAL_MACHINE, key, "MonitorMode"); } if (MsRegReadInt(REG_LOCAL_MACHINE, key, "MonitorModeEnabled") == 1) { MsRegDeleteValue(REG_LOCAL_MACHINE, key, "MonitorModeEnabled"); } } ret = true; } else if (StrCmpi(e->DriverType, "Broadcom") == 0) { if (enable) { MsRegWriteStr(REG_LOCAL_MACHINE, key, "PreserveVlanInfoInRxPacket", "1"); } else { MsRegDeleteValue(REG_LOCAL_MACHINE, key, "PreserveVlanInfoInRxPacket"); } ret = true; } else if (StrCmpi(e->DriverType, "Marvell") == 0) { if (enable) { MsRegWriteInt(REG_LOCAL_MACHINE, key, "SkDisableVlanStrip", 1); } else { MsRegDeleteValue(REG_LOCAL_MACHINE, key, "SkDisableVlanStrip"); } ret = true; } Format(tcpkey, sizeof(tcpkey), "SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters\\Interfaces\\%s", e->Guid); if (enable) { if (MsRegIsValue(REG_LOCAL_MACHINE, tcpkey, "MTU") == false) { MsRegWriteInt(REG_LOCAL_MACHINE, tcpkey, "MTU", 1500); } } else { UINT mtu = MsRegReadInt(REG_LOCAL_MACHINE, tcpkey, "MTU"); if (mtu == 1500) { MsRegDeleteValue(REG_LOCAL_MACHINE, tcpkey, "MTU"); } } } } FreeRpcEnumEthVLan(&t); return ret; }