diff --git a/InstallTunnelSDK/InstallTunnelSDK.vdproj b/InstallerSDK_amd64/InstallerSDK_amd64.vdproj similarity index 66% rename from InstallTunnelSDK/InstallTunnelSDK.vdproj rename to InstallerSDK_amd64/InstallerSDK_amd64.vdproj index 91c4523..b8072a6 100644 --- a/InstallTunnelSDK/InstallTunnelSDK.vdproj +++ b/InstallerSDK_amd64/InstallerSDK_amd64.vdproj @@ -3,7 +3,7 @@ "VSVersion" = "3:800" "ProjectType" = "8:{978C614F-708E-4E1A-B201-565925725DBA}" "IsWebType" = "8:FALSE" -"ProjectName" = "8:InstallTunnelSDK" +"ProjectName" = "8:InstallerSDK_amd64" "LanguageId" = "3:2052" "CodePage" = "3:936" "UILanguageId" = "3:2052" @@ -15,224 +15,116 @@ { "Entry" { - "MsmKey" = "8:_00EB5BF3E5624995855CCF580A8AD1D5" + "MsmKey" = "8:_1088767113B8403E8BE21AD23BA4BC83" "OwnerKey" = "8:_UNDEFINED" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_061110FCF275ABD7AB2CF878EE47397D" - "OwnerKey" = "8:_451417C63FD78D938C6E04BB65EAA006" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_061110FCF275ABD7AB2CF878EE47397D" - "OwnerKey" = "8:_10E071CF096B417C925C5E27E36CE39A" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_10E071CF096B417C925C5E27E36CE39A" + "MsmKey" = "8:_28B239B3603041EDBD444930636B2080" "OwnerKey" = "8:_UNDEFINED" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_20BD2967BFAA3A22AB8B6A54AA530708" - "OwnerKey" = "8:_A2B46765ECF148F6B3BD76DC027D3B06" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_2FC97B27E9CA691CA53C31B3360D9008" - "OwnerKey" = "8:_00EB5BF3E5624995855CCF580A8AD1D5" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_2FC97B27E9CA691CA53C31B3360D9008" - "OwnerKey" = "8:_A2B46765ECF148F6B3BD76DC027D3B06" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_3853091F559CDFEDEBC0DE9767664FD8" - "OwnerKey" = "8:_A2B46765ECF148F6B3BD76DC027D3B06" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_451417C63FD78D938C6E04BB65EAA006" - "OwnerKey" = "8:_E128C35F6AE09A19D4BFECA45A1271B7" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_451417C63FD78D938C6E04BB65EAA006" - "OwnerKey" = "8:_10E071CF096B417C925C5E27E36CE39A" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_4709F8F14ABE7B5983245A0461485A18" - "OwnerKey" = "8:_A2B46765ECF148F6B3BD76DC027D3B06" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_513E5CF8D0F56603CEA37562D0DCB474" - "OwnerKey" = "8:_10E071CF096B417C925C5E27E36CE39A" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_6A1A279D341B4A5D87C6D56C726E2979" + "MsmKey" = "8:_2EA1D8EC90224D8BAF966549B05C16E4" "OwnerKey" = "8:_UNDEFINED" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_6A8B2CA20D527217332BB0170E559DB9" - "OwnerKey" = "8:_A2B46765ECF148F6B3BD76DC027D3B06" + "MsmKey" = "8:_3953F92791EF6155DD03FEF790B0DDCF" + "OwnerKey" = "8:_536090BAB697484B8E206852993F24BA" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_84BB8455EE8B1AB05AA45633B9D70FD7" - "OwnerKey" = "8:_A2B46765ECF148F6B3BD76DC027D3B06" + "MsmKey" = "8:_456DEFC31623264EA44622E8655F880A" + "OwnerKey" = "8:_536090BAB697484B8E206852993F24BA" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_8A5EF688505390205390D3ABE7EC7364" - "OwnerKey" = "8:_A2B46765ECF148F6B3BD76DC027D3B06" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_9C6AA836EEAA2CA0F046C2077B46BD74" - "OwnerKey" = "8:_00EB5BF3E5624995855CCF580A8AD1D5" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_9C6AA836EEAA2CA0F046C2077B46BD74" - "OwnerKey" = "8:_A2B46765ECF148F6B3BD76DC027D3B06" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_A2B46765ECF148F6B3BD76DC027D3B06" + "MsmKey" = "8:_4A508E196A404A3BB2442C22B49FC535" "OwnerKey" = "8:_UNDEFINED" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_C66BF42BD20D1EB2314F789A0F01DD06" - "OwnerKey" = "8:_00EB5BF3E5624995855CCF580A8AD1D5" + "MsmKey" = "8:_529782AAA27F039161AE9DC1FC81E5C3" + "OwnerKey" = "8:_536090BAB697484B8E206852993F24BA" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_C66BF42BD20D1EB2314F789A0F01DD06" - "OwnerKey" = "8:_A2B46765ECF148F6B3BD76DC027D3B06" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_CA19B2D4A8F5298BD6A83F12B3DCF68A" - "OwnerKey" = "8:_451417C63FD78D938C6E04BB65EAA006" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_CA19B2D4A8F5298BD6A83F12B3DCF68A" - "OwnerKey" = "8:_10E071CF096B417C925C5E27E36CE39A" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_CEE2F747DF77425F8F8416259F5A60C6" + "MsmKey" = "8:_536090BAB697484B8E206852993F24BA" "OwnerKey" = "8:_UNDEFINED" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_CF70965F768635AE40F5A4648E193482" - "OwnerKey" = "8:_451417C63FD78D938C6E04BB65EAA006" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_CF70965F768635AE40F5A4648E193482" - "OwnerKey" = "8:_10E071CF096B417C925C5E27E36CE39A" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_DC143071B1794733B7955D905E8F722D" + "MsmKey" = "8:_6819D0DDEBE042789711599A4893C583" "OwnerKey" = "8:_UNDEFINED" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_E128C35F6AE09A19D4BFECA45A1271B7" - "OwnerKey" = "8:_10E071CF096B417C925C5E27E36CE39A" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_E68F9AF277DA30F367774B24D4F4A4B0" - "OwnerKey" = "8:_00EB5BF3E5624995855CCF580A8AD1D5" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_FAA1AF88F72C4C469E6B4CE67FCCB8CB" + "MsmKey" = "8:_87A737265FFE4B3580E3E3333ECA6422" "OwnerKey" = "8:_UNDEFINED" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_10E071CF096B417C925C5E27E36CE39A" + "MsmKey" = "8:_CAF1EAED19FEB8585EE0E5550C6CD814" + "OwnerKey" = "8:_536090BAB697484B8E206852993F24BA" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_E128C35F6AE09A19D4BFECA45A1271B7" + "MsmKey" = "8:_CAF1EAED19FEB8585EE0E5550C6CD814" + "OwnerKey" = "8:_E299DFE7D43447328C1278A1D50ADA09" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_451417C63FD78D938C6E04BB65EAA006" + "MsmKey" = "8:_D5336C5953869C7AB7C7684EA658B27D" + "OwnerKey" = "8:_536090BAB697484B8E206852993F24BA" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_CA19B2D4A8F5298BD6A83F12B3DCF68A" + "MsmKey" = "8:_DC612CCB7F3243B1AA3A8955C4DC32B1" + "OwnerKey" = "8:_UNDEFINED" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_CF70965F768635AE40F5A4648E193482" + "MsmKey" = "8:_E299DFE7D43447328C1278A1D50ADA09" + "OwnerKey" = "8:_UNDEFINED" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_061110FCF275ABD7AB2CF878EE47397D" + "MsmKey" = "8:_E2F78996F3155186FEC01C5D190F5798" + "OwnerKey" = "8:_536090BAB697484B8E206852993F24BA" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_513E5CF8D0F56603CEA37562D0DCB474" + "MsmKey" = "8:_E2F78996F3155186FEC01C5D190F5798" + "OwnerKey" = "8:_E299DFE7D43447328C1278A1D50ADA09" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_F181CC29E34695D364707CC04EABB928" + "OwnerKey" = "8:_536090BAB697484B8E206852993F24BA" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_FAC0BD08058C4DA1978C753F8DBB269D" + "OwnerKey" = "8:_UNDEFINED" "MsmSig" = "8:_UNDEFINED" } } @@ -243,7 +135,7 @@ "DisplayName" = "8:Debug" "IsDebugOnly" = "11:TRUE" "IsReleaseOnly" = "11:FALSE" - "OutputFilename" = "8:Debug\\InstallTunnelSDK.msi" + "OutputFilename" = "8:Debug\\InstallerSDK_amd64.msi" "PackageFilesAs" = "3:2" "PackageFileSize" = "3:-2147483648" "CabType" = "3:1" @@ -253,29 +145,13 @@ "PrivateKeyFile" = "8:" "TimeStampServer" = "8:" "InstallerBootstrapper" = "3:2" - "BootstrapperCfg:{63ACBE69-63AA-4F98-B2B6-99F9E24495F2}" - { - "Enabled" = "11:TRUE" - "PromptEnabled" = "11:TRUE" - "PrerequisitesLocation" = "2:1" - "Url" = "8:" - "ComponentsUrl" = "8:" - "Items" - { - "{EDC2488A-8267-493A-A98E-7D9C3B36CDF3}:.NETFramework,Version=v4.7.2" - { - "Name" = "8:Microsoft .NET Framework 4.7.2 (x86 and x64)" - "ProductCode" = "8:.NETFramework,Version=v4.7.2" - } - } - } } "Release" { "DisplayName" = "8:Release" "IsDebugOnly" = "11:FALSE" "IsReleaseOnly" = "11:TRUE" - "OutputFilename" = "8:Release\\InstallTunnelSDK.msi" + "OutputFilename" = "8:Release\\InstallerSDK_amd64.msi" "PackageFilesAs" = "3:2" "PackageFileSize" = "3:-2147483648" "CabType" = "3:1" @@ -285,22 +161,6 @@ "PrivateKeyFile" = "8:" "TimeStampServer" = "8:" "InstallerBootstrapper" = "3:2" - "BootstrapperCfg:{63ACBE69-63AA-4F98-B2B6-99F9E24495F2}" - { - "Enabled" = "11:TRUE" - "PromptEnabled" = "11:TRUE" - "PrerequisitesLocation" = "2:1" - "Url" = "8:" - "ComponentsUrl" = "8:" - "Items" - { - "{EDC2488A-8267-493A-A98E-7D9C3B36CDF3}:.NETFramework,Version=v4.7.2" - { - "Name" = "8:Microsoft .NET Framework 4.7.2 (x86 and x64)" - "ProductCode" = "8:.NETFramework,Version=v4.7.2" - } - } - } } } "Deployable" @@ -318,35 +178,16 @@ { "LaunchCondition" { - "{A06ECF26-33A3-4562-8140-9B0E340D4F24}:_9F9BD2C74B6144EEBFF679DF66D3DF06" - { - "Name" = "8:.NET Framework" - "Message" = "8:[VSDNETMSG]" - "FrameworkVersion" = "8:.NETFramework,Version=v4.7.2" - "AllowLaterVersions" = "11:FALSE" - "InstallUrl" = "8:http://go.microsoft.com/fwlink/?LinkId=863262" - } } } "File" { - "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_061110FCF275ABD7AB2CF878EE47397D" + "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_1088767113B8403E8BE21AD23BA4BC83" { - "AssemblyRegister" = "3:1" - "AssemblyIsInGAC" = "11:FALSE" - "AssemblyAsmDisplayName" = "8:System.Buffers, Version=4.0.3.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL" - "ScatterAssemblies" - { - "_061110FCF275ABD7AB2CF878EE47397D" - { - "Name" = "8:System.Buffers.dll" - "Attributes" = "3:512" - } - } - "SourcePath" = "8:System.Buffers.dll" - "TargetName" = "8:" + "SourcePath" = "8:..\\NetTunnelSDK\\include\\usrerr.h" + "TargetName" = "8:usrerr.h" "Tag" = "8:" - "Folder" = "8:_A69AEF7ED77C4BB28FA87F3D7B5FF39A" + "Folder" = "8:_A3EAAC7681BD4ED6BA6917BD105454CC" "Condition" = "8:" "Transitive" = "11:FALSE" "Vital" = "11:TRUE" @@ -358,15 +199,15 @@ "PackageAs" = "3:1" "Register" = "3:1" "Exclude" = "11:FALSE" - "IsDependency" = "11:TRUE" + "IsDependency" = "11:FALSE" "IsolateTo" = "8:" } - "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_20BD2967BFAA3A22AB8B6A54AA530708" + "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_28B239B3603041EDBD444930636B2080" { - "SourcePath" = "8:NetTunnelSDK.dll" - "TargetName" = "8:NetTunnelSDK.dll" + "SourcePath" = "8:..\\NetTunnelSDK\\depends\\WireGuardNT\\amd64\\wireguard.dll" + "TargetName" = "8:wireguard.dll" "Tag" = "8:" - "Folder" = "8:_A69AEF7ED77C4BB28FA87F3D7B5FF39A" + "Folder" = "8:_11B6E97F977B4EE4ACBB201BA1EA1604" "Condition" = "8:" "Transitive" = "11:FALSE" "Vital" = "11:TRUE" @@ -378,137 +219,15 @@ "PackageAs" = "3:1" "Register" = "3:1" "Exclude" = "11:FALSE" - "IsDependency" = "11:TRUE" + "IsDependency" = "11:FALSE" "IsolateTo" = "8:" } - "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_2FC97B27E9CA691CA53C31B3360D9008" - { - "SourcePath" = "8:fmtd.dll" - "TargetName" = "8:fmtd.dll" - "Tag" = "8:" - "Folder" = "8:_A69AEF7ED77C4BB28FA87F3D7B5FF39A" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Vital" = "11:TRUE" - "ReadOnly" = "11:FALSE" - "Hidden" = "11:FALSE" - "System" = "11:FALSE" - "Permanent" = "11:FALSE" - "SharedLegacy" = "11:FALSE" - "PackageAs" = "3:1" - "Register" = "3:1" - "Exclude" = "11:FALSE" - "IsDependency" = "11:TRUE" - "IsolateTo" = "8:" - } - "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_3853091F559CDFEDEBC0DE9767664FD8" - { - "SourcePath" = "8:VCRUNTIME140_1D.dll" - "TargetName" = "8:VCRUNTIME140_1D.dll" - "Tag" = "8:" - "Folder" = "8:_A69AEF7ED77C4BB28FA87F3D7B5FF39A" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Vital" = "11:TRUE" - "ReadOnly" = "11:FALSE" - "Hidden" = "11:FALSE" - "System" = "11:FALSE" - "Permanent" = "11:FALSE" - "SharedLegacy" = "11:FALSE" - "PackageAs" = "3:1" - "Register" = "3:1" - "Exclude" = "11:FALSE" - "IsDependency" = "11:TRUE" - "IsolateTo" = "8:" - } - "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_451417C63FD78D938C6E04BB65EAA006" - { - "AssemblyRegister" = "3:1" - "AssemblyIsInGAC" = "11:FALSE" - "AssemblyAsmDisplayName" = "8:System.Memory, Version=4.0.1.2, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL" - "ScatterAssemblies" - { - "_451417C63FD78D938C6E04BB65EAA006" - { - "Name" = "8:System.Memory.dll" - "Attributes" = "3:512" - } - } - "SourcePath" = "8:System.Memory.dll" - "TargetName" = "8:" - "Tag" = "8:" - "Folder" = "8:_A69AEF7ED77C4BB28FA87F3D7B5FF39A" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Vital" = "11:TRUE" - "ReadOnly" = "11:FALSE" - "Hidden" = "11:FALSE" - "System" = "11:FALSE" - "Permanent" = "11:FALSE" - "SharedLegacy" = "11:FALSE" - "PackageAs" = "3:1" - "Register" = "3:1" - "Exclude" = "11:FALSE" - "IsDependency" = "11:TRUE" - "IsolateTo" = "8:" - } - "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_4709F8F14ABE7B5983245A0461485A18" - { - "SourcePath" = "8:VCRUNTIME140D.dll" - "TargetName" = "8:VCRUNTIME140D.dll" - "Tag" = "8:" - "Folder" = "8:_A69AEF7ED77C4BB28FA87F3D7B5FF39A" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Vital" = "11:TRUE" - "ReadOnly" = "11:FALSE" - "Hidden" = "11:FALSE" - "System" = "11:FALSE" - "Permanent" = "11:FALSE" - "SharedLegacy" = "11:FALSE" - "PackageAs" = "3:1" - "Register" = "3:1" - "Exclude" = "11:FALSE" - "IsDependency" = "11:TRUE" - "IsolateTo" = "8:" - } - "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_513E5CF8D0F56603CEA37562D0DCB474" - { - "AssemblyRegister" = "3:1" - "AssemblyIsInGAC" = "11:FALSE" - "AssemblyAsmDisplayName" = "8:System.Net.Http, Version=4.2.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" - "ScatterAssemblies" - { - "_513E5CF8D0F56603CEA37562D0DCB474" - { - "Name" = "8:System.Net.Http.dll" - "Attributes" = "3:512" - } - } - "SourcePath" = "8:System.Net.Http.dll" - "TargetName" = "8:" - "Tag" = "8:" - "Folder" = "8:_A69AEF7ED77C4BB28FA87F3D7B5FF39A" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Vital" = "11:TRUE" - "ReadOnly" = "11:FALSE" - "Hidden" = "11:FALSE" - "System" = "11:FALSE" - "Permanent" = "11:FALSE" - "SharedLegacy" = "11:FALSE" - "PackageAs" = "3:1" - "Register" = "3:1" - "Exclude" = "11:FALSE" - "IsDependency" = "11:TRUE" - "IsolateTo" = "8:" - } - "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_6A1A279D341B4A5D87C6D56C726E2979" + "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_2EA1D8EC90224D8BAF966549B05C16E4" { "SourcePath" = "8:..\\NetTunnelSDK\\resource\\iconsTray.ico" "TargetName" = "8:iconsTray.ico" "Tag" = "8:" - "Folder" = "8:_A69AEF7ED77C4BB28FA87F3D7B5FF39A" + "Folder" = "8:_A3B5B7B6BEA34261BD6FDBE7127C2BB2" "Condition" = "8:" "Transitive" = "11:FALSE" "Vital" = "11:TRUE" @@ -523,72 +242,12 @@ "IsDependency" = "11:FALSE" "IsolateTo" = "8:" } - "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_6A8B2CA20D527217332BB0170E559DB9" - { - "SourcePath" = "8:ucrtbased.dll" - "TargetName" = "8:ucrtbased.dll" - "Tag" = "8:" - "Folder" = "8:_A69AEF7ED77C4BB28FA87F3D7B5FF39A" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Vital" = "11:TRUE" - "ReadOnly" = "11:FALSE" - "Hidden" = "11:FALSE" - "System" = "11:FALSE" - "Permanent" = "11:FALSE" - "SharedLegacy" = "11:FALSE" - "PackageAs" = "3:1" - "Register" = "3:1" - "Exclude" = "11:FALSE" - "IsDependency" = "11:TRUE" - "IsolateTo" = "8:" - } - "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_84BB8455EE8B1AB05AA45633B9D70FD7" - { - "SourcePath" = "8:CRYPT32.dll" - "TargetName" = "8:CRYPT32.dll" - "Tag" = "8:" - "Folder" = "8:_A69AEF7ED77C4BB28FA87F3D7B5FF39A" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Vital" = "11:TRUE" - "ReadOnly" = "11:FALSE" - "Hidden" = "11:FALSE" - "System" = "11:FALSE" - "Permanent" = "11:FALSE" - "SharedLegacy" = "11:FALSE" - "PackageAs" = "3:1" - "Register" = "3:1" - "Exclude" = "11:FALSE" - "IsDependency" = "11:TRUE" - "IsolateTo" = "8:" - } - "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_8A5EF688505390205390D3ABE7EC7364" - { - "SourcePath" = "8:MSVCP140D.dll" - "TargetName" = "8:MSVCP140D.dll" - "Tag" = "8:" - "Folder" = "8:_A69AEF7ED77C4BB28FA87F3D7B5FF39A" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Vital" = "11:TRUE" - "ReadOnly" = "11:FALSE" - "Hidden" = "11:FALSE" - "System" = "11:FALSE" - "Permanent" = "11:FALSE" - "SharedLegacy" = "11:FALSE" - "PackageAs" = "3:1" - "Register" = "3:1" - "Exclude" = "11:FALSE" - "IsDependency" = "11:TRUE" - "IsolateTo" = "8:" - } - "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_9C6AA836EEAA2CA0F046C2077B46BD74" + "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_3953F92791EF6155DD03FEF790B0DDCF" { "SourcePath" = "8:IPHLPAPI.DLL" "TargetName" = "8:IPHLPAPI.DLL" "Tag" = "8:" - "Folder" = "8:_A69AEF7ED77C4BB28FA87F3D7B5FF39A" + "Folder" = "8:_11B6E97F977B4EE4ACBB201BA1EA1604" "Condition" = "8:" "Transitive" = "11:FALSE" "Vital" = "11:TRUE" @@ -603,12 +262,12 @@ "IsDependency" = "11:TRUE" "IsolateTo" = "8:" } - "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_C66BF42BD20D1EB2314F789A0F01DD06" + "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_456DEFC31623264EA44622E8655F880A" { "SourcePath" = "8:bcrypt.dll" "TargetName" = "8:bcrypt.dll" "Tag" = "8:" - "Folder" = "8:_A69AEF7ED77C4BB28FA87F3D7B5FF39A" + "Folder" = "8:_11B6E97F977B4EE4ACBB201BA1EA1604" "Condition" = "8:" "Transitive" = "11:FALSE" "Vital" = "11:TRUE" @@ -623,43 +282,12 @@ "IsDependency" = "11:TRUE" "IsolateTo" = "8:" } - "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_CA19B2D4A8F5298BD6A83F12B3DCF68A" + "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_4A508E196A404A3BB2442C22B49FC535" { - "AssemblyRegister" = "3:1" - "AssemblyIsInGAC" = "11:FALSE" - "AssemblyAsmDisplayName" = "8:System.Runtime.CompilerServices.Unsafe, Version=4.0.4.1, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" - "ScatterAssemblies" - { - "_CA19B2D4A8F5298BD6A83F12B3DCF68A" - { - "Name" = "8:System.Runtime.CompilerServices.Unsafe.dll" - "Attributes" = "3:512" - } - } - "SourcePath" = "8:System.Runtime.CompilerServices.Unsafe.dll" - "TargetName" = "8:" + "SourcePath" = "8:..\\NetTunnelSDK\\include\\globalcfg.h" + "TargetName" = "8:globalcfg.h" "Tag" = "8:" - "Folder" = "8:_A69AEF7ED77C4BB28FA87F3D7B5FF39A" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Vital" = "11:TRUE" - "ReadOnly" = "11:FALSE" - "Hidden" = "11:FALSE" - "System" = "11:FALSE" - "Permanent" = "11:FALSE" - "SharedLegacy" = "11:FALSE" - "PackageAs" = "3:1" - "Register" = "3:1" - "Exclude" = "11:FALSE" - "IsDependency" = "11:TRUE" - "IsolateTo" = "8:" - } - "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_CEE2F747DF77425F8F8416259F5A60C6" - { - "SourcePath" = "8:..\\x64\\Debug\\NetTunnelSvr.exe" - "TargetName" = "8:NetTunnelSvr.exe" - "Tag" = "8:" - "Folder" = "8:_A69AEF7ED77C4BB28FA87F3D7B5FF39A" + "Folder" = "8:_A3EAAC7681BD4ED6BA6917BD105454CC" "Condition" = "8:" "Transitive" = "11:FALSE" "Vital" = "11:TRUE" @@ -674,23 +302,12 @@ "IsDependency" = "11:FALSE" "IsolateTo" = "8:" } - "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_CF70965F768635AE40F5A4648E193482" + "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_529782AAA27F039161AE9DC1FC81E5C3" { - "AssemblyRegister" = "3:1" - "AssemblyIsInGAC" = "11:FALSE" - "AssemblyAsmDisplayName" = "8:System.Numerics.Vectors, Version=4.1.4.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" - "ScatterAssemblies" - { - "_CF70965F768635AE40F5A4648E193482" - { - "Name" = "8:System.Numerics.Vectors.dll" - "Attributes" = "3:512" - } - } - "SourcePath" = "8:System.Numerics.Vectors.dll" - "TargetName" = "8:" + "SourcePath" = "8:fmtd.dll" + "TargetName" = "8:fmtd.dll" "Tag" = "8:" - "Folder" = "8:_A69AEF7ED77C4BB28FA87F3D7B5FF39A" + "Folder" = "8:_11B6E97F977B4EE4ACBB201BA1EA1604" "Condition" = "8:" "Transitive" = "11:FALSE" "Vital" = "11:TRUE" @@ -705,83 +322,152 @@ "IsDependency" = "11:TRUE" "IsolateTo" = "8:" } - "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_DC143071B1794733B7955D905E8F722D" + "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_6819D0DDEBE042789711599A4893C583" { - "SourcePath" = "8:..\\x64\\Debug\\wireguard.dll" - "TargetName" = "8:wireguard.dll" - "Tag" = "8:" - "Folder" = "8:_A69AEF7ED77C4BB28FA87F3D7B5FF39A" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Vital" = "11:TRUE" - "ReadOnly" = "11:FALSE" - "Hidden" = "11:FALSE" - "System" = "11:FALSE" - "Permanent" = "11:FALSE" - "SharedLegacy" = "11:FALSE" - "PackageAs" = "3:1" - "Register" = "3:1" - "Exclude" = "11:FALSE" - "IsDependency" = "11:FALSE" - "IsolateTo" = "8:" - } - "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_E128C35F6AE09A19D4BFECA45A1271B7" - { - "AssemblyRegister" = "3:1" - "AssemblyIsInGAC" = "11:FALSE" - "AssemblyAsmDisplayName" = "8:System.Net.IPNetwork, Version=2.6.593.0, Culture=neutral, PublicKeyToken=717343cc2c25edcf, processorArchitecture=MSIL" - "ScatterAssemblies" - { - "_E128C35F6AE09A19D4BFECA45A1271B7" - { - "Name" = "8:System.Net.IPNetwork.dll" - "Attributes" = "3:512" - } - } - "SourcePath" = "8:System.Net.IPNetwork.dll" - "TargetName" = "8:" - "Tag" = "8:" - "Folder" = "8:_A69AEF7ED77C4BB28FA87F3D7B5FF39A" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Vital" = "11:TRUE" - "ReadOnly" = "11:FALSE" - "Hidden" = "11:FALSE" - "System" = "11:FALSE" - "Permanent" = "11:FALSE" - "SharedLegacy" = "11:FALSE" - "PackageAs" = "3:1" - "Register" = "3:1" - "Exclude" = "11:FALSE" - "IsDependency" = "11:TRUE" - "IsolateTo" = "8:" - } - "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_E68F9AF277DA30F367774B24D4F4A4B0" - { - "SourcePath" = "8:WinDivert.dll" - "TargetName" = "8:WinDivert.dll" - "Tag" = "8:" - "Folder" = "8:_A69AEF7ED77C4BB28FA87F3D7B5FF39A" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Vital" = "11:TRUE" - "ReadOnly" = "11:FALSE" - "Hidden" = "11:FALSE" - "System" = "11:FALSE" - "Permanent" = "11:FALSE" - "SharedLegacy" = "11:FALSE" - "PackageAs" = "3:1" - "Register" = "3:1" - "Exclude" = "11:FALSE" - "IsDependency" = "11:TRUE" - "IsolateTo" = "8:" - } - "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_FAA1AF88F72C4C469E6B4CE67FCCB8CB" - { - "SourcePath" = "8:..\\x64\\Debug\\tunnel.dll" + "SourcePath" = "8:..\\NetTunnelSDK\\depends\\tunnel\\amd64\\tunnel.dll" "TargetName" = "8:tunnel.dll" "Tag" = "8:" - "Folder" = "8:_A69AEF7ED77C4BB28FA87F3D7B5FF39A" + "Folder" = "8:_11B6E97F977B4EE4ACBB201BA1EA1604" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:FALSE" + "IsolateTo" = "8:" + } + "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_87A737265FFE4B3580E3E3333ECA6422" + { + "SourcePath" = "8:..\\NetTunnelSDK\\include\\user.h" + "TargetName" = "8:user.h" + "Tag" = "8:" + "Folder" = "8:_A3EAAC7681BD4ED6BA6917BD105454CC" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:FALSE" + "IsolateTo" = "8:" + } + "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_CAF1EAED19FEB8585EE0E5550C6CD814" + { + "SourcePath" = "8:VCRUNTIME140D.dll" + "TargetName" = "8:VCRUNTIME140D.dll" + "Tag" = "8:" + "Folder" = "8:_11B6E97F977B4EE4ACBB201BA1EA1604" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:TRUE" + "IsolateTo" = "8:" + } + "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_D5336C5953869C7AB7C7684EA658B27D" + { + "SourcePath" = "8:MSVCP140D.dll" + "TargetName" = "8:MSVCP140D.dll" + "Tag" = "8:" + "Folder" = "8:_11B6E97F977B4EE4ACBB201BA1EA1604" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:TRUE" + "IsolateTo" = "8:" + } + "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_DC612CCB7F3243B1AA3A8955C4DC32B1" + { + "SourcePath" = "8:..\\NetTunnelSDK\\include\\network.h" + "TargetName" = "8:network.h" + "Tag" = "8:" + "Folder" = "8:_A3EAAC7681BD4ED6BA6917BD105454CC" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:FALSE" + "IsolateTo" = "8:" + } + "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_E2F78996F3155186FEC01C5D190F5798" + { + "SourcePath" = "8:ucrtbased.dll" + "TargetName" = "8:ucrtbased.dll" + "Tag" = "8:" + "Folder" = "8:_11B6E97F977B4EE4ACBB201BA1EA1604" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:TRUE" + "IsolateTo" = "8:" + } + "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_F181CC29E34695D364707CC04EABB928" + { + "SourcePath" = "8:VCRUNTIME140_1D.dll" + "TargetName" = "8:VCRUNTIME140_1D.dll" + "Tag" = "8:" + "Folder" = "8:_11B6E97F977B4EE4ACBB201BA1EA1604" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:TRUE" + "IsolateTo" = "8:" + } + "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_FAC0BD08058C4DA1978C753F8DBB269D" + { + "SourcePath" = "8:..\\NetTunnelSDK\\include\\tunnel.h" + "TargetName" = "8:tunnel.h" + "Tag" = "8:" + "Folder" = "8:_A3EAAC7681BD4ED6BA6917BD105454CC" "Condition" = "8:" "Transitive" = "11:FALSE" "Vital" = "11:TRUE" @@ -802,7 +488,7 @@ } "Folder" { - "{1525181F-901A-416C-8A58-119130FE478E}:_8D05D163E015430BA6198AD513E2F9AC" + "{1525181F-901A-416C-8A58-119130FE478E}:_0031E002D2134FBAACF6BC1CC192436B" { "Name" = "8:#1916" "AlwaysCreate" = "11:FALSE" @@ -813,7 +499,7 @@ { } } - "{3C67513D-01DD-4637-8A68-80971EB9504F}:_A69AEF7ED77C4BB28FA87F3D7B5FF39A" + "{3C67513D-01DD-4637-8A68-80971EB9504F}:_11B6E97F977B4EE4ACBB201BA1EA1604" { "DefaultLocation" = "8:[ProgramFiles64Folder][Manufacturer]\\[ProductName]" "Name" = "8:#1925" @@ -823,9 +509,31 @@ "Property" = "8:TARGETDIR" "Folders" { + "{9EF0B969-E518-4E46-987F-47570745A589}:_A3B5B7B6BEA34261BD6FDBE7127C2BB2" + { + "Name" = "8:icon" + "AlwaysCreate" = "11:FALSE" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Property" = "8:_06E1439F593D4AAD89DD176A54A31EC4" + "Folders" + { + } + } + "{9EF0B969-E518-4E46-987F-47570745A589}:_A3EAAC7681BD4ED6BA6917BD105454CC" + { + "Name" = "8:include" + "AlwaysCreate" = "11:TRUE" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Property" = "8:_C208A892D30340969B43C1A6BECC921C" + "Folders" + { + } + } } } - "{1525181F-901A-416C-8A58-119130FE478E}:_F2FD943D1B5147C4B58503C66284EBC5" + "{1525181F-901A-416C-8A58-119130FE478E}:_DB157647785849AB8E02B6ACAC8B9040" { "Name" = "8:#1919" "AlwaysCreate" = "11:FALSE" @@ -851,26 +559,26 @@ "Product" { "Name" = "8:Microsoft Visual Studio" - "ProductName" = "8:SCC" - "ProductCode" = "8:{FC04A2D1-FDD4-485A-88CC-67543D0B07FC}" - "PackageCode" = "8:{E72A3533-046D-464B-A2A8-C1326AC51F4F}" - "UpgradeCode" = "8:{E4E3F1C5-78D9-4F56-AA5F-2C68C839E21E}" - "AspNetVersion" = "8:" + "ProductName" = "8:SCCSDK" + "ProductCode" = "8:{0F21F61E-F559-45D3-9390-20D2563CC2F8}" + "PackageCode" = "8:{92A5014D-0CE3-4A20-B130-1EF8C458390D}" + "UpgradeCode" = "8:{30151F2E-31C5-44AC-82C4-5FCF9D54BCF3}" + "AspNetVersion" = "8:2.0.50727.0" "RestartWWWService" = "11:FALSE" - "RemovePreviousVersions" = "11:TRUE" + "RemovePreviousVersions" = "11:FALSE" "DetectNewerInstalledVersion" = "11:TRUE" - "InstallAllUsers" = "11:FALSE" + "InstallAllUsers" = "11:TRUE" "ProductVersion" = "8:1.0.0" "Manufacturer" = "8:CMHI" "ARPHELPTELEPHONE" = "8:" "ARPHELPLINK" = "8:" - "Title" = "8:InstallTunnelSDK" + "Title" = "8:InstallerSCCSDK_amd64" "Subject" = "8:" "ARPCONTACT" = "8:CMHI" "Keywords" = "8:" "ARPCOMMENTS" = "8:" "ARPURLINFOABOUT" = "8:" - "ARPPRODUCTICON" = "8:_6A1A279D341B4A5D87C6D56C726E2979" + "ARPPRODUCTICON" = "8:_2EA1D8EC90224D8BAF966549B05C16E4" "ARPIconIndex" = "3:0" "SearchPath" = "8:" "UseSystemSearchPath" = "11:TRUE" @@ -885,7 +593,7 @@ { "Keys" { - "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_2AB8FED44C394940A11FAE747B83A8E5" + "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_0D41F39B09A24077B25BC81BAE38932D" { "Name" = "8:Software" "Condition" = "8:" @@ -894,7 +602,7 @@ "Transitive" = "11:FALSE" "Keys" { - "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_21550C0606694FCD93CD49E5E313F43A" + "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_22C3610A9C9045018BC093E917E992AA" { "Name" = "8:[Manufacturer]" "Condition" = "8:" @@ -919,7 +627,7 @@ { "Keys" { - "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_88A98F7C70AB4EECBBD628C8A27CCFF6" + "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_1079FDBEED1E497CAE2C7EBEC720C186" { "Name" = "8:Software" "Condition" = "8:" @@ -928,7 +636,7 @@ "Transitive" = "11:FALSE" "Keys" { - "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_3CFB4CA375C44D74A29BB6B33B0FB74D" + "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_C4068B0221E64DAB8C8B47EF36AD53F8" { "Name" = "8:[Manufacturer]" "Condition" = "8:" @@ -976,234 +684,14 @@ } "UserInterface" { - "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_08EF6230F8234AB8A2D8511DA50CD105" - { - "Name" = "8:#1901" - "Sequence" = "3:2" - "Attributes" = "3:2" - "Dialogs" - { - "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_C338FAFE279C41A2ABE7587C958A58DA" - { - "Sequence" = "3:100" - "DisplayName" = "8:进度" - "UseDynamicProperties" = "11:TRUE" - "IsDependency" = "11:FALSE" - "SourcePath" = "8:\\VsdAdminProgressDlg.wid" - "Properties" - { - "BannerBitmap" - { - "Name" = "8:BannerBitmap" - "DisplayName" = "8:#1001" - "Description" = "8:#1101" - "Type" = "3:8" - "ContextData" = "8:Bitmap" - "Attributes" = "3:4" - "Setting" = "3:1" - "UsePlugInResources" = "11:TRUE" - } - "ShowProgress" - { - "Name" = "8:ShowProgress" - "DisplayName" = "8:#1009" - "Description" = "8:#1109" - "Type" = "3:5" - "ContextData" = "8:1;True=1;False=0" - "Attributes" = "3:0" - "Setting" = "3:0" - "Value" = "3:1" - "DefaultValue" = "3:1" - "UsePlugInResources" = "11:TRUE" - } - } - } - } - } - "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_0B97F7BEDC074380A4F44500B1B5D297" - { - "Name" = "8:#1902" - "Sequence" = "3:1" - "Attributes" = "3:3" - "Dialogs" - { - "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_DBA4571D847E4B44834E8BBAE89CD818" - { - "Sequence" = "3:100" - "DisplayName" = "8:已完成" - "UseDynamicProperties" = "11:TRUE" - "IsDependency" = "11:FALSE" - "SourcePath" = "8:\\VsdFinishedDlg.wid" - "Properties" - { - "BannerBitmap" - { - "Name" = "8:BannerBitmap" - "DisplayName" = "8:#1001" - "Description" = "8:#1101" - "Type" = "3:8" - "ContextData" = "8:Bitmap" - "Attributes" = "3:4" - "Setting" = "3:1" - "UsePlugInResources" = "11:TRUE" - } - "UpdateText" - { - "Name" = "8:UpdateText" - "DisplayName" = "8:#1058" - "Description" = "8:#1158" - "Type" = "3:15" - "ContextData" = "8:" - "Attributes" = "3:0" - "Setting" = "3:1" - "Value" = "8:#1258" - "DefaultValue" = "8:#1258" - "UsePlugInResources" = "11:TRUE" - } - } - } - } - } - "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_1A75A1B38E3045028C979E5544253A69" - { - "Name" = "8:#1902" - "Sequence" = "3:2" - "Attributes" = "3:3" - "Dialogs" - { - "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_EC2D02D811CB44DCAC0D7F6732CD98DE" - { - "Sequence" = "3:100" - "DisplayName" = "8:已完成" - "UseDynamicProperties" = "11:TRUE" - "IsDependency" = "11:FALSE" - "SourcePath" = "8:\\VsdAdminFinishedDlg.wid" - "Properties" - { - "BannerBitmap" - { - "Name" = "8:BannerBitmap" - "DisplayName" = "8:#1001" - "Description" = "8:#1101" - "Type" = "3:8" - "ContextData" = "8:Bitmap" - "Attributes" = "3:4" - "Setting" = "3:1" - "UsePlugInResources" = "11:TRUE" - } - } - } - } - } - "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_36452A8295E6480BA71FD695E8C87EE6" - { - "Name" = "8:#1900" - "Sequence" = "3:2" - "Attributes" = "3:1" - "Dialogs" - { - "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_7E862B5EBBCB40A18A04B744F2F402CA" - { - "Sequence" = "3:100" - "DisplayName" = "8:欢迎使用" - "UseDynamicProperties" = "11:TRUE" - "IsDependency" = "11:FALSE" - "SourcePath" = "8:\\VsdAdminWelcomeDlg.wid" - "Properties" - { - "BannerBitmap" - { - "Name" = "8:BannerBitmap" - "DisplayName" = "8:#1001" - "Description" = "8:#1101" - "Type" = "3:8" - "ContextData" = "8:Bitmap" - "Attributes" = "3:4" - "Setting" = "3:1" - "UsePlugInResources" = "11:TRUE" - } - "CopyrightWarning" - { - "Name" = "8:CopyrightWarning" - "DisplayName" = "8:#1002" - "Description" = "8:#1102" - "Type" = "3:3" - "ContextData" = "8:" - "Attributes" = "3:0" - "Setting" = "3:1" - "Value" = "8:#1202" - "DefaultValue" = "8:#1202" - "UsePlugInResources" = "11:TRUE" - } - "Welcome" - { - "Name" = "8:Welcome" - "DisplayName" = "8:#1003" - "Description" = "8:#1103" - "Type" = "3:3" - "ContextData" = "8:" - "Attributes" = "3:0" - "Setting" = "3:1" - "Value" = "8:#1203" - "DefaultValue" = "8:#1203" - "UsePlugInResources" = "11:TRUE" - } - } - } - "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_CFEB7A174B8B4D94B49F1D2C2DD3F159" - { - "Sequence" = "3:200" - "DisplayName" = "8:安装文件夹" - "UseDynamicProperties" = "11:TRUE" - "IsDependency" = "11:FALSE" - "SourcePath" = "8:\\VsdAdminFolderDlg.wid" - "Properties" - { - "BannerBitmap" - { - "Name" = "8:BannerBitmap" - "DisplayName" = "8:#1001" - "Description" = "8:#1101" - "Type" = "3:8" - "ContextData" = "8:Bitmap" - "Attributes" = "3:4" - "Setting" = "3:1" - "UsePlugInResources" = "11:TRUE" - } - } - } - "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_DCEA4653B81740D5A1894C422A5C8D71" - { - "Sequence" = "3:300" - "DisplayName" = "8:确认安装" - "UseDynamicProperties" = "11:TRUE" - "IsDependency" = "11:FALSE" - "SourcePath" = "8:\\VsdAdminConfirmDlg.wid" - "Properties" - { - "BannerBitmap" - { - "Name" = "8:BannerBitmap" - "DisplayName" = "8:#1001" - "Description" = "8:#1101" - "Type" = "3:8" - "ContextData" = "8:Bitmap" - "Attributes" = "3:4" - "Setting" = "3:1" - "UsePlugInResources" = "11:TRUE" - } - } - } - } - } - "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_5FE6576286934B9DB994F8D239EA516C" + "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_1A5B6A7AC70B4B2083C881C9932B2D1A" { "Name" = "8:#1900" "Sequence" = "3:1" "Attributes" = "3:1" "Dialogs" { - "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_519795C0DA9D461983CC6E62F22984CF" + "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_8DA3DBBEDF3945B19FBA2F6694A943E1" { "Sequence" = "3:100" "DisplayName" = "8:欢迎使用" @@ -1251,29 +739,7 @@ } } } - "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_89E01476DA3546F9A0F32138FA2E014B" - { - "Sequence" = "3:300" - "DisplayName" = "8:确认安装" - "UseDynamicProperties" = "11:TRUE" - "IsDependency" = "11:FALSE" - "SourcePath" = "8:\\VsdConfirmDlg.wid" - "Properties" - { - "BannerBitmap" - { - "Name" = "8:BannerBitmap" - "DisplayName" = "8:#1001" - "Description" = "8:#1101" - "Type" = "3:8" - "ContextData" = "8:Bitmap" - "Attributes" = "3:4" - "Setting" = "3:1" - "UsePlugInResources" = "11:TRUE" - } - } - } - "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_E12D198797624598801B8ABFDBEFBF95" + "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_A5F632F5D61B4791965C656687D8FFDB" { "Sequence" = "3:200" "DisplayName" = "8:安装文件夹" @@ -1308,28 +774,226 @@ } } } + "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_D5B0CDB17A70462B8EDF7EAE0C67838D" + { + "Sequence" = "3:300" + "DisplayName" = "8:确认安装" + "UseDynamicProperties" = "11:TRUE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdConfirmDlg.wid" + "Properties" + { + "BannerBitmap" + { + "Name" = "8:BannerBitmap" + "DisplayName" = "8:#1001" + "Description" = "8:#1101" + "Type" = "3:8" + "ContextData" = "8:Bitmap" + "Attributes" = "3:4" + "Setting" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + } + } } } - "{2479F3F5-0309-486D-8047-8187E2CE5BA0}:_70B58BE5E3B84FB984CD705D483E7047" - { - "UseDynamicProperties" = "11:FALSE" - "IsDependency" = "11:FALSE" - "SourcePath" = "8:\\VsdBasicDialogs.wim" - } - "{2479F3F5-0309-486D-8047-8187E2CE5BA0}:_776185CD60224F9CA7657FF77FEC2CA7" + "{2479F3F5-0309-486D-8047-8187E2CE5BA0}:_21C76F5F1CFB4BA58A4D8C2FAAE31BD2" { "UseDynamicProperties" = "11:FALSE" "IsDependency" = "11:FALSE" "SourcePath" = "8:\\VsdUserInterface.wim" } - "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_E516CC97D97E4BF28977E74F6452401A" + "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_23A205155A41453CB73AD78B97A38005" + { + "Name" = "8:#1900" + "Sequence" = "3:2" + "Attributes" = "3:1" + "Dialogs" + { + "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_32270935FC5D4DE09A89EC118CD351A0" + { + "Sequence" = "3:300" + "DisplayName" = "8:确认安装" + "UseDynamicProperties" = "11:TRUE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdAdminConfirmDlg.wid" + "Properties" + { + "BannerBitmap" + { + "Name" = "8:BannerBitmap" + "DisplayName" = "8:#1001" + "Description" = "8:#1101" + "Type" = "3:8" + "ContextData" = "8:Bitmap" + "Attributes" = "3:4" + "Setting" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + } + } + "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_7D8AF8370A2942E788B8F2FD5664A8F4" + { + "Sequence" = "3:200" + "DisplayName" = "8:安装文件夹" + "UseDynamicProperties" = "11:TRUE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdAdminFolderDlg.wid" + "Properties" + { + "BannerBitmap" + { + "Name" = "8:BannerBitmap" + "DisplayName" = "8:#1001" + "Description" = "8:#1101" + "Type" = "3:8" + "ContextData" = "8:Bitmap" + "Attributes" = "3:4" + "Setting" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + } + } + "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_DFF103B23B6E4DF7AA7CD757907B0EB3" + { + "Sequence" = "3:100" + "DisplayName" = "8:欢迎使用" + "UseDynamicProperties" = "11:TRUE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdAdminWelcomeDlg.wid" + "Properties" + { + "BannerBitmap" + { + "Name" = "8:BannerBitmap" + "DisplayName" = "8:#1001" + "Description" = "8:#1101" + "Type" = "3:8" + "ContextData" = "8:Bitmap" + "Attributes" = "3:4" + "Setting" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + "CopyrightWarning" + { + "Name" = "8:CopyrightWarning" + "DisplayName" = "8:#1002" + "Description" = "8:#1102" + "Type" = "3:3" + "ContextData" = "8:" + "Attributes" = "3:0" + "Setting" = "3:1" + "Value" = "8:#1202" + "DefaultValue" = "8:#1202" + "UsePlugInResources" = "11:TRUE" + } + "Welcome" + { + "Name" = "8:Welcome" + "DisplayName" = "8:#1003" + "Description" = "8:#1103" + "Type" = "3:3" + "ContextData" = "8:" + "Attributes" = "3:0" + "Setting" = "3:1" + "Value" = "8:#1203" + "DefaultValue" = "8:#1203" + "UsePlugInResources" = "11:TRUE" + } + } + } + } + } + "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_2C109D1AC2654C428D20A41C8CF7D025" + { + "Name" = "8:#1902" + "Sequence" = "3:2" + "Attributes" = "3:3" + "Dialogs" + { + "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_11A04CB154284B0CA0CCB7A9A8F98B5E" + { + "Sequence" = "3:100" + "DisplayName" = "8:已完成" + "UseDynamicProperties" = "11:TRUE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdAdminFinishedDlg.wid" + "Properties" + { + "BannerBitmap" + { + "Name" = "8:BannerBitmap" + "DisplayName" = "8:#1001" + "Description" = "8:#1101" + "Type" = "3:8" + "ContextData" = "8:Bitmap" + "Attributes" = "3:4" + "Setting" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + } + } + } + } + "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_5D14B5C5855D4BDDB55D89912F7BA5EF" + { + "Name" = "8:#1902" + "Sequence" = "3:1" + "Attributes" = "3:3" + "Dialogs" + { + "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_BBC6A5421E224AC099769C3189467B3E" + { + "Sequence" = "3:100" + "DisplayName" = "8:已完成" + "UseDynamicProperties" = "11:TRUE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdFinishedDlg.wid" + "Properties" + { + "BannerBitmap" + { + "Name" = "8:BannerBitmap" + "DisplayName" = "8:#1001" + "Description" = "8:#1101" + "Type" = "3:8" + "ContextData" = "8:Bitmap" + "Attributes" = "3:4" + "Setting" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + "UpdateText" + { + "Name" = "8:UpdateText" + "DisplayName" = "8:#1058" + "Description" = "8:#1158" + "Type" = "3:15" + "ContextData" = "8:" + "Attributes" = "3:0" + "Setting" = "3:1" + "Value" = "8:#1258" + "DefaultValue" = "8:#1258" + "UsePlugInResources" = "11:TRUE" + } + } + } + } + } + "{2479F3F5-0309-486D-8047-8187E2CE5BA0}:_CC9BE1B0656149F89F69D33EB6C6412D" + { + "UseDynamicProperties" = "11:FALSE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdBasicDialogs.wim" + } + "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_CCBF36AEC9A548938F80E51BA63785F8" { "Name" = "8:#1901" "Sequence" = "3:1" "Attributes" = "3:2" "Dialogs" { - "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_BA0AC84C93DC4D589081D4684B29473F" + "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_78F4E7769F65433BBC9621ECD1D26CF0" { "Sequence" = "3:100" "DisplayName" = "8:进度" @@ -1366,18 +1030,62 @@ } } } + "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_DFD81A9BA605462CA82CD3C250A654C7" + { + "Name" = "8:#1901" + "Sequence" = "3:2" + "Attributes" = "3:2" + "Dialogs" + { + "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_B3D2DA40B38A415D87563DA05C9A3DC7" + { + "Sequence" = "3:100" + "DisplayName" = "8:进度" + "UseDynamicProperties" = "11:TRUE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdAdminProgressDlg.wid" + "Properties" + { + "BannerBitmap" + { + "Name" = "8:BannerBitmap" + "DisplayName" = "8:#1001" + "Description" = "8:#1101" + "Type" = "3:8" + "ContextData" = "8:Bitmap" + "Attributes" = "3:4" + "Setting" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + "ShowProgress" + { + "Name" = "8:ShowProgress" + "DisplayName" = "8:#1009" + "Description" = "8:#1109" + "Type" = "3:5" + "ContextData" = "8:1;True=1;False=0" + "Attributes" = "3:0" + "Setting" = "3:0" + "Value" = "3:1" + "DefaultValue" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + } + } + } + } } "MergeModule" { } "ProjectOutput" { - "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_00EB5BF3E5624995855CCF580A8AD1D5" + "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_536090BAB697484B8E206852993F24BA" { "SourcePath" = "8:..\\x64\\Debug\\NetTunnelSDK.dll" "TargetName" = "8:" "Tag" = "8:" - "Folder" = "8:_A69AEF7ED77C4BB28FA87F3D7B5FF39A" + "Folder" = "8:_11B6E97F977B4EE4ACBB201BA1EA1604" "Condition" = "8:" "Transitive" = "11:FALSE" "Vital" = "11:TRUE" @@ -1400,12 +1108,12 @@ { } } - "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_09D5F31BA46C466386CAA21A568B800F" + "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_5D1B756E19334E5F9696EF72E6C0B218" { "SourcePath" = "8:" "TargetName" = "8:" "Tag" = "8:" - "Folder" = "8:_A69AEF7ED77C4BB28FA87F3D7B5FF39A" + "Folder" = "8:_11B6E97F977B4EE4ACBB201BA1EA1604" "Condition" = "8:" "Transitive" = "11:FALSE" "Vital" = "11:TRUE" @@ -1421,131 +1129,19 @@ "IsolateTo" = "8:" "ProjectOutputGroupRegister" = "3:1" "OutputConfiguration" = "8:" - "OutputGroupCanonicalName" = "8:LocalizedResourceDlls" - "OutputProjectGuid" = "8:{79995848-FD05-46F5-A7FE-46265E540E32}" + "OutputGroupCanonicalName" = "8:Documentation" + "OutputProjectGuid" = "8:{1584BAD4-DBEC-43D2-BC06-08C23F02489A}" "ShowKeyOutput" = "11:TRUE" "ExcludeFilters" { } } - "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_0FB96E565E5D437A9D9180FEFB9445DD" + "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_5D9140C18F75441CB09137D7DD545C0E" { "SourcePath" = "8:" "TargetName" = "8:" "Tag" = "8:" - "Folder" = "8:_A69AEF7ED77C4BB28FA87F3D7B5FF39A" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Vital" = "11:TRUE" - "ReadOnly" = "11:FALSE" - "Hidden" = "11:FALSE" - "System" = "11:FALSE" - "Permanent" = "11:FALSE" - "SharedLegacy" = "11:FALSE" - "PackageAs" = "3:1" - "Register" = "3:1" - "Exclude" = "11:FALSE" - "IsDependency" = "11:FALSE" - "IsolateTo" = "8:" - "ProjectOutputGroupRegister" = "3:1" - "OutputConfiguration" = "8:" - "OutputGroupCanonicalName" = "8:ReferenceCopyLocalPaths" - "OutputProjectGuid" = "8:{79995848-FD05-46F5-A7FE-46265E540E32}" - "ShowKeyOutput" = "11:TRUE" - "ExcludeFilters" - { - } - } - "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_10E071CF096B417C925C5E27E36CE39A" - { - "SourcePath" = "8:..\\NetTunnelApp\\obj\\Debug\\NetTunnelApp.exe" - "TargetName" = "8:" - "Tag" = "8:" - "Folder" = "8:_A69AEF7ED77C4BB28FA87F3D7B5FF39A" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Vital" = "11:TRUE" - "ReadOnly" = "11:FALSE" - "Hidden" = "11:FALSE" - "System" = "11:FALSE" - "Permanent" = "11:FALSE" - "SharedLegacy" = "11:FALSE" - "PackageAs" = "3:1" - "Register" = "3:1" - "Exclude" = "11:FALSE" - "IsDependency" = "11:FALSE" - "IsolateTo" = "8:" - "ProjectOutputGroupRegister" = "3:1" - "OutputConfiguration" = "8:" - "OutputGroupCanonicalName" = "8:Built" - "OutputProjectGuid" = "8:{79995848-FD05-46F5-A7FE-46265E540E32}" - "ShowKeyOutput" = "11:TRUE" - "ExcludeFilters" - { - } - } - "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_138159081C724BCEB5F7D78E8530680C" - { - "SourcePath" = "8:" - "TargetName" = "8:" - "Tag" = "8:" - "Folder" = "8:_A69AEF7ED77C4BB28FA87F3D7B5FF39A" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Vital" = "11:TRUE" - "ReadOnly" = "11:FALSE" - "Hidden" = "11:FALSE" - "System" = "11:FALSE" - "Permanent" = "11:FALSE" - "SharedLegacy" = "11:FALSE" - "PackageAs" = "3:1" - "Register" = "3:1" - "Exclude" = "11:FALSE" - "IsDependency" = "11:FALSE" - "IsolateTo" = "8:" - "ProjectOutputGroupRegister" = "3:1" - "OutputConfiguration" = "8:" - "OutputGroupCanonicalName" = "8:RuntimeImplementation" - "OutputProjectGuid" = "8:{79995848-FD05-46F5-A7FE-46265E540E32}" - "ShowKeyOutput" = "11:TRUE" - "ExcludeFilters" - { - } - } - "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_19604C5232074625A2F3B24664F5BF2C" - { - "SourcePath" = "8:" - "TargetName" = "8:" - "Tag" = "8:" - "Folder" = "8:_A69AEF7ED77C4BB28FA87F3D7B5FF39A" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Vital" = "11:TRUE" - "ReadOnly" = "11:FALSE" - "Hidden" = "11:FALSE" - "System" = "11:FALSE" - "Permanent" = "11:FALSE" - "SharedLegacy" = "11:FALSE" - "PackageAs" = "3:1" - "Register" = "3:1" - "Exclude" = "11:FALSE" - "IsDependency" = "11:FALSE" - "IsolateTo" = "8:" - "ProjectOutputGroupRegister" = "3:1" - "OutputConfiguration" = "8:" - "OutputGroupCanonicalName" = "8:XmlSerializer" - "OutputProjectGuid" = "8:{79995848-FD05-46F5-A7FE-46265E540E32}" - "ShowKeyOutput" = "11:TRUE" - "ExcludeFilters" - { - } - } - "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_86E40595C88E4E1D8D5E3C2BF53BDD1F" - { - "SourcePath" = "8:" - "TargetName" = "8:" - "Tag" = "8:" - "Folder" = "8:_A69AEF7ED77C4BB28FA87F3D7B5FF39A" + "Folder" = "8:_11B6E97F977B4EE4ACBB201BA1EA1604" "Condition" = "8:" "Transitive" = "11:FALSE" "Vital" = "11:TRUE" @@ -1562,18 +1158,130 @@ "ProjectOutputGroupRegister" = "3:1" "OutputConfiguration" = "8:" "OutputGroupCanonicalName" = "8:ContentFiles" - "OutputProjectGuid" = "8:{79995848-FD05-46F5-A7FE-46265E540E32}" + "OutputProjectGuid" = "8:{1584BAD4-DBEC-43D2-BC06-08C23F02489A}" "ShowKeyOutput" = "11:TRUE" "ExcludeFilters" { } } - "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_A2B46765ECF148F6B3BD76DC027D3B06" + "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_90BEBC85901741FD931F1E229119B2D0" { - "SourcePath" = "8:..\\x64\\Debug\\NetTunnelSDKTestApp.exe" + "SourcePath" = "8:" "TargetName" = "8:" "Tag" = "8:" - "Folder" = "8:_A69AEF7ED77C4BB28FA87F3D7B5FF39A" + "Folder" = "8:_11B6E97F977B4EE4ACBB201BA1EA1604" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:FALSE" + "IsolateTo" = "8:" + "ProjectOutputGroupRegister" = "3:1" + "OutputConfiguration" = "8:" + "OutputGroupCanonicalName" = "8:LocalizedResourceDlls" + "OutputProjectGuid" = "8:{0A2EEDAF-F4A8-41E0-A874-2F30D1EEB55E}" + "ShowKeyOutput" = "11:TRUE" + "ExcludeFilters" + { + } + } + "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_B533684BBAE345FD8D29E28D7036DB56" + { + "SourcePath" = "8:" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_11B6E97F977B4EE4ACBB201BA1EA1604" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:FALSE" + "IsolateTo" = "8:" + "ProjectOutputGroupRegister" = "3:1" + "OutputConfiguration" = "8:" + "OutputGroupCanonicalName" = "8:LocalizedResourceDlls" + "OutputProjectGuid" = "8:{1584BAD4-DBEC-43D2-BC06-08C23F02489A}" + "ShowKeyOutput" = "11:TRUE" + "ExcludeFilters" + { + } + } + "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_C4B9CA924EF948E698347943FC9EE248" + { + "SourcePath" = "8:" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_11B6E97F977B4EE4ACBB201BA1EA1604" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:FALSE" + "IsolateTo" = "8:" + "ProjectOutputGroupRegister" = "3:1" + "OutputConfiguration" = "8:" + "OutputGroupCanonicalName" = "8:Symbols" + "OutputProjectGuid" = "8:{1584BAD4-DBEC-43D2-BC06-08C23F02489A}" + "ShowKeyOutput" = "11:TRUE" + "ExcludeFilters" + { + } + } + "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_E1571A195C12436AAA15070A14575492" + { + "SourcePath" = "8:" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_11B6E97F977B4EE4ACBB201BA1EA1604" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:FALSE" + "IsolateTo" = "8:" + "ProjectOutputGroupRegister" = "3:1" + "OutputConfiguration" = "8:" + "OutputGroupCanonicalName" = "8:Symbols" + "OutputProjectGuid" = "8:{0A2EEDAF-F4A8-41E0-A874-2F30D1EEB55E}" + "ShowKeyOutput" = "11:TRUE" + "ExcludeFilters" + { + } + } + "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_E299DFE7D43447328C1278A1D50ADA09" + { + "SourcePath" = "8:..\\x64\\Debug\\NetTunnelSvr.exe" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_11B6E97F977B4EE4ACBB201BA1EA1604" "Condition" = "8:" "Transitive" = "11:FALSE" "Vital" = "11:TRUE" @@ -1590,7 +1298,63 @@ "ProjectOutputGroupRegister" = "3:1" "OutputConfiguration" = "8:" "OutputGroupCanonicalName" = "8:Built" - "OutputProjectGuid" = "8:{9F44F41E-FACF-472D-A382-A40D0A84DB2C}" + "OutputProjectGuid" = "8:{0A2EEDAF-F4A8-41E0-A874-2F30D1EEB55E}" + "ShowKeyOutput" = "11:TRUE" + "ExcludeFilters" + { + } + } + "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_F700CD9D068D42348F4997F3A7C9A262" + { + "SourcePath" = "8:" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_11B6E97F977B4EE4ACBB201BA1EA1604" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:FALSE" + "IsolateTo" = "8:" + "ProjectOutputGroupRegister" = "3:1" + "OutputConfiguration" = "8:" + "OutputGroupCanonicalName" = "8:ContentFiles" + "OutputProjectGuid" = "8:{0A2EEDAF-F4A8-41E0-A874-2F30D1EEB55E}" + "ShowKeyOutput" = "11:TRUE" + "ExcludeFilters" + { + } + } + "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_FCFC0F15512849E1974F1EF2BB9E8C8D" + { + "SourcePath" = "8:" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_11B6E97F977B4EE4ACBB201BA1EA1604" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:FALSE" + "IsolateTo" = "8:" + "ProjectOutputGroupRegister" = "3:1" + "OutputConfiguration" = "8:" + "OutputGroupCanonicalName" = "8:Documentation" + "OutputProjectGuid" = "8:{0A2EEDAF-F4A8-41E0-A874-2F30D1EEB55E}" "ShowKeyOutput" = "11:TRUE" "ExcludeFilters" { diff --git a/NetTunnelApp/MainForm.cs b/NetTunnelApp/MainForm.cs index b4a9a53..a2b89e6 100644 --- a/NetTunnelApp/MainForm.cs +++ b/NetTunnelApp/MainForm.cs @@ -65,7 +65,7 @@ public partial class MainForm : Form string.Format("{0:yyyyMMdd}", DateTime.Now) + ".log"; //NetTunnelLib.InitTunnelSDKLog(path, LogLevel.LOG_DEBUG); NetTunnelLib.TunnelSDKInitEnv(Environment.CurrentDirectory, "http://xajhuang.com:9276", path, LogLevel.LOG_DEBUG, menuSetModeServer.Checked); - + NetTunnelLib.EnableSCGProxy(true, "efc.xajhuang.com", 10000); GetCurrentNetCard(); NetCardMenuItems menuItems = new NetCardMenuItems(_curNetCard); @@ -108,14 +108,6 @@ public partial class MainForm : Form Marshal.FreeCoTaskMem(pt); } - private void test_create_wg_key() - { - var buffer = new StringBuilder(64 + 1); - var buffer2 = new StringBuilder(64 + 1); - var v = NetTunnelLib.GenerateWireguardKeyPairs(buffer, 64, buffer2, 64); - lstLogs.Items.Add(v.ToString() + ": [" + buffer.ToString() + "] / [" + buffer2.ToString() + "]"); - } - private void test_create_wg_svr_cfg() { WgSvrConfig wsg = new WgSvrConfig(); diff --git a/NetTunnelApp/NetTunnelLib.cs b/NetTunnelApp/NetTunnelLib.cs index 1154d5b..fcaf359 100644 --- a/NetTunnelApp/NetTunnelLib.cs +++ b/NetTunnelApp/NetTunnelLib.cs @@ -181,10 +181,6 @@ public class NetTunnelLib [DllImport("NetTunnelSDK.dll", CallingConvention = CallingConvention.Cdecl)] public static extern int SetProtocolEncryptType(ProtoCryptoType type, String pProKey); - - [DllImport("NetTunnelSDK.dll", CallingConvention = CallingConvention.Cdecl)] - public static extern int GenerateWireguardKeyPairs(StringBuilder wgPubKey, int maxPubKey, StringBuilder wgPrivKey, - int MaxPrivKey); [DllImport("NetTunnelSDK.dll", CallingConvention = CallingConvention.Cdecl)] public static extern int GetAllNICInfo(out IntPtr netCard, ref int size); @@ -229,6 +225,12 @@ public class NetTunnelLib [DllImport("NetTunnelSDK.dll", CallingConvention = CallingConvention.Cdecl)] public static extern void SetCurrentNetShareMode(NET_SHARE_MODE shareMode); + [DllImport("NetTunnelSDK.dll", CallingConvention = CallingConvention.Cdecl)] + public static extern int EnableSCGProxy(bool isEnable, String proxyIp, int proxyPort); + + [DllImport("NetTunnelSDK.dll", CallingConvention = CallingConvention.Cdecl)] + public static extern bool UsedSCGProxy(); + //[DllImport("NetTunnelSDK.dll", CallingConvention = CallingConvention.Cdecl)] //public static extern int RunPipeCmd(String pszCmd, StringBuilder pszResultBuffer, int dwResultBufferSize); } \ No newline at end of file diff --git a/NetTunnelSDK/NetTunnelSDK.vcxproj b/NetTunnelSDK/NetTunnelSDK.vcxproj index c14b519..4202ea5 100644 --- a/NetTunnelSDK/NetTunnelSDK.vcxproj +++ b/NetTunnelSDK/NetTunnelSDK.vcxproj @@ -45,6 +45,7 @@ true v143 MultiByte + false DynamicLibrary @@ -114,16 +115,20 @@ Use pch.h stdcpp17 - MultiThreadedDebug + MultiThreadedDebugDLL + .\depends\WinDivert\include;.\include;.\depends\WireGuardNT\include;%(AdditionalIncludeDirectories) Windows true false - .\WinDivert\x64;%(AdditionalLibraryDirectories) + %(AdditionalLibraryDirectories) - copy /y $(TargetDir)*.dll $(SolutionDir)\NetTunnelApp\bin\$(ConfigurationName)\ + copy /y $(ProjectDir)depends\tunnel\amd64\tunnel.dll $(TargetDir) +copy /y $(ProjectDir)depends\WireGuardNT\amd64\wireguard.dll $(TargetDir) +copy /y $(TargetDir)fmtd.dll $(SolutionDir)NetTunnelApp\bin\$(ConfigurationName)\ +copy /y $(TargetDir)NetTunnelSDK.dll $(SolutionDir)NetTunnelApp\bin\$(ConfigurationName)\ @@ -149,47 +154,41 @@ - - - - - - - - - - - - - - - + + + + + + + + + + + + + + - - + + - - - - + + + + + Create Create Create Create - - - - - NotUsing - + + + + - - Use - - diff --git a/NetTunnelSDK/NetTunnelSDK.vcxproj.filters b/NetTunnelSDK/NetTunnelSDK.vcxproj.filters index fa2a99a..cdcf2a8 100644 --- a/NetTunnelSDK/NetTunnelSDK.vcxproj.filters +++ b/NetTunnelSDK/NetTunnelSDK.vcxproj.filters @@ -16,9 +16,6 @@ {1111b68b-34f2-49fa-8116-de5ae65603b6} - - {7b591f9a-0c91-4e23-a6b2-bc3b5b25f008} - {f2474544-0d85-457c-a448-afdaaa4130d3} @@ -37,51 +34,54 @@ {f13f3513-264f-4e1a-a1c8-4b5cc9e8af5c} + + {d3c17cbd-a724-43a2-8090-2fb15f62f88e} + + + {7b591f9a-0c91-4e23-a6b2-bc3b5b25f008} + - - 头文件 - - - 头文件 - - - 头文件 - - - 头文件 - - - 头文件 - - - 头文件 - - - 头文件 - - - 头文件 - - - 头文件 - - - 头文件\protocol - - - 头文件\protocol - - - 头文件\json - - + 头文件\http - + + 头文件\json + + + 头文件\protocol + + + 头文件\protocol + + 头文件 - + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + 头文件 @@ -92,44 +92,41 @@ 源文件 - - 源文件 - - - 源文件 - - - 源文件\crypto - - - 源文件\crypto - - - 源文件\wireguard - - - 源文件\network - 源文件\user - + + 源文件\misc + + + 源文件\misc + + 源文件\protocol - - 源文件\protocol + + 源文件\crypto - + + 源文件\crypto + + 源文件\network - - 源文件 - - + 源文件\network - - 源文件\wireguard + + 源文件\network + + + 源文件\tunnel + + + 源文件\tunnel + + + 源文件\tunnel diff --git a/NetTunnelSDK/ProtocolBase.cpp b/NetTunnelSDK/ProtocolBase.cpp deleted file mode 100644 index 705d2a3..0000000 --- a/NetTunnelSDK/ProtocolBase.cpp +++ /dev/null @@ -1,2 +0,0 @@ -#include "pch.h" -#include "ProtocolBase.h" diff --git a/NetTunnelSDK/ProxyService.cpp b/NetTunnelSDK/ProxyService.cpp deleted file mode 100644 index 0a0fab8..0000000 --- a/NetTunnelSDK/ProxyService.cpp +++ /dev/null @@ -1,126 +0,0 @@ -#include "pch.h" -#include "WinDivert/include/windivert.h" - -#include -#include -#include "globalcfg.h" -#include "usrerr.h" - -#pragma comment(lib, "WinDivert.lib") - -typedef struct { - bool isRunning; - HANDLE proxyThread; - HANDLE proxyHandle; - bool isExitSvr; -} UDP_PROXY_CTX, *PUDP_PROXY_CTX; - -typedef struct { - TCHAR streamFilter[1024]; - TCHAR targetIp[MAX_IP_LEN]; - UINT16 targetPort; - int vmId; - int svrId; - UDP_PROXY_CTX udpCtx; -} PROXY_INFO, *PPROXY_INFO; - - -static std::unordered_map g_ProxyColleagues; - - -int CreatePorxyService(const TCHAR *pTargetIp, int targetPort, int vmId, int svrId) { - //int CreatePorxyService() { - //int ret; - static HANDLE hDriver; - PPROXY_INFO pInfo; - std::string key; - std::unordered_map::iterator iter; - - // 查找先前代理是否存在 - key = std::string(pTargetIp) + ":" + std::to_string(targetPort); - - if ((iter = g_ProxyColleagues.find(key)) != g_ProxyColleagues.end()) { - pInfo = iter->second; - // 如果配置完全相同则直接返回 - if (pInfo->vmId == vmId && pInfo->svrId == svrId) { - return ERR_SUCCESS; - } else { - pInfo->vmId = vmId; - pInfo->svrId = svrId; - } - } else { - // 创建新的代理配置 - pInfo = static_cast(HeapAlloc(GetProcessHeap(), 0, sizeof(PROXY_INFO))); - - if (pInfo == nullptr) { - SPDLOG_ERROR(TEXT("Error allocating {0} bytes memory "), sizeof(PROXY_INFO)); - return -ERR_MALLOC_MEMORY; - } - - memset(pInfo, 0, sizeof(PROXY_INFO)); - } - - memset(pInfo->streamFilter, 0, 1024); - - StringCbPrintf(pInfo->streamFilter, 1024, TEXT("(udp.DstPort == %d and )"), targetPort); - - hDriver = WinDivertOpen(pInfo->streamFilter, WINDIVERT_LAYER_NETWORK, 0, 0); - - if (hDriver == INVALID_HANDLE_VALUE) { - //ERROR_INSUFFICIENT_BUFFER - SPDLOG_ERROR(TEXT("Open Driver With Filter \"{1}\" Error: {0}"), GetLastError(), pInfo->streamFilter); - return -ERR_SYS_CALL; - } - - CreateThread( - nullptr, // Thread attributes - 0, // Stack size (0 = use default) - [](LPVOID lpParameter) { - const HANDLE h = lpParameter; - unsigned char packet[2048]; - UINT packet_len; - WINDIVERT_ADDRESS addr; - - while (true) { - if (!WinDivertRecv(h, packet, 0xFFFF, &packet_len, &addr)) { - SPDLOG_ERROR(TEXT("failed to read packet ({0})"), GetLastError()); - continue; - } - - switch (addr.Event) { - case WINDIVERT_EVENT_SOCKET_BIND: - SPDLOG_ERROR("BIND"); - break; - case WINDIVERT_EVENT_SOCKET_LISTEN: - - SPDLOG_ERROR("LISTEN"); - break; - case WINDIVERT_EVENT_SOCKET_CONNECT: - - SPDLOG_ERROR("CONNECT: {0:x}, {1:x}", addr.Socket.EndpointId, addr.Socket.ParentEndpointId); - break; - case WINDIVERT_EVENT_SOCKET_ACCEPT: - - SPDLOG_ERROR("ACCEPT"); - break; - case WINDIVERT_EVENT_SOCKET_CLOSE: - - SPDLOG_ERROR("CLOSE: {0:x}, {1:x}", addr.Socket.EndpointId, addr.Socket.ParentEndpointId); - break; - default: - SPDLOG_ERROR(TEXT("***({0})"), static_cast(addr.Event)); - break; - } - - /*if (!WinDivertSendEx(h, packet, packet_len, nullptr, 0, &addr, sizeof(WINDIVERT_ADDRESS), nullptr)) { - SPDLOG_ERROR(TEXT("warning: failed to reinject packet ({0})\n"), GetLastError()); - }*/ - } - - return static_cast(0); - }, // Thread start address - hDriver, // Parameter to pass to the thread - 0, // Creation flags - nullptr); // Thread id - return 0; -} \ No newline at end of file diff --git a/NetTunnelSDK/UserManager.cpp b/NetTunnelSDK/UserManager.cpp index c8dd57d..05798d0 100644 --- a/NetTunnelSDK/UserManager.cpp +++ b/NetTunnelSDK/UserManager.cpp @@ -356,16 +356,6 @@ int SetTunnelConfigure(const TCHAR *pCliPrivateKey, } } -#if 0 - if (GetCurrentNetShareMode() == NAT_SHARE_MODE) { - // 清理旧的 NAT 配置 - if ((ret = RemoveNATRule(GetGlobalCfgInfo()->userCfg.userName)) != ERR_SUCCESS) { - SPDLOG_ERROR(TEXT("Call GetNetIntelnetConnectionSharing error: {0}"), ret); - return ret; - } - } -#endif - ret = GetIpV4InfoFromCIDR(pSvrTunnelAddr, &tunnelInfo); if (ret != ERR_SUCCESS) { @@ -384,7 +374,12 @@ int SetTunnelConfigure(const TCHAR *pCliPrivateKey, StringCbCopy(cliCfg.PrivateKey, 64, pCliPrivateKey); StringCbCopy(cliCfg.Address, 32, pCliNetwork); StringCbCopy(cliCfg.SvrPubKey, 64, pSvrPublicKey); - StringCbCopy(cliCfg.ServerURL, 256, pSvrEndPoint); + if (UsedSCGProxy()) { + StringCbPrintf(cliCfg.ServerURL, 256, TEXT("127.0.0.1:%d"), GetGlobalCfgInfo()->scgProxy.proxyPort); + } else { + StringCbCopy(cliCfg.ServerURL, 256, pSvrEndPoint); + } + StringCbPrintf(cliCfg.AllowNet, 256, TEXT("%s/%d,%s/%d"), @@ -455,7 +450,7 @@ int GetUserClientConfigure(const TCHAR *pUserName, const TCHAR *pToken, PUSER_CL ProtocolRequest req; ProtocolResponse rsp; - if (pUserName == nullptr || lstrlen(pUserName) == 0) { + if (pUserName == nullptr || lstrlen(pUserName) == 0) { SPDLOG_ERROR(TEXT("Input pUserName params error: {0}"), pUserName); return -ERR_INPUT_PARAMS; } diff --git a/NetTunnelSDK/hashdigest.cpp b/NetTunnelSDK/crypto/HashDigest.cpp similarity index 100% rename from NetTunnelSDK/hashdigest.cpp rename to NetTunnelSDK/crypto/HashDigest.cpp diff --git a/NetTunnelSDK/crypto.cpp b/NetTunnelSDK/crypto/crypto.cpp similarity index 100% rename from NetTunnelSDK/crypto.cpp rename to NetTunnelSDK/crypto/crypto.cpp diff --git a/NetTunnelSDK/WinDivert/include/windivert.h b/NetTunnelSDK/depends/WinDivert/include/windivert.h similarity index 100% rename from NetTunnelSDK/WinDivert/include/windivert.h rename to NetTunnelSDK/depends/WinDivert/include/windivert.h diff --git a/NetTunnelSDK/WinDivert/x86/WinDivert.dll b/NetTunnelSDK/depends/WinDivert/x86/WinDivert.dll similarity index 100% rename from NetTunnelSDK/WinDivert/x86/WinDivert.dll rename to NetTunnelSDK/depends/WinDivert/x86/WinDivert.dll diff --git a/NetTunnelSDK/WinDivert/x86/WinDivert.lib b/NetTunnelSDK/depends/WinDivert/x86/WinDivert.lib similarity index 100% rename from NetTunnelSDK/WinDivert/x86/WinDivert.lib rename to NetTunnelSDK/depends/WinDivert/x86/WinDivert.lib diff --git a/NetTunnelSDK/WinDivert/x86/WinDivert32.sys b/NetTunnelSDK/depends/WinDivert/x86/WinDivert32.sys similarity index 100% rename from NetTunnelSDK/WinDivert/x86/WinDivert32.sys rename to NetTunnelSDK/depends/WinDivert/x86/WinDivert32.sys diff --git a/NetTunnelSDK/WinDivert/x86/WinDivert64.sys b/NetTunnelSDK/depends/WinDivert/x86/WinDivert64.sys similarity index 100% rename from NetTunnelSDK/WinDivert/x86/WinDivert64.sys rename to NetTunnelSDK/depends/WinDivert/x86/WinDivert64.sys diff --git a/NetTunnelSDK/depends/WireGuardNT/amd64/wireguard.dll b/NetTunnelSDK/depends/WireGuardNT/amd64/wireguard.dll new file mode 100644 index 0000000..efc0362 Binary files /dev/null and b/NetTunnelSDK/depends/WireGuardNT/amd64/wireguard.dll differ diff --git a/NetTunnelSDK/depends/WireGuardNT/arm/wireguard.dll b/NetTunnelSDK/depends/WireGuardNT/arm/wireguard.dll new file mode 100644 index 0000000..3977c5d Binary files /dev/null and b/NetTunnelSDK/depends/WireGuardNT/arm/wireguard.dll differ diff --git a/NetTunnelSDK/depends/WireGuardNT/arm64/wireguard.dll b/NetTunnelSDK/depends/WireGuardNT/arm64/wireguard.dll new file mode 100644 index 0000000..d49df5c Binary files /dev/null and b/NetTunnelSDK/depends/WireGuardNT/arm64/wireguard.dll differ diff --git a/NetTunnelSDK/depends/WireGuardNT/include/wireguard.h b/NetTunnelSDK/depends/WireGuardNT/include/wireguard.h new file mode 100644 index 0000000..ce562fa --- /dev/null +++ b/NetTunnelSDK/depends/WireGuardNT/include/wireguard.h @@ -0,0 +1,308 @@ +/* SPDX-License-Identifier: GPL-2.0 OR MIT + * + * Copyright (C) 2018-2021 WireGuard LLC. All Rights Reserved. + */ + +#pragma once + +#include +#include +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef ALIGNED +# if defined(_MSC_VER) +# define ALIGNED(n) __declspec(align(n)) +# elif defined(__GNUC__) +# define ALIGNED(n) __attribute__((aligned(n))) +# else +# error "Unable to define ALIGNED" +# endif +#endif + +/* MinGW is missing this one, unfortunately. */ +#ifndef _Post_maybenull_ +# define _Post_maybenull_ +#endif + +#pragma warning(push) +#pragma warning(disable : 4324) /* structure was padded due to alignment specifier */ + +/** + * A handle representing WireGuard adapter + */ +typedef struct _WIREGUARD_ADAPTER *WIREGUARD_ADAPTER_HANDLE; + +/** + * Creates a new WireGuard adapter. + * + * @param Name The requested name of the adapter. Zero-terminated string of up to MAX_ADAPTER_NAME-1 + * characters. + * + * @param TunnelType Name of the adapter tunnel type. Zero-terminated string of up to MAX_ADAPTER_NAME-1 + * characters. + * + * @param RequestedGUID The GUID of the created network adapter, which then influences NLA generation deterministically. + * If it is set to NULL, the GUID is chosen by the system at random, and hence a new NLA entry is + * created for each new adapter. It is called "requested" GUID because the API it uses is + * completely undocumented, and so there could be minor interesting complications with its usage. + * + * @return If the function succeeds, the return value is the adapter handle. Must be released with + * WireGuardCloseAdapter. If the function fails, the return value is NULL. To get extended error information, call + * GetLastError. + */ +typedef _Must_inspect_result_ +_Return_type_success_(return != NULL) +_Post_maybenull_ +WIREGUARD_ADAPTER_HANDLE(WINAPI WIREGUARD_CREATE_ADAPTER_FUNC) +(_In_z_ LPCWSTR Name, _In_z_ LPCWSTR TunnelType, _In_opt_ const GUID *RequestedGUID); + +/** + * Opens an existing WireGuard adapter. + * + * @param Name The requested name of the adapter. Zero-terminated string of up to MAX_ADAPTER_NAME-1 + * characters. + * + * @return If the function succeeds, the return value is the adapter handle. Must be released with + * WireGuardCloseAdapter. If the function fails, the return value is NULL. To get extended error information, call + * GetLastError. + */ +typedef _Must_inspect_result_ +_Return_type_success_(return != NULL) +_Post_maybenull_ +WIREGUARD_ADAPTER_HANDLE(WINAPI WIREGUARD_OPEN_ADAPTER_FUNC)(_In_z_ LPCWSTR Name); + +/** + * Releases WireGuard adapter resources and, if adapter was created with WireGuardCreateAdapter, removes adapter. + * + * @param Adapter Adapter handle obtained with WireGuardCreateAdapter or WireGuardOpenAdapter. + */ +typedef VOID(WINAPI WIREGUARD_CLOSE_ADAPTER_FUNC)(_In_opt_ WIREGUARD_ADAPTER_HANDLE Adapter); + +/** + * Deletes the WireGuard driver if there are no more adapters in use. + * + * @return If the function succeeds, the return value is nonzero. If the function fails, the return value is zero. To + * get extended error information, call GetLastError. + */ +typedef _Return_type_success_(return != FALSE) +BOOL(WINAPI WIREGUARD_DELETE_DRIVER_FUNC)(VOID); + +/** + * Returns the LUID of the adapter. + * + * @param Adapter Adapter handle obtained with WireGuardCreateAdapter or WireGuardOpenAdapter + * + * @param Luid Pointer to LUID to receive adapter LUID. + */ +typedef VOID(WINAPI WIREGUARD_GET_ADAPTER_LUID_FUNC)(_In_ WIREGUARD_ADAPTER_HANDLE Adapter, _Out_ NET_LUID *Luid); + +/** + * Determines the version of the WireGuard driver currently loaded. + * + * @return If the function succeeds, the return value is the version number. If the function fails, the return value is + * zero. To get extended error information, call GetLastError. Possible errors include the following: + * ERROR_FILE_NOT_FOUND WireGuard not loaded + */ +typedef _Return_type_success_(return != 0) +DWORD(WINAPI WIREGUARD_GET_RUNNING_DRIVER_VERSION_FUNC)(VOID); + +/** + * Determines the level of logging, passed to WIREGUARD_LOGGER_CALLBACK. + */ +typedef enum +{ + WIREGUARD_LOG_INFO, /**< Informational */ + WIREGUARD_LOG_WARN, /**< Warning */ + WIREGUARD_LOG_ERR /**< Error */ +} WIREGUARD_LOGGER_LEVEL; + +/** + * Called by internal logger to report diagnostic messages + * + * @param Level Message level. + * + * @param Timestamp Message timestamp in in 100ns intervals since 1601-01-01 UTC. + * + * @param Message Message text. + */ +typedef VOID(CALLBACK *WIREGUARD_LOGGER_CALLBACK)( + _In_ WIREGUARD_LOGGER_LEVEL Level, + _In_ DWORD64 Timestamp, + _In_z_ LPCWSTR Message); + +/** + * Sets logger callback function. + * + * @param NewLogger Pointer to callback function to use as a new global logger. NewLogger may be called from various + * threads concurrently. Should the logging require serialization, you must handle serialization in + * NewLogger. Set to NULL to disable. + */ +typedef VOID(WINAPI WIREGUARD_SET_LOGGER_FUNC)(_In_ WIREGUARD_LOGGER_CALLBACK NewLogger); + +/** + * Whether and how logs from the driver are collected for the callback function. + */ +typedef enum +{ + WIREGUARD_ADAPTER_LOG_OFF, /**< No logs are generated from the driver. */ + WIREGUARD_ADAPTER_LOG_ON, /**< Logs are generated from the driver. */ + WIREGUARD_ADAPTER_LOG_ON_WITH_PREFIX /**< Logs are generated from the driver, index-prefixed. */ +} WIREGUARD_ADAPTER_LOG_STATE; + +/** + * Sets whether and how the adapter logs to the logger previously set up with WireGuardSetLogger. + * + * @param Adapter Adapter handle obtained with WireGuardCreateAdapter or WireGuardOpenAdapter + * + * @param LogState Adapter logging state. + * + * @return If the function succeeds, the return value is nonzero. If the function fails, the return value is zero. To + * get extended error information, call GetLastError. + */ +typedef _Return_type_success_(return != FALSE) +BOOL(WINAPI WIREGUARD_SET_ADAPTER_LOGGING_FUNC) +(_In_ WIREGUARD_ADAPTER_HANDLE Adapter, _In_ WIREGUARD_ADAPTER_LOG_STATE LogState); + +/** + * Determines the state of the adapter. + */ +typedef enum +{ + WIREGUARD_ADAPTER_STATE_DOWN, /**< Down */ + WIREGUARD_ADAPTER_STATE_UP, /**< Up */ +} WIREGUARD_ADAPTER_STATE; + +/** + * Sets the adapter state of the WireGuard adapter. Note: sockets are owned by the process that sets the state to up. + * + * @param Adapter Adapter handle obtained with WireGuardCreateAdapter or WireGuardOpenAdapter + * + * @param State Adapter state. + * + * @return If the function succeeds, the return value is nonzero. If the function fails, the return value is zero. To + * get extended error information, call GetLastError. + */ +typedef _Return_type_success_(return != FALSE) +BOOL(WINAPI WIREGUARD_SET_ADAPTER_STATE_FUNC) +(_In_ WIREGUARD_ADAPTER_HANDLE Adapter, _In_ WIREGUARD_ADAPTER_STATE State); + +/** + * Gets the adapter state of the WireGuard adapter. + * + * @param Adapter Adapter handle obtained with WireGuardCreateAdapter or WireGuardOpenAdapter + * + * @param State Pointer to adapter state. + * + * @return If the function succeeds, the return value is nonzero. If the function fails, the return value is zero. To + * get extended error information, call GetLastError. + */ +typedef _Must_inspect_result_ +_Return_type_success_(return != FALSE) +BOOL(WINAPI WIREGUARD_GET_ADAPTER_STATE_FUNC) +(_In_ WIREGUARD_ADAPTER_HANDLE Adapter, _Out_ WIREGUARD_ADAPTER_STATE *State); + +#define WIREGUARD_KEY_LENGTH 32 + +typedef struct _WIREGUARD_ALLOWED_IP WIREGUARD_ALLOWED_IP; +struct ALIGNED(8) _WIREGUARD_ALLOWED_IP +{ + union + { + IN_ADDR V4; + IN6_ADDR V6; + } Address; /**< IP address */ + ADDRESS_FAMILY AddressFamily; /**< Address family, either AF_INET or AF_INET6 */ + BYTE Cidr; /**< CIDR of allowed IPs */ +}; + +typedef enum +{ + WIREGUARD_PEER_HAS_PUBLIC_KEY = 1 << 0, /**< The PublicKey field is set */ + WIREGUARD_PEER_HAS_PRESHARED_KEY = 1 << 1, /**< The PresharedKey field is set */ + WIREGUARD_PEER_HAS_PERSISTENT_KEEPALIVE = 1 << 2, /**< The PersistentKeepAlive field is set */ + WIREGUARD_PEER_HAS_ENDPOINT = 1 << 3, /**< The Endpoint field is set */ + WIREGUARD_PEER_REPLACE_ALLOWED_IPS = 1 << 5, /**< Remove all allowed IPs before adding new ones */ + WIREGUARD_PEER_REMOVE = 1 << 6, /**< Remove specified peer */ + WIREGUARD_PEER_UPDATE = 1 << 7 /**< Do not add a new peer */ +} WIREGUARD_PEER_FLAG; + +typedef struct _WIREGUARD_PEER WIREGUARD_PEER; +struct ALIGNED(8) _WIREGUARD_PEER +{ + WIREGUARD_PEER_FLAG Flags; /**< Bitwise combination of flags */ + DWORD Reserved; /**< Reserved; must be zero */ + BYTE PublicKey[WIREGUARD_KEY_LENGTH]; /**< Public key, the peer's primary identifier */ + BYTE PresharedKey[WIREGUARD_KEY_LENGTH]; /**< Preshared key for additional layer of post-quantum resistance */ + WORD PersistentKeepalive; /**< Seconds interval, or 0 to disable */ + SOCKADDR_INET Endpoint; /**< Endpoint, with IP address and UDP port number*/ + DWORD64 TxBytes; /**< Number of bytes transmitted */ + DWORD64 RxBytes; /**< Number of bytes received */ + DWORD64 LastHandshake; /**< Time of the last handshake, in 100ns intervals since 1601-01-01 UTC */ + DWORD AllowedIPsCount; /**< Number of allowed IP structs following this struct */ +}; + +typedef enum +{ + WIREGUARD_INTERFACE_HAS_PUBLIC_KEY = (1 << 0), /**< The PublicKey field is set */ + WIREGUARD_INTERFACE_HAS_PRIVATE_KEY = (1 << 1), /**< The PrivateKey field is set */ + WIREGUARD_INTERFACE_HAS_LISTEN_PORT = (1 << 2), /**< The ListenPort field is set */ + WIREGUARD_INTERFACE_REPLACE_PEERS = (1 << 3) /**< Remove all peers before adding new ones */ +} WIREGUARD_INTERFACE_FLAG; + +typedef struct _WIREGUARD_INTERFACE WIREGUARD_INTERFACE; +struct ALIGNED(8) _WIREGUARD_INTERFACE +{ + WIREGUARD_INTERFACE_FLAG Flags; /**< Bitwise combination of flags */ + WORD ListenPort; /**< Port for UDP listen socket, or 0 to choose randomly */ + BYTE PrivateKey[WIREGUARD_KEY_LENGTH]; /**< Private key of interface */ + BYTE PublicKey[WIREGUARD_KEY_LENGTH]; /**< Corresponding public key of private key */ + DWORD PeersCount; /**< Number of peer structs following this struct */ +}; + +/** + * Sets the configuration of the WireGuard adapter. + * + * @param Adapter Adapter handle obtained with WireGuardCreateAdapter or WireGuardOpenAdapter + * + * @param Config Configuration for the adapter. + * + * @param Bytes Number of bytes in Config allocation. + * + * @return If the function succeeds, the return value is nonzero. If the function fails, the return value is zero. To + * get extended error information, call GetLastError. + */ +typedef _Return_type_success_(return != FALSE) +BOOL(WINAPI WIREGUARD_SET_CONFIGURATION_FUNC) +(_In_ WIREGUARD_ADAPTER_HANDLE Adapter, _In_reads_bytes_(Bytes) const WIREGUARD_INTERFACE *Config, _In_ DWORD Bytes); + +/** + * Gets the configuration of the WireGuard adapter. + * + * @param Adapter Adapter handle obtained with WireGuardCreateAdapter or WireGuardOpenAdapter + * + * @param Config Configuration for the adapter. + * + * @param Bytes Pointer to number of bytes in Config allocation. + * + * @return If the function succeeds, the return value is nonzero. If the function fails, the return value is zero. To + * get extended error information, call GetLastError, which if ERROR_MORE_DATA, Bytes is updated with the + * required size. + */ +typedef _Must_inspect_result_ +_Return_type_success_(return != FALSE) +BOOL(WINAPI WIREGUARD_GET_CONFIGURATION_FUNC) +(_In_ WIREGUARD_ADAPTER_HANDLE Adapter, + _Out_writes_bytes_all_(*Bytes) WIREGUARD_INTERFACE *Config, + _Inout_ DWORD *Bytes); + +#pragma warning(pop) + +#ifdef __cplusplus +} +#endif diff --git a/NetTunnelSDK/depends/WireGuardNT/x86/wireguard.dll b/NetTunnelSDK/depends/WireGuardNT/x86/wireguard.dll new file mode 100644 index 0000000..ecca024 Binary files /dev/null and b/NetTunnelSDK/depends/WireGuardNT/x86/wireguard.dll differ diff --git a/NetTunnelSDK/depends/tunnel/amd64/tunnel.dll b/NetTunnelSDK/depends/tunnel/amd64/tunnel.dll new file mode 100644 index 0000000..4db0441 Binary files /dev/null and b/NetTunnelSDK/depends/tunnel/amd64/tunnel.dll differ diff --git a/NetTunnelSDK/depends/tunnel/arm64/tunnel.dll b/NetTunnelSDK/depends/tunnel/arm64/tunnel.dll new file mode 100644 index 0000000..96ddae2 Binary files /dev/null and b/NetTunnelSDK/depends/tunnel/arm64/tunnel.dll differ diff --git a/NetTunnelSDK/depends/tunnel/x86/tunnel.dll b/NetTunnelSDK/depends/tunnel/x86/tunnel.dll new file mode 100644 index 0000000..4adcac3 Binary files /dev/null and b/NetTunnelSDK/depends/tunnel/x86/tunnel.dll differ diff --git a/NetTunnelSDK/AIGCJson.hpp b/NetTunnelSDK/include/AIGCJson.hpp similarity index 100% rename from NetTunnelSDK/AIGCJson.hpp rename to NetTunnelSDK/include/AIGCJson.hpp diff --git a/NetTunnelSDK/ProtocolBase.h b/NetTunnelSDK/include/ProtocolBase.h similarity index 100% rename from NetTunnelSDK/ProtocolBase.h rename to NetTunnelSDK/include/ProtocolBase.h diff --git a/NetTunnelSDK/common.h b/NetTunnelSDK/include/common.h similarity index 100% rename from NetTunnelSDK/common.h rename to NetTunnelSDK/include/common.h diff --git a/NetTunnelSDK/framework.h b/NetTunnelSDK/include/framework.h similarity index 100% rename from NetTunnelSDK/framework.h rename to NetTunnelSDK/include/framework.h diff --git a/NetTunnelSDK/globalcfg.h b/NetTunnelSDK/include/globalcfg.h similarity index 87% rename from NetTunnelSDK/globalcfg.h rename to NetTunnelSDK/include/globalcfg.h index 21258b1..590c497 100644 --- a/NetTunnelSDK/globalcfg.h +++ b/NetTunnelSDK/include/globalcfg.h @@ -2,6 +2,8 @@ #include #include "common.h" +#include + #if 0 /** * @brief WireGuard 配置项 @@ -67,6 +69,19 @@ typedef struct { USER_SERVER_CONFIG svrConfig; ///< 用户服务端配置 } USER_CONFIG, *PUSER_CONFIG; +typedef struct { + TCHAR targetIp[MAX_IP_LEN]; + UINT16 targetPort; + UINT16 proxyPort; + UINT16 scgGwPort; + TCHAR scgIpAddr[MAX_IP_LEN]; + SOCKET udpProxySock; + SOCKET scgGwSock; + HANDLE hProxyTunnelThread; + HANDLE hProxySCGThread; + bool exitNow; +} SCG_PROXY_INFO, *PSCG_PROXY_INFO; + /** * @brief SDK 全局配置项 */ @@ -76,16 +91,16 @@ typedef struct { TCHAR systemDirectory[MAX_PATH]; ///< 操作系统目录 TCHAR workDirectory[MAX_PATH]; ///< SDK 当前工作目录 bool isWorkServer; ///< SDK 当前模式 客户端/服务端 - bool usedSCGProxy; ///< 是否启动 SCG 代理 + //int scgProxyPort; ///< SCG 代理端口, >0 启动 SCG代理,<=0 关闭SCG代理 PROTO_CRYPTO_TYPE proCryptoType; ///< 协议加密类型 TCHAR proKeyBuf[256]; ///< 协议加密秘钥 BOOL enableLog; ///< 是否启用日志 spdlog::level::level_enum logLevel; ///< 日志等级 TCHAR cfgPath[MAX_PATH]; ///< 配置文件路径 - //WIREGUARD_CFG wireguardCfg; ///< wireguard 配置项 @see WIREGUARD_CFG WGINTERFACE_CFG wgServerCfg; ///< wireguard 服务端网络接口配置 WGINTERFACE_CFG wgClientCfg; ///< wireguard 客户端网络接口配置 USER_CONFIG userCfg; ///< 用户配置项 + SCG_PROXY_INFO scgProxy; ///< SCG UDP 代理信息 int curConnVmId; ///< 当前连接的VM } SDK_CONFIG, *PSDK_CONFIG; diff --git a/NetTunnelSDK/httplib.h b/NetTunnelSDK/include/httplib.h similarity index 100% rename from NetTunnelSDK/httplib.h rename to NetTunnelSDK/include/httplib.h diff --git a/NetTunnelSDK/misc.h b/NetTunnelSDK/include/misc.h similarity index 96% rename from NetTunnelSDK/misc.h rename to NetTunnelSDK/include/misc.h index d6cbea7..3e536b4 100644 --- a/NetTunnelSDK/misc.h +++ b/NetTunnelSDK/include/misc.h @@ -108,6 +108,12 @@ int GetIpV4InfoFromNetmask(const TCHAR *pIpStr, const TCHAR *pNetmask, PIP_INFO int GetIpV4InfoFromCIDR(const TCHAR *pIpStr, PIP_INFO pInfo); int GetIpV4InfoFromHostname(int family, const char *host, PIP_INFO pInfo); + +int InitializeWireGuardLibrary(); +void UnInitializeWireGuardLibrary(); + +void StopUDPProxyServer(); +int CreateUDPProxyServer(); #ifdef __cplusplus } #endif \ No newline at end of file diff --git a/NetTunnelSDK/network.h b/NetTunnelSDK/include/network.h similarity index 99% rename from NetTunnelSDK/network.h rename to NetTunnelSDK/include/network.h index e500875..875e671 100644 --- a/NetTunnelSDK/network.h +++ b/NetTunnelSDK/include/network.h @@ -247,7 +247,7 @@ TUNNEL_API int __cdecl RemoveNATRule(const TCHAR *pInterfaceName); * - ERR_SUCCESS 成功 */ TUNNEL_API int __cdecl SetInterfaceIpAddress(const TCHAR *pInterfaceName, const TCHAR *pIpaddr, const TCHAR *pNetmask); -TUNNEL_API int __cdecl CreatePorxyService(); + #if 0 /** * @brief 获取Windows Hyper-V 虚拟机状态, 必须开启后才能开启NAT转发功能 diff --git a/NetTunnelSDK/pch.h b/NetTunnelSDK/include/pch.h similarity index 100% rename from NetTunnelSDK/pch.h rename to NetTunnelSDK/include/pch.h diff --git a/NetTunnelSDK/protocol.h b/NetTunnelSDK/include/protocol.h similarity index 100% rename from NetTunnelSDK/protocol.h rename to NetTunnelSDK/include/protocol.h diff --git a/NetTunnelSDK/resource.h b/NetTunnelSDK/include/resource.h similarity index 100% rename from NetTunnelSDK/resource.h rename to NetTunnelSDK/include/resource.h diff --git a/NetTunnelSDK/tunnel.h b/NetTunnelSDK/include/tunnel.h similarity index 82% rename from NetTunnelSDK/tunnel.h rename to NetTunnelSDK/include/tunnel.h index 906c9bd..1dd5f15 100644 --- a/NetTunnelSDK/tunnel.h +++ b/NetTunnelSDK/include/tunnel.h @@ -109,19 +109,6 @@ TUNNEL_API int __cdecl SetProtocolEncryptType(const PROTO_CRYPTO_TYPE type, cons */ TUNNEL_API void __cdecl TunnelLogEnable(bool enLog); -/** - * @brief 创建 WireGuard 密钥对 - * @param[out] pPubKey 公钥缓冲区 - * @param[in] pubkeySize 公钥缓冲区大小(字节数) - * @param[out] pPrivKey 私钥缓冲区 - * @param[in] privKeySize 私钥缓冲区大小(字节数) - * @return 函数执行结果 0: 成功, 小于0 失败 @see USER_ERRNO - * - -ERR_ITEM_UNEXISTS WireGuard 未配置或未安装 - * - -ERR_CALL_SHELL 调用操作系统命令行工具失败 - * - ERR_SUCCESS 成功 - */ -TUNNEL_API int __cdecl GenerateWireguardKeyPairs(TCHAR *pPubKey, int pubkeySize, TCHAR *pPrivKey, int privKeySize); - /** * @brief 创建 WireGuard 服务端配置文件 * @param[in] pWgConfig 配置文件相关配置项 @see WGSERVER_CONFIG @@ -175,6 +162,7 @@ TUNNEL_API int __cdecl CreateWireGuardService(const TCHAR *pInterfaceName, const */ TUNNEL_API int __cdecl GetWireGuardServiceStatus(const TCHAR *pTunnelName, bool *pIsRunning); +TUNNEL_API int __cdecl GetWireGuradTunnelInfo(const TCHAR *pTunnelName); /** * @brief 移除 WireGuard 隧道服务 * @param pTunnelName 隧道服务名 @@ -264,14 +252,19 @@ TUNNEL_API void __cdecl TunnelSDKUnInit(); /** * @brief SCG 代理服务开关 * @param isEnable TRUE: 启动 SCG 代理, FALSE: 禁用 SCG 代理 + * @param pSCGIpAddr SCG 代理 IP + * @param scgPort SCG 代理端口 + * @return 0: 成功, 小于0 失败 @see USER_ERRNO + * - -ERR_INPUT_PARAMS 输入参数错误 + * - ERR_SUCCESS 成功 */ -TUNNEL_API void __cdecl EnableSCGProxy(bool isEnable); +TUNNEL_API int __cdecl EnableSCGProxy(bool isEnable, const TCHAR* pSCGIpAddr, int scgPort); /** * @brief 获取当前 SCG 代理服务状态 * @return TRUE: SCG 代理启动, FALSE: SCG 代理禁用 */ -TUNNEL_API bool __cdecl GetSCGProxyStatus(); +TUNNEL_API bool __cdecl UsedSCGProxy(); /** * @brief 计算文件 Hash @@ -291,48 +284,6 @@ TUNNEL_API bool __cdecl GetSCGProxyStatus(); */ TUNNEL_API int __cdecl CalcFileHash(const HASH_TYPE type, const TCHAR *pPath, TCHAR outHash[]); -//+++++++++++++++++++++++++++++++++++++++++Temp Interface - -//TUNNEL_API int __cdecl ProtoGetUserConfigure(const TCHAR *pUser, const TCHAR *pToken); -//TUNNEL_API const TCHAR* __cdecl GetInterfaceGUIDByName(const TCHAR *pInterfaceName, GUID* pGuid); -//------------------------------------------End Temp Interface -#if 0 -/** - * @brief 安装 Windows NAT 自定义 PowerShell 命令 - * @return 0: 成功, 小于0 失败 @see USER_ERRNO - * - -ERR_INPUT_PARAMS 输入参数错误 - * - -ERR_OPEN_FILE 打开文件失败 - * - -ERR_MEMORY_STR 字符串处理 - * - -ERR_ITEM_UNEXISTS 资源不存在 - * - -ERR_CALL_SHELL 调用系统命令行失败 - * - ERR_SUCCESS 成功 - */ -TUNNEL_API int __cdecl InstallWindowsNATCommand(); -TUNNEL_API int __cdecl WireGuardNetConnectionSharingEnable(); - - -/** - * @brief 查找 WireGuard 运行环境 - * @param[out] pFullPath wireguard.exe 程序路径 - * @param[in] maxSize pFullPath 缓冲区最大字节数 - * @return 函数执行结果 0: 成功, 小于0 失败 @see USER_ERRNO - * - -ERR_INPUT_PARAMS 输入参数错误 - * - -ERR_MALLOC_MEMORY 分配内存失败 - * - -ERR_FILE_NOT_EXISTS 文件不存在 - * - ERR_SUCCESS 成功 - */ -TUNNEL_API int __cdecl FindWireguardExe(TCHAR *pFullPath, int maxSize); - -/** - * @brief 设置 wireguard.exe 程序路径 - * @param[in] pPath wireguard.exe 程序路径 - * @return 函数执行结果 0: 成功, 小于0 失败 @see USER_ERRNO - * - -ERR_INPUT_PARAMS 输入参数错误 - * - -ERR_ITEM_UNEXISTS 文件不存在 - * - ERR_SUCCESS 成功 - */ -TUNNEL_API int __cdecl SetWireguardPath(const TCHAR *pPath); -#endif #ifdef __cplusplus } #endif \ No newline at end of file diff --git a/NetTunnelSDK/user.h b/NetTunnelSDK/include/user.h similarity index 100% rename from NetTunnelSDK/user.h rename to NetTunnelSDK/include/user.h diff --git a/NetTunnelSDK/usrerr.h b/NetTunnelSDK/include/usrerr.h similarity index 96% rename from NetTunnelSDK/usrerr.h rename to NetTunnelSDK/include/usrerr.h index 937ec33..27ef62e 100644 --- a/NetTunnelSDK/usrerr.h +++ b/NetTunnelSDK/include/usrerr.h @@ -12,6 +12,8 @@ enum USER_ERRNO { ERR_ITEM_UNEXISTS, ///< 该内容不存在 ERR_SYS_INIT, ///< 系统中断 ERR_SYS_CALL, ///< 系统调用 + ERR_LOAD_LIBRARY, ///< 加载系统库失败 + ERR_MAP_LIBRARY, ///< 加载系统库接口失败 ERR_SYS_TIMEOUT, ///< 系统超时 ERR_SYSTEM_UNINITIALIZE, ///< 系统未初始化 ERR_CREATE_FILE, ///< 创建文件/目录失败 diff --git a/NetTunnelSDK/ipcalc.cpp b/NetTunnelSDK/misc/ipcalc.cpp similarity index 98% rename from NetTunnelSDK/ipcalc.cpp rename to NetTunnelSDK/misc/ipcalc.cpp index 0646068..6bc6646 100644 --- a/NetTunnelSDK/ipcalc.cpp +++ b/NetTunnelSDK/misc/ipcalc.cpp @@ -439,7 +439,7 @@ int GetIpV4InfoFromCIDR(const TCHAR *pIpStr, PIP_INFO pInfo) { TCHAR *prefixStr; TCHAR *ipStr = _strdup(pIpStr); - if (pIpStr == nullptr || lstrlen(pIpStr) < MIN_IP_LEN) { + if (pIpStr == nullptr || lstrlen(pIpStr) < MIN_IP_LEN || lstrlen(pIpStr) >= MAX_IP_LEN) { SPDLOG_ERROR(TEXT("Input pIpStr format error: {}."), pIpStr); return -ERR_INPUT_PARAMS; } @@ -485,12 +485,12 @@ int GetIpV4InfoFromCIDR(const TCHAR *pIpStr, PIP_INFO pInfo) { int GetIpV4InfoFromNetmask(const TCHAR *pIpStr, const TCHAR *pNetmask, PIP_INFO pInfo) { int prefix; - if (pIpStr == nullptr || lstrlen(pIpStr) < MIN_IP_LEN) { + if (pIpStr == nullptr || lstrlen(pIpStr) < MIN_IP_LEN || lstrlen(pIpStr) >= MAX_IP_LEN) { SPDLOG_ERROR(TEXT("Input pIpStr format error: {}."), pIpStr); return -ERR_INPUT_PARAMS; } - if (pNetmask == nullptr || lstrlen(pNetmask) < MIN_IP_LEN) { + if (pNetmask == nullptr || lstrlen(pNetmask) < MIN_IP_LEN || lstrlen(pNetmask) >= MAX_IP_LEN) { SPDLOG_ERROR(TEXT("Input pNetmask format error: {}."), pNetmask); return -ERR_INPUT_PARAMS; } diff --git a/NetTunnelSDK/misc.cpp b/NetTunnelSDK/misc/misc.cpp similarity index 100% rename from NetTunnelSDK/misc.cpp rename to NetTunnelSDK/misc/misc.cpp diff --git a/NetTunnelSDK/ControlService.cpp b/NetTunnelSDK/network/ControlService.cpp similarity index 97% rename from NetTunnelSDK/ControlService.cpp rename to NetTunnelSDK/network/ControlService.cpp index b97da6b..a8d7049 100644 --- a/NetTunnelSDK/ControlService.cpp +++ b/NetTunnelSDK/network/ControlService.cpp @@ -204,7 +204,7 @@ int CreateControlService(PUSER_SERVER_CONFIG pSvr) { } } - if (isSvrStart) { + if (reqData.msgContent.isStart) { SPDLOG_INFO(TEXT("Tunnel Service Start Now: {0}"), GetGlobalCfgInfo()->userCfg.userName); } else { SPDLOG_INFO(TEXT("Tunnel Service Stoped: {0}"), GetGlobalCfgInfo()->userCfg.userName); @@ -270,16 +270,7 @@ int CreateControlService(PUSER_SERVER_CONFIG pSvr) { g_InterfaceMutex.unlock(); return; } -#if 0 - // 启动服务 - ret = WireGuardInstallDefaultServerService(true); - if (ret != ERR_SUCCESS) { - // 返回启动服务失败 - return; - } - // 设置路由表 -#endif // 返回当前隧道信息 rsp.msgContent.errCode = ERR_SUCCESS; rsp.msgContent.errMessage = TEXT("OK"); diff --git a/NetTunnelSDK/network/ProxyService.cpp b/NetTunnelSDK/network/ProxyService.cpp new file mode 100644 index 0000000..996ca08 --- /dev/null +++ b/NetTunnelSDK/network/ProxyService.cpp @@ -0,0 +1,241 @@ +#include "pch.h" + +#include +#include +#include "globalcfg.h" +#include "usrerr.h" +#include "misc.h" + +#include +#include + +typedef struct { + bool isRunning; + HANDLE proxyThread; + HANDLE proxyHandle; + bool isExitSvr; +} UDP_PROXY_CTX, *PUDP_PROXY_CTX; + +typedef struct { + TCHAR streamFilter[1024]; + TCHAR targetIp[MAX_IP_LEN]; + UINT16 targetPort; + int vmId; + int svrId; + UDP_PROXY_CTX udpCtx; +} PROXY_INFO, *PPROXY_INFO; + +void StopUDPProxyServer() { + const PSCG_PROXY_INFO pProxy = &GetGlobalCfgInfo()->scgProxy; + pProxy->exitNow = true; + + if (pProxy->hProxyTunnelThread) { + if (WaitForSingleObject(pProxy->hProxyTunnelThread, 10 * 1000) == WAIT_TIMEOUT) { + SPDLOG_ERROR(TEXT("Waitting HTTP Service clost timeout")); + } + + closesocket(pProxy->udpProxySock); + } + + if (pProxy->hProxySCGThread) { + if (WaitForSingleObject(pProxy->hProxySCGThread, 10 * 1000) == WAIT_TIMEOUT) { + SPDLOG_ERROR(TEXT("Waitting HTTP Service clost timeout")); + } + + closesocket(pProxy->scgGwSock); + } +} + +static DWORD UDPProxvRemoteThread(LPVOID lpParameter) { + const auto pPeerSock = static_cast(lpParameter); + const PSCG_PROXY_INFO pProxy = &GetGlobalCfgInfo()->scgProxy; + + while (pPeerSock && !pProxy->exitNow) { + sockaddr_in remoteWgAddr {}; + TCHAR ipAddr[MAX_IP_LEN]; + + int addrSize = sizeof(SOCKADDR); + char recvBuf[1500]; + int iRecvBytes; + + // 代理服务 In + iRecvBytes = recvfrom(pProxy->scgGwSock, + recvBuf, + 1500, + 0, + reinterpret_cast(&remoteWgAddr), + &addrSize); + + memset(ipAddr, 0, MAX_IP_LEN); + InetNtop(AF_INET, &remoteWgAddr.sin_addr.s_addr, ipAddr, MAX_IP_LEN); + SPDLOG_TRACE(TEXT(">>> Scoket In {1} Recv {0} bytes from {2}:{3}"), + iRecvBytes, + pProxy->scgGwSock, + ipAddr, + ntohs(remoteWgAddr.sin_port)); + + if (iRecvBytes != SOCKET_ERROR) { + int sendBytes = sendto(pProxy->udpProxySock, + recvBuf, + iRecvBytes, + 0, + reinterpret_cast(pPeerSock), + sizeof(SOCKADDR)); + memset(ipAddr, 0, MAX_IP_LEN); + InetNtop(AF_INET, &pPeerSock->sin_addr.s_addr, ipAddr, MAX_IP_LEN); + SPDLOG_TRACE(TEXT("<<< Scoket In Send {0} bytes to {2}:{3}"), + sendBytes, + pProxy->udpProxySock, + ipAddr, + ntohs(pPeerSock->sin_port)); + } + + Sleep(100); + } + return 0; +} + +static DWORD UDPProxyRecvThread(LPVOID lpParameter) { + bool isRemoteInit = false; + sockaddr_in localWgAddr {}; + sockaddr_in scgAddr {}; + const PSCG_PROXY_INFO pProxy = &GetGlobalCfgInfo()->scgProxy; + pProxy->exitNow = false; + + scgAddr.sin_family = AF_INET; + scgAddr.sin_port = htons(pProxy->scgGwPort); + InetPton(AF_INET, pProxy->scgIpAddr, &scgAddr.sin_addr.s_addr); + + while (!pProxy->exitNow) { + TCHAR ipAddr[MAX_IP_LEN]; + int addrSize = sizeof(SOCKADDR); + char recvBuf[1500]; + int iRecvBytes; + + // 代理服务 Out + iRecvBytes = recvfrom(pProxy->udpProxySock, + recvBuf, + 1500, + 0, + reinterpret_cast(&localWgAddr), + &addrSize); + + InetNtop(AF_INET, &localWgAddr.sin_addr.s_addr, ipAddr, MAX_IP_LEN); + SPDLOG_TRACE(TEXT(">>> Scoket Out {1} Recv {0} bytes from {2}:{3}"), + iRecvBytes, + pProxy->udpProxySock, + ipAddr, + ntohs(localWgAddr.sin_port)); + + if (iRecvBytes != SOCKET_ERROR) { + int sendBytes; + + if (!isRemoteInit) { + HANDLE handle; + isRemoteInit = true; + // 创建远端接收线程 + handle = CreateThread(nullptr, // Thread attributes + 0, // Stack size (0 = use default) + UDPProxvRemoteThread, // Thread start address + &localWgAddr, // Parameter to pass to the thread + 0, // Creation flags + nullptr); // Thread id + + if (handle == nullptr) { + SPDLOG_ERROR("Create Thread failed with error = {0}", GetLastError()); + closesocket(pProxy->udpProxySock); + closesocket(pProxy->scgGwSock); + pProxy->exitNow = true; + return -ERR_CREATE_THREAD; + } + + pProxy->hProxySCGThread = handle; + } + + sendBytes = sendto(pProxy->scgGwSock, + recvBuf, + iRecvBytes, + 0, + reinterpret_cast(&scgAddr), + sizeof(SOCKADDR)); + memset(ipAddr, 0, MAX_IP_LEN); + InetNtop(AF_INET, &scgAddr.sin_addr.s_addr, ipAddr, MAX_IP_LEN); + SPDLOG_TRACE(TEXT("<<< Scoket Out Send {0} bytes to {2}:{3}"), + sendBytes, + pProxy->scgGwSock, + ipAddr, + ntohs(scgAddr.sin_port)); + } + + Sleep(100); + } + return 0; +} + +int CreateUDPProxyServer() { + HANDLE handle; + int ret; + int addrSize = sizeof(sockaddr_in); + sockaddr_in server {}; + sockaddr_in bindAddr {}; + SOCKET sock; + const PSCG_PROXY_INFO pProxy = &GetGlobalCfgInfo()->scgProxy; + + // 创建本地 SOCKET 代理服务器 + sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); + if (sock == INVALID_SOCKET) { + SPDLOG_ERROR("Create UDP Socket failed with error = {0}", WSAGetLastError()); + return -ERR_SOCKET_CREATE; + } + + server.sin_family = AF_INET; + server.sin_addr.s_addr = htonl(INADDR_ANY); + server.sin_port = htons(0); + + if (bind(sock, reinterpret_cast(&server), sizeof(SOCKADDR)) == SOCKET_ERROR) { + closesocket(sock); + SPDLOG_ERROR("Bind local UDP Socket failed with error = {0}", WSAGetLastError()); + return -ERR_SOCKET_BIND; + } + + if ((ret = getsockname(sock, reinterpret_cast(&bindAddr), &addrSize)) != 0) { + closesocket(sock); + SPDLOG_ERROR("Get UDP Socket bind port failed with error = {0}, {1}", WSAGetLastError(), ret); + return -ERR_SOCKET_BIND; + } + + // 保存 UDP 代理服务器信息 + pProxy->udpProxySock = sock; + pProxy->proxyPort = ntohs(bindAddr.sin_port); + + SPDLOG_DEBUG(TEXT("Proxy Server socket {0} bind {1} prot"), sock, pProxy->proxyPort); + + // 创建SCG SOCKET 连接客户端服务 + sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); + if (sock == INVALID_SOCKET) { + SPDLOG_ERROR("Create UDP Socket failed with error = {0}", WSAGetLastError()); + closesocket(pProxy->udpProxySock); + return -ERR_SOCKET_CREATE; + } + + pProxy->scgGwSock = sock; + + // 创建代理服务发送线程 + handle = CreateThread(nullptr, // Thread attributes + 0, // Stack size (0 = use default) + UDPProxyRecvThread, // Thread start address + nullptr, // Parameter to pass to the thread + 0, // Creation flags + nullptr); // Thread id + + if (handle == nullptr) { + SPDLOG_ERROR("Create Thread failed with error = {0}", GetLastError()); + closesocket(pProxy->udpProxySock); + closesocket(pProxy->scgGwSock); + return -ERR_CREATE_THREAD; + } + + pProxy->hProxyTunnelThread = handle; + + return ERR_SUCCESS; +} \ No newline at end of file diff --git a/NetTunnelSDK/network.cpp b/NetTunnelSDK/network/network.cpp similarity index 100% rename from NetTunnelSDK/network.cpp rename to NetTunnelSDK/network/network.cpp diff --git a/NetTunnelSDK/protocol.cpp b/NetTunnelSDK/protocol/protocol.cpp similarity index 74% rename from NetTunnelSDK/protocol.cpp rename to NetTunnelSDK/protocol/protocol.cpp index c9585a8..5d6bf15 100644 --- a/NetTunnelSDK/protocol.cpp +++ b/NetTunnelSDK/protocol/protocol.cpp @@ -15,25 +15,58 @@ static httplib::Client *g_httpCtx = nullptr; static httplib::Client *g_tunnelHttpCtx = nullptr; int InitControlServer(const TCHAR *pUserSvrUrl) { - const PUSER_CONFIG pUser = &GetGlobalCfgInfo()->userCfg; - PUSER_SERVER_CONFIG pUserCfg = &pUser->svrConfig; if (g_tunnelHttpCtx) { delete g_tunnelHttpCtx; g_tunnelHttpCtx = nullptr; } - g_tunnelHttpCtx = new httplib::Client(pUserSvrUrl); + if (GetGlobalCfgInfo()->scgProxy.scgGwPort > 0) { + TCHAR scgProxyUrl[MAX_PATH]; + StringCbPrintf(scgProxyUrl, MAX_PATH, TEXT("http://127.0.0.1:%d"), GetGlobalCfgInfo()->scgProxy.scgGwPort); + g_tunnelHttpCtx = new httplib::Client(pUserSvrUrl); + } else { + g_tunnelHttpCtx = new httplib::Client(pUserSvrUrl); + } if (g_tunnelHttpCtx) { g_tunnelHttpCtx->set_connection_timeout(0, 1000000); // 1 second g_tunnelHttpCtx->set_read_timeout(5, 0); // 5 seconds g_tunnelHttpCtx->set_write_timeout(5, 0); // 5 seconds g_tunnelHttpCtx->set_post_connect_cb([](socket_t sock) { - SPDLOG_DEBUG(TEXT("Service Connected: {0}"), sock); + if (UsedSCGProxy()) { + int ret; + unsigned char vmid[4]; + const unsigned int id = htonl(GetGlobalCfgInfo()->curConnVmId); + unsigned char scgProxy[] = {0x01, // VERSION + 0x09, // Length + 0xF0, // ++++++ INFO[0] TYPE + 0x04, // INFO[0] LENGTH + 0, // INFO[0] VMID[0] + 0, // INFO[0] VMID[1] + 0, // INFO[0] VMID[2] + 0, // INFO[0] VMID[3] + 0xF1, // INFO[1] TYPE + 0x01, // INFO[1] LENGTH + 0x07}; // ------ INFO[1] SCG Service ID - // TODO Send SCG Message - // send(sock, ..... GetGlobalCfgInfo()->curConnVmId + unsigned char *p = scgProxy; + + memcpy(vmid, &id, 4); + scgProxy[4] = vmid[0]; + scgProxy[5] = vmid[1]; + scgProxy[6] = vmid[2]; + scgProxy[7] = vmid[3]; + + ret = send(sock, reinterpret_cast(p), sizeof(scgProxy), 0); + + while (ret < static_cast(sizeof(scgProxy))) { + p += ret; + ret += send(sock, reinterpret_cast(p), sizeof(scgProxy), 0); + } + + SPDLOG_DEBUG(TEXT("Service Connected To SCG Server: {0}"), sock); + } }); } diff --git a/NetTunnelSDK/WireguardService.cpp b/NetTunnelSDK/tunnel/WireGuardService.cpp similarity index 74% rename from NetTunnelSDK/WireguardService.cpp rename to NetTunnelSDK/tunnel/WireGuardService.cpp index 5b7e085..8ab9a33 100644 --- a/NetTunnelSDK/WireguardService.cpp +++ b/NetTunnelSDK/tunnel/WireGuardService.cpp @@ -2,11 +2,95 @@ #include "usrerr.h" #include "globalcfg.h" #include "tunnel.h" +#include "wireguard.h" +#include "misc.h" #include #include #include +static WIREGUARD_CREATE_ADAPTER_FUNC *WireGuardCreateAdapter; +static WIREGUARD_OPEN_ADAPTER_FUNC *WireGuardOpenAdapter; +static WIREGUARD_CLOSE_ADAPTER_FUNC *WireGuardCloseAdapter; +static WIREGUARD_GET_ADAPTER_LUID_FUNC *WireGuardGetAdapterLUID; +static WIREGUARD_GET_RUNNING_DRIVER_VERSION_FUNC *WireGuardGetRunningDriverVersion; +static WIREGUARD_DELETE_DRIVER_FUNC *WireGuardDeleteDriver; +static WIREGUARD_SET_LOGGER_FUNC *WireGuardSetLogger; +static WIREGUARD_SET_ADAPTER_LOGGING_FUNC *WireGuardSetAdapterLogging; +static WIREGUARD_GET_ADAPTER_STATE_FUNC *WireGuardGetAdapterState; +static WIREGUARD_SET_ADAPTER_STATE_FUNC *WireGuardSetAdapterState; +static WIREGUARD_GET_CONFIGURATION_FUNC *WireGuardGetConfiguration; +static WIREGUARD_SET_CONFIGURATION_FUNC *WireGuardSetConfiguration; + +typedef struct { + WIREGUARD_INTERFACE Interface; + WIREGUARD_PEER RemoteServer; + WIREGUARD_ALLOWED_IP Allow1; + WIREGUARD_ALLOWED_IP Allow2; +} WG_CONFIG_INFO; + +static HMODULE g_WireGarudModule; + +int InitializeWireGuardLibrary() { + TCHAR dllPath[MAX_PATH]; + + StringCbPrintf(dllPath, MAX_PATH, TEXT("%s\\wireguard.dll"), GetGlobalCfgInfo()->workDirectory); + if(!PathFileExists(dllPath)) { + SPDLOG_ERROR(TEXT("WireGuard DLL Not Found: {0}"), dllPath); + return -ERR_ITEM_UNEXISTS; + } + + g_WireGarudModule = LoadLibraryEx(dllPath, + nullptr, + LOAD_LIBRARY_SEARCH_APPLICATION_DIR | LOAD_LIBRARY_SEARCH_SYSTEM32); + if (!g_WireGarudModule) { + DWORD errCode = GetLastError(); + SPDLOG_ERROR(TEXT("LoadLibraryEx WireGuard DLL error: {0}"), errCode); + return -ERR_LOAD_LIBRARY; + } +#define X(Name) ((*(FARPROC *)&(Name) = GetProcAddress(g_WireGarudModule, #Name)) == nullptr) + if (X(WireGuardCreateAdapter) || X(WireGuardOpenAdapter) || X(WireGuardCloseAdapter) || + X(WireGuardGetAdapterLUID) || X(WireGuardGetRunningDriverVersion) || X(WireGuardDeleteDriver) || + X(WireGuardSetLogger) || X(WireGuardSetAdapterLogging) || X(WireGuardGetAdapterState) || + X(WireGuardSetAdapterState) || X(WireGuardGetConfiguration) || X(WireGuardSetConfiguration)) +#undef X + { + SPDLOG_ERROR(TEXT("Map WireGuard DLL EntryPoint error: {0}"), GetLastError()); + FreeLibrary(g_WireGarudModule); + return -ERR_MAP_LIBRARY; + } + return ERR_SUCCESS; +} + +void UnInitializeWireGuardLibrary() { + if (g_WireGarudModule) { + FreeLibrary(g_WireGarudModule); + } +} + +int GetWireGuradTunnelInfo(const TCHAR *pTunnelName) { + WIREGUARD_ADAPTER_HANDLE Adapter; + int ret; + WCHAR wstrName[MAX_PATH]; + + if ((ret = TCharToWideChar(pTunnelName, wstrName, MAX_PATH)) != ERR_SUCCESS) { + return ret; + } + + Adapter = WireGuardOpenAdapter(wstrName); + + if (Adapter) { + WG_CONFIG_INFO config; + + DWORD Bytes = sizeof(WG_CONFIG_INFO); + if (!WireGuardGetConfiguration(Adapter, &config.Interface, &Bytes)) { + SPDLOG_ERROR("Failed to get configuration: {0}", GetLastError()); + } + } + + return ERR_SUCCESS; +} + int GetWireGuardServiceStatus(const TCHAR *pTunnelName, bool *pIsRunning) { SC_HANDLE schSCManager; SC_HANDLE schService; diff --git a/NetTunnelSDK/tunnel.cpp b/NetTunnelSDK/tunnel/tunnel.cpp similarity index 88% rename from NetTunnelSDK/tunnel.cpp rename to NetTunnelSDK/tunnel/tunnel.cpp index c828649..d9e3236 100644 --- a/NetTunnelSDK/tunnel.cpp +++ b/NetTunnelSDK/tunnel/tunnel.cpp @@ -14,7 +14,7 @@ #include "user.h" #include -#include +#include #pragma comment(lib, "Dbghelp.lib") @@ -94,7 +94,9 @@ int TunnelSDKInitEnv(const TCHAR *pWorkDir, const TCHAR *pLogFile, LOG_LEVEL level, bool isWorkServer) { - size_t length; + int ret; + size_t length; + WSADATA WsaData; CoInitialize(nullptr); CoInitializeSecurity(nullptr, @@ -106,11 +108,12 @@ int TunnelSDKInitEnv(const TCHAR *pWorkDir, nullptr, EOAC_NONE, nullptr); + WSAStartup(MAKEWORD(2, 2), &WsaData); memset(&g_globalConfig, 0, sizeof(SDK_CONFIG)); - g_globalConfig.isWorkServer = isWorkServer; - g_globalConfig.usedSCGProxy = false; + g_globalConfig.isWorkServer = isWorkServer; + g_globalConfig.scgProxy.scgGwPort = 0; if (pWorkDir == nullptr) { // 获取当前文件默认路径 @@ -156,6 +159,10 @@ int TunnelSDKInitEnv(const TCHAR *pWorkDir, StringCbPrintf(g_globalConfig.cfgPath, MAX_PATH, TEXT("%s\\%s"), g_globalConfig.workDirectory, CONFIG_FILE_NAME); + if ((ret = InitializeWireGuardLibrary()) == ERR_SUCCESS) { + return ret; + } + #if 0 if (FindWireguardExe(nullptr, 0) != ERR_SUCCESS) { SPDLOG_ERROR(TEXT("WireGuard not found, Please install WireGuard first or set the WireGuard Path.")); @@ -169,15 +176,40 @@ int TunnelSDKInitEnv(const TCHAR *pWorkDir, void TunnelSDKUnInit() { RemoteWireGuardControl(false); LocalWireGuardControl(false, false); + UnInitializeWireGuardLibrary(); CoFreeUnusedLibraries(); + WSACleanup(); } -void EnableSCGProxy(bool isEnable) { - g_globalConfig.usedSCGProxy = isEnable; +int EnableSCGProxy(bool isEnable, const TCHAR *pSCGIpAddr, int scgPort) { + + if (pSCGIpAddr == nullptr || lstrlen(pSCGIpAddr) == 0 || lstrlen(pSCGIpAddr) >= MAX_IP_LEN) { + SPDLOG_ERROR(TEXT("Input pInterfaceName params error: {0}"), pSCGIpAddr); + return -ERR_INPUT_PARAMS; + } + + memset(g_globalConfig.scgProxy.scgIpAddr, 0, MAX_IP_LEN); + + if (isEnable) { + IP_INFO ipInfo; + int ret; + if ((ret = GetIpV4InfoFromHostname(AF_INET, pSCGIpAddr, &ipInfo)) != ERR_SUCCESS) { + return ret; + } + + StringCbCopy(g_globalConfig.scgProxy.scgIpAddr, MAX_IP_LEN, ipInfo.hostip); + g_globalConfig.scgProxy.scgGwPort = static_cast(scgPort); + CreateUDPProxyServer(); + } else { + StopUDPProxyServer(); + g_globalConfig.scgProxy.scgGwPort = 0; + } + + return ERR_SUCCESS; } -bool GetSCGProxyStatus() { - return g_globalConfig.usedSCGProxy; +bool UsedSCGProxy() { + return (g_globalConfig.scgProxy.scgGwPort > 0); } void TunnelLogEnable(bool enLog) { diff --git a/NetTunnelSDK/wireguard.cpp b/NetTunnelSDK/tunnel/wireguard.cpp similarity index 89% rename from NetTunnelSDK/wireguard.cpp rename to NetTunnelSDK/tunnel/wireguard.cpp index cfbbd7f..7a594d8 100644 --- a/NetTunnelSDK/wireguard.cpp +++ b/NetTunnelSDK/tunnel/wireguard.cpp @@ -9,8 +9,6 @@ #include "misc.h" #include "network.h" -#define USED_EMBEDDED_WG (1) - #pragma comment(lib, "Shlwapi.lib") #pragma comment(lib, "Winmm.lib") @@ -53,38 +51,12 @@ int WireGuardInstallDefaultServerService(bool bInstall) { StringCbCopy(svrName, MAX_PATH, cfgVal); PathStripPath(svrName); PathRemoveExtension(svrName); - -#if USED_EMBEDDED_WG + if (bInstall) { ret = WireGuardInstallServerService(cfgVal); //CreateWireGuardService(svrName, cfgVal); } else { ret = RemoveGuardService(svrName, true); } -#else - if (bInstall) { - // 安装服务 - StringCbPrintf(cmdBuf, - MAX_PATH, - TEXT("\"%s\" /installtunnelservice \"%s\""), - GetGlobalCfgInfo()->wireguardCfg.wireguardPath, - cfgVal); - } else { - // 卸载服务 - - StringCbPrintf(cmdBuf, - MAX_PATH, - TEXT("\"%s\" /uninstalltunnelservice %s"), - GetGlobalCfgInfo()->wireguardCfg.wireguardPath, - svrName); - } - - if ((ret = RunCommand(cmdBuf, nullptr, 0, &retCode)) != ERR_SUCCESS) { - SPDLOG_ERROR(TEXT("Run command [{0}] error: {1}"), cmdBuf, ret); - return -ERR_CALL_SHELL; - } - - SPDLOG_DEBUG(TEXT("Run command [{0}]"), cmdBuf); -#endif if (bInstall && ret == ERR_SUCCESS) { int retry = 10; @@ -127,22 +99,6 @@ int WireGuardInstallServerService(const TCHAR *pTunnelCfgPath) { return ret; } -#if 0 - - // 安装服务 - StringCbPrintf(cmdBuf, - MAX_PATH, - TEXT("\"%s\" /installtunnelservice \"%s\""), - GetGlobalCfgInfo()->wireguardCfg.wireguardPath, - pTunnelCfgPath); - - if ((ret = RunCommand(cmdBuf, nullptr, 0, &retCode)) != ERR_SUCCESS) { - SPDLOG_ERROR(TEXT("Run command [{0}] error: {1}"), cmdBuf, ret); - return -ERR_CALL_SHELL; - } - - SPDLOG_DEBUG(TEXT("Run command [{0}]"), cmdBuf); -#endif return ERR_SUCCESS; } @@ -154,32 +110,12 @@ int WireGuardUnInstallServerService(const TCHAR *pTunnelName) { SPDLOG_ERROR(TEXT("Input pTunnelName params error")); return -ERR_INPUT_PARAMS; } - -#if 0 - StringCbCopy(svrName, MAX_PATH, pTunnelName); - PathStripPath(svrName); - PathRemoveExtension(svrName); -#endif - -#if USED_EMBEDDED_WG + if ((ret = RemoveGuardService(pTunnelName, true)) != ERR_SUCCESS) { SPDLOG_ERROR(TEXT("Stop WireGuard Service Error: {0}"), ret); return ret; } -#else - StringCbPrintf(cmdBuf, - MAX_PATH, - TEXT("\"%s\" /uninstalltunnelservice %s"), - GetGlobalCfgInfo()->wireguardCfg.wireguardPath, - svrName); - if ((ret = RunCommand(cmdBuf, nullptr, 0, &retCode)) != ERR_SUCCESS) { - SPDLOG_ERROR(TEXT("Run command [{0}] error: {1}"), cmdBuf, ret); - return -ERR_CALL_SHELL; - } - - SPDLOG_DEBUG(TEXT("Run command [{0}]"), cmdBuf); -#endif return ERR_SUCCESS; } @@ -213,39 +149,7 @@ int IsWireGuardServerInstalled(bool *pIsInstalled) { } int IsWireGuardServerRunning(const TCHAR *pIfName, bool *pIsRunning) { -#if USED_EMBEDDED_WG return GetWireGuardServiceStatus(pIfName, pIsRunning); -#else - int ret; - PNIC_CONTENT pInfo = nullptr; - int size = 0; - - if (pIfName == nullptr || lstrlen(pIfName) == 0) { - SPDLOG_ERROR(TEXT("Input pIfName params error")); - return -ERR_INPUT_PARAMS; - } - - if (pIsRunning == nullptr) { - SPDLOG_ERROR(TEXT("Input pIsRunning params error")); - return -ERR_INPUT_PARAMS; - } - - *pIsRunning = false; - - ret = GetAllNICInfo(&pInfo, &size); - if (ret != ERR_SUCCESS) { - return ret; - } - - for (int i = 0; i < size; i++) { - if (StrNCmp(pInfo[i].NetCardDescription, WG_NIC_DISCRIPT, lstrlen(WG_NIC_DISCRIPT)) == 0 && - StrCmp(pInfo[i].NetCardName, pIfName) == 0) { - *pIsRunning = true; - } - } - - return ret; -#endif } int WireGuardCreateClientConfig(const PWGCLIENT_CONFIG pWgConfig) { @@ -523,9 +427,21 @@ int WireGuardCreateServerConfig(const PWGSERVER_CONFIG pWgConfig) { return ERR_SUCCESS; } -// TODO: Change implement -int GenerateWireguardKeyPairs(TCHAR *pPubKey, int pubkeySize, TCHAR *pPrivKey, int privKeySize) { #if 0 + +/** + * @brief 创建 WireGuard 密钥对 + * @param[out] pPubKey 公钥缓冲区 + * @param[in] pubkeySize 公钥缓冲区大小(字节数) + * @param[out] pPrivKey 私钥缓冲区 + * @param[in] privKeySize 私钥缓冲区大小(字节数) + * @return 函数执行结果 0: 成功, 小于0 失败 @see USER_ERRNO + * - -ERR_ITEM_UNEXISTS WireGuard 未配置或未安装 + * - -ERR_CALL_SHELL 调用操作系统命令行工具失败 + * - ERR_SUCCESS 成功 + */ +int GenerateWireguardKeyPairs(TCHAR *pPubKey, int pubkeySize, TCHAR *pPrivKey, int privKeySize) { + int ret; DWORD retCode; TCHAR cmdBuffer[MAX_PATH]; @@ -565,11 +481,18 @@ int GenerateWireguardKeyPairs(TCHAR *pPubKey, int pubkeySize, TCHAR *pPrivKey, i StringCbCopy(pPubKey, pubkeySize, cmdResult); SPDLOG_DEBUG(TEXT("Run command [{0}] resutl \'{1}\'"), cmdBuffer, cmdResult); -#endif + return ERR_SUCCESS; } -#if 0 +/** + * @brief 设置 wireguard.exe 程序路径 + * @param[in] pPath wireguard.exe 程序路径 + * @return 函数执行结果 0: 成功, 小于0 失败 @see USER_ERRNO + * - -ERR_INPUT_PARAMS 输入参数错误 + * - -ERR_ITEM_UNEXISTS 文件不存在 + * - ERR_SUCCESS 成功 + */ int SetWireguardPath(const TCHAR *pPath) { if (pPath == nullptr) { return -ERR_INPUT_PARAMS; @@ -599,7 +522,16 @@ int SetWireguardPath(const TCHAR *pPath) { } } - +/** + * @brief 查找 WireGuard 运行环境 + * @param[out] pFullPath wireguard.exe 程序路径 + * @param[in] maxSize pFullPath 缓冲区最大字节数 + * @return 函数执行结果 0: 成功, 小于0 失败 @see USER_ERRNO + * - -ERR_INPUT_PARAMS 输入参数错误 + * - -ERR_MALLOC_MEMORY 分配内存失败 + * - -ERR_FILE_NOT_EXISTS 文件不存在 + * - ERR_SUCCESS 成功 + */ int FindWireguardExe(TCHAR *pFullPath, int maxSize) { TCHAR path[MAX_PATH]; TCHAR wireguardPath[MAX_PATH]; @@ -735,6 +667,16 @@ int FindWireguardExe(TCHAR *pFullPath, int maxSize) { return -ERR_FILE_NOT_EXISTS; } +/** + * @brief 安装 Windows NAT 自定义 PowerShell 命令 + * @return 0: 成功, 小于0 失败 @see USER_ERRNO + * - -ERR_INPUT_PARAMS 输入参数错误 + * - -ERR_OPEN_FILE 打开文件失败 + * - -ERR_MEMORY_STR 字符串处理 + * - -ERR_ITEM_UNEXISTS 资源不存在 + * - -ERR_CALL_SHELL 调用系统命令行失败 + * - ERR_SUCCESS 成功 + */ int InstallWindowsNATCommand() { TCHAR psCmdPath[MAX_PATH]; diff --git a/NetTunnelSDKTestApp/NetTunnelSDKTestApp.cpp b/NetTunnelSDKTestApp/NetTunnelSDKTestApp.cpp index 89e35d5..90b935b 100644 --- a/NetTunnelSDKTestApp/NetTunnelSDKTestApp.cpp +++ b/NetTunnelSDKTestApp/NetTunnelSDKTestApp.cpp @@ -1,13 +1,12 @@ // NetTunnelSDKTestApp.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 // +#include "globalcfg.h" + #include #include "common.h" #include "tunnel.h" - -#include "globalcfg.h" -#include "network.h" #include "user.h" #include "usrerr.h" diff --git a/NetTunnelSDKTestApp/NetTunnelSDKTestApp.vcxproj b/NetTunnelSDKTestApp/NetTunnelSDKTestApp.vcxproj index a9b41cb..f8ef14a 100644 --- a/NetTunnelSDKTestApp/NetTunnelSDKTestApp.vcxproj +++ b/NetTunnelSDKTestApp/NetTunnelSDKTestApp.vcxproj @@ -104,7 +104,7 @@ false _DEBUG;_CONSOLE;%(PreprocessorDefinitions) true - ../NetTunnelSDK;%(AdditionalIncludeDirectories) + ..\NetTunnelSDK\include;%(AdditionalIncludeDirectories) Default @@ -137,6 +137,7 @@ + diff --git a/NetTunnelSDKTestApp/NetTunnelSDKTestApp.vcxproj.filters b/NetTunnelSDKTestApp/NetTunnelSDKTestApp.vcxproj.filters index 05a12c0..e39897e 100644 --- a/NetTunnelSDKTestApp/NetTunnelSDKTestApp.vcxproj.filters +++ b/NetTunnelSDKTestApp/NetTunnelSDKTestApp.vcxproj.filters @@ -36,6 +36,9 @@ 源文件 + + 源文件 + diff --git a/NetTunnelSvr/NetTunnelSvr.cpp b/NetTunnelSvr/NetTunnelSvr.cpp index 0e1a7af..46ac145 100644 --- a/NetTunnelSvr/NetTunnelSvr.cpp +++ b/NetTunnelSvr/NetTunnelSvr.cpp @@ -57,7 +57,7 @@ static void LogToSystemEventLog(int wErrorType, int wCustumerCode, const TCHAR * } } -static HMODULE InitializeWireGuardNT(void) { +static HMODULE InitializeTunnelLibrary() { const HMODULE tunnel = LoadLibraryExW(L"tunnel.dll", nullptr, LOAD_LIBRARY_SEARCH_APPLICATION_DIR | LOAD_LIBRARY_SEARCH_SYSTEM32); @@ -85,7 +85,7 @@ int _tmain(int wargc, _TCHAR *wargv[]) { if (wargc == 3 && !wcscmp(wargv[1], L"/service")) { BOOL ret; - const HMODULE hModule = InitializeWireGuardNT(); + const HMODULE hModule = InitializeTunnelLibrary(); if (!hModule || !WireGuardTunnelService) { StringCbPrintf(tMsg, MAX_PATH, TEXT("Init WireGuardTunnelService Service Error: %d\n"), GetLastError()); diff --git a/TestNetTunnelSDK/TestNetTunnelSDK.cpp b/TestNetTunnelSDK/TestNetTunnelSDK.cpp index b371c1c..1c1fcad 100644 --- a/TestNetTunnelSDK/TestNetTunnelSDK.cpp +++ b/TestNetTunnelSDK/TestNetTunnelSDK.cpp @@ -1,12 +1,11 @@ #include "pch.h" #include "CppUnitTest.h" -#include "../NetTunnelSDK/tunnel.h" -#include "../NetTunnelSDK/usrerr.h" -#include "../NetTunnelSDK/misc.h" -#include "../NetTunnelSDK/globalcfg.h" -#include "../NetTunnelSDK/network.h" -#include "../NetTunnelSDK/user.h" -#include "../NetTunnelSDK/protocol.h" +#include "globalcfg.h" +#include "tunnel.h" +#include "usrerr.h" +#include "misc.h" +#include "network.h" +#include "user.h" #include @@ -35,7 +34,7 @@ TEST_MODULE_CLEANUP(ModuleCleanup) { TEST_CLASS(TestNetTunnelSDK) { public: const int RET_OK = ERR_SUCCESS; - + TEST_METHOD(TestRunPipeCmd) { #if 0 TCHAR buf[1024]; @@ -172,21 +171,20 @@ public: TEST_METHOD(TestGetInterfaceGUIDByName) { GUID guid; - + Assert::AreEqual(RET_OK, GetInterfaceGUIDByName(TEXT("admin"), &guid)); Assert::AreNotEqual(0, static_cast(guid.Data1)); //Assert::AreEqual(RET_OK, ProtoGetUserConfigure("admin", "asfdsafdladf083asldf+=")); } - TEST_METHOD(TestSetNATRule) { - Assert::AreEqual(RET_OK, SetNATRule(TEXT("admin"), TEXT("10.10.10.250/24"))); + TEST_METHOD(TestSetNATRule) { + Assert::AreEqual(RET_OK, SetNATRule(TEXT("admin"), TEXT("10.10.10.250/24"))); } TEST_METHOD(TestRemoveNATRule) { - Assert::AreEqual(RET_OK, RemoveNATRule(TEXT("admin"))); + Assert::AreEqual(RET_OK, RemoveNATRule(TEXT("admin"))); } - TEST_METHOD(TestGetInterfaceIfIndexByIpAddr) { ULONG index = -1; @@ -203,9 +201,23 @@ public: Assert::AreEqual(RET_OK, RemoteWireGuardControl(true)); Assert::AreEqual(RET_OK, LocalWireGuardControl(true, true)); + //EnableSCGProxy(true, 10000); + //Assert::AreEqual(RET_OK, RemoteWireGuardControl(false)); + //Assert::AreEqual(RET_OK, LocalWireGuardControl(false, false)); + } + + TEST_METHOD(TestClientProgressFree) { Assert::AreEqual(RET_OK, RemoteWireGuardControl(false)); Assert::AreEqual(RET_OK, LocalWireGuardControl(false, false)); } + + TEST_METHOD(TestGetWireGuradTunnelInfo) { + + Assert::AreEqual(RET_OK, GetWireGuradTunnelInfo(TEXT("admin"))); + + //Assert::AreEqual(RET_OK, RemoteWireGuardControl(false)); + //Assert::AreEqual(RET_OK, LocalWireGuardControl(false, false)); + } }; } \ No newline at end of file diff --git a/TestNetTunnelSDK/TestNetTunnelSDK.vcxproj b/TestNetTunnelSDK/TestNetTunnelSDK.vcxproj index d10b963..d0b9ad2 100644 --- a/TestNetTunnelSDK/TestNetTunnelSDK.vcxproj +++ b/TestNetTunnelSDK/TestNetTunnelSDK.vcxproj @@ -92,7 +92,7 @@ Use Level3 true - $(VCInstallDir)UnitTest\include;%(AdditionalIncludeDirectories) + ..\NetTunnelSDK\include;$(VCInstallDir)UnitTest\include;%(AdditionalIncludeDirectories) _DEBUG;%(PreprocessorDefinitions) true pch.h diff --git a/tunnel_windows.sln b/tunnel_windows.sln index 56abfaa..4021309 100644 --- a/tunnel_windows.sln +++ b/tunnel_windows.sln @@ -21,164 +21,254 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "NetTunnelSDKTestApp", "NetT {1584BAD4-DBEC-43D2-BC06-08C23F02489A} = {1584BAD4-DBEC-43D2-BC06-08C23F02489A} EndProjectSection EndProject -Project("{54435603-DBB4-11D2-8724-00A0C9A8B90C}") = "InstallTunnelSDK", "InstallTunnelSDK\InstallTunnelSDK.vdproj", "{FE91D4D0-29A6-4C58-874F-11F6AC1D50CD}" -EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "NetTunnelSvr", "NetTunnelSvr\NetTunnelSvr.vcxproj", "{0A2EEDAF-F4A8-41E0-A874-2F30D1EEB55E}" EndProject +Project("{54435603-DBB4-11D2-8724-00A0C9A8B90C}") = "InstallerSDK_amd64", "InstallerSDK_amd64\InstallerSDK_amd64.vdproj", "{709C9DD6-6B42-40A9-AA70-629274A75BAC}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug DLL|Any CPU = Debug DLL|Any CPU + Debug DLL|ARM = Debug DLL|ARM + Debug DLL|ARM64 = Debug DLL|ARM64 Debug DLL|x64 = Debug DLL|x64 Debug DLL|x86 = Debug DLL|x86 Debug|Any CPU = Debug|Any CPU + Debug|ARM = Debug|ARM + Debug|ARM64 = Debug|ARM64 Debug|x64 = Debug|x64 Debug|x86 = Debug|x86 Release DLL|Any CPU = Release DLL|Any CPU + Release DLL|ARM = Release DLL|ARM + Release DLL|ARM64 = Release DLL|ARM64 Release DLL|x64 = Release DLL|x64 Release DLL|x86 = Release DLL|x86 Release|Any CPU = Release|Any CPU + Release|ARM = Release|ARM + Release|ARM64 = Release|ARM64 Release|x64 = Release|x64 Release|x86 = Release|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {1584BAD4-DBEC-43D2-BC06-08C23F02489A}.Debug DLL|Any CPU.ActiveCfg = Debug|x64 {1584BAD4-DBEC-43D2-BC06-08C23F02489A}.Debug DLL|Any CPU.Build.0 = Debug|x64 + {1584BAD4-DBEC-43D2-BC06-08C23F02489A}.Debug DLL|ARM.ActiveCfg = Debug|x64 + {1584BAD4-DBEC-43D2-BC06-08C23F02489A}.Debug DLL|ARM.Build.0 = Debug|x64 + {1584BAD4-DBEC-43D2-BC06-08C23F02489A}.Debug DLL|ARM64.ActiveCfg = Debug|x64 + {1584BAD4-DBEC-43D2-BC06-08C23F02489A}.Debug DLL|ARM64.Build.0 = Debug|x64 {1584BAD4-DBEC-43D2-BC06-08C23F02489A}.Debug DLL|x64.ActiveCfg = Debug|x64 {1584BAD4-DBEC-43D2-BC06-08C23F02489A}.Debug DLL|x64.Build.0 = Debug|x64 {1584BAD4-DBEC-43D2-BC06-08C23F02489A}.Debug DLL|x86.ActiveCfg = Debug|Win32 {1584BAD4-DBEC-43D2-BC06-08C23F02489A}.Debug DLL|x86.Build.0 = Debug|Win32 {1584BAD4-DBEC-43D2-BC06-08C23F02489A}.Debug|Any CPU.ActiveCfg = Debug|x64 {1584BAD4-DBEC-43D2-BC06-08C23F02489A}.Debug|Any CPU.Build.0 = Debug|x64 + {1584BAD4-DBEC-43D2-BC06-08C23F02489A}.Debug|ARM.ActiveCfg = Debug|x64 + {1584BAD4-DBEC-43D2-BC06-08C23F02489A}.Debug|ARM.Build.0 = Debug|x64 + {1584BAD4-DBEC-43D2-BC06-08C23F02489A}.Debug|ARM64.ActiveCfg = Debug|x64 + {1584BAD4-DBEC-43D2-BC06-08C23F02489A}.Debug|ARM64.Build.0 = Debug|x64 {1584BAD4-DBEC-43D2-BC06-08C23F02489A}.Debug|x64.ActiveCfg = Debug|x64 {1584BAD4-DBEC-43D2-BC06-08C23F02489A}.Debug|x64.Build.0 = Debug|x64 {1584BAD4-DBEC-43D2-BC06-08C23F02489A}.Debug|x86.ActiveCfg = Debug|Win32 {1584BAD4-DBEC-43D2-BC06-08C23F02489A}.Debug|x86.Build.0 = Debug|Win32 {1584BAD4-DBEC-43D2-BC06-08C23F02489A}.Release DLL|Any CPU.ActiveCfg = Release|x64 {1584BAD4-DBEC-43D2-BC06-08C23F02489A}.Release DLL|Any CPU.Build.0 = Release|x64 + {1584BAD4-DBEC-43D2-BC06-08C23F02489A}.Release DLL|ARM.ActiveCfg = Release|x64 + {1584BAD4-DBEC-43D2-BC06-08C23F02489A}.Release DLL|ARM.Build.0 = Release|x64 + {1584BAD4-DBEC-43D2-BC06-08C23F02489A}.Release DLL|ARM64.ActiveCfg = Release|x64 + {1584BAD4-DBEC-43D2-BC06-08C23F02489A}.Release DLL|ARM64.Build.0 = Release|x64 {1584BAD4-DBEC-43D2-BC06-08C23F02489A}.Release DLL|x64.ActiveCfg = Release|x64 {1584BAD4-DBEC-43D2-BC06-08C23F02489A}.Release DLL|x64.Build.0 = Release|x64 {1584BAD4-DBEC-43D2-BC06-08C23F02489A}.Release DLL|x86.ActiveCfg = Release|Win32 {1584BAD4-DBEC-43D2-BC06-08C23F02489A}.Release DLL|x86.Build.0 = Release|Win32 {1584BAD4-DBEC-43D2-BC06-08C23F02489A}.Release|Any CPU.ActiveCfg = Release|x64 {1584BAD4-DBEC-43D2-BC06-08C23F02489A}.Release|Any CPU.Build.0 = Release|x64 + {1584BAD4-DBEC-43D2-BC06-08C23F02489A}.Release|ARM.ActiveCfg = Release|x64 + {1584BAD4-DBEC-43D2-BC06-08C23F02489A}.Release|ARM.Build.0 = Release|x64 + {1584BAD4-DBEC-43D2-BC06-08C23F02489A}.Release|ARM64.ActiveCfg = Release|x64 + {1584BAD4-DBEC-43D2-BC06-08C23F02489A}.Release|ARM64.Build.0 = Release|x64 {1584BAD4-DBEC-43D2-BC06-08C23F02489A}.Release|x64.ActiveCfg = Release|x64 {1584BAD4-DBEC-43D2-BC06-08C23F02489A}.Release|x64.Build.0 = Release|x64 {1584BAD4-DBEC-43D2-BC06-08C23F02489A}.Release|x86.ActiveCfg = Release|Win32 {1584BAD4-DBEC-43D2-BC06-08C23F02489A}.Release|x86.Build.0 = Release|Win32 {79995848-FD05-46F5-A7FE-46265E540E32}.Debug DLL|Any CPU.ActiveCfg = Debug|Any CPU {79995848-FD05-46F5-A7FE-46265E540E32}.Debug DLL|Any CPU.Build.0 = Debug|Any CPU + {79995848-FD05-46F5-A7FE-46265E540E32}.Debug DLL|ARM.ActiveCfg = Debug|Any CPU + {79995848-FD05-46F5-A7FE-46265E540E32}.Debug DLL|ARM.Build.0 = Debug|Any CPU + {79995848-FD05-46F5-A7FE-46265E540E32}.Debug DLL|ARM64.ActiveCfg = Debug|Any CPU + {79995848-FD05-46F5-A7FE-46265E540E32}.Debug DLL|ARM64.Build.0 = Debug|Any CPU {79995848-FD05-46F5-A7FE-46265E540E32}.Debug DLL|x64.ActiveCfg = Debug|Any CPU {79995848-FD05-46F5-A7FE-46265E540E32}.Debug DLL|x64.Build.0 = Debug|Any CPU {79995848-FD05-46F5-A7FE-46265E540E32}.Debug DLL|x86.ActiveCfg = Debug|Any CPU {79995848-FD05-46F5-A7FE-46265E540E32}.Debug DLL|x86.Build.0 = Debug|Any CPU {79995848-FD05-46F5-A7FE-46265E540E32}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {79995848-FD05-46F5-A7FE-46265E540E32}.Debug|Any CPU.Build.0 = Debug|Any CPU + {79995848-FD05-46F5-A7FE-46265E540E32}.Debug|ARM.ActiveCfg = Debug|Any CPU + {79995848-FD05-46F5-A7FE-46265E540E32}.Debug|ARM.Build.0 = Debug|Any CPU + {79995848-FD05-46F5-A7FE-46265E540E32}.Debug|ARM64.ActiveCfg = Debug|Any CPU + {79995848-FD05-46F5-A7FE-46265E540E32}.Debug|ARM64.Build.0 = Debug|Any CPU {79995848-FD05-46F5-A7FE-46265E540E32}.Debug|x64.ActiveCfg = Debug|Any CPU {79995848-FD05-46F5-A7FE-46265E540E32}.Debug|x64.Build.0 = Debug|Any CPU {79995848-FD05-46F5-A7FE-46265E540E32}.Debug|x86.ActiveCfg = Debug|Any CPU {79995848-FD05-46F5-A7FE-46265E540E32}.Debug|x86.Build.0 = Debug|Any CPU {79995848-FD05-46F5-A7FE-46265E540E32}.Release DLL|Any CPU.ActiveCfg = Release|Any CPU {79995848-FD05-46F5-A7FE-46265E540E32}.Release DLL|Any CPU.Build.0 = Release|Any CPU + {79995848-FD05-46F5-A7FE-46265E540E32}.Release DLL|ARM.ActiveCfg = Release|Any CPU + {79995848-FD05-46F5-A7FE-46265E540E32}.Release DLL|ARM.Build.0 = Release|Any CPU + {79995848-FD05-46F5-A7FE-46265E540E32}.Release DLL|ARM64.ActiveCfg = Release|Any CPU + {79995848-FD05-46F5-A7FE-46265E540E32}.Release DLL|ARM64.Build.0 = Release|Any CPU {79995848-FD05-46F5-A7FE-46265E540E32}.Release DLL|x64.ActiveCfg = Release|Any CPU {79995848-FD05-46F5-A7FE-46265E540E32}.Release DLL|x64.Build.0 = Release|Any CPU {79995848-FD05-46F5-A7FE-46265E540E32}.Release DLL|x86.ActiveCfg = Release|Any CPU {79995848-FD05-46F5-A7FE-46265E540E32}.Release DLL|x86.Build.0 = Release|Any CPU {79995848-FD05-46F5-A7FE-46265E540E32}.Release|Any CPU.ActiveCfg = Release|Any CPU {79995848-FD05-46F5-A7FE-46265E540E32}.Release|Any CPU.Build.0 = Release|Any CPU + {79995848-FD05-46F5-A7FE-46265E540E32}.Release|ARM.ActiveCfg = Release|Any CPU + {79995848-FD05-46F5-A7FE-46265E540E32}.Release|ARM.Build.0 = Release|Any CPU + {79995848-FD05-46F5-A7FE-46265E540E32}.Release|ARM64.ActiveCfg = Release|Any CPU + {79995848-FD05-46F5-A7FE-46265E540E32}.Release|ARM64.Build.0 = Release|Any CPU {79995848-FD05-46F5-A7FE-46265E540E32}.Release|x64.ActiveCfg = Release|Any CPU {79995848-FD05-46F5-A7FE-46265E540E32}.Release|x64.Build.0 = Release|Any CPU {79995848-FD05-46F5-A7FE-46265E540E32}.Release|x86.ActiveCfg = Release|Any CPU {79995848-FD05-46F5-A7FE-46265E540E32}.Release|x86.Build.0 = Release|Any CPU {61FE87EB-A3BA-4A7E-971C-69CB05F5C81C}.Debug DLL|Any CPU.ActiveCfg = Debug|x64 {61FE87EB-A3BA-4A7E-971C-69CB05F5C81C}.Debug DLL|Any CPU.Build.0 = Debug|x64 + {61FE87EB-A3BA-4A7E-971C-69CB05F5C81C}.Debug DLL|ARM.ActiveCfg = Debug|x64 + {61FE87EB-A3BA-4A7E-971C-69CB05F5C81C}.Debug DLL|ARM.Build.0 = Debug|x64 + {61FE87EB-A3BA-4A7E-971C-69CB05F5C81C}.Debug DLL|ARM64.ActiveCfg = Debug|x64 + {61FE87EB-A3BA-4A7E-971C-69CB05F5C81C}.Debug DLL|ARM64.Build.0 = Debug|x64 {61FE87EB-A3BA-4A7E-971C-69CB05F5C81C}.Debug DLL|x64.ActiveCfg = Debug|x64 {61FE87EB-A3BA-4A7E-971C-69CB05F5C81C}.Debug DLL|x64.Build.0 = Debug|x64 {61FE87EB-A3BA-4A7E-971C-69CB05F5C81C}.Debug DLL|x86.ActiveCfg = Debug|Win32 {61FE87EB-A3BA-4A7E-971C-69CB05F5C81C}.Debug DLL|x86.Build.0 = Debug|Win32 {61FE87EB-A3BA-4A7E-971C-69CB05F5C81C}.Debug|Any CPU.ActiveCfg = Debug|x64 {61FE87EB-A3BA-4A7E-971C-69CB05F5C81C}.Debug|Any CPU.Build.0 = Debug|x64 + {61FE87EB-A3BA-4A7E-971C-69CB05F5C81C}.Debug|ARM.ActiveCfg = Debug|x64 + {61FE87EB-A3BA-4A7E-971C-69CB05F5C81C}.Debug|ARM.Build.0 = Debug|x64 + {61FE87EB-A3BA-4A7E-971C-69CB05F5C81C}.Debug|ARM64.ActiveCfg = Debug|x64 + {61FE87EB-A3BA-4A7E-971C-69CB05F5C81C}.Debug|ARM64.Build.0 = Debug|x64 {61FE87EB-A3BA-4A7E-971C-69CB05F5C81C}.Debug|x64.ActiveCfg = Debug|x64 {61FE87EB-A3BA-4A7E-971C-69CB05F5C81C}.Debug|x64.Build.0 = Debug|x64 {61FE87EB-A3BA-4A7E-971C-69CB05F5C81C}.Debug|x86.ActiveCfg = Debug|Win32 {61FE87EB-A3BA-4A7E-971C-69CB05F5C81C}.Debug|x86.Build.0 = Debug|Win32 {61FE87EB-A3BA-4A7E-971C-69CB05F5C81C}.Release DLL|Any CPU.ActiveCfg = Release|x64 {61FE87EB-A3BA-4A7E-971C-69CB05F5C81C}.Release DLL|Any CPU.Build.0 = Release|x64 + {61FE87EB-A3BA-4A7E-971C-69CB05F5C81C}.Release DLL|ARM.ActiveCfg = Release|x64 + {61FE87EB-A3BA-4A7E-971C-69CB05F5C81C}.Release DLL|ARM.Build.0 = Release|x64 + {61FE87EB-A3BA-4A7E-971C-69CB05F5C81C}.Release DLL|ARM64.ActiveCfg = Release|x64 + {61FE87EB-A3BA-4A7E-971C-69CB05F5C81C}.Release DLL|ARM64.Build.0 = Release|x64 {61FE87EB-A3BA-4A7E-971C-69CB05F5C81C}.Release DLL|x64.ActiveCfg = Release|x64 {61FE87EB-A3BA-4A7E-971C-69CB05F5C81C}.Release DLL|x64.Build.0 = Release|x64 {61FE87EB-A3BA-4A7E-971C-69CB05F5C81C}.Release DLL|x86.ActiveCfg = Release|Win32 {61FE87EB-A3BA-4A7E-971C-69CB05F5C81C}.Release DLL|x86.Build.0 = Release|Win32 {61FE87EB-A3BA-4A7E-971C-69CB05F5C81C}.Release|Any CPU.ActiveCfg = Release|x64 {61FE87EB-A3BA-4A7E-971C-69CB05F5C81C}.Release|Any CPU.Build.0 = Release|x64 + {61FE87EB-A3BA-4A7E-971C-69CB05F5C81C}.Release|ARM.ActiveCfg = Release|x64 + {61FE87EB-A3BA-4A7E-971C-69CB05F5C81C}.Release|ARM.Build.0 = Release|x64 + {61FE87EB-A3BA-4A7E-971C-69CB05F5C81C}.Release|ARM64.ActiveCfg = Release|x64 + {61FE87EB-A3BA-4A7E-971C-69CB05F5C81C}.Release|ARM64.Build.0 = Release|x64 {61FE87EB-A3BA-4A7E-971C-69CB05F5C81C}.Release|x64.ActiveCfg = Release|x64 {61FE87EB-A3BA-4A7E-971C-69CB05F5C81C}.Release|x64.Build.0 = Release|x64 {61FE87EB-A3BA-4A7E-971C-69CB05F5C81C}.Release|x86.ActiveCfg = Release|Win32 {61FE87EB-A3BA-4A7E-971C-69CB05F5C81C}.Release|x86.Build.0 = Release|Win32 {9F44F41E-FACF-472D-A382-A40D0A84DB2C}.Debug DLL|Any CPU.ActiveCfg = Debug|x64 {9F44F41E-FACF-472D-A382-A40D0A84DB2C}.Debug DLL|Any CPU.Build.0 = Debug|x64 + {9F44F41E-FACF-472D-A382-A40D0A84DB2C}.Debug DLL|ARM.ActiveCfg = Debug|x64 + {9F44F41E-FACF-472D-A382-A40D0A84DB2C}.Debug DLL|ARM.Build.0 = Debug|x64 + {9F44F41E-FACF-472D-A382-A40D0A84DB2C}.Debug DLL|ARM64.ActiveCfg = Debug|x64 + {9F44F41E-FACF-472D-A382-A40D0A84DB2C}.Debug DLL|ARM64.Build.0 = Debug|x64 {9F44F41E-FACF-472D-A382-A40D0A84DB2C}.Debug DLL|x64.ActiveCfg = Debug|x64 {9F44F41E-FACF-472D-A382-A40D0A84DB2C}.Debug DLL|x64.Build.0 = Debug|x64 {9F44F41E-FACF-472D-A382-A40D0A84DB2C}.Debug DLL|x86.ActiveCfg = Debug|Win32 {9F44F41E-FACF-472D-A382-A40D0A84DB2C}.Debug DLL|x86.Build.0 = Debug|Win32 {9F44F41E-FACF-472D-A382-A40D0A84DB2C}.Debug|Any CPU.ActiveCfg = Debug|x64 {9F44F41E-FACF-472D-A382-A40D0A84DB2C}.Debug|Any CPU.Build.0 = Debug|x64 + {9F44F41E-FACF-472D-A382-A40D0A84DB2C}.Debug|ARM.ActiveCfg = Debug|x64 + {9F44F41E-FACF-472D-A382-A40D0A84DB2C}.Debug|ARM.Build.0 = Debug|x64 + {9F44F41E-FACF-472D-A382-A40D0A84DB2C}.Debug|ARM64.ActiveCfg = Debug|x64 + {9F44F41E-FACF-472D-A382-A40D0A84DB2C}.Debug|ARM64.Build.0 = Debug|x64 {9F44F41E-FACF-472D-A382-A40D0A84DB2C}.Debug|x64.ActiveCfg = Debug|x64 {9F44F41E-FACF-472D-A382-A40D0A84DB2C}.Debug|x64.Build.0 = Debug|x64 {9F44F41E-FACF-472D-A382-A40D0A84DB2C}.Debug|x86.ActiveCfg = Debug|Win32 {9F44F41E-FACF-472D-A382-A40D0A84DB2C}.Debug|x86.Build.0 = Debug|Win32 {9F44F41E-FACF-472D-A382-A40D0A84DB2C}.Release DLL|Any CPU.ActiveCfg = Release|x64 {9F44F41E-FACF-472D-A382-A40D0A84DB2C}.Release DLL|Any CPU.Build.0 = Release|x64 + {9F44F41E-FACF-472D-A382-A40D0A84DB2C}.Release DLL|ARM.ActiveCfg = Release|x64 + {9F44F41E-FACF-472D-A382-A40D0A84DB2C}.Release DLL|ARM.Build.0 = Release|x64 + {9F44F41E-FACF-472D-A382-A40D0A84DB2C}.Release DLL|ARM64.ActiveCfg = Release|x64 + {9F44F41E-FACF-472D-A382-A40D0A84DB2C}.Release DLL|ARM64.Build.0 = Release|x64 {9F44F41E-FACF-472D-A382-A40D0A84DB2C}.Release DLL|x64.ActiveCfg = Release|x64 {9F44F41E-FACF-472D-A382-A40D0A84DB2C}.Release DLL|x64.Build.0 = Release|x64 {9F44F41E-FACF-472D-A382-A40D0A84DB2C}.Release DLL|x86.ActiveCfg = Release|Win32 {9F44F41E-FACF-472D-A382-A40D0A84DB2C}.Release DLL|x86.Build.0 = Release|Win32 {9F44F41E-FACF-472D-A382-A40D0A84DB2C}.Release|Any CPU.ActiveCfg = Release|x64 {9F44F41E-FACF-472D-A382-A40D0A84DB2C}.Release|Any CPU.Build.0 = Release|x64 + {9F44F41E-FACF-472D-A382-A40D0A84DB2C}.Release|ARM.ActiveCfg = Release|x64 + {9F44F41E-FACF-472D-A382-A40D0A84DB2C}.Release|ARM.Build.0 = Release|x64 + {9F44F41E-FACF-472D-A382-A40D0A84DB2C}.Release|ARM64.ActiveCfg = Release|x64 + {9F44F41E-FACF-472D-A382-A40D0A84DB2C}.Release|ARM64.Build.0 = Release|x64 {9F44F41E-FACF-472D-A382-A40D0A84DB2C}.Release|x64.ActiveCfg = Release|x64 {9F44F41E-FACF-472D-A382-A40D0A84DB2C}.Release|x64.Build.0 = Release|x64 {9F44F41E-FACF-472D-A382-A40D0A84DB2C}.Release|x86.ActiveCfg = Release|Win32 {9F44F41E-FACF-472D-A382-A40D0A84DB2C}.Release|x86.Build.0 = Release|Win32 - {FE91D4D0-29A6-4C58-874F-11F6AC1D50CD}.Debug DLL|Any CPU.ActiveCfg = Debug - {FE91D4D0-29A6-4C58-874F-11F6AC1D50CD}.Debug DLL|Any CPU.Build.0 = Debug - {FE91D4D0-29A6-4C58-874F-11F6AC1D50CD}.Debug DLL|x64.ActiveCfg = Debug - {FE91D4D0-29A6-4C58-874F-11F6AC1D50CD}.Debug DLL|x64.Build.0 = Debug - {FE91D4D0-29A6-4C58-874F-11F6AC1D50CD}.Debug DLL|x86.ActiveCfg = Debug - {FE91D4D0-29A6-4C58-874F-11F6AC1D50CD}.Debug DLL|x86.Build.0 = Debug - {FE91D4D0-29A6-4C58-874F-11F6AC1D50CD}.Debug|Any CPU.ActiveCfg = Debug - {FE91D4D0-29A6-4C58-874F-11F6AC1D50CD}.Debug|x64.ActiveCfg = Debug - {FE91D4D0-29A6-4C58-874F-11F6AC1D50CD}.Debug|x86.ActiveCfg = Debug - {FE91D4D0-29A6-4C58-874F-11F6AC1D50CD}.Release DLL|Any CPU.ActiveCfg = Release - {FE91D4D0-29A6-4C58-874F-11F6AC1D50CD}.Release DLL|Any CPU.Build.0 = Release - {FE91D4D0-29A6-4C58-874F-11F6AC1D50CD}.Release DLL|x64.ActiveCfg = Release - {FE91D4D0-29A6-4C58-874F-11F6AC1D50CD}.Release DLL|x64.Build.0 = Release - {FE91D4D0-29A6-4C58-874F-11F6AC1D50CD}.Release DLL|x86.ActiveCfg = Release - {FE91D4D0-29A6-4C58-874F-11F6AC1D50CD}.Release DLL|x86.Build.0 = Release - {FE91D4D0-29A6-4C58-874F-11F6AC1D50CD}.Release|Any CPU.ActiveCfg = Release - {FE91D4D0-29A6-4C58-874F-11F6AC1D50CD}.Release|x64.ActiveCfg = Release - {FE91D4D0-29A6-4C58-874F-11F6AC1D50CD}.Release|x86.ActiveCfg = Release {0A2EEDAF-F4A8-41E0-A874-2F30D1EEB55E}.Debug DLL|Any CPU.ActiveCfg = Debug|x64 {0A2EEDAF-F4A8-41E0-A874-2F30D1EEB55E}.Debug DLL|Any CPU.Build.0 = Debug|x64 + {0A2EEDAF-F4A8-41E0-A874-2F30D1EEB55E}.Debug DLL|ARM.ActiveCfg = Debug|x64 + {0A2EEDAF-F4A8-41E0-A874-2F30D1EEB55E}.Debug DLL|ARM.Build.0 = Debug|x64 + {0A2EEDAF-F4A8-41E0-A874-2F30D1EEB55E}.Debug DLL|ARM64.ActiveCfg = Debug|x64 + {0A2EEDAF-F4A8-41E0-A874-2F30D1EEB55E}.Debug DLL|ARM64.Build.0 = Debug|x64 {0A2EEDAF-F4A8-41E0-A874-2F30D1EEB55E}.Debug DLL|x64.ActiveCfg = Debug|x64 {0A2EEDAF-F4A8-41E0-A874-2F30D1EEB55E}.Debug DLL|x64.Build.0 = Debug|x64 {0A2EEDAF-F4A8-41E0-A874-2F30D1EEB55E}.Debug DLL|x86.ActiveCfg = Debug|Win32 {0A2EEDAF-F4A8-41E0-A874-2F30D1EEB55E}.Debug DLL|x86.Build.0 = Debug|Win32 {0A2EEDAF-F4A8-41E0-A874-2F30D1EEB55E}.Debug|Any CPU.ActiveCfg = Debug|x64 {0A2EEDAF-F4A8-41E0-A874-2F30D1EEB55E}.Debug|Any CPU.Build.0 = Debug|x64 + {0A2EEDAF-F4A8-41E0-A874-2F30D1EEB55E}.Debug|ARM.ActiveCfg = Debug|x64 + {0A2EEDAF-F4A8-41E0-A874-2F30D1EEB55E}.Debug|ARM.Build.0 = Debug|x64 + {0A2EEDAF-F4A8-41E0-A874-2F30D1EEB55E}.Debug|ARM64.ActiveCfg = Debug|x64 + {0A2EEDAF-F4A8-41E0-A874-2F30D1EEB55E}.Debug|ARM64.Build.0 = Debug|x64 {0A2EEDAF-F4A8-41E0-A874-2F30D1EEB55E}.Debug|x64.ActiveCfg = Debug|x64 {0A2EEDAF-F4A8-41E0-A874-2F30D1EEB55E}.Debug|x64.Build.0 = Debug|x64 {0A2EEDAF-F4A8-41E0-A874-2F30D1EEB55E}.Debug|x86.ActiveCfg = Debug|Win32 {0A2EEDAF-F4A8-41E0-A874-2F30D1EEB55E}.Debug|x86.Build.0 = Debug|Win32 {0A2EEDAF-F4A8-41E0-A874-2F30D1EEB55E}.Release DLL|Any CPU.ActiveCfg = Release|x64 {0A2EEDAF-F4A8-41E0-A874-2F30D1EEB55E}.Release DLL|Any CPU.Build.0 = Release|x64 + {0A2EEDAF-F4A8-41E0-A874-2F30D1EEB55E}.Release DLL|ARM.ActiveCfg = Release|x64 + {0A2EEDAF-F4A8-41E0-A874-2F30D1EEB55E}.Release DLL|ARM.Build.0 = Release|x64 + {0A2EEDAF-F4A8-41E0-A874-2F30D1EEB55E}.Release DLL|ARM64.ActiveCfg = Release|x64 + {0A2EEDAF-F4A8-41E0-A874-2F30D1EEB55E}.Release DLL|ARM64.Build.0 = Release|x64 {0A2EEDAF-F4A8-41E0-A874-2F30D1EEB55E}.Release DLL|x64.ActiveCfg = Release|x64 {0A2EEDAF-F4A8-41E0-A874-2F30D1EEB55E}.Release DLL|x64.Build.0 = Release|x64 {0A2EEDAF-F4A8-41E0-A874-2F30D1EEB55E}.Release DLL|x86.ActiveCfg = Release|Win32 {0A2EEDAF-F4A8-41E0-A874-2F30D1EEB55E}.Release DLL|x86.Build.0 = Release|Win32 {0A2EEDAF-F4A8-41E0-A874-2F30D1EEB55E}.Release|Any CPU.ActiveCfg = Release|x64 {0A2EEDAF-F4A8-41E0-A874-2F30D1EEB55E}.Release|Any CPU.Build.0 = Release|x64 + {0A2EEDAF-F4A8-41E0-A874-2F30D1EEB55E}.Release|ARM.ActiveCfg = Release|x64 + {0A2EEDAF-F4A8-41E0-A874-2F30D1EEB55E}.Release|ARM.Build.0 = Release|x64 + {0A2EEDAF-F4A8-41E0-A874-2F30D1EEB55E}.Release|ARM64.ActiveCfg = Release|x64 + {0A2EEDAF-F4A8-41E0-A874-2F30D1EEB55E}.Release|ARM64.Build.0 = Release|x64 {0A2EEDAF-F4A8-41E0-A874-2F30D1EEB55E}.Release|x64.ActiveCfg = Release|x64 {0A2EEDAF-F4A8-41E0-A874-2F30D1EEB55E}.Release|x64.Build.0 = Release|x64 {0A2EEDAF-F4A8-41E0-A874-2F30D1EEB55E}.Release|x86.ActiveCfg = Release|Win32 {0A2EEDAF-F4A8-41E0-A874-2F30D1EEB55E}.Release|x86.Build.0 = Release|Win32 + {709C9DD6-6B42-40A9-AA70-629274A75BAC}.Debug DLL|Any CPU.ActiveCfg = Debug + {709C9DD6-6B42-40A9-AA70-629274A75BAC}.Debug DLL|ARM.ActiveCfg = Debug + {709C9DD6-6B42-40A9-AA70-629274A75BAC}.Debug DLL|ARM64.ActiveCfg = Debug + {709C9DD6-6B42-40A9-AA70-629274A75BAC}.Debug DLL|x64.ActiveCfg = Debug + {709C9DD6-6B42-40A9-AA70-629274A75BAC}.Debug DLL|x86.ActiveCfg = Debug + {709C9DD6-6B42-40A9-AA70-629274A75BAC}.Debug|Any CPU.ActiveCfg = Debug + {709C9DD6-6B42-40A9-AA70-629274A75BAC}.Debug|ARM.ActiveCfg = Debug + {709C9DD6-6B42-40A9-AA70-629274A75BAC}.Debug|ARM64.ActiveCfg = Debug + {709C9DD6-6B42-40A9-AA70-629274A75BAC}.Debug|x64.ActiveCfg = Debug + {709C9DD6-6B42-40A9-AA70-629274A75BAC}.Debug|x86.ActiveCfg = Debug + {709C9DD6-6B42-40A9-AA70-629274A75BAC}.Release DLL|Any CPU.ActiveCfg = Release + {709C9DD6-6B42-40A9-AA70-629274A75BAC}.Release DLL|ARM.ActiveCfg = Release + {709C9DD6-6B42-40A9-AA70-629274A75BAC}.Release DLL|ARM64.ActiveCfg = Release + {709C9DD6-6B42-40A9-AA70-629274A75BAC}.Release DLL|x64.ActiveCfg = Release + {709C9DD6-6B42-40A9-AA70-629274A75BAC}.Release DLL|x86.ActiveCfg = Release + {709C9DD6-6B42-40A9-AA70-629274A75BAC}.Release|Any CPU.ActiveCfg = Release + {709C9DD6-6B42-40A9-AA70-629274A75BAC}.Release|ARM.ActiveCfg = Release + {709C9DD6-6B42-40A9-AA70-629274A75BAC}.Release|ARM64.ActiveCfg = Release + {709C9DD6-6B42-40A9-AA70-629274A75BAC}.Release|x64.ActiveCfg = Release + {709C9DD6-6B42-40A9-AA70-629274A75BAC}.Release|x86.ActiveCfg = Release EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE