diff --git a/ebpf-for-windows.sln b/ebpf-for-windows.sln index 5a0d094397..611f1b76a0 100644 --- a/ebpf-for-windows.sln +++ b/ebpf-for-windows.sln @@ -1,9 +1,8 @@ - Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 17 VisualStudioVersion = 17.4.33205.214 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ebpfverifier", "external\ebpf-verifier\build\prevail.vcxproj", "{7D5B4E68-C0FA-3F86-9405-F6400219B440}" +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "prevail", "external\ebpf-verifier\build\prevail.vcxproj", "{7D5B4E68-C0FA-3F86-9405-F6400219B440}" ProjectSection(ProjectDependencies) = postProject {231EE32B-EBA4-4FE5-A55B-DB18F539D403} = {231EE32B-EBA4-4FE5-A55B-DB18F539D403} EndProjectSection @@ -319,7 +318,7 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "usersim", "external\usersim {231EE32B-EBA4-4FE5-A55B-DB18F539D403} = {231EE32B-EBA4-4FE5-A55B-DB18F539D403} EndProjectSection EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libbtf", "external\ebpf-verifier\build\external\libbtf\libbtf\libbtf.vcxproj", "{5D450380-AE0C-3DAA-A0CC-F1291D1DE9EE}" +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libbtf", "external\ebpf-verifier\build\external\libbtf\libbtf\libbtf.vcxproj", "{0899051F-C386-39C8-B253-60F00B2E5CFF}" ProjectSection(ProjectDependencies) = postProject {231EE32B-EBA4-4FE5-A55B-DB18F539D403} = {231EE32B-EBA4-4FE5-A55B-DB18F539D403} EndProjectSection @@ -399,23 +398,23 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "onebranch", "tools\onebranc EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ubpf_fuzzer", "ubpf_fuzzer", "{4E5F20F6-6B89-40DC-8F26-4A0E3CD1B6BA}" EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ubpf", "external\ubpf\build_fuzzer\vm\ubpf.vcxproj", "{6942D816-3031-3D6B-A1D1-9190C1BD49BE}" +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ubpf", "external\ubpf\build_fuzzer\vm\ubpf.vcxproj", "{9617D7A5-789C-3233-B376-840B55453BA2}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ebpfverifier", "external\ubpf\build_fuzzer\external\ebpf-verifier\ebpfverifier.vcxproj", "{55FF9B28-F3A2-465B-9E35-D154F2380581}" EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libbtf", "external\ubpf\build_fuzzer\external\ebpf-verifier\external\libbtf\libbtf\libbtf.vcxproj", "{FE68637F-4C92-3656-A7B4-CFDE5DFFFCAE}" +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libbtf", "external\ubpf\build_fuzzer\external\ebpf-verifier\external\libbtf\libbtf\libbtf.vcxproj", "{07DB18F6-8DBC-34EA-B94A-692984756D22}" EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "win-c", "external\ubpf\build_fuzzer\vm\compat\libraries\win-c\win-c.vcxproj", "{DC8CA70C-ACBE-3EC0-A901-08FFEDCF535D}" +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "win-c", "external\ubpf\build_fuzzer\vm\compat\libraries\win-c\win-c.vcxproj", "{961C97F9-6708-3C38-B9FA-A914C1F647A9}" EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ubpf_fuzzer", "external\ubpf\build_fuzzer\libfuzzer\ubpf_fuzzer.vcxproj", "{19A90A82-92D0-3246-93CA-F15A7B279297}" +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ubpf_fuzzer", "external\ubpf\build_fuzzer\libfuzzer\ubpf_fuzzer.vcxproj", "{2AAA62C7-08D0-3268-A8DF-3B29D4E4AA7F}" ProjectSection(ProjectDependencies) = postProject - {6942D816-3031-3D6B-A1D1-9190C1BD49BE} = {6942D816-3031-3D6B-A1D1-9190C1BD49BE} + {9617D7A5-789C-3233-B376-840B55453BA2} = {9617D7A5-789C-3233-B376-840B55453BA2} {55FF9B28-F3A2-465B-9E35-D154F2380581} = {55FF9B28-F3A2-465B-9E35-D154F2380581} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ubpf_fuzzer_post_build", "scripts\ubpf_fuzzer_post_build\ubpf_fuzzer_post_build.vcxproj", "{3D563E44-B7D0-499C-A15C-C1C1B9A73B6F}" ProjectSection(ProjectDependencies) = postProject - {19A90A82-92D0-3246-93CA-F15A7B279297} = {19A90A82-92D0-3246-93CA-F15A7B279297} + {2AAA62C7-08D0-3268-A8DF-3B29D4E4AA7F} = {2AAA62C7-08D0-3268-A8DF-3B29D4E4AA7F} EndProjectSection EndProject Global @@ -2705,48 +2704,48 @@ Global {030A7AC6-14DC-45CF-AF34-891057AB1402}.RelWithDebInfo|x64.Build.0 = Release|x64 {030A7AC6-14DC-45CF-AF34-891057AB1402}.RelWithDebInfo|x86.ActiveCfg = Release|Win32 {030A7AC6-14DC-45CF-AF34-891057AB1402}.RelWithDebInfo|x86.Build.0 = Release|Win32 - {5D450380-AE0C-3DAA-A0CC-F1291D1DE9EE}.Debug|ARM64.ActiveCfg = Debug|ARM64 - {5D450380-AE0C-3DAA-A0CC-F1291D1DE9EE}.Debug|ARM64.Build.0 = Debug|ARM64 - {5D450380-AE0C-3DAA-A0CC-F1291D1DE9EE}.Debug|x64.ActiveCfg = Debug|x64 - {5D450380-AE0C-3DAA-A0CC-F1291D1DE9EE}.Debug|x64.Build.0 = Debug|x64 - {5D450380-AE0C-3DAA-A0CC-F1291D1DE9EE}.Debug|x86.ActiveCfg = Debug|x64 - {5D450380-AE0C-3DAA-A0CC-F1291D1DE9EE}.Debug|x86.Build.0 = Debug|x64 - {5D450380-AE0C-3DAA-A0CC-F1291D1DE9EE}.FuzzerDebug|ARM64.ActiveCfg = FuzzerDebug|ARM64 - {5D450380-AE0C-3DAA-A0CC-F1291D1DE9EE}.FuzzerDebug|ARM64.Build.0 = FuzzerDebug|ARM64 - {5D450380-AE0C-3DAA-A0CC-F1291D1DE9EE}.FuzzerDebug|x64.ActiveCfg = FuzzerDebug|x64 - {5D450380-AE0C-3DAA-A0CC-F1291D1DE9EE}.FuzzerDebug|x64.Build.0 = FuzzerDebug|x64 - {5D450380-AE0C-3DAA-A0CC-F1291D1DE9EE}.FuzzerDebug|x86.ActiveCfg = FuzzerDebug|x64 - {5D450380-AE0C-3DAA-A0CC-F1291D1DE9EE}.FuzzerDebug|x86.Build.0 = FuzzerDebug|x64 - {5D450380-AE0C-3DAA-A0CC-F1291D1DE9EE}.MinSizeRel|ARM64.ActiveCfg = MinSizeRel|ARM64 - {5D450380-AE0C-3DAA-A0CC-F1291D1DE9EE}.MinSizeRel|ARM64.Build.0 = MinSizeRel|ARM64 - {5D450380-AE0C-3DAA-A0CC-F1291D1DE9EE}.MinSizeRel|x64.ActiveCfg = MinSizeRel|x64 - {5D450380-AE0C-3DAA-A0CC-F1291D1DE9EE}.MinSizeRel|x64.Build.0 = MinSizeRel|x64 - {5D450380-AE0C-3DAA-A0CC-F1291D1DE9EE}.MinSizeRel|x86.ActiveCfg = MinSizeRel|x64 - {5D450380-AE0C-3DAA-A0CC-F1291D1DE9EE}.MinSizeRel|x86.Build.0 = MinSizeRel|x64 - {5D450380-AE0C-3DAA-A0CC-F1291D1DE9EE}.NativeOnlyDebug|ARM64.ActiveCfg = Debug|ARM64 - {5D450380-AE0C-3DAA-A0CC-F1291D1DE9EE}.NativeOnlyDebug|ARM64.Build.0 = Debug|ARM64 - {5D450380-AE0C-3DAA-A0CC-F1291D1DE9EE}.NativeOnlyDebug|x64.ActiveCfg = Debug|x64 - {5D450380-AE0C-3DAA-A0CC-F1291D1DE9EE}.NativeOnlyDebug|x64.Build.0 = Debug|x64 - {5D450380-AE0C-3DAA-A0CC-F1291D1DE9EE}.NativeOnlyDebug|x86.ActiveCfg = Debug|x64 - {5D450380-AE0C-3DAA-A0CC-F1291D1DE9EE}.NativeOnlyDebug|x86.Build.0 = Debug|x64 - {5D450380-AE0C-3DAA-A0CC-F1291D1DE9EE}.NativeOnlyRelease|ARM64.ActiveCfg = Release|ARM64 - {5D450380-AE0C-3DAA-A0CC-F1291D1DE9EE}.NativeOnlyRelease|ARM64.Build.0 = Release|ARM64 - {5D450380-AE0C-3DAA-A0CC-F1291D1DE9EE}.NativeOnlyRelease|x64.ActiveCfg = Release|x64 - {5D450380-AE0C-3DAA-A0CC-F1291D1DE9EE}.NativeOnlyRelease|x64.Build.0 = Release|x64 - {5D450380-AE0C-3DAA-A0CC-F1291D1DE9EE}.NativeOnlyRelease|x86.ActiveCfg = Release|x64 - {5D450380-AE0C-3DAA-A0CC-F1291D1DE9EE}.NativeOnlyRelease|x86.Build.0 = Release|x64 - {5D450380-AE0C-3DAA-A0CC-F1291D1DE9EE}.Release|ARM64.ActiveCfg = Release|ARM64 - {5D450380-AE0C-3DAA-A0CC-F1291D1DE9EE}.Release|ARM64.Build.0 = Release|ARM64 - {5D450380-AE0C-3DAA-A0CC-F1291D1DE9EE}.Release|x64.ActiveCfg = Release|x64 - {5D450380-AE0C-3DAA-A0CC-F1291D1DE9EE}.Release|x64.Build.0 = Release|x64 - {5D450380-AE0C-3DAA-A0CC-F1291D1DE9EE}.Release|x86.ActiveCfg = Release|x64 - {5D450380-AE0C-3DAA-A0CC-F1291D1DE9EE}.Release|x86.Build.0 = Release|x64 - {5D450380-AE0C-3DAA-A0CC-F1291D1DE9EE}.RelWithDebInfo|ARM64.ActiveCfg = RelWithDebInfo|ARM64 - {5D450380-AE0C-3DAA-A0CC-F1291D1DE9EE}.RelWithDebInfo|ARM64.Build.0 = RelWithDebInfo|ARM64 - {5D450380-AE0C-3DAA-A0CC-F1291D1DE9EE}.RelWithDebInfo|x64.ActiveCfg = RelWithDebInfo|x64 - {5D450380-AE0C-3DAA-A0CC-F1291D1DE9EE}.RelWithDebInfo|x64.Build.0 = RelWithDebInfo|x64 - {5D450380-AE0C-3DAA-A0CC-F1291D1DE9EE}.RelWithDebInfo|x86.ActiveCfg = RelWithDebInfo|x64 - {5D450380-AE0C-3DAA-A0CC-F1291D1DE9EE}.RelWithDebInfo|x86.Build.0 = RelWithDebInfo|x64 + {0899051F-C386-39C8-B253-60F00B2E5CFF}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {0899051F-C386-39C8-B253-60F00B2E5CFF}.Debug|ARM64.Build.0 = Debug|ARM64 + {0899051F-C386-39C8-B253-60F00B2E5CFF}.Debug|x64.ActiveCfg = Debug|x64 + {0899051F-C386-39C8-B253-60F00B2E5CFF}.Debug|x64.Build.0 = Debug|x64 + {0899051F-C386-39C8-B253-60F00B2E5CFF}.Debug|x86.ActiveCfg = Debug|x64 + {0899051F-C386-39C8-B253-60F00B2E5CFF}.Debug|x86.Build.0 = Debug|x64 + {0899051F-C386-39C8-B253-60F00B2E5CFF}.FuzzerDebug|ARM64.ActiveCfg = FuzzerDebug|ARM64 + {0899051F-C386-39C8-B253-60F00B2E5CFF}.FuzzerDebug|ARM64.Build.0 = FuzzerDebug|ARM64 + {0899051F-C386-39C8-B253-60F00B2E5CFF}.FuzzerDebug|x64.ActiveCfg = FuzzerDebug|x64 + {0899051F-C386-39C8-B253-60F00B2E5CFF}.FuzzerDebug|x64.Build.0 = FuzzerDebug|x64 + {0899051F-C386-39C8-B253-60F00B2E5CFF}.FuzzerDebug|x86.ActiveCfg = FuzzerDebug|x64 + {0899051F-C386-39C8-B253-60F00B2E5CFF}.FuzzerDebug|x86.Build.0 = FuzzerDebug|x64 + {0899051F-C386-39C8-B253-60F00B2E5CFF}.MinSizeRel|ARM64.ActiveCfg = MinSizeRel|ARM64 + {0899051F-C386-39C8-B253-60F00B2E5CFF}.MinSizeRel|ARM64.Build.0 = MinSizeRel|ARM64 + {0899051F-C386-39C8-B253-60F00B2E5CFF}.MinSizeRel|x64.ActiveCfg = MinSizeRel|x64 + {0899051F-C386-39C8-B253-60F00B2E5CFF}.MinSizeRel|x64.Build.0 = MinSizeRel|x64 + {0899051F-C386-39C8-B253-60F00B2E5CFF}.MinSizeRel|x86.ActiveCfg = MinSizeRel|x64 + {0899051F-C386-39C8-B253-60F00B2E5CFF}.MinSizeRel|x86.Build.0 = MinSizeRel|x64 + {0899051F-C386-39C8-B253-60F00B2E5CFF}.NativeOnlyDebug|ARM64.ActiveCfg = Debug|ARM64 + {0899051F-C386-39C8-B253-60F00B2E5CFF}.NativeOnlyDebug|ARM64.Build.0 = Debug|ARM64 + {0899051F-C386-39C8-B253-60F00B2E5CFF}.NativeOnlyDebug|x64.ActiveCfg = Debug|x64 + {0899051F-C386-39C8-B253-60F00B2E5CFF}.NativeOnlyDebug|x64.Build.0 = Debug|x64 + {0899051F-C386-39C8-B253-60F00B2E5CFF}.NativeOnlyDebug|x86.ActiveCfg = Debug|x64 + {0899051F-C386-39C8-B253-60F00B2E5CFF}.NativeOnlyDebug|x86.Build.0 = Debug|x64 + {0899051F-C386-39C8-B253-60F00B2E5CFF}.NativeOnlyRelease|ARM64.ActiveCfg = Release|ARM64 + {0899051F-C386-39C8-B253-60F00B2E5CFF}.NativeOnlyRelease|ARM64.Build.0 = Release|ARM64 + {0899051F-C386-39C8-B253-60F00B2E5CFF}.NativeOnlyRelease|x64.ActiveCfg = Release|x64 + {0899051F-C386-39C8-B253-60F00B2E5CFF}.NativeOnlyRelease|x64.Build.0 = Release|x64 + {0899051F-C386-39C8-B253-60F00B2E5CFF}.NativeOnlyRelease|x86.ActiveCfg = Release|x64 + {0899051F-C386-39C8-B253-60F00B2E5CFF}.NativeOnlyRelease|x86.Build.0 = Release|x64 + {0899051F-C386-39C8-B253-60F00B2E5CFF}.Release|ARM64.ActiveCfg = Release|ARM64 + {0899051F-C386-39C8-B253-60F00B2E5CFF}.Release|ARM64.Build.0 = Release|ARM64 + {0899051F-C386-39C8-B253-60F00B2E5CFF}.Release|x64.ActiveCfg = Release|x64 + {0899051F-C386-39C8-B253-60F00B2E5CFF}.Release|x64.Build.0 = Release|x64 + {0899051F-C386-39C8-B253-60F00B2E5CFF}.Release|x86.ActiveCfg = Release|x64 + {0899051F-C386-39C8-B253-60F00B2E5CFF}.Release|x86.Build.0 = Release|x64 + {0899051F-C386-39C8-B253-60F00B2E5CFF}.RelWithDebInfo|ARM64.ActiveCfg = RelWithDebInfo|ARM64 + {0899051F-C386-39C8-B253-60F00B2E5CFF}.RelWithDebInfo|ARM64.Build.0 = RelWithDebInfo|ARM64 + {0899051F-C386-39C8-B253-60F00B2E5CFF}.RelWithDebInfo|x64.ActiveCfg = RelWithDebInfo|x64 + {0899051F-C386-39C8-B253-60F00B2E5CFF}.RelWithDebInfo|x64.Build.0 = RelWithDebInfo|x64 + {0899051F-C386-39C8-B253-60F00B2E5CFF}.RelWithDebInfo|x86.ActiveCfg = RelWithDebInfo|x64 + {0899051F-C386-39C8-B253-60F00B2E5CFF}.RelWithDebInfo|x86.Build.0 = RelWithDebInfo|x64 {1937DB41-F3EB-4955-A636-6386DCB394F6}.Debug|ARM64.ActiveCfg = Debug|ARM64 {1937DB41-F3EB-4955-A636-6386DCB394F6}.Debug|ARM64.Build.0 = Debug|ARM64 {1937DB41-F3EB-4955-A636-6386DCB394F6}.Debug|x64.ActiveCfg = Debug|x64 @@ -3193,44 +3192,44 @@ Global {58D6BAB8-10EF-4A99-AFF2-6B14269A8DCD}.RelWithDebInfo|x64.Build.0 = Release|x64 {58D6BAB8-10EF-4A99-AFF2-6B14269A8DCD}.RelWithDebInfo|x86.ActiveCfg = Release|x64 {58D6BAB8-10EF-4A99-AFF2-6B14269A8DCD}.RelWithDebInfo|x86.Build.0 = Release|x64 - {6942D816-3031-3D6B-A1D1-9190C1BD49BE}.Debug|ARM64.ActiveCfg = Debug|ARM64 - {6942D816-3031-3D6B-A1D1-9190C1BD49BE}.Debug|ARM64.Build.0 = Debug|ARM64 - {6942D816-3031-3D6B-A1D1-9190C1BD49BE}.Debug|x64.ActiveCfg = Debug|x64 - {6942D816-3031-3D6B-A1D1-9190C1BD49BE}.Debug|x86.ActiveCfg = Debug|x64 - {6942D816-3031-3D6B-A1D1-9190C1BD49BE}.Debug|x86.Build.0 = Debug|x64 - {6942D816-3031-3D6B-A1D1-9190C1BD49BE}.FuzzerDebug|ARM64.ActiveCfg = FuzzerDebug|ARM64 - {6942D816-3031-3D6B-A1D1-9190C1BD49BE}.FuzzerDebug|ARM64.Build.0 = FuzzerDebug|ARM64 - {6942D816-3031-3D6B-A1D1-9190C1BD49BE}.FuzzerDebug|x64.ActiveCfg = RelWithDebInfo|x64 - {6942D816-3031-3D6B-A1D1-9190C1BD49BE}.FuzzerDebug|x64.Build.0 = RelWithDebInfo|x64 - {6942D816-3031-3D6B-A1D1-9190C1BD49BE}.FuzzerDebug|x86.ActiveCfg = FuzzerDebug|x64 - {6942D816-3031-3D6B-A1D1-9190C1BD49BE}.FuzzerDebug|x86.Build.0 = FuzzerDebug|x64 - {6942D816-3031-3D6B-A1D1-9190C1BD49BE}.MinSizeRel|ARM64.ActiveCfg = MinSizeRel|ARM64 - {6942D816-3031-3D6B-A1D1-9190C1BD49BE}.MinSizeRel|ARM64.Build.0 = MinSizeRel|ARM64 - {6942D816-3031-3D6B-A1D1-9190C1BD49BE}.MinSizeRel|x64.ActiveCfg = MinSizeRel|x64 - {6942D816-3031-3D6B-A1D1-9190C1BD49BE}.MinSizeRel|x64.Build.0 = MinSizeRel|x64 - {6942D816-3031-3D6B-A1D1-9190C1BD49BE}.MinSizeRel|x86.ActiveCfg = MinSizeRel|x64 - {6942D816-3031-3D6B-A1D1-9190C1BD49BE}.MinSizeRel|x86.Build.0 = MinSizeRel|x64 - {6942D816-3031-3D6B-A1D1-9190C1BD49BE}.NativeOnlyDebug|ARM64.ActiveCfg = Debug|ARM64 - {6942D816-3031-3D6B-A1D1-9190C1BD49BE}.NativeOnlyDebug|ARM64.Build.0 = Debug|ARM64 - {6942D816-3031-3D6B-A1D1-9190C1BD49BE}.NativeOnlyDebug|x64.ActiveCfg = Debug|x64 - {6942D816-3031-3D6B-A1D1-9190C1BD49BE}.NativeOnlyDebug|x86.ActiveCfg = Debug|x64 - {6942D816-3031-3D6B-A1D1-9190C1BD49BE}.NativeOnlyDebug|x86.Build.0 = Debug|x64 - {6942D816-3031-3D6B-A1D1-9190C1BD49BE}.NativeOnlyRelease|ARM64.ActiveCfg = Release|ARM64 - {6942D816-3031-3D6B-A1D1-9190C1BD49BE}.NativeOnlyRelease|ARM64.Build.0 = Release|ARM64 - {6942D816-3031-3D6B-A1D1-9190C1BD49BE}.NativeOnlyRelease|x64.ActiveCfg = Release|x64 - {6942D816-3031-3D6B-A1D1-9190C1BD49BE}.NativeOnlyRelease|x86.ActiveCfg = Release|x64 - {6942D816-3031-3D6B-A1D1-9190C1BD49BE}.NativeOnlyRelease|x86.Build.0 = Release|x64 - {6942D816-3031-3D6B-A1D1-9190C1BD49BE}.Release|ARM64.ActiveCfg = Release|ARM64 - {6942D816-3031-3D6B-A1D1-9190C1BD49BE}.Release|ARM64.Build.0 = Release|ARM64 - {6942D816-3031-3D6B-A1D1-9190C1BD49BE}.Release|x64.ActiveCfg = Release|x64 - {6942D816-3031-3D6B-A1D1-9190C1BD49BE}.Release|x86.ActiveCfg = Release|x64 - {6942D816-3031-3D6B-A1D1-9190C1BD49BE}.Release|x86.Build.0 = Release|x64 - {6942D816-3031-3D6B-A1D1-9190C1BD49BE}.RelWithDebInfo|ARM64.ActiveCfg = RelWithDebInfo|ARM64 - {6942D816-3031-3D6B-A1D1-9190C1BD49BE}.RelWithDebInfo|ARM64.Build.0 = RelWithDebInfo|ARM64 - {6942D816-3031-3D6B-A1D1-9190C1BD49BE}.RelWithDebInfo|x64.ActiveCfg = RelWithDebInfo|x64 - {6942D816-3031-3D6B-A1D1-9190C1BD49BE}.RelWithDebInfo|x64.Build.0 = RelWithDebInfo|x64 - {6942D816-3031-3D6B-A1D1-9190C1BD49BE}.RelWithDebInfo|x86.ActiveCfg = RelWithDebInfo|x64 - {6942D816-3031-3D6B-A1D1-9190C1BD49BE}.RelWithDebInfo|x86.Build.0 = RelWithDebInfo|x64 + {9617D7A5-789C-3233-B376-840B55453BA2}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {9617D7A5-789C-3233-B376-840B55453BA2}.Debug|ARM64.Build.0 = Debug|ARM64 + {9617D7A5-789C-3233-B376-840B55453BA2}.Debug|x64.ActiveCfg = Debug|x64 + {9617D7A5-789C-3233-B376-840B55453BA2}.Debug|x86.ActiveCfg = Debug|x64 + {9617D7A5-789C-3233-B376-840B55453BA2}.Debug|x86.Build.0 = Debug|x64 + {9617D7A5-789C-3233-B376-840B55453BA2}.FuzzerDebug|ARM64.ActiveCfg = FuzzerDebug|ARM64 + {9617D7A5-789C-3233-B376-840B55453BA2}.FuzzerDebug|ARM64.Build.0 = FuzzerDebug|ARM64 + {9617D7A5-789C-3233-B376-840B55453BA2}.FuzzerDebug|x64.ActiveCfg = RelWithDebInfo|x64 + {9617D7A5-789C-3233-B376-840B55453BA2}.FuzzerDebug|x64.Build.0 = RelWithDebInfo|x64 + {9617D7A5-789C-3233-B376-840B55453BA2}.FuzzerDebug|x86.ActiveCfg = FuzzerDebug|x64 + {9617D7A5-789C-3233-B376-840B55453BA2}.FuzzerDebug|x86.Build.0 = FuzzerDebug|x64 + {9617D7A5-789C-3233-B376-840B55453BA2}.MinSizeRel|ARM64.ActiveCfg = MinSizeRel|ARM64 + {9617D7A5-789C-3233-B376-840B55453BA2}.MinSizeRel|ARM64.Build.0 = MinSizeRel|ARM64 + {9617D7A5-789C-3233-B376-840B55453BA2}.MinSizeRel|x64.ActiveCfg = MinSizeRel|x64 + {9617D7A5-789C-3233-B376-840B55453BA2}.MinSizeRel|x64.Build.0 = MinSizeRel|x64 + {9617D7A5-789C-3233-B376-840B55453BA2}.MinSizeRel|x86.ActiveCfg = MinSizeRel|x64 + {9617D7A5-789C-3233-B376-840B55453BA2}.MinSizeRel|x86.Build.0 = MinSizeRel|x64 + {9617D7A5-789C-3233-B376-840B55453BA2}.NativeOnlyDebug|ARM64.ActiveCfg = Debug|ARM64 + {9617D7A5-789C-3233-B376-840B55453BA2}.NativeOnlyDebug|ARM64.Build.0 = Debug|ARM64 + {9617D7A5-789C-3233-B376-840B55453BA2}.NativeOnlyDebug|x64.ActiveCfg = Debug|x64 + {9617D7A5-789C-3233-B376-840B55453BA2}.NativeOnlyDebug|x86.ActiveCfg = Debug|x64 + {9617D7A5-789C-3233-B376-840B55453BA2}.NativeOnlyDebug|x86.Build.0 = Debug|x64 + {9617D7A5-789C-3233-B376-840B55453BA2}.NativeOnlyRelease|ARM64.ActiveCfg = Release|ARM64 + {9617D7A5-789C-3233-B376-840B55453BA2}.NativeOnlyRelease|ARM64.Build.0 = Release|ARM64 + {9617D7A5-789C-3233-B376-840B55453BA2}.NativeOnlyRelease|x64.ActiveCfg = Release|x64 + {9617D7A5-789C-3233-B376-840B55453BA2}.NativeOnlyRelease|x86.ActiveCfg = Release|x64 + {9617D7A5-789C-3233-B376-840B55453BA2}.NativeOnlyRelease|x86.Build.0 = Release|x64 + {9617D7A5-789C-3233-B376-840B55453BA2}.Release|ARM64.ActiveCfg = Release|ARM64 + {9617D7A5-789C-3233-B376-840B55453BA2}.Release|ARM64.Build.0 = Release|ARM64 + {9617D7A5-789C-3233-B376-840B55453BA2}.Release|x64.ActiveCfg = Release|x64 + {9617D7A5-789C-3233-B376-840B55453BA2}.Release|x86.ActiveCfg = Release|x64 + {9617D7A5-789C-3233-B376-840B55453BA2}.Release|x86.Build.0 = Release|x64 + {9617D7A5-789C-3233-B376-840B55453BA2}.RelWithDebInfo|ARM64.ActiveCfg = RelWithDebInfo|ARM64 + {9617D7A5-789C-3233-B376-840B55453BA2}.RelWithDebInfo|ARM64.Build.0 = RelWithDebInfo|ARM64 + {9617D7A5-789C-3233-B376-840B55453BA2}.RelWithDebInfo|x64.ActiveCfg = RelWithDebInfo|x64 + {9617D7A5-789C-3233-B376-840B55453BA2}.RelWithDebInfo|x64.Build.0 = RelWithDebInfo|x64 + {9617D7A5-789C-3233-B376-840B55453BA2}.RelWithDebInfo|x86.ActiveCfg = RelWithDebInfo|x64 + {9617D7A5-789C-3233-B376-840B55453BA2}.RelWithDebInfo|x86.Build.0 = RelWithDebInfo|x64 {55FF9B28-F3A2-465B-9E35-D154F2380581}.Debug|ARM64.ActiveCfg = Debug|ARM64 {55FF9B28-F3A2-465B-9E35-D154F2380581}.Debug|ARM64.Build.0 = Debug|ARM64 {55FF9B28-F3A2-465B-9E35-D154F2380581}.Debug|x64.ActiveCfg = Debug|x64 @@ -3269,118 +3268,118 @@ Global {55FF9B28-F3A2-465B-9E35-D154F2380581}.RelWithDebInfo|x64.Build.0 = RelWithDebInfo|x64 {55FF9B28-F3A2-465B-9E35-D154F2380581}.RelWithDebInfo|x86.ActiveCfg = RelWithDebInfo|x64 {55FF9B28-F3A2-465B-9E35-D154F2380581}.RelWithDebInfo|x86.Build.0 = RelWithDebInfo|x64 - {FE68637F-4C92-3656-A7B4-CFDE5DFFFCAE}.Debug|ARM64.ActiveCfg = Debug|ARM64 - {FE68637F-4C92-3656-A7B4-CFDE5DFFFCAE}.Debug|ARM64.Build.0 = Debug|ARM64 - {FE68637F-4C92-3656-A7B4-CFDE5DFFFCAE}.Debug|x64.ActiveCfg = Debug|x64 - {FE68637F-4C92-3656-A7B4-CFDE5DFFFCAE}.Debug|x86.ActiveCfg = Debug|x64 - {FE68637F-4C92-3656-A7B4-CFDE5DFFFCAE}.Debug|x86.Build.0 = Debug|x64 - {FE68637F-4C92-3656-A7B4-CFDE5DFFFCAE}.FuzzerDebug|ARM64.ActiveCfg = FuzzerDebug|ARM64 - {FE68637F-4C92-3656-A7B4-CFDE5DFFFCAE}.FuzzerDebug|ARM64.Build.0 = FuzzerDebug|ARM64 - {FE68637F-4C92-3656-A7B4-CFDE5DFFFCAE}.FuzzerDebug|x64.ActiveCfg = RelWithDebInfo|x64 - {FE68637F-4C92-3656-A7B4-CFDE5DFFFCAE}.FuzzerDebug|x64.Build.0 = RelWithDebInfo|x64 - {FE68637F-4C92-3656-A7B4-CFDE5DFFFCAE}.FuzzerDebug|x86.ActiveCfg = FuzzerDebug|x64 - {FE68637F-4C92-3656-A7B4-CFDE5DFFFCAE}.FuzzerDebug|x86.Build.0 = FuzzerDebug|x64 - {FE68637F-4C92-3656-A7B4-CFDE5DFFFCAE}.MinSizeRel|ARM64.ActiveCfg = MinSizeRel|ARM64 - {FE68637F-4C92-3656-A7B4-CFDE5DFFFCAE}.MinSizeRel|ARM64.Build.0 = MinSizeRel|ARM64 - {FE68637F-4C92-3656-A7B4-CFDE5DFFFCAE}.MinSizeRel|x64.ActiveCfg = MinSizeRel|x64 - {FE68637F-4C92-3656-A7B4-CFDE5DFFFCAE}.MinSizeRel|x64.Build.0 = MinSizeRel|x64 - {FE68637F-4C92-3656-A7B4-CFDE5DFFFCAE}.MinSizeRel|x86.ActiveCfg = MinSizeRel|x64 - {FE68637F-4C92-3656-A7B4-CFDE5DFFFCAE}.MinSizeRel|x86.Build.0 = MinSizeRel|x64 - {FE68637F-4C92-3656-A7B4-CFDE5DFFFCAE}.NativeOnlyDebug|ARM64.ActiveCfg = Debug|ARM64 - {FE68637F-4C92-3656-A7B4-CFDE5DFFFCAE}.NativeOnlyDebug|ARM64.Build.0 = Debug|ARM64 - {FE68637F-4C92-3656-A7B4-CFDE5DFFFCAE}.NativeOnlyDebug|x64.ActiveCfg = Debug|x64 - {FE68637F-4C92-3656-A7B4-CFDE5DFFFCAE}.NativeOnlyDebug|x86.ActiveCfg = Debug|x64 - {FE68637F-4C92-3656-A7B4-CFDE5DFFFCAE}.NativeOnlyDebug|x86.Build.0 = Debug|x64 - {FE68637F-4C92-3656-A7B4-CFDE5DFFFCAE}.NativeOnlyRelease|ARM64.ActiveCfg = Release|ARM64 - {FE68637F-4C92-3656-A7B4-CFDE5DFFFCAE}.NativeOnlyRelease|ARM64.Build.0 = Release|ARM64 - {FE68637F-4C92-3656-A7B4-CFDE5DFFFCAE}.NativeOnlyRelease|x64.ActiveCfg = Release|x64 - {FE68637F-4C92-3656-A7B4-CFDE5DFFFCAE}.NativeOnlyRelease|x86.ActiveCfg = Release|x64 - {FE68637F-4C92-3656-A7B4-CFDE5DFFFCAE}.NativeOnlyRelease|x86.Build.0 = Release|x64 - {FE68637F-4C92-3656-A7B4-CFDE5DFFFCAE}.Release|ARM64.ActiveCfg = Release|ARM64 - {FE68637F-4C92-3656-A7B4-CFDE5DFFFCAE}.Release|ARM64.Build.0 = Release|ARM64 - {FE68637F-4C92-3656-A7B4-CFDE5DFFFCAE}.Release|x64.ActiveCfg = Release|x64 - {FE68637F-4C92-3656-A7B4-CFDE5DFFFCAE}.Release|x86.ActiveCfg = Release|x64 - {FE68637F-4C92-3656-A7B4-CFDE5DFFFCAE}.Release|x86.Build.0 = Release|x64 - {FE68637F-4C92-3656-A7B4-CFDE5DFFFCAE}.RelWithDebInfo|ARM64.ActiveCfg = RelWithDebInfo|ARM64 - {FE68637F-4C92-3656-A7B4-CFDE5DFFFCAE}.RelWithDebInfo|ARM64.Build.0 = RelWithDebInfo|ARM64 - {FE68637F-4C92-3656-A7B4-CFDE5DFFFCAE}.RelWithDebInfo|x64.ActiveCfg = RelWithDebInfo|x64 - {FE68637F-4C92-3656-A7B4-CFDE5DFFFCAE}.RelWithDebInfo|x64.Build.0 = RelWithDebInfo|x64 - {FE68637F-4C92-3656-A7B4-CFDE5DFFFCAE}.RelWithDebInfo|x86.ActiveCfg = RelWithDebInfo|x64 - {FE68637F-4C92-3656-A7B4-CFDE5DFFFCAE}.RelWithDebInfo|x86.Build.0 = RelWithDebInfo|x64 - {DC8CA70C-ACBE-3EC0-A901-08FFEDCF535D}.Debug|ARM64.ActiveCfg = Debug|ARM64 - {DC8CA70C-ACBE-3EC0-A901-08FFEDCF535D}.Debug|ARM64.Build.0 = Debug|ARM64 - {DC8CA70C-ACBE-3EC0-A901-08FFEDCF535D}.Debug|x64.ActiveCfg = Debug|x64 - {DC8CA70C-ACBE-3EC0-A901-08FFEDCF535D}.Debug|x86.ActiveCfg = Debug|x64 - {DC8CA70C-ACBE-3EC0-A901-08FFEDCF535D}.Debug|x86.Build.0 = Debug|x64 - {DC8CA70C-ACBE-3EC0-A901-08FFEDCF535D}.FuzzerDebug|ARM64.ActiveCfg = FuzzerDebug|ARM64 - {DC8CA70C-ACBE-3EC0-A901-08FFEDCF535D}.FuzzerDebug|ARM64.Build.0 = FuzzerDebug|ARM64 - {DC8CA70C-ACBE-3EC0-A901-08FFEDCF535D}.FuzzerDebug|x64.ActiveCfg = RelWithDebInfo|x64 - {DC8CA70C-ACBE-3EC0-A901-08FFEDCF535D}.FuzzerDebug|x64.Build.0 = RelWithDebInfo|x64 - {DC8CA70C-ACBE-3EC0-A901-08FFEDCF535D}.FuzzerDebug|x86.ActiveCfg = FuzzerDebug|x64 - {DC8CA70C-ACBE-3EC0-A901-08FFEDCF535D}.FuzzerDebug|x86.Build.0 = FuzzerDebug|x64 - {DC8CA70C-ACBE-3EC0-A901-08FFEDCF535D}.MinSizeRel|ARM64.ActiveCfg = MinSizeRel|ARM64 - {DC8CA70C-ACBE-3EC0-A901-08FFEDCF535D}.MinSizeRel|ARM64.Build.0 = MinSizeRel|ARM64 - {DC8CA70C-ACBE-3EC0-A901-08FFEDCF535D}.MinSizeRel|x64.ActiveCfg = MinSizeRel|x64 - {DC8CA70C-ACBE-3EC0-A901-08FFEDCF535D}.MinSizeRel|x64.Build.0 = MinSizeRel|x64 - {DC8CA70C-ACBE-3EC0-A901-08FFEDCF535D}.MinSizeRel|x86.ActiveCfg = MinSizeRel|x64 - {DC8CA70C-ACBE-3EC0-A901-08FFEDCF535D}.MinSizeRel|x86.Build.0 = MinSizeRel|x64 - {DC8CA70C-ACBE-3EC0-A901-08FFEDCF535D}.NativeOnlyDebug|ARM64.ActiveCfg = Debug|ARM64 - {DC8CA70C-ACBE-3EC0-A901-08FFEDCF535D}.NativeOnlyDebug|ARM64.Build.0 = Debug|ARM64 - {DC8CA70C-ACBE-3EC0-A901-08FFEDCF535D}.NativeOnlyDebug|x64.ActiveCfg = Debug|x64 - {DC8CA70C-ACBE-3EC0-A901-08FFEDCF535D}.NativeOnlyDebug|x86.ActiveCfg = Debug|x64 - {DC8CA70C-ACBE-3EC0-A901-08FFEDCF535D}.NativeOnlyDebug|x86.Build.0 = Debug|x64 - {DC8CA70C-ACBE-3EC0-A901-08FFEDCF535D}.NativeOnlyRelease|ARM64.ActiveCfg = Release|ARM64 - {DC8CA70C-ACBE-3EC0-A901-08FFEDCF535D}.NativeOnlyRelease|ARM64.Build.0 = Release|ARM64 - {DC8CA70C-ACBE-3EC0-A901-08FFEDCF535D}.NativeOnlyRelease|x64.ActiveCfg = Release|x64 - {DC8CA70C-ACBE-3EC0-A901-08FFEDCF535D}.NativeOnlyRelease|x86.ActiveCfg = Release|x64 - {DC8CA70C-ACBE-3EC0-A901-08FFEDCF535D}.NativeOnlyRelease|x86.Build.0 = Release|x64 - {DC8CA70C-ACBE-3EC0-A901-08FFEDCF535D}.Release|ARM64.ActiveCfg = Release|ARM64 - {DC8CA70C-ACBE-3EC0-A901-08FFEDCF535D}.Release|ARM64.Build.0 = Release|ARM64 - {DC8CA70C-ACBE-3EC0-A901-08FFEDCF535D}.Release|x64.ActiveCfg = Release|x64 - {DC8CA70C-ACBE-3EC0-A901-08FFEDCF535D}.Release|x86.ActiveCfg = Release|x64 - {DC8CA70C-ACBE-3EC0-A901-08FFEDCF535D}.Release|x86.Build.0 = Release|x64 - {DC8CA70C-ACBE-3EC0-A901-08FFEDCF535D}.RelWithDebInfo|ARM64.ActiveCfg = RelWithDebInfo|ARM64 - {DC8CA70C-ACBE-3EC0-A901-08FFEDCF535D}.RelWithDebInfo|ARM64.Build.0 = RelWithDebInfo|ARM64 - {DC8CA70C-ACBE-3EC0-A901-08FFEDCF535D}.RelWithDebInfo|x64.ActiveCfg = RelWithDebInfo|x64 - {DC8CA70C-ACBE-3EC0-A901-08FFEDCF535D}.RelWithDebInfo|x64.Build.0 = RelWithDebInfo|x64 - {DC8CA70C-ACBE-3EC0-A901-08FFEDCF535D}.RelWithDebInfo|x86.ActiveCfg = RelWithDebInfo|x64 - {DC8CA70C-ACBE-3EC0-A901-08FFEDCF535D}.RelWithDebInfo|x86.Build.0 = RelWithDebInfo|x64 - {19A90A82-92D0-3246-93CA-F15A7B279297}.Debug|ARM64.ActiveCfg = Debug|ARM64 - {19A90A82-92D0-3246-93CA-F15A7B279297}.Debug|ARM64.Build.0 = Debug|ARM64 - {19A90A82-92D0-3246-93CA-F15A7B279297}.Debug|x64.ActiveCfg = Debug|x64 - {19A90A82-92D0-3246-93CA-F15A7B279297}.Debug|x86.ActiveCfg = Debug|x64 - {19A90A82-92D0-3246-93CA-F15A7B279297}.Debug|x86.Build.0 = Debug|x64 - {19A90A82-92D0-3246-93CA-F15A7B279297}.FuzzerDebug|ARM64.ActiveCfg = FuzzerDebug|ARM64 - {19A90A82-92D0-3246-93CA-F15A7B279297}.FuzzerDebug|ARM64.Build.0 = FuzzerDebug|ARM64 - {19A90A82-92D0-3246-93CA-F15A7B279297}.FuzzerDebug|x64.ActiveCfg = RelWithDebInfo|x64 - {19A90A82-92D0-3246-93CA-F15A7B279297}.FuzzerDebug|x64.Build.0 = RelWithDebInfo|x64 - {19A90A82-92D0-3246-93CA-F15A7B279297}.FuzzerDebug|x86.ActiveCfg = FuzzerDebug|x64 - {19A90A82-92D0-3246-93CA-F15A7B279297}.FuzzerDebug|x86.Build.0 = FuzzerDebug|x64 - {19A90A82-92D0-3246-93CA-F15A7B279297}.MinSizeRel|ARM64.ActiveCfg = MinSizeRel|ARM64 - {19A90A82-92D0-3246-93CA-F15A7B279297}.MinSizeRel|ARM64.Build.0 = MinSizeRel|ARM64 - {19A90A82-92D0-3246-93CA-F15A7B279297}.MinSizeRel|x64.ActiveCfg = MinSizeRel|x64 - {19A90A82-92D0-3246-93CA-F15A7B279297}.MinSizeRel|x64.Build.0 = MinSizeRel|x64 - {19A90A82-92D0-3246-93CA-F15A7B279297}.MinSizeRel|x86.ActiveCfg = MinSizeRel|x64 - {19A90A82-92D0-3246-93CA-F15A7B279297}.MinSizeRel|x86.Build.0 = MinSizeRel|x64 - {19A90A82-92D0-3246-93CA-F15A7B279297}.NativeOnlyDebug|ARM64.ActiveCfg = Debug|ARM64 - {19A90A82-92D0-3246-93CA-F15A7B279297}.NativeOnlyDebug|x64.ActiveCfg = Debug|x64 - {19A90A82-92D0-3246-93CA-F15A7B279297}.NativeOnlyDebug|x86.ActiveCfg = Debug|x64 - {19A90A82-92D0-3246-93CA-F15A7B279297}.NativeOnlyDebug|x86.Build.0 = Debug|x64 - {19A90A82-92D0-3246-93CA-F15A7B279297}.NativeOnlyRelease|ARM64.ActiveCfg = Release|ARM64 - {19A90A82-92D0-3246-93CA-F15A7B279297}.NativeOnlyRelease|x64.ActiveCfg = Release|x64 - {19A90A82-92D0-3246-93CA-F15A7B279297}.NativeOnlyRelease|x86.ActiveCfg = Release|x64 - {19A90A82-92D0-3246-93CA-F15A7B279297}.NativeOnlyRelease|x86.Build.0 = Release|x64 - {19A90A82-92D0-3246-93CA-F15A7B279297}.Release|ARM64.ActiveCfg = Release|ARM64 - {19A90A82-92D0-3246-93CA-F15A7B279297}.Release|ARM64.Build.0 = Release|ARM64 - {19A90A82-92D0-3246-93CA-F15A7B279297}.Release|x64.ActiveCfg = Release|x64 - {19A90A82-92D0-3246-93CA-F15A7B279297}.Release|x86.ActiveCfg = Release|x64 - {19A90A82-92D0-3246-93CA-F15A7B279297}.Release|x86.Build.0 = Release|x64 - {19A90A82-92D0-3246-93CA-F15A7B279297}.RelWithDebInfo|ARM64.ActiveCfg = RelWithDebInfo|ARM64 - {19A90A82-92D0-3246-93CA-F15A7B279297}.RelWithDebInfo|ARM64.Build.0 = RelWithDebInfo|ARM64 - {19A90A82-92D0-3246-93CA-F15A7B279297}.RelWithDebInfo|x64.ActiveCfg = RelWithDebInfo|x64 - {19A90A82-92D0-3246-93CA-F15A7B279297}.RelWithDebInfo|x64.Build.0 = RelWithDebInfo|x64 - {19A90A82-92D0-3246-93CA-F15A7B279297}.RelWithDebInfo|x86.ActiveCfg = RelWithDebInfo|x64 - {19A90A82-92D0-3246-93CA-F15A7B279297}.RelWithDebInfo|x86.Build.0 = RelWithDebInfo|x64 + {07DB18F6-8DBC-34EA-B94A-692984756D22}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {07DB18F6-8DBC-34EA-B94A-692984756D22}.Debug|ARM64.Build.0 = Debug|ARM64 + {07DB18F6-8DBC-34EA-B94A-692984756D22}.Debug|x64.ActiveCfg = Debug|x64 + {07DB18F6-8DBC-34EA-B94A-692984756D22}.Debug|x86.ActiveCfg = Debug|x64 + {07DB18F6-8DBC-34EA-B94A-692984756D22}.Debug|x86.Build.0 = Debug|x64 + {07DB18F6-8DBC-34EA-B94A-692984756D22}.FuzzerDebug|ARM64.ActiveCfg = FuzzerDebug|ARM64 + {07DB18F6-8DBC-34EA-B94A-692984756D22}.FuzzerDebug|ARM64.Build.0 = FuzzerDebug|ARM64 + {07DB18F6-8DBC-34EA-B94A-692984756D22}.FuzzerDebug|x64.ActiveCfg = RelWithDebInfo|x64 + {07DB18F6-8DBC-34EA-B94A-692984756D22}.FuzzerDebug|x64.Build.0 = RelWithDebInfo|x64 + {07DB18F6-8DBC-34EA-B94A-692984756D22}.FuzzerDebug|x86.ActiveCfg = FuzzerDebug|x64 + {07DB18F6-8DBC-34EA-B94A-692984756D22}.FuzzerDebug|x86.Build.0 = FuzzerDebug|x64 + {07DB18F6-8DBC-34EA-B94A-692984756D22}.MinSizeRel|ARM64.ActiveCfg = MinSizeRel|ARM64 + {07DB18F6-8DBC-34EA-B94A-692984756D22}.MinSizeRel|ARM64.Build.0 = MinSizeRel|ARM64 + {07DB18F6-8DBC-34EA-B94A-692984756D22}.MinSizeRel|x64.ActiveCfg = MinSizeRel|x64 + {07DB18F6-8DBC-34EA-B94A-692984756D22}.MinSizeRel|x64.Build.0 = MinSizeRel|x64 + {07DB18F6-8DBC-34EA-B94A-692984756D22}.MinSizeRel|x86.ActiveCfg = MinSizeRel|x64 + {07DB18F6-8DBC-34EA-B94A-692984756D22}.MinSizeRel|x86.Build.0 = MinSizeRel|x64 + {07DB18F6-8DBC-34EA-B94A-692984756D22}.NativeOnlyDebug|ARM64.ActiveCfg = Debug|ARM64 + {07DB18F6-8DBC-34EA-B94A-692984756D22}.NativeOnlyDebug|ARM64.Build.0 = Debug|ARM64 + {07DB18F6-8DBC-34EA-B94A-692984756D22}.NativeOnlyDebug|x64.ActiveCfg = Debug|x64 + {07DB18F6-8DBC-34EA-B94A-692984756D22}.NativeOnlyDebug|x86.ActiveCfg = Debug|x64 + {07DB18F6-8DBC-34EA-B94A-692984756D22}.NativeOnlyDebug|x86.Build.0 = Debug|x64 + {07DB18F6-8DBC-34EA-B94A-692984756D22}.NativeOnlyRelease|ARM64.ActiveCfg = Release|ARM64 + {07DB18F6-8DBC-34EA-B94A-692984756D22}.NativeOnlyRelease|ARM64.Build.0 = Release|ARM64 + {07DB18F6-8DBC-34EA-B94A-692984756D22}.NativeOnlyRelease|x64.ActiveCfg = Release|x64 + {07DB18F6-8DBC-34EA-B94A-692984756D22}.NativeOnlyRelease|x86.ActiveCfg = Release|x64 + {07DB18F6-8DBC-34EA-B94A-692984756D22}.NativeOnlyRelease|x86.Build.0 = Release|x64 + {07DB18F6-8DBC-34EA-B94A-692984756D22}.Release|ARM64.ActiveCfg = Release|ARM64 + {07DB18F6-8DBC-34EA-B94A-692984756D22}.Release|ARM64.Build.0 = Release|ARM64 + {07DB18F6-8DBC-34EA-B94A-692984756D22}.Release|x64.ActiveCfg = Release|x64 + {07DB18F6-8DBC-34EA-B94A-692984756D22}.Release|x86.ActiveCfg = Release|x64 + {07DB18F6-8DBC-34EA-B94A-692984756D22}.Release|x86.Build.0 = Release|x64 + {07DB18F6-8DBC-34EA-B94A-692984756D22}.RelWithDebInfo|ARM64.ActiveCfg = RelWithDebInfo|ARM64 + {07DB18F6-8DBC-34EA-B94A-692984756D22}.RelWithDebInfo|ARM64.Build.0 = RelWithDebInfo|ARM64 + {07DB18F6-8DBC-34EA-B94A-692984756D22}.RelWithDebInfo|x64.ActiveCfg = RelWithDebInfo|x64 + {07DB18F6-8DBC-34EA-B94A-692984756D22}.RelWithDebInfo|x64.Build.0 = RelWithDebInfo|x64 + {07DB18F6-8DBC-34EA-B94A-692984756D22}.RelWithDebInfo|x86.ActiveCfg = RelWithDebInfo|x64 + {07DB18F6-8DBC-34EA-B94A-692984756D22}.RelWithDebInfo|x86.Build.0 = RelWithDebInfo|x64 + {961C97F9-6708-3C38-B9FA-A914C1F647A9}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {961C97F9-6708-3C38-B9FA-A914C1F647A9}.Debug|ARM64.Build.0 = Debug|ARM64 + {961C97F9-6708-3C38-B9FA-A914C1F647A9}.Debug|x64.ActiveCfg = Debug|x64 + {961C97F9-6708-3C38-B9FA-A914C1F647A9}.Debug|x86.ActiveCfg = Debug|x64 + {961C97F9-6708-3C38-B9FA-A914C1F647A9}.Debug|x86.Build.0 = Debug|x64 + {961C97F9-6708-3C38-B9FA-A914C1F647A9}.FuzzerDebug|ARM64.ActiveCfg = FuzzerDebug|ARM64 + {961C97F9-6708-3C38-B9FA-A914C1F647A9}.FuzzerDebug|ARM64.Build.0 = FuzzerDebug|ARM64 + {961C97F9-6708-3C38-B9FA-A914C1F647A9}.FuzzerDebug|x64.ActiveCfg = RelWithDebInfo|x64 + {961C97F9-6708-3C38-B9FA-A914C1F647A9}.FuzzerDebug|x64.Build.0 = RelWithDebInfo|x64 + {961C97F9-6708-3C38-B9FA-A914C1F647A9}.FuzzerDebug|x86.ActiveCfg = FuzzerDebug|x64 + {961C97F9-6708-3C38-B9FA-A914C1F647A9}.FuzzerDebug|x86.Build.0 = FuzzerDebug|x64 + {961C97F9-6708-3C38-B9FA-A914C1F647A9}.MinSizeRel|ARM64.ActiveCfg = MinSizeRel|ARM64 + {961C97F9-6708-3C38-B9FA-A914C1F647A9}.MinSizeRel|ARM64.Build.0 = MinSizeRel|ARM64 + {961C97F9-6708-3C38-B9FA-A914C1F647A9}.MinSizeRel|x64.ActiveCfg = MinSizeRel|x64 + {961C97F9-6708-3C38-B9FA-A914C1F647A9}.MinSizeRel|x64.Build.0 = MinSizeRel|x64 + {961C97F9-6708-3C38-B9FA-A914C1F647A9}.MinSizeRel|x86.ActiveCfg = MinSizeRel|x64 + {961C97F9-6708-3C38-B9FA-A914C1F647A9}.MinSizeRel|x86.Build.0 = MinSizeRel|x64 + {961C97F9-6708-3C38-B9FA-A914C1F647A9}.NativeOnlyDebug|ARM64.ActiveCfg = Debug|ARM64 + {961C97F9-6708-3C38-B9FA-A914C1F647A9}.NativeOnlyDebug|ARM64.Build.0 = Debug|ARM64 + {961C97F9-6708-3C38-B9FA-A914C1F647A9}.NativeOnlyDebug|x64.ActiveCfg = Debug|x64 + {961C97F9-6708-3C38-B9FA-A914C1F647A9}.NativeOnlyDebug|x86.ActiveCfg = Debug|x64 + {961C97F9-6708-3C38-B9FA-A914C1F647A9}.NativeOnlyDebug|x86.Build.0 = Debug|x64 + {961C97F9-6708-3C38-B9FA-A914C1F647A9}.NativeOnlyRelease|ARM64.ActiveCfg = Release|ARM64 + {961C97F9-6708-3C38-B9FA-A914C1F647A9}.NativeOnlyRelease|ARM64.Build.0 = Release|ARM64 + {961C97F9-6708-3C38-B9FA-A914C1F647A9}.NativeOnlyRelease|x64.ActiveCfg = Release|x64 + {961C97F9-6708-3C38-B9FA-A914C1F647A9}.NativeOnlyRelease|x86.ActiveCfg = Release|x64 + {961C97F9-6708-3C38-B9FA-A914C1F647A9}.NativeOnlyRelease|x86.Build.0 = Release|x64 + {961C97F9-6708-3C38-B9FA-A914C1F647A9}.Release|ARM64.ActiveCfg = Release|ARM64 + {961C97F9-6708-3C38-B9FA-A914C1F647A9}.Release|ARM64.Build.0 = Release|ARM64 + {961C97F9-6708-3C38-B9FA-A914C1F647A9}.Release|x64.ActiveCfg = Release|x64 + {961C97F9-6708-3C38-B9FA-A914C1F647A9}.Release|x86.ActiveCfg = Release|x64 + {961C97F9-6708-3C38-B9FA-A914C1F647A9}.Release|x86.Build.0 = Release|x64 + {961C97F9-6708-3C38-B9FA-A914C1F647A9}.RelWithDebInfo|ARM64.ActiveCfg = RelWithDebInfo|ARM64 + {961C97F9-6708-3C38-B9FA-A914C1F647A9}.RelWithDebInfo|ARM64.Build.0 = RelWithDebInfo|ARM64 + {961C97F9-6708-3C38-B9FA-A914C1F647A9}.RelWithDebInfo|x64.ActiveCfg = RelWithDebInfo|x64 + {961C97F9-6708-3C38-B9FA-A914C1F647A9}.RelWithDebInfo|x64.Build.0 = RelWithDebInfo|x64 + {961C97F9-6708-3C38-B9FA-A914C1F647A9}.RelWithDebInfo|x86.ActiveCfg = RelWithDebInfo|x64 + {961C97F9-6708-3C38-B9FA-A914C1F647A9}.RelWithDebInfo|x86.Build.0 = RelWithDebInfo|x64 + {2AAA62C7-08D0-3268-A8DF-3B29D4E4AA7F}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {2AAA62C7-08D0-3268-A8DF-3B29D4E4AA7F}.Debug|ARM64.Build.0 = Debug|ARM64 + {2AAA62C7-08D0-3268-A8DF-3B29D4E4AA7F}.Debug|x64.ActiveCfg = Debug|x64 + {2AAA62C7-08D0-3268-A8DF-3B29D4E4AA7F}.Debug|x86.ActiveCfg = Debug|x64 + {2AAA62C7-08D0-3268-A8DF-3B29D4E4AA7F}.Debug|x86.Build.0 = Debug|x64 + {2AAA62C7-08D0-3268-A8DF-3B29D4E4AA7F}.FuzzerDebug|ARM64.ActiveCfg = FuzzerDebug|ARM64 + {2AAA62C7-08D0-3268-A8DF-3B29D4E4AA7F}.FuzzerDebug|ARM64.Build.0 = FuzzerDebug|ARM64 + {2AAA62C7-08D0-3268-A8DF-3B29D4E4AA7F}.FuzzerDebug|x64.ActiveCfg = RelWithDebInfo|x64 + {2AAA62C7-08D0-3268-A8DF-3B29D4E4AA7F}.FuzzerDebug|x64.Build.0 = RelWithDebInfo|x64 + {2AAA62C7-08D0-3268-A8DF-3B29D4E4AA7F}.FuzzerDebug|x86.ActiveCfg = FuzzerDebug|x64 + {2AAA62C7-08D0-3268-A8DF-3B29D4E4AA7F}.FuzzerDebug|x86.Build.0 = FuzzerDebug|x64 + {2AAA62C7-08D0-3268-A8DF-3B29D4E4AA7F}.MinSizeRel|ARM64.ActiveCfg = MinSizeRel|ARM64 + {2AAA62C7-08D0-3268-A8DF-3B29D4E4AA7F}.MinSizeRel|ARM64.Build.0 = MinSizeRel|ARM64 + {2AAA62C7-08D0-3268-A8DF-3B29D4E4AA7F}.MinSizeRel|x64.ActiveCfg = MinSizeRel|x64 + {2AAA62C7-08D0-3268-A8DF-3B29D4E4AA7F}.MinSizeRel|x64.Build.0 = MinSizeRel|x64 + {2AAA62C7-08D0-3268-A8DF-3B29D4E4AA7F}.MinSizeRel|x86.ActiveCfg = MinSizeRel|x64 + {2AAA62C7-08D0-3268-A8DF-3B29D4E4AA7F}.MinSizeRel|x86.Build.0 = MinSizeRel|x64 + {2AAA62C7-08D0-3268-A8DF-3B29D4E4AA7F}.NativeOnlyDebug|ARM64.ActiveCfg = Debug|ARM64 + {2AAA62C7-08D0-3268-A8DF-3B29D4E4AA7F}.NativeOnlyDebug|x64.ActiveCfg = Debug|x64 + {2AAA62C7-08D0-3268-A8DF-3B29D4E4AA7F}.NativeOnlyDebug|x86.ActiveCfg = Debug|x64 + {2AAA62C7-08D0-3268-A8DF-3B29D4E4AA7F}.NativeOnlyDebug|x86.Build.0 = Debug|x64 + {2AAA62C7-08D0-3268-A8DF-3B29D4E4AA7F}.NativeOnlyRelease|ARM64.ActiveCfg = Release|ARM64 + {2AAA62C7-08D0-3268-A8DF-3B29D4E4AA7F}.NativeOnlyRelease|x64.ActiveCfg = Release|x64 + {2AAA62C7-08D0-3268-A8DF-3B29D4E4AA7F}.NativeOnlyRelease|x86.ActiveCfg = Release|x64 + {2AAA62C7-08D0-3268-A8DF-3B29D4E4AA7F}.NativeOnlyRelease|x86.Build.0 = Release|x64 + {2AAA62C7-08D0-3268-A8DF-3B29D4E4AA7F}.Release|ARM64.ActiveCfg = Release|ARM64 + {2AAA62C7-08D0-3268-A8DF-3B29D4E4AA7F}.Release|ARM64.Build.0 = Release|ARM64 + {2AAA62C7-08D0-3268-A8DF-3B29D4E4AA7F}.Release|x64.ActiveCfg = Release|x64 + {2AAA62C7-08D0-3268-A8DF-3B29D4E4AA7F}.Release|x86.ActiveCfg = Release|x64 + {2AAA62C7-08D0-3268-A8DF-3B29D4E4AA7F}.Release|x86.Build.0 = Release|x64 + {2AAA62C7-08D0-3268-A8DF-3B29D4E4AA7F}.RelWithDebInfo|ARM64.ActiveCfg = RelWithDebInfo|ARM64 + {2AAA62C7-08D0-3268-A8DF-3B29D4E4AA7F}.RelWithDebInfo|ARM64.Build.0 = RelWithDebInfo|ARM64 + {2AAA62C7-08D0-3268-A8DF-3B29D4E4AA7F}.RelWithDebInfo|x64.ActiveCfg = RelWithDebInfo|x64 + {2AAA62C7-08D0-3268-A8DF-3B29D4E4AA7F}.RelWithDebInfo|x64.Build.0 = RelWithDebInfo|x64 + {2AAA62C7-08D0-3268-A8DF-3B29D4E4AA7F}.RelWithDebInfo|x86.ActiveCfg = RelWithDebInfo|x64 + {2AAA62C7-08D0-3268-A8DF-3B29D4E4AA7F}.RelWithDebInfo|x86.Build.0 = RelWithDebInfo|x64 {3D563E44-B7D0-499C-A15C-C1C1B9A73B6F}.Debug|ARM64.ActiveCfg = Debug|ARM64 {3D563E44-B7D0-499C-A15C-C1C1B9A73B6F}.Debug|ARM64.Build.0 = Debug|ARM64 {3D563E44-B7D0-499C-A15C-C1C1B9A73B6F}.Debug|x64.ActiveCfg = Debug|x64 @@ -3480,7 +3479,7 @@ Global {4F082524-9496-44FA-8CBA-4BC0BDC62568} = {492C9B22-9237-4996-9E33-CA14D3533616} {AA933B9F-B5D8-4AA8-AC18-98FE1A161E8A} = {69CDB6A1-434D-4BC9-9BFF-D12DF7EDBB6B} {030A7AC6-14DC-45CF-AF34-891057AB1402} = {69CDB6A1-434D-4BC9-9BFF-D12DF7EDBB6B} - {5D450380-AE0C-3DAA-A0CC-F1291D1DE9EE} = {69CDB6A1-434D-4BC9-9BFF-D12DF7EDBB6B} + {0899051F-C386-39C8-B253-60F00B2E5CFF} = {69CDB6A1-434D-4BC9-9BFF-D12DF7EDBB6B} {1937DB41-F3EB-4955-A636-6386DCB394F6} = {69CDB6A1-434D-4BC9-9BFF-D12DF7EDBB6B} {1FDAD2FD-EBD8-462A-B285-ED5174E55079} = {97D3096A-20FB-4ACB-A038-88E652FE61E3} {9388DD45-7941-45D7-B4FF-BC00F550AF17} = {69CDB6A1-434D-4BC9-9BFF-D12DF7EDBB6B} @@ -3493,14 +3492,14 @@ Global {C8D46543-5AE5-4E66-B9CE-8B84588B1C9E} = {984080A6-5890-4ADE-BF8C-DC78EBAB0E8B} {6D365515-DE92-4CEB-AB3D-5608719A8886} = {492C9B22-9237-4996-9E33-CA14D3533616} {58D6BAB8-10EF-4A99-AFF2-6B14269A8DCD} = {B09749EC-3D14-414B-BA9B-CD20E218DC84} - {6942D816-3031-3D6B-A1D1-9190C1BD49BE} = {4E5F20F6-6B89-40DC-8F26-4A0E3CD1B6BA} + {9617D7A5-789C-3233-B376-840B55453BA2} = {4E5F20F6-6B89-40DC-8F26-4A0E3CD1B6BA} {55FF9B28-F3A2-465B-9E35-D154F2380581} = {4E5F20F6-6B89-40DC-8F26-4A0E3CD1B6BA} - {FE68637F-4C92-3656-A7B4-CFDE5DFFFCAE} = {4E5F20F6-6B89-40DC-8F26-4A0E3CD1B6BA} - {DC8CA70C-ACBE-3EC0-A901-08FFEDCF535D} = {4E5F20F6-6B89-40DC-8F26-4A0E3CD1B6BA} - {19A90A82-92D0-3246-93CA-F15A7B279297} = {4E5F20F6-6B89-40DC-8F26-4A0E3CD1B6BA} + {07DB18F6-8DBC-34EA-B94A-692984756D22} = {4E5F20F6-6B89-40DC-8F26-4A0E3CD1B6BA} + {961C97F9-6708-3C38-B9FA-A914C1F647A9} = {4E5F20F6-6B89-40DC-8F26-4A0E3CD1B6BA} + {2AAA62C7-08D0-3268-A8DF-3B29D4E4AA7F} = {4E5F20F6-6B89-40DC-8F26-4A0E3CD1B6BA} {3D563E44-B7D0-499C-A15C-C1C1B9A73B6F} = {4E5F20F6-6B89-40DC-8F26-4A0E3CD1B6BA} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {3D5F862D-74C6-4357-9F95-0B152E33B7B8} EndGlobalSection -EndGlobal \ No newline at end of file +EndGlobal diff --git a/ebpfapi/Source.def b/ebpfapi/Source.def index 5ed6825c08..80e33f71b6 100644 --- a/ebpfapi/Source.def +++ b/ebpfapi/Source.def @@ -105,6 +105,7 @@ EXPORTS ebpf_api_elf_verify_program_from_file ebpf_api_elf_verify_program_from_memory ebpf_api_close_handle + ebpf_api_get_data_section ebpf_api_get_pinned_map_info ebpf_api_map_info_free ebpf_canonicalize_pin_path diff --git a/include/ebpf_api.h b/include/ebpf_api.h index b3b527a471..e8157afb45 100644 --- a/include/ebpf_api.h +++ b/include/ebpf_api.h @@ -67,14 +67,14 @@ extern "C" } ebpf_api_program_info_t; /** - * @brief Get list of programs and stats in an eBPF file. - * @param[in] file Name of file containing eBPF programs. - * @param[in] verbose Obtain additional info about the programs. - * @param[out] infos On success points to a list of eBPF programs. - * The caller is responsible for freeing the list via ebpf_free_programs(). - * @param[out] error_message On failure points to a text description of - * the error. - */ + * @brief Get list of programs and stats in an eBPF file. + * @param[in] file Name of file containing eBPF programs. + * @param[in] verbose Obtain additional info about the programs. + * @param[out] infos On success points to a list of eBPF programs. + * The caller is responsible for freeing the list via ebpf_free_programs(). + * @param[out] error_message On failure points to a text description of + * the error. + */ _Must_inspect_result_ ebpf_result_t ebpf_enumerate_programs( _In_z_ const char* file, @@ -798,6 +798,25 @@ extern "C" _In_opt_ void* ctx, _In_opt_ const struct ebpf_perf_buffer_opts* opts) EBPF_NO_EXCEPT; + /** + * @brief Extract data from a named section in a PE or ELF file. + * @param[in] file_path Path to the PE or ELF file. + * @param[in] section_name Name of the section to extract. + * @param[out] data Pointer to buffer to receive section data. If NULL, only the size is returned. + * @param[in,out] data_size On input, size of the buffer. On output, actual size of section data. + * @retval EBPF_SUCCESS The operation was successful. + * @retval EBPF_INSUFFICIENT_BUFFER The buffer is too small. data_size contains required size. + * @retval EBPF_INVALID_ARGUMENT Invalid parameters. + * @retval EBPF_OBJECT_NOT_FOUND Section not found in file. + * @retval EBPF_INVALID_OBJECT File format is invalid or unsupported. + */ + _Must_inspect_result_ ebpf_result_t + ebpf_api_get_data_section( + _In_z_ const char* file_path, + _In_z_ const char* section_name, + _Out_writes_bytes_opt_(*data_size) uint8_t* data, + _Inout_ size_t* data_size) EBPF_NO_EXCEPT; + #ifdef __cplusplus } #endif diff --git a/libs/api/ebpf_api.cpp b/libs/api/ebpf_api.cpp index c56f24200e..d2c9a4ec95 100644 --- a/libs/api/ebpf_api.cpp +++ b/libs/api/ebpf_api.cpp @@ -15,6 +15,10 @@ #include "ebpf_serialize.h" #include "ebpf_shared_framework.h" #include "ebpf_tracelog.h" +// Undefine Windows min/max macros for ELFIO +#undef max +#undef min +#include "elfio_wrapper.hpp" #include "hash.h" #pragma warning(push) #pragma warning(disable : 4200) // Zero-sized array in struct/union @@ -564,7 +568,7 @@ _ebpf_map_lookup_element_batch_helper( while (count_returned < input_count) { // Fetch the next batch of entries. - size_t entries_to_fetch = min(input_count - count_returned, max_entries_per_batch); + size_t entries_to_fetch = std::min(input_count - count_returned, max_entries_per_batch); ebpf_protocol_buffer_t request_buffer( EBPF_OFFSET_OF(_ebpf_operation_map_get_next_key_value_batch_request, previous_key) + @@ -772,7 +776,7 @@ _update_map_element_batch( try { for (size_t key_index = 0; key_index < input_count;) { // Compute the number of entries to update in this batch. - size_t entries_to_update = min(input_count - key_index, max_entries_per_batch); + size_t entries_to_update = std::min(input_count - key_index, max_entries_per_batch); request_buffer.resize( EBPF_OFFSET_OF(ebpf_operation_map_update_element_batch_request_t, data) + @@ -1102,7 +1106,7 @@ ebpf_map_delete_element_batch(fd_t map_fd, _In_ const void* keys, _Inout_ uint32 try { for (size_t key_index = 0; key_index < input_count;) { // Compute the number of entries to update in this batch. - size_t entries_to_delete = min(input_count - key_index, max_entries_per_batch); + size_t entries_to_delete = std::min(input_count - key_index, max_entries_per_batch); request_buffer.resize( EBPF_OFFSET_OF(ebpf_operation_map_delete_element_batch_request_t, keys) + key_size * entries_to_delete); @@ -2596,7 +2600,7 @@ _ebpf_pe_get_map_definitions( // at other times, they are 16-byte-aligned. Skip over them looking for the // map_entry_t which starts with an 8-byte-aligned NULL pointer where the previous // byte (if any) is also 00, and the following 8 bytes are also NULL. The next 8 bytes - // are not not NULL though. + // are not NULL though. uint32_t map_offset = 0; uint64_t zero = 0; while (map_offset + 24 < section_header.Misc.VirtualSize && @@ -5252,6 +5256,134 @@ ebpf_map_set_wait_handle(fd_t map_fd, uint64_t index, ebpf_handle_t handle) NO_E } CATCH_NO_MEMORY_EBPF_RESULT +// Context structure for section data extraction. +typedef struct _ebpf_section_data_context +{ + const char* section_name; + bool section_found; + size_t section_size; + const uint8_t* section_data; +} ebpf_section_data_context_t; + +// Callback function for PE section iteration. +static int +_ebpf_pe_find_section( + _Inout_ void* context, + _In_ const VA& va, + _In_ const std::string& section_name, + _In_ const image_section_header& section_header, + _In_ const bounded_buffer* buffer) NO_EXCEPT_TRY +{ + UNREFERENCED_PARAMETER(va); + UNREFERENCED_PARAMETER(section_header); + + ebpf_section_data_context_t* ctx = static_cast(context); + + if (section_name == ctx->section_name && buffer != nullptr) { + ctx->section_found = true; + ctx->section_size = buffer->bufLen; + ctx->section_data = buffer->buf; + return 1; // Stop iteration. + } + return 0; // Continue iteration. +} +CATCH_NO_MEMORY_INT(1) + +_Must_inspect_result_ ebpf_result_t +ebpf_api_get_data_section( + _In_z_ const char* file_path, + _In_z_ const char* section_name, + _Out_writes_bytes_opt_(*data_size) uint8_t* data, + _Inout_ size_t* data_size) NO_EXCEPT_TRY +{ + EBPF_LOG_ENTRY(); + + if (file_path == nullptr || section_name == nullptr || data_size == nullptr) { + EBPF_RETURN_RESULT(EBPF_INVALID_ARGUMENT); + } + + // Determine file type by extension. + std::string path(file_path); + bool is_pe_file = false; + if (path.size() > 4) { + std::string extension = path.substr(path.size() - 4); + std::transform(extension.begin(), extension.end(), extension.begin(), [](char c) { + return static_cast(::tolower(static_cast(c))); + }); + is_pe_file = (extension == ".dll" || extension == ".sys" || extension == ".exe"); + } + + ebpf_result_t result = EBPF_SUCCESS; + + if (is_pe_file) { + // Parse PE file using pe-parse library. + std::scoped_lock pe_parse_lock(_pe_parse_mutex); + parsed_pe* pe = ParsePEFromFile(file_path); + if (pe == nullptr) { + EBPF_RETURN_RESULT(EBPF_INVALID_OBJECT); + } + + // Set up context for section search. + ebpf_section_data_context_t section_context = { + .section_name = section_name, .section_found = false, .section_size = 0, .section_data = nullptr}; + + IterSec(pe, _ebpf_pe_find_section, §ion_context); + + if (!section_context.section_found) { + DestructParsedPE(pe); + EBPF_RETURN_RESULT(EBPF_OBJECT_NOT_FOUND); + } + + // Check buffer size. + if (data == nullptr) { + // Just return the size. + *data_size = section_context.section_size; + } else if (*data_size < section_context.section_size) { + // Buffer too small. + *data_size = section_context.section_size; + DestructParsedPE(pe); + EBPF_RETURN_RESULT(EBPF_INSUFFICIENT_BUFFER); + } else { + // Copy data to buffer. + memcpy(data, section_context.section_data, section_context.section_size); + *data_size = section_context.section_size; + } + + DestructParsedPE(pe); + } else { + // Parse ELF file using ELFIO library. + ELFIO::elfio reader; + if (!reader.load(file_path)) { + EBPF_RETURN_RESULT(EBPF_INVALID_OBJECT); + } + + // Find the section by name. + ELFIO::section* section = reader.sections[section_name]; + if (section == nullptr || section->get_data() == nullptr) { + EBPF_RETURN_RESULT(EBPF_OBJECT_NOT_FOUND); + } + + size_t section_size = section->get_size(); + + // Check buffer size. + if (data == nullptr) { + // Just return the size. + *data_size = section_size; + } else if (*data_size < section_size) { + // Buffer too small. + *data_size = section_size; + EBPF_RETURN_RESULT(EBPF_INSUFFICIENT_BUFFER); + } else { + // Copy data to buffer. + memcpy(data, section->get_data(), section_size); + *data_size = section_size; + } + } + + EBPF_RETURN_RESULT(result); +} +CATCH_NO_MEMORY_EBPF_RESULT + static _Must_inspect_result_ ebpf_result_t _ebpf_link_mark_as_legacy_mode(ebpf_handle_t link_handle) NO_EXCEPT_TRY { diff --git a/libs/ebpfnetsh/ebpfnetsh.vcxproj b/libs/ebpfnetsh/ebpfnetsh.vcxproj index 223b1389a2..a9671128be 100644 --- a/libs/ebpfnetsh/ebpfnetsh.vcxproj +++ b/libs/ebpfnetsh/ebpfnetsh.vcxproj @@ -101,6 +101,7 @@ + @@ -110,6 +111,7 @@ + diff --git a/libs/ebpfnetsh/ebpfnetsh.vcxproj.filters b/libs/ebpfnetsh/ebpfnetsh.vcxproj.filters index 922eb5bc2d..d66706baf1 100644 --- a/libs/ebpfnetsh/ebpfnetsh.vcxproj.filters +++ b/libs/ebpfnetsh/ebpfnetsh.vcxproj.filters @@ -22,6 +22,9 @@ Source Files + + Source Files + Source Files @@ -45,6 +48,9 @@ Header Files + + Header Files + Header Files diff --git a/libs/ebpfnetsh/netsh_hash.cpp b/libs/ebpfnetsh/netsh_hash.cpp new file mode 100644 index 0000000000..343d284332 --- /dev/null +++ b/libs/ebpfnetsh/netsh_hash.cpp @@ -0,0 +1,130 @@ +// Copyright (c) eBPF for Windows contributors +// SPDX-License-Identifier: MIT + +#include "ebpf_api.h" +#include "netsh_hash.h" +#include "platform.h" +#include "tokens.h" +#include "utilities.h" + +#include +#include +#include +#include + +// The following function uses Windows-specific types as an input to match +// definition of "FN_HANDLE_CMD" in public file of NetSh.h. +unsigned long +handle_ebpf_show_hash( + IN LPCWSTR machine, + _Inout_updates_(argc) LPWSTR* argv, + IN DWORD current_index, + IN DWORD argc, + IN DWORD flags, + IN LPCVOID data, + OUT BOOL* done) +{ + UNREFERENCED_PARAMETER(machine); + UNREFERENCED_PARAMETER(flags); + UNREFERENCED_PARAMETER(data); + UNREFERENCED_PARAMETER(done); + + TAG_TYPE tags[] = { + {TOKEN_FILENAME, NS_REQ_PRESENT, FALSE}, + {TOKEN_HASHONLY, NS_REQ_ZERO, FALSE}, + }; + const int FILENAME_INDEX = 0; + const int HASHONLY_INDEX = 1; + + unsigned long tag_type[_countof(tags)] = {0}; + + unsigned long status = + PreprocessCommand(nullptr, argv, current_index, argc, tags, _countof(tags), 0, _countof(tags), tag_type); + + std::string filename; + bool hash_only = false; + for (int i = 0; (status == NO_ERROR) && ((i + current_index) < argc); i++) { + switch (tag_type[i]) { + case FILENAME_INDEX: { + filename = down_cast_from_wstring(std::wstring(argv[current_index + i])); + break; + } + case HASHONLY_INDEX: { + hash_only = true; + break; + } + default: + status = ERROR_INVALID_SYNTAX; + break; + } + } + + if (status != NO_ERROR) { + return status; + } + + // First get the size of the hash section. + size_t hash_size = 0; + ebpf_result_t result = ebpf_api_get_data_section(filename.c_str(), "hash", nullptr, &hash_size); + + if (result == EBPF_INVALID_OBJECT) { + std::cout << "error: No such file or directory opening " << filename << std::endl; + return ERROR_SUPPRESS_OUTPUT; + } else if (result == EBPF_OBJECT_NOT_FOUND) { + std::cout << "No hash section found in " << filename << std::endl; + return ERROR_SUPPRESS_OUTPUT; + } else if (result != EBPF_SUCCESS) { + std::cout << "Error reading hash from " << filename << ": " << result << std::endl; + return ERROR_SUPPRESS_OUTPUT; + } + + if (hash_size == 0) { + std::cout << "Hash section is empty in " << filename << std::endl; + return ERROR_SUPPRESS_OUTPUT; + } + + // Allocate buffer and get the hash data. + std::vector hash_data(hash_size); + result = ebpf_api_get_data_section(filename.c_str(), "hash", hash_data.data(), &hash_size); + + if (result != EBPF_SUCCESS) { + std::cout << "Error reading hash data from " << filename << ": " << result << std::endl; + return ERROR_SUPPRESS_OUTPUT; + } + + // Truncate hash to size of a SHA-256 hash if larger. + if (hash_size > 32) { + hash_size = 32; + } + + // Resize vector to actual hash size. + hash_data.resize(hash_size); + + if (hash_only) { + // Print hash in PowerShell Get-FileHash format (uppercase, no spaces). + for (size_t i = 0; i < hash_size; i++) { + std::cout << std::hex << std::uppercase << std::setw(2) << std::setfill('0') + << static_cast(hash_data[i]); + } + std::cout << std::dec << std::nouppercase << std::endl; // Reset formatting. + } else { + // Print detailed hash information. + std::cout << "Hash for " << filename << ":" << std::endl; + std::cout << "Size: " << hash_size << " bytes" << std::endl; + std::cout << "Data: "; + + // Print hash in hexadecimal format with spaces. + for (size_t i = 0; i < hash_size; i++) { + if (i > 0 && i % 16 == 0) { + std::cout << std::endl << " "; + } + std::cout << std::hex << std::setw(2) << std::setfill('0') << static_cast(hash_data[i]); + if (i < hash_size - 1) { + std::cout << " "; + } + } + std::cout << std::dec << std::endl; // Reset to decimal format. + } + + return NO_ERROR; +} \ No newline at end of file diff --git a/libs/ebpfnetsh/netsh_hash.h b/libs/ebpfnetsh/netsh_hash.h new file mode 100644 index 0000000000..1636f3e3b0 --- /dev/null +++ b/libs/ebpfnetsh/netsh_hash.h @@ -0,0 +1,17 @@ +// Copyright (c) eBPF for Windows contributors +// SPDX-License-Identifier: MIT +#pragma once + +#include +#include + +#ifdef __cplusplus +extern "C" +{ +#endif + + FN_HANDLE_CMD handle_ebpf_show_hash; + +#ifdef __cplusplus +} +#endif \ No newline at end of file diff --git a/libs/ebpfnetsh/tokens.h b/libs/ebpfnetsh/tokens.h index b1c501a21a..44084dad43 100644 --- a/libs/ebpfnetsh/tokens.h +++ b/libs/ebpfnetsh/tokens.h @@ -6,6 +6,7 @@ #define TOKEN_COMPARTMENT L"compartment" #define TOKEN_EXECUTION L"execution" #define TOKEN_FILENAME L"filename" +#define TOKEN_HASHONLY L"hashonly" #define TOKEN_ID L"id" #define TOKEN_INTERFACE L"interface" #define TOKEN_LEVEL L"level" diff --git a/tests/end_to_end/end_to_end.cpp b/tests/end_to_end/end_to_end.cpp index d8579600ca..f36d70254c 100644 --- a/tests/end_to_end/end_to_end.cpp +++ b/tests/end_to_end/end_to_end.cpp @@ -3573,5 +3573,75 @@ _test_prog_array_map_user_reference(ebpf_execution_type_t execution_type) REQUIRE(bpf_prog_get_next_id(0, &start_id) < 0); } +TEST_CASE("ebpf_api_get_data_section", "[end_to_end]") +{ + _test_helper_end_to_end test_helper; + test_helper.initialize(); + + // Test with PE files that exist (from the build output). + const char* pe_file_path = "map.sys"; + std::vector data; + size_t data_size = 0; + ebpf_result_t result; + + // Test 1: Valid PE file with existing section (should return EBPF_SUCCESS with the size > 0). + result = ebpf_api_get_data_section(pe_file_path, "hash", nullptr, &data_size); + REQUIRE(result == EBPF_SUCCESS); + REQUIRE(data_size > 0); + + // Allocate buffer and get the data. + data.resize(data_size); + size_t buffer_size = data_size; + result = ebpf_api_get_data_section(pe_file_path, "hash", data.data(), &buffer_size); + REQUIRE(result == EBPF_SUCCESS); + REQUIRE(buffer_size == data_size); + + // Test 2: Invalid file path (should return EBPF_INVALID_OBJECT). + result = ebpf_api_get_data_section("nonexistent_file.sys", "hash", nullptr, &data_size); + REQUIRE(result == EBPF_INVALID_OBJECT); + + // Test 3: Try another PE file with nonexistent section. + const char* pe_file_path2 = "ebpfcore.sys"; + result = ebpf_api_get_data_section(pe_file_path2, "hash", nullptr, &data_size); + REQUIRE(result == EBPF_OBJECT_NOT_FOUND); + + // Test 4: Valid ELF file with valid section. + const char* elf_file_path = "map.o"; + result = ebpf_api_get_data_section(elf_file_path, "maps", nullptr, &data_size); + REQUIRE(result == EBPF_SUCCESS); + + // Allocate buffer and get the data. + data.resize(data_size); + buffer_size = data_size; + result = ebpf_api_get_data_section(elf_file_path, "maps", data.data(), &buffer_size); + REQUIRE(result == EBPF_SUCCESS); + REQUIRE(buffer_size == data_size); + + // Test 5: Valid ELF file with nonexistent section. + result = ebpf_api_get_data_section(elf_file_path, "nonexistent_section", nullptr, &data_size); + REQUIRE(result == EBPF_OBJECT_NOT_FOUND); + + // Test 6: Invalid ELF file path. + result = ebpf_api_get_data_section("nonexistent_file.o", "maps", nullptr, &data_size); + REQUIRE(result == EBPF_INVALID_OBJECT); + + // Test 7: Input buffer too small (ELF). + result = ebpf_api_get_data_section(elf_file_path, "maps", nullptr, &data_size); + REQUIRE(result == EBPF_SUCCESS); + + data.resize(data_size - 1); // Intentionally make buffer smaller. + buffer_size = data_size - 1; + result = ebpf_api_get_data_section(elf_file_path, "maps", data.data(), &buffer_size); + REQUIRE(result == EBPF_INSUFFICIENT_BUFFER); + + // Test 8: Input buffer too small (PE). + result = ebpf_api_get_data_section(pe_file_path, "hash", nullptr, &data_size); + REQUIRE(result == EBPF_SUCCESS); + data.resize(data_size - 1); // Intentionally make buffer smaller. + buffer_size = data_size - 1; + result = ebpf_api_get_data_section(pe_file_path, "hash", data.data(), &buffer_size); + REQUIRE(result == EBPF_INSUFFICIENT_BUFFER); +} + DECLARE_JIT_TEST_CASES( "prog_array_map_user_reference", "[end_to_end][user_reference]", _test_prog_array_map_user_reference); diff --git a/tests/end_to_end/netsh_test.cpp b/tests/end_to_end/netsh_test.cpp index 3ca749b413..78cc209770 100644 --- a/tests/end_to_end/netsh_test.cpp +++ b/tests/end_to_end/netsh_test.cpp @@ -225,13 +225,13 @@ TEST_CASE("show sections bpf.sys", "[netsh][sections]") REQUIRE(result == NO_ERROR); #if defined(_M_X64) && defined(NDEBUG) - const int code_size = 1064; + const int code_size = 1032; #elif defined(_M_X64) && !defined(NDEBUG) - const int code_size = 1784; + const int code_size = 1592; #elif defined(_M_ARM64) && defined(NDEBUG) - const int code_size = 1120; + const int code_size = 1104; #elif defined(_M_ARM64) && !defined(NDEBUG) - const int code_size = 5984; + const int code_size = 5696; #else #error "Unsupported architecture" #endif @@ -1034,3 +1034,98 @@ _test_pin_unpin_map(ebpf_execution_type_t execution_type) } DECLARE_ALL_TEST_CASES("pin/unpin map", "[netsh][pin]", _test_pin_unpin_map); + +// Test cases for show hash functionality. +TEST_CASE("show hash nosuchfile.o", "[netsh][hash]") +{ + _test_helper_netsh test_helper; + test_helper.initialize(); + + int result; + std::string output = _run_netsh_command(handle_ebpf_show_hash, L"nosuchfile.o", nullptr, nullptr, &result); + REQUIRE(result == ERROR_SUPPRESS_OUTPUT); + REQUIRE(output == "error: No such file or directory opening nosuchfile.o\n"); +} + +TEST_CASE("show hash bpf.o", "[netsh][hash]") +{ + _test_helper_netsh test_helper; + test_helper.initialize(); + + int result; + std::string output = _run_netsh_command(handle_ebpf_show_hash, L"bpf.o", nullptr, nullptr, &result); + REQUIRE(result == ERROR_SUPPRESS_OUTPUT); + REQUIRE(output == "No hash section found in bpf.o\n"); +} + +TEST_CASE("show hash PE file with hash section", "[netsh][hash]") +{ + _test_helper_netsh test_helper; + test_helper.initialize(); + + int result; + // Test with a PE file that has a hash section. + std::string output = _run_netsh_command(handle_ebpf_show_hash, L"map_reuse_um.dll", nullptr, nullptr, &result); + REQUIRE(result == ERROR_SUCCESS); + REQUIRE(output.find("Hash for map_reuse_um.dll:") != std::string::npos); + REQUIRE(output.find("Size: 32 bytes") != std::string::npos); + REQUIRE(output.find("Data: ") != std::string::npos); +} + +TEST_CASE("show hash PE file without hash section", "[netsh][hash]") +{ + _test_helper_netsh test_helper; + test_helper.initialize(); + + int result; + // Test with a PE file that doesn't have a hash section. + std::string output = _run_netsh_command(handle_ebpf_show_hash, L"EbpfApi.dll", nullptr, nullptr, &result); + REQUIRE(result == ERROR_SUPPRESS_OUTPUT); + REQUIRE(output == "No hash section found in EbpfApi.dll\n"); +} + +TEST_CASE("show hash PE file with hash section hashonly", "[netsh][hash]") +{ + _test_helper_netsh test_helper; + test_helper.initialize(); + + int result; + // Test with a PE file that has a hash section, hashonly format. + std::string output = _run_netsh_command(handle_ebpf_show_hash, L"map_reuse_um.dll", L"hashonly", nullptr, &result); + REQUIRE(result == ERROR_SUCCESS); + + // Verify output is exactly 64 hex characters (32 bytes) + newline, all uppercase, no spaces. + REQUIRE(output.length() == 65); // 64 characters + newline + REQUIRE(output[64] == '\n'); + + // Check that all characters are uppercase hex. + for (int i = 0; i < 64; i++) { + REQUIRE(((output[i] >= '0' && output[i] <= '9') || (output[i] >= 'A' && output[i] <= 'F'))); + } + + // Verify no spaces in the hash. + REQUIRE(output.find(' ') == std::string::npos); +} + +TEST_CASE("show hash PE file without hash section hashonly", "[netsh][hash]") +{ + _test_helper_netsh test_helper; + test_helper.initialize(); + + int result; + // Test with a PE file that doesn't have a hash section, hashonly format. + std::string output = _run_netsh_command(handle_ebpf_show_hash, L"EbpfApi.dll", L"hashonly", nullptr, &result); + REQUIRE(result == ERROR_SUPPRESS_OUTPUT); + REQUIRE(output == "No hash section found in EbpfApi.dll\n"); +} + +TEST_CASE("show hash nosuchfile.o hashonly", "[netsh][hash]") +{ + _test_helper_netsh test_helper; + test_helper.initialize(); + + int result; + std::string output = _run_netsh_command(handle_ebpf_show_hash, L"nosuchfile.o", L"hashonly", nullptr, &result); + REQUIRE(result == ERROR_SUPPRESS_OUTPUT); + REQUIRE(output == "error: No such file or directory opening nosuchfile.o\n"); +} diff --git a/tests/end_to_end/netsh_test_helper.h b/tests/end_to_end/netsh_test_helper.h index 48b004c820..7ce909cd20 100644 --- a/tests/end_to_end/netsh_test_helper.h +++ b/tests/end_to_end/netsh_test_helper.h @@ -8,6 +8,7 @@ #include "elf.h" #include "links.h" #include "maps.h" +#include "netsh_hash.h" #include "pins.h" #include "processes.h" #include "programs.h" diff --git a/tools/bpf2c/bpf_code_generator.cpp b/tools/bpf2c/bpf_code_generator.cpp index 292316a0a4..55bc16596e 100644 --- a/tools/bpf2c/bpf_code_generator.cpp +++ b/tools/bpf2c/bpf_code_generator.cpp @@ -1689,12 +1689,10 @@ bpf_code_generator::emit_c_code(std::ostream& output_stream) // Emit C file. output_stream << "#include \"bpf2c.h\"" << std::endl << std::endl; - output_stream << "static void" << std::endl - << "_get_hash(_Outptr_result_buffer_maybenull_(*size) const uint8_t** hash, _Out_ size_t* size)" - << std::endl; - output_stream << "{" << std::endl; + // Emit hash data in its own section. if (elf_file_hash.has_value()) { - output_stream << INDENT "const uint8_t hash_buffer[] = {" << std::endl; + output_stream << "#pragma const_seg(push, \"hash\")" << std::endl; + output_stream << "const uint8_t _elf_hash[] = {" << std::endl; for (size_t i = 0; i < elf_file_hash.value().size(); i++) { if (i % 16 == 0) { output_stream << INDENT ""; @@ -1704,9 +1702,19 @@ bpf_code_generator::emit_c_code(std::ostream& output_stream) output_stream << std::endl; } } - output_stream << INDENT "};" << std::endl; - output_stream << INDENT "*hash = hash_buffer;" << std::endl; - output_stream << INDENT "*size = sizeof(hash_buffer);" << std::endl; + output_stream << "};" << std::endl; + output_stream << "#pragma const_seg(pop)" << std::endl; + output_stream << "#pragma comment(linker, \"/INCLUDE:_elf_hash\")" << std::endl; + output_stream << std::endl; + } + + output_stream << "static void" << std::endl + << "_get_hash(_Outptr_result_buffer_maybenull_(*size) const uint8_t** hash, _Out_ size_t* size)" + << std::endl; + output_stream << "{" << std::endl; + if (elf_file_hash.has_value()) { + output_stream << INDENT "*hash = _elf_hash;" << std::endl; + output_stream << INDENT "*size = sizeof(_elf_hash);" << std::endl; } else { output_stream << INDENT "*hash = NULL;" << std::endl; output_stream << INDENT "*size = 0;" << std::endl; diff --git a/tools/netsh/dllmain.c b/tools/netsh/dllmain.c index d7d72bcb17..992b261a1c 100644 --- a/tools/netsh/dllmain.c +++ b/tools/netsh/dllmain.c @@ -5,6 +5,7 @@ #include "elf.h" #include "links.h" #include "maps.h" +#include "netsh_hash.h" #include "pins.h" #include "processes.h" #include "programs.h" @@ -42,6 +43,7 @@ DllMain(HMODULE moduleHandle, unsigned long reasonForCall, void* reserved) // Nouns #define CMD_EBPF_SHOW_DISASSEMBLY L"disassembly" +#define CMD_EBPF_SHOW_HASH L"hash" #define CMD_EBPF_SHOW_LINKS L"links" #define CMD_EBPF_SHOW_MAPS L"maps" #define CMD_EBPF_SHOW_PINS L"pins" @@ -76,6 +78,7 @@ CMD_ENTRY g_EbpfSetCommandTable[] = { }; CMD_ENTRY g_EbpfShowCommandTable[] = { CREATE_CMD_ENTRY(EBPF_SHOW_DISASSEMBLY, handle_ebpf_show_disassembly), + CREATE_CMD_ENTRY(EBPF_SHOW_HASH, handle_ebpf_show_hash), CREATE_CMD_ENTRY(EBPF_SHOW_LINKS, handle_ebpf_show_links), CREATE_CMD_ENTRY(EBPF_SHOW_MAPS, handle_ebpf_show_maps), CREATE_CMD_ENTRY(EBPF_SHOW_PINS, handle_ebpf_show_pins), @@ -130,6 +133,7 @@ CMD_ENTRY_LONG g_EbpfSetCommandTableLong[] = { }; CMD_ENTRY_ORIGINAL g_EbpfShowCommandTableOriginal[] = { CREATE_CMD_ENTRY_ORIGINAL(EBPF_SHOW_DISASSEMBLY, handle_ebpf_show_disassembly), + CREATE_CMD_ENTRY_ORIGINAL(EBPF_SHOW_HASH, handle_ebpf_show_hash), CREATE_CMD_ENTRY_ORIGINAL(EBPF_SHOW_LINKS, handle_ebpf_show_links), CREATE_CMD_ENTRY_ORIGINAL(EBPF_SHOW_MAPS, handle_ebpf_show_maps), CREATE_CMD_ENTRY_ORIGINAL(EBPF_SHOW_PINS, handle_ebpf_show_pins), @@ -140,6 +144,7 @@ CMD_ENTRY_ORIGINAL g_EbpfShowCommandTableOriginal[] = { }; CMD_ENTRY_LONG g_EbpfShowCommandTableLong[] = { CREATE_CMD_ENTRY_LONG(EBPF_SHOW_DISASSEMBLY, handle_ebpf_show_disassembly), + CREATE_CMD_ENTRY_LONG(EBPF_SHOW_HASH, handle_ebpf_show_hash), CREATE_CMD_ENTRY_LONG(EBPF_SHOW_LINKS, handle_ebpf_show_links), CREATE_CMD_ENTRY_LONG(EBPF_SHOW_MAPS, handle_ebpf_show_maps), CREATE_CMD_ENTRY_LONG(EBPF_SHOW_PINS, handle_ebpf_show_pins), diff --git a/tools/netsh/ebpfnetsh.rc b/tools/netsh/ebpfnetsh.rc index ef293689c0..0a7a2981fb 100644 --- a/tools/netsh/ebpfnetsh.rc +++ b/tools/netsh/ebpfnetsh.rc @@ -261,6 +261,17 @@ BEGIN \nUsage: %1!s!\ \n\ \nRemarks: Shows processes using eBPF.\ +\n" + + HLP_EBPF_SHOW_HASH "Shows hash embedded in PE file.\n" + HLP_EBPF_SHOW_HASH_EX "\ +\nUsage: %1!s! \ +\n\ +\nParameters:\ +\n\ +\n filename - Name of eBPF PE file to display hash from.\ +\n\ +\nRemarks: Shows the ELF hash embedded in the 'hash' section of the PE file.\ \n" HLP_EBPF_PIN_MAP "Pins an eBPF map.\n" diff --git a/tools/netsh/resource.h b/tools/netsh/resource.h index 3af04000cc..be74104a5f 100644 --- a/tools/netsh/resource.h +++ b/tools/netsh/resource.h @@ -32,6 +32,8 @@ #define HLP_EBPF_UNPIN_MAP_EX 128 #define HLP_EBPF_UNPIN_PROGRAM 129 #define HLP_EBPF_UNPIN_PROGRAM_EX 130 +#define HLP_EBPF_SHOW_HASH 131 +#define HLP_EBPF_SHOW_HASH_EX 132 #define EBPF_FILE_DESCRIPTION "eBPF for Windows Netsh Helper" #define EBPF_FILE_NAME "ebpfnetsh.dll" @@ -40,7 +42,7 @@ // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NEXT_RESOURCE_VALUE 131 +#define _APS_NEXT_RESOURCE_VALUE 133 #define _APS_NEXT_COMMAND_VALUE 40001 #define _APS_NEXT_CONTROL_VALUE 1001 #define _APS_NEXT_SYMED_VALUE 101