eBPF implementation that runs on top of Windows
This report summarizes scanner evidence for microsoft/ebpf-for-windows, a C project with 3,570 GitHub stars. SynthScan examined 350,216 lines of code across 822 source files, recording 5401 pattern matches distributed across 8 syntactic categories. The legacy adjusted pattern signal is 11.3 (Moderate pattern signal); it is not an authorship estimate.
Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.
Use each vector to guide manual verification of the underlying findings.
Can maintainers explain intent, assumptions, and trade-offs? 5367 finding(s).
Are imports declared and package/API names verified? 30 finding(s).
Are wrappers, guards, and repeated structures necessary? 4 finding(s).
Which changes need focused human review? 5401 finding(s).
This chart tracks the legacy adjusted pattern score across scan runs. Changes can reflect source changes, scan coverage, or detector/scoring versions; they do not measure AI adoption or prove that a team refactored code. Compare runs only when their scoring versions are compatible. The dashed line tracks the raw pattern-hit count.
Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.
This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.
The scanner identified 5401 distinct pattern matches across 8 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tools/export_program_info/export_program_info.cpp | 1 | // Copyright (c) eBPF for Windows contributors | COMMENT |
| LOW | tools/export_program_info/resource.h | 1 | // Copyright (c) eBPF for Windows contributors | COMMENT |
| LOW | tools/bpf2c/bpf2c.cpp | 1 | // Copyright (c) eBPF for Windows contributors | COMMENT |
| LOW | tools/bpf2c/bpf_code_generator.cpp | 1 | // Copyright (c) eBPF for Windows contributors | COMMENT |
| LOW | tools/bpf2c/bpf_code_generator.cpp | 21 | #define ebpf_inst ebpf_inst_btf | COMMENT |
| LOW | tools/bpf2c/bpf_code_generator.cpp | 41 | // Pulling in the prevail namespace to get the definitions in ebpf_vm_isa.h. | COMMENT |
| LOW | tools/bpf2c/bpf_code_generator.cpp | 61 | #define EBPF_ATOMIC_FETCH 0x01 | COMMENT |
| LOW | tools/bpf2c/bpf_code_generator.h | 1 | // Copyright (c) eBPF for Windows contributors | COMMENT |
| LOW | tools/bpf2c/resource.h | 1 | // Copyright (c) eBPF for Windows contributors | COMMENT |
| LOW | tools/netsh/resource.h | 1 | //{{NO_DEPENDENCIES}} | COMMENT |
| LOW | tools/netsh/resource.h | 21 | #define HLP_EBPF_SHOW_LINKS 117 | COMMENT |
| LOW | tools/netsh/resource.h | 41 | // Next default values for new objects. | COMMENT |
| LOW | tools/netsh/dllmain.c | 1 | // Copyright (c) eBPF for Windows contributors | COMMENT |
| LOW | tools/netsh/dllmain.c | 41 | #define CMD_GROUP_SHOW L"show" | COMMENT |
| LOW | tools/netsh/dllmain.c | 181 | #define HLP_GROUP_SET 1104 | COMMENT |
| LOW | tools/bpftool/resource.h | 1 | // Copyright (c) eBPF for Windows contributors | COMMENT |
| LOW | tools/port_leak/resource.h | 1 | // Copyright (c) eBPF for Windows contributors | COMMENT |
| LOW | tools/dnsflood/resource.h | 1 | // Copyright (c) eBPF for Windows contributors | COMMENT |
| LOW | tools/port_quota/resource.h | 1 | // Copyright (c) eBPF for Windows contributors | COMMENT |
| LOW | ebpfapi/rpc_client.cpp | 1 | // Copyright (c) eBPF for Windows contributors | COMMENT |
| LOW | ebpfapi/resource.h | 1 | // Copyright (c) eBPF for Windows contributors | COMMENT |
| LOW | include/bpf_endian.h | 41 | * to cpu_to_be16(). We could use it unconditionally in BPF | COMMENT |
| LOW | include/bpf_endian.h | 61 | #define __bpf_htons(x) (x) | COMMENT |
| LOW | include/bpf_endian.h | 81 | #define bpf_be64_to_cpu(x) (__builtin_constant_p(x) ? __bpf_constant_be64_to_cpu(x) : __bpf_be64_to_cpu(x)) | COMMENT |
| LOW | include/ebpf_windows.h | 1 | // Copyright (c) eBPF for Windows contributors | COMMENT |
| LOW | include/ebpf_windows.h | 21 | typedef unsigned short uint16_t; | COMMENT |
| LOW | include/ebpf_windows.h | 41 | #define EBPF_GLOBAL_HELPERS_REGISTRY_KEY L"GlobalHelpers" | COMMENT |
| LOW | include/ebpf_windows.h | 81 | #define EBPF_ATTACH_CLIENT_DATA_VERSION_TOTAL_SIZE sizeof(ebpf_extension_data_t) | COMMENT |
| LOW | include/ebpf_error.h | 1 | // Copyright (c) eBPF for Windows contributors | COMMENT |
| LOW | include/ebpf_program_types.h | 1 | // Copyright (c) eBPF for Windows contributors | COMMENT |
| LOW | include/bpf_helpers_platform.h | 1 | // Copyright (c) eBPF for Windows contributors | COMMENT |
| LOW | include/bpf2c.h | 21 | #else | COMMENT |
| LOW | include/bpf2c.h | 61 | COMMENT | |
| LOW | include/bpf_helpers.h | 1 | // Copyright (c) eBPF for Windows contributors | COMMENT |
| LOW | include/bpf_helpers.h | 41 | COMMENT | |
| LOW | include/bpf_helper_defs.h | 201 | EBPF_HELPER(long, bpf_trace_printk5, (const char* fmt, uint32_t fmt_size, uint64_t arg3, uint64_t arg4, uint64_t arg5)); | COMMENT |
| LOW | include/bpf_helper_defs.h | 481 | #define bpf_strnlen_s ((bpf_strnlen_s_t)BPF_FUNC_strnlen_s) | COMMENT |
| LOW | include/elfio_wrapper.hpp | 1 | // Copyright (c) eBPF for Windows contributors | COMMENT |
| LOW | include/ebpf_nethooks.h | 1 | // Copyright (c) eBPF for Windows contributors | COMMENT |
| LOW | include/ebpf_api.h | 1 | // Copyright (c) eBPF for Windows contributors | COMMENT |
| LOW | include/uapi/linux/tcp.h | 1 | // Copyright (c) eBPF for Windows contributors | COMMENT |
| LOW | include/uapi/linux/bpf.h | 1 | // Copyright (c) eBPF for Windows contributors | COMMENT |
| LOW | include/uapi/linux/if_ether.h | 1 | // Copyright (c) eBPF for Windows contributors | COMMENT |
| LOW | include/uapi/linux/in.h | 1 | // Copyright (c) eBPF for Windows contributors | COMMENT |
| LOW | include/uapi/linux/ip.h | 1 | // Copyright (c) eBPF for Windows contributors | COMMENT |
| LOW | include/asm/posix_types.h | 1 | // Copyright (c) eBPF for Windows contributors | COMMENT |
| LOW | include/asm/errno.h | 1 | // Copyright (c) eBPF for Windows contributors | COMMENT |
| LOW | include/net/if_ether.h | 21 | uint16_t Length; // IEEE 802 | COMMENT |
| LOW | include/net/ip.h | 1 | // Copyright (c) eBPF for Windows contributors | COMMENT |
| LOW | include/bpf_conformance/bpf_conformance.h | 1 | // Copyright (c) eBPF for Windows contributors | COMMENT |
| LOW | include/linux/bpf.h | 1 | // Copyright (c) eBPF for Windows contributors | COMMENT |
| LOW | include/linux/stddef.h | 1 | // Copyright (c) eBPF for Windows contributors | COMMENT |
| LOW | include/bpf/hashmap.h | 1 | // Copyright (c) eBPF for Windows contributors | COMMENT |
| LOW | tests/unit/wer_report_test_wrapper.cpp | 1 | // Copyright (c) eBPF for Windows contributors | COMMENT |
| LOW | tests/unit/libbpf_test_jit.cpp | 1 | // Copyright (c) eBPF for Windows contributors | COMMENT |
| LOW | tests/unit/libbpf_test.cpp | 1 | // Copyright (c) eBPF for Windows contributors | COMMENT |
| LOW | tests/unit/libbpf_test.cpp | 21 | COMMENT | |
| LOW | tests/unit/libbpf_test.cpp | 4761 | // Phase 1: Open a valid native module. | COMMENT |
| LOW | tests/unit/libbpf_test.cpp | 4781 | // - Release: operator[] on empty vector reads from nullptr -> AV. | COMMENT |
| LOW | tests/unit/resource.h | 1 | // Copyright (c) eBPF for Windows contributors | COMMENT |
| 5270 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | netebpfext/net_ebpf_ext.c | 977 | // Step 1: Unregister the callout functions. Once this succeeds, WFP can no longer invoke classify/notify, | COMMENT |
| LOW | netebpfext/net_ebpf_ext.c | 999 | // Step 2: Reclaim zombie filter contexts on each provider before removing the callout objects, sub-layers | COMMENT |
| LOW | netebpfext/net_ebpf_ext.c | 1025 | // Step 3: Delete the callout objects. A callout object cannot be deleted while a filter still specifies it | COMMENT |
| LOW⚡ | .github/skills/verify-prevail/SKILL.md | 55 | ### Step 1: Read the Reference | COMMENT |
| LOW⚡ | .github/skills/verify-prevail/SKILL.md | 59 | ### Step 2: Gather the Error | COMMENT |
| LOW⚡ | .github/skills/verify-prevail/SKILL.md | 68 | ### Step 3: Identify the Failure Pattern | COMMENT |
| LOW | .github/skills/verify-prevail/SKILL.md | 86 | ### Step 4: Trace the Root Cause | COMMENT |
| LOW | .github/skills/verify-prevail/SKILL.md | 94 | ### Step 5: Recommend a Fix | COMMENT |
| LOW | .github/skills/pr-triage-report/SKILL.md | 93 | ### Step 1: Scope the PR Set | COMMENT |
| LOW | .github/skills/pr-triage-report/SKILL.md | 110 | ### Step 2: Gather Per-PR Metadata | COMMENT |
| LOW | .github/skills/pr-triage-report/SKILL.md | 151 | ### Step 3: Compute Age | COMMENT |
| LOW | .github/skills/pr-triage-report/SKILL.md | 156 | ### Step 4: Compute CI Status | COMMENT |
| LOW | .github/skills/pr-triage-report/SKILL.md | 200 | ### Step 5: Determine Base-Branch Freshness | COMMENT |
| LOW | .github/skills/pr-triage-report/SKILL.md | 222 | ### Step 6: Determine Current Sign-Offs | COMMENT |
| LOW | .github/skills/pr-triage-report/SKILL.md | 243 | ### Step 7: Determine Next Step | COMMENT |
| LOW | .github/skills/pr-triage-report/SKILL.md | 259 | ### Step 8: Compute Freshness | COMMENT |
| LOW | .github/skills/pr-triage-report/SKILL.md | 286 | ### Step 9: Determine Next Owner | COMMENT |
| LOW | .github/skills/pr-triage-report/SKILL.md | 309 | ### Step 10: Sort and Render the Report | COMMENT |
| LOW⚡ | .github/skills/verify-bpf/SKILL.md | 71 | ### Step 1: Identify the Source | COMMENT |
| LOW⚡ | .github/skills/verify-bpf/SKILL.md | 81 | ### Step 2: Compile with Clang | COMMENT |
| LOW⚡ | .github/skills/verify-bpf/SKILL.md | 85 | ### Step 3: Verify with bpf2c | COMMENT |
| LOW⚡ | .github/skills/verify-bpf/SKILL.md | 92 | ### Step 4: Diagnose Failures | COMMENT |
| LOW⚡ | .github/skills/build-ebpf/SKILL.md | 29 | ### Step 1: Determine What to Build | COMMENT |
| LOW⚡ | .github/skills/build-ebpf/SKILL.md | 37 | ### Step 2: Determine Configuration and Platform | COMMENT |
| LOW⚡ | .github/skills/build-ebpf/SKILL.md | 46 | ### Step 3: Construct and Run the MSBuild Command | COMMENT |
| LOW | .github/skills/build-ebpf/SKILL.md | 84 | ### Step 4: Analyze Results | COMMENT |
| LOW | .github/skills/adversarial-branch-review/SKILL.md | 59 | ### Step 1: Establish Review Scope | COMMENT |
| LOW | .github/skills/adversarial-branch-review/SKILL.md | 78 | ### Step 2: Gather Branch Context | COMMENT |
| LOW | .github/skills/adversarial-branch-review/SKILL.md | 96 | ### Step 3: Apply Adversarial Review Methodology | COMMENT |
| LOW | .github/skills/adversarial-branch-review/SKILL.md | 157 | ### Step 4: Maintain Coverage Proof | COMMENT |
| LOW | .github/skills/adversarial-branch-review/SKILL.md | 174 | ### Step 5: Report Only High-Signal Findings | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | tests/sample/bindmonitor_tailcall.c | 122 | uint32_t dummy_key = 0; | CODE |
| LOW⚡ | tests/sample/bindmonitor_tailcall.c | 123 | uint32_t* dummy_value = bpf_map_lookup_elem(&dummy_map, &dummy_key); | CODE |
| LOW⚡ | tests/sample/bindmonitor_tailcall.c | 125 | if (!dummy_value) { | CODE |
| LOW⚡ | tests/sample/bindmonitor_tailcall.c | 138 | uint32_t dummy_key = 0; | CODE |
| LOW⚡ | tests/sample/bindmonitor_tailcall.c | 139 | uint32_t* dummy_value = bpf_map_lookup_elem(&dummy_map, &dummy_key); | CODE |
| LOW⚡ | tests/sample/bindmonitor_tailcall.c | 141 | if (!dummy_value) { | CODE |
| LOW⚡ | tests/sample/unsafe/invalid_helpers.c | 130 | uint32_t dummy_key = 0; | CODE |
| LOW⚡ | tests/sample/unsafe/invalid_helpers.c | 131 | uint32_t* dummy_value = bpf_map_lookup_elem(&dummy_map, &dummy_key); | CODE |
| LOW⚡ | tests/sample/unsafe/invalid_helpers.c | 133 | if (!dummy_value) { | CODE |
| LOW⚡ | tests/sample/unsafe/invalid_helpers.c | 146 | uint32_t dummy_key = 0; | CODE |
| LOW⚡ | tests/sample/unsafe/invalid_helpers.c | 147 | uint32_t* dummy_value = bpf_map_lookup_elem(&dummy_map, &dummy_key); | CODE |
| LOW⚡ | tests/sample/unsafe/invalid_helpers.c | 149 | if (!dummy_value) { | CODE |
| LOW⚡ | tests/sample/unsafe/invalid_maps2.c | 148 | uint32_t dummy_key = 0; | CODE |
| LOW⚡ | tests/sample/unsafe/invalid_maps2.c | 149 | uint32_t* dummy_value = bpf_map_lookup_elem(&dummy_map, &dummy_key); | CODE |
| LOW⚡ | tests/sample/unsafe/invalid_maps2.c | 151 | if (!dummy_value) { | CODE |
| LOW⚡ | tests/sample/unsafe/invalid_maps2.c | 164 | uint32_t dummy_key = 0; | CODE |
| LOW⚡ | tests/sample/unsafe/invalid_maps2.c | 165 | uint32_t* dummy_value = bpf_map_lookup_elem(&dummy_map, &dummy_key); | CODE |
| LOW⚡ | tests/sample/unsafe/invalid_maps2.c | 167 | if (!dummy_value) { | CODE |
| LOW⚡ | tests/sample/unsafe/invalid_maps1.c | 137 | uint32_t dummy_key = 0; | CODE |
| LOW⚡ | tests/sample/unsafe/invalid_maps1.c | 138 | uint32_t* dummy_value = bpf_map_lookup_elem(&dummy_map, &dummy_key); | CODE |
| LOW⚡ | tests/sample/unsafe/invalid_maps1.c | 140 | if (!dummy_value) { | CODE |
| LOW⚡ | tests/sample/unsafe/invalid_maps1.c | 153 | uint32_t dummy_key = 0; | CODE |
| LOW⚡ | tests/sample/unsafe/invalid_maps1.c | 154 | uint32_t* dummy_value = bpf_map_lookup_elem(&dummy_map, &dummy_key); | CODE |
| LOW⚡ | tests/sample/unsafe/invalid_maps1.c | 156 | if (!dummy_value) { | CODE |
| LOW | tests/netebpfext_unit/netebpfext_unit.cpp | 925 | uint8_t dummy_data[8] = {0}; | CODE |
| LOW | tests/netebpfext_unit/netebpfext_unit.cpp | 926 | cc->helper_return_value = set_redirect(sock_addr_context, dummy_data, sizeof(dummy_data)); | CODE |
| LOW | docs/MultipleLoadNativeModule.md | 77 | 4. If runtime finds the module, and it is in "placeholder" state, it will block on an event, which will be set when the | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| CRITICAL | .github/workflows/reusable-test.yml | 573 | const opts = github.rest.issues.listForRepo.endpoint.merge({ | CODE |
| CRITICAL | .github/workflows/check_wdk.yml | 78 | const opts = github.rest.issues.listForRepo.endpoint.merge({ | CODE |
| CRITICAL | .github/workflows/netperf.yml | 114 | const opts = github.rest.issues.listForRepo.endpoint.merge({ | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | .github/workflows/codeql.yml | 32 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | .github/workflows/cicd.yml | 45 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | .github/workflows/cicd.yml | 373 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | .azure/OneBranch.PullRequest.yml | 175 | # --------------------------------------------------------------------------- | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | tests/unit/libbpf_test.cpp | 560 | // This is a set of tests which utilize the libbpf XDP APIs. | COMMENT |
| MEDIUM | libs/runtime/unit/platform_unit_test.cpp | 2710 | // Replace these test with a more robust test like TESTU01 or PractRand once licensing issues are resolved. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | netebpfext/net_ebpf_ext.c | 977 | // Step 1: Unregister the callout functions. Once this succeeds, WFP can no longer invoke classify/notify, | COMMENT |
| LOW | netebpfext/net_ebpf_ext.c | 999 | // Step 2: Reclaim zombie filter contexts on each provider before removing the callout objects, sub-layers | COMMENT |
| LOW | netebpfext/net_ebpf_ext.c | 1025 | // Step 3: Delete the callout objects. A callout object cannot be deleted while a filter still specifies it | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | .github/workflows/reusable-test.yml | 127 | # Check if .github/workflows/reusable-test.yml exists locally. | COMMENT |