PNET × ETH 注册表共存契约审计
审计对象:
Darra_Profinet_Slave全仓 (PNET / DarraRT_Pnet) 对照物: DarraRT_Eth.sys 的CmRegistryCallback注册表保护回调 审计日期: 2026-08-13 | 方法: 全仓 grep 静态审计 (只读, 排除其他参考\/ ThirdParty /_archive_GUI_bak_20260809\/ 二进制)
0. 结论 (一页速览)
- PNET 键总数: 7 个顶层键域 (+ 各键域子键), 碰撞数 = 0。
- PNET 创建/删除/读写的每一个注册表键全路径均不含
DarraRT_Eth子串 (大小写不敏感), 无一落入 ETH 回调保护范围。 - 全仓
DarraRT_Eth/darrart_eth共 26 处命中, 全部位于注释 / 文档 /_Stage探测脚本的设备路径数组, 零处位于注册表键路径字符串或 INF 实际值。 - ETH 回调收紧片段
"DarraRT" → "DarraRT_Eth"后, PNET 安装/卸载/运行时的全部注册表操作 100% 放行。
1. ETH 回调保护语义 (对照基线)
| 项 | 值 |
|---|---|
| 回调 | CmRegistryCallback (DarraRT_Eth.sys) |
| 匹配片段 | "DarraRT_Eth" (大小写不敏感, 对键全路径做子串匹配) |
| 保护动作 | 删除操作且调用进程 ≠ PID 4 (System) → 拒绝 |
| 旧片段 (已修复) | "DarraRT" 宽泛匹配 — 曾误伤 PNET (PNET 键含 DarraRT_Pnet, 旧片段命中 → PNET 安装必败) |
| 本次收紧后 | 仅路径含 DarraRT_Eth 字面量才触发 |
判定公式: PNET 键路径包含 DarraRT_Eth (任意大小写) ? → Protected (删除被拒) : Other (放行)。
2. PNET 注册表键全清单
2.1 安装时创建 (setupapi / netcfg / sc / INF)
| # | 键路径 (HKLM) | 来源 (文件:行) | 建键者 |
|---|---|---|---|
| K1 | SYSTEM\CurrentControlSet\Services\DarraRT_Pnet | DarraRT_Pnet.inf:39 AddService = DarraRT_Pnet | netcfg (setupapi) |
| K1a | …\Services\DarraRT_Pnet\Ndi (值 Service=DarraRT_Pnet, HelpText) | DarraRT_Pnet.inf:48-49 [Install.AddReg] HKR | setupapi |
| K1b | …\Services\DarraRT_Pnet\Ndi\Interfaces (值 UpperRange=noupper, LowerRange=ndis5,ndis4,ndis5_prot) | DarraRT_Pnet.inf:50-51 | setupapi |
| K1c | …\Services\DarraRT_Pnet\Linkage / \Parameters / \Enum | NDIS 绑定时自动派生 | NDIS |
| K2 | SYSTEM\CurrentControlSet\Enum\ROOT\DARRART_PNET\0000 | DarraRT_Pnet.inf:23-26 注释 (HW ID = darrart_pnet 幻影设备节点) | netcfg |
| K3 | SYSTEM\CurrentControlSet\Control\Network\{4D36E975-E325-11CE-BFC1-08002BE10318}\{随机GUID}\Connection (值 ComponentId=darrart_pnet) | 安装包\Services\DriverManager.cs:134 netcfg -l -c p -i DarraRT_Pnet | netcfg |
| K4 | SYSTEM\DriverDatabase\DriverPackages\darrart_pnet.inf_amd64_<hash>\* + DriverInfFiles\oemXX.inf (DriverStore) | DarraRT_Pnet.inf:9 CatalogFile = darrart_pnet.cat; install-pnet.ps1:119 | setupapi / pnputil |
| K5 | SYSTEM\CurrentControlSet\Services\DarraPnetService | 安装包\Services\InstallEngine.cs:648 + Darra_Pnet_Service\Install\ServiceInstaller.cs:55 (sc create DarraPnetService) | sc.exe / ServiceInstaller |
| K6 | SYSTEM\CurrentControlSet\Services\EventLog\Application\DarraPnetService | Darra_Pnet_Service\Program.cs:326-329 (.AddEventLog, SourceName = "DarraPnetService", .NET 首次写自动注册) | EventLog 提供方 |
| K7 | SOFTWARE\Darra\Profinet\License (值 Certificate / MachineId / TrialStartUtc) | Darra_Pnet_SDK\CSharp\Pnet\Static\PnetAuthorization.cs:42; Darra_Pnet_Service\License\PnetLicenseService.cs:71; Darra_Pnet_GUI\授权\激活.cs:227 | GUI 激活 (SDK) / Service |
2.2 运行时创建/写入
| 键 | 写者 | 说明 |
|---|---|---|
K7 (…\License\TrialStartUtc, Certificate) | Service (PnetLicenseService.cs:417-430) / SDK (PnetAuthorization.cs:523-607) / GUI 激活 | 授权证书与体验期起点; 唯一运行时写点 |
| K6 (EventLog 源) | Service (首次写日志时 .NET 自动建) | 日志事件源 |
驱动本体 (DarraRT_Pnet.sys) 运行时注册表写入 = 0: 内核源码 grep ZwCreateKey / ZwDeleteKey / RtlWriteRegistryValue / CmRegisterCallback / RegistryCallback 全仓 0 命中 — 驱动无任何注册表回调、无运行时键创建。
2.3 运行时只读 (不创建键, 不触发回调保护)
| 键 | 读者 (文件:行) | 用途 |
|---|---|---|
SYSTEM\CurrentControlSet\Services\DarraRT_Pnet | GUI MainForm.cs:497 / SplashScreen.cs:206 | 驱动服务状态探测 (状态栏) |
SYSTEM\CurrentControlSet\Control\Class\{4D36E972-E325-11CE-BFC1-08002BE10318}\<实例>\Linkage\UpperBind | GUI Views\DeviceView.cs:437 | 网卡是否已绑 PNET 判定 |
SYSTEM\CurrentControlSet\Control\Network\{4D36E975-…}\ | Service Core\PnetDriverBridge.cs:1708-1713 | 组件/连接名映射枚举 |
SOFTWARE\Microsoft\Windows NT\CurrentVersion[\SoftwareProtectionPlatform] | Service License\PnetDeviceInfoHelper.cs:162-168 | 设备指纹 (只读 Windows 系统键) |
2.4 卸载时删除
| 键 | 删除者 (文件:行) |
|---|---|
K1 (…\Services\DarraRT_Pnet) | sc delete — install-pnet.ps1:175 / 安装包\Services\UninstallService.cs (netcfg -u + sc delete) |
| K3 (网络组件) | netcfg -u DarraRT_Pnet — DriverManager.cs:178 / install-pnet.ps1:169 |
K5 (…\Services\DarraPnetService) | sc delete — ServiceInstaller.cs:151 / InstallEngine.cs:595 |
SOFTWARE\Darra\Profinet (整树) | Microsoft.Win32.Registry.LocalMachine.DeleteSubKeyTree — UninstallService.cs:345-357 |
| K4 (DriverStore 残留) | 提示用户 pnputil /delete-driver <oemXX.inf> — install-pnet.ps1:183-186 (仅提示不自动) |
3. 碰撞判定 (逐键 vs 片段 "DarraRT_Eth", 大小写不敏感)
| # | 键全路径 | 含 "DarraRT_Eth" ? | 判定 |
|---|---|---|---|
| K1/K1a-c | …\Services\DarraRT_Pnet\… | 否 (DarraRT_P ≠ DarraRT_E, 第 9 字符 P vs E) | Other / 放行 |
| K2 | …\Enum\ROOT\DARRART_PNET\… | 否 (PNET vs ETH) | Other / 放行 |
| K3 | …\Control\Network\{GUID}\Connection (值 darrart_pnet) | 否 | Other / 放行 |
| K4 | …\DriverDatabase\DriverPackages\darrart_pnet.inf_amd64_… | 否 | Other / 放行 |
| K5 | …\Services\DarraPnetService | 否 (第 7 字符 P vs _) | Other / 放行 |
| K6 | …\Services\EventLog\Application\DarraPnetService | 否 | Other / 放行 |
| K7 | SOFTWARE\Darra\Profinet\License | 否 | Other / 放行 |
逐字符核对关键点 (子串匹配唯一接近处):
DarraRT_Pnet与DarraRT_Eth前 8 字符相同 (DarraRT_), 第 9 字符PvsE即分叉 — 不构成子串。darrart_pnet/darrartpnet(旧工具工具\NetCfgInstall\Program.cs:38遗留变体) 同样不含darrart_eth。- 全仓不存在任何形如
…\DarraRT_Eth\…或…\darrart_eth\…的注册表路径字符串。
4. grep 证据: "DarraRT" 全部命中分类 (551 处 / 107 文件)
grep -riohE "darrart[a-z_\\\\.0-9]*" 去重后 40 类 token, 全部分类如下:
| 类别 | 代表 token (计数) | 性质 | 是否键路径 |
|---|---|---|---|
| PNET 自有服务/设备名 | DarraRT_Pnet (302) / DarraRT_Pnet.sys (235) / darrartpnet (56) / DARRART_PNET (7) | 服务名/文件名/HW ID | 是键路径组成部分, 但无 Eth 子串 |
| PNET 驱动源码文件自引用 | DarraRT_Pnet_{Internal,Shared,Frame,Entry,Nic,Timer,Iocr,Log,Diagnostics,Instance}.{c,h} (~120) | 文件名/头注释 | 否 |
| PNET INF/cat 名 | DarraRT_Pnet.inf (49) / darrart_pnet.cat (31) / darrart_pnet.inf (3) / darrart_pnet (10) / DarraRT_Pnet.cat (11) | DriverStore 目录基名 | 是 (K4), 无 Eth 子串 |
| 临时目录/安装残留名 | darrart_pnet_install (4) / DarraRT_Pnet.sha256 (5) / DarraRT_Pnet.pdb (3) / DarraRT_Pnet_GlobalIO (15, \Device\ 对象名) | 文件系统/对象管理器 | 否 |
| ETH 名 (仅注释/文档/探测) | DarraRT_Eth (37) / darrart_eth (8) / DarraRT_Eth.inf (8) / DarraRT_Eth.sys (4) / DarraRT_Eth. (4) | 见下 §4.1 全清单 | 否 |
| ETH 硬实时线泛指 (文档对比) | DarraRT (12, 全在 docs / _Stage 诊断脚本) / DarraRT.sys (5, bin XML 产物) / DarraRTPnetFrame.c (4, 历史文件注释) | 文档/构建产物 | 否 |
| Sync 协议名 (注释) | DarraRT_Sync (12) | 同卡双绑禁令注释 | 否 |
| 域名 | darrart (16, 仅 https://www.darrart.com XML 文档 + _Stage 诊断脚本) | 网站域名/诊断过滤 | 否 |
4.1 "DarraRT_Eth" 26 处命中全清单 (逐条定性 — 全部非键路径)
| 位置 | 命中性质 |
|---|---|
Darra_Pnet_Kernel\Windows\scripts\install-pnet.ps1:13 | 注释: 其他协议不得再绑同一网卡 |
Darra_Pnet_Kernel\Windows\Pnet\README.md:14 | 文档: NDIS 双注册蓝屏警示 |
Darra_Pnet_Kernel\Windows\Pnet\DarraRT_Pnet_Nic.c:639 | 代码注释: 双注册蓝屏拓扑 |
Darra_Pnet_Kernel\Windows\Pnet\DarraRT_Pnet.inf:2,53,68 (及 _Stage\ 内 8 份同源 INF 副本: cat-inf2cat / cat-test-local / sign2 / sign-round-fix / catsign-new / catsign / evsign / re-sign) | INF 注释 (; 行): ① 双注册禁令 ② 解释为何移除 RequireExclusiveBinding (darrart_eth 是描述现网已绑定协议, 非 INF 写入值) |
_Stage\probe3.ps1:11 | 探测脚本设备路径数组 (\.\DarraRT_Eth 等 — Object Manager 设备名探测, 只读检测共存, 非注册表) |
INF 实际值核对 (DarraRT_Pnet.inf [Install.AddReg]): 全部 HKR 值 = Service="DarraRT_Pnet" / HelpText / UpperRange="noupper" / LowerRange="ndis5,ndis4,ndis5_prot" — 无任何值含 darrart_eth。
5. 共存契约表 (PNET 键 × ETH 回调)
| PNET 键 | ETH 回调分类 | 安装 | 卸载删除 | 运行时删除/重写 |
|---|---|---|---|---|
…\Services\DarraRT_Pnet\* | Other | 放行 | 放行 (sc delete / netcfg -u) | 放行 |
…\Enum\ROOT\DARRART_PNET\* | Other | 放行 | 放行 (netcfg -u) | — |
…\Control\Network\{4D36E975-…}\{GUID}\* | Other | 放行 | 放行 (netcfg -u) | 放行 |
…\DriverDatabase\DriverPackages\darrart_pnet.inf_* | Other | 放行 | 放行 (pnputil, 需管理员/可信安装者) | — |
…\Services\DarraPnetService | Other | 放行 | 放行 (sc delete) | 放行 (sc config/failure) |
…\Services\EventLog\Application\DarraPnetService | Other | 放行 | (随服务键清理或残留无害) | 放行 |
SOFTWARE\Darra\Profinet\License | Other | 放行 | 放行 (DeleteSubKeyTree) | 放行 (Certificate/TrialStartUtc 重写) |
注意: 上述删除者均非 PID 4, 若这些键含 DarraRT_Eth 会被 ETH 回调拒删 — 但判定结果全部为 Other, 故无此风险。
6. 碰撞发现
无碰撞 (0 处)。 无需修复。
附带说明 (非碰撞, 供参考):
- 旧宽片段曾误伤: 若 ETH 回调回退为宽片段
"DarraRT", PNET 的 K1/K1a-c/K2 路径 (含DarraRT_Pnet) 会再次被拒删/拒装 — 严禁回退片段, 当前"DarraRT_Eth"收紧版是两产品共存的前提。 - PNET 代码内
DarraRT_Eth字面量仅 3 处非注释:probe3.ps1:11(设备路径探测数组,_Stage现场诊断脚本, 不落仓库产品载荷) — 保持即可, 无需改。 - 建议 (不自行改代码): 后续若 ETH 侧再新增保护片段 (如
"DarraRT"前缀通用保护), 必须重新跑本审计; PNET 侧若新增注册表键域, 保持键名不含DarraRT_Eth即安全。
7. PNET × ETH NDIS 共存点结论
两产品在同一台测试机/工业机上注册表层面零冲突, NDIS 层面以下四项全部不同, 可并存注册:
| 维度 | PNET (DarraRT_Pnet) | ETH (DarraRT_Eth) | 结论 |
|---|---|---|---|
| EtherType | RT Class 1 周期帧 = 0x8892 (DarraRT_Pnet_Frame.h:17); 另收 LLDP 0x88CC / VLAN 0x8100 | EtherCAT 帧 = 0x88A4 (DarraSync 复用) | 不同 → 帧分流无串扰 |
| NDIS 协议名 | L"DarraRT_Pnet" (DarraRT_Pnet_Internal.h:55, Nic.c:643 NdisRegisterProtocolDriver) | "DarraRT_Eth" | 不同 → 无 NDIS 双注册 (同名注册 = 0x3B 蓝屏) |
| 设备对象/符号链接 | \Device\DarraRT_Pnet + \\.\DarraRT_Pnet (Entry.c:4,542,595) + Section \Device\DarraRT_Pnet_GlobalIO | \Device\DarraRT_Eth + \\.\DarraRT_Eth | 不同 → Object Manager 无撞名 |
| 内核服务名 | DarraRT_Pnet (INF AddService) | DarraRT_Eth | 不同 |
| 控制面服务名 | DarraPnetService (端口 18840) | (无同名) | 不同 |
| 注册表服务键 | Services\DarraRT_Pnet | Services\DarraRT_Eth (受自身回调保护) | 不同 → 本审计 0 碰撞 |
同卡绑定约束 (PNET 自家 INF/README 铁律): 虽然协议名不同可并存注册, 但 PNET 明确禁止与 DarraRT_Eth / DarraRT_Sync 绑同一网卡 (NDIS 双协议同卡 = 蓝屏风险; DarraRT_Pnet.inf:2,53 / README.md:14 / Nic.c:639)。独占意图由驱动层实现 (BIND_ADAPTER 显式独占, 不自动抢卡) — 这是绑定拓扑纪律, 与注册表回调保护无关。
附: 审计证据索引
| 证据 | 位置 |
|---|---|
全仓 DarraRT 551 命中 / 107 文件 | grep -ri "DarraRT" (排除目录见 §0) |
DarraRT_Eth 26 命中全清单 | 本文件 §4.1 |
| INF 实际 AddReg 值 | Darra_Pnet_Kernel\Windows\Pnet\DarraRT_Pnet.inf:36-75 |
| 内核零注册表 API | Darra_Pnet_Kernel\ grep Zw*Key/Rtl*Registry/CmRegisterCallback = 0 命中 |
| 授权键唯一权威常量 | Darra_Pnet_SDK\CSharp\Pnet\Static\PnetAuthorization.cs:42 (SOFTWARE\Darra\Profinet\License) |
| 卸载键整树删除 | 安装包\Services\UninstallService.cs:345-357 (SOFTWARE\Darra\Profinet) |
| EtherType / 协议名 / 设备名宏 | Darra_Pnet_Kernel\Windows\Pnet\DarraRT_Pnet_Frame.h:17 / DarraRT_Pnet_Internal.h:53-55 |