跳到主要内容

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_eth26 处命中, 全部位于注释 / 文档 / _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)来源 (文件:行)建键者
K1SYSTEM\CurrentControlSet\Services\DarraRT_PnetDarraRT_Pnet.inf:39 AddService = DarraRT_Pnetnetcfg (setupapi)
K1a…\Services\DarraRT_Pnet\Ndi (值 Service=DarraRT_Pnet, HelpText)DarraRT_Pnet.inf:48-49 [Install.AddReg] HKRsetupapi
K1b…\Services\DarraRT_Pnet\Ndi\Interfaces (值 UpperRange=noupper, LowerRange=ndis5,ndis4,ndis5_prot)DarraRT_Pnet.inf:50-51setupapi
K1c…\Services\DarraRT_Pnet\Linkage / \Parameters / \EnumNDIS 绑定时自动派生NDIS
K2SYSTEM\CurrentControlSet\Enum\ROOT\DARRART_PNET\0000DarraRT_Pnet.inf:23-26 注释 (HW ID = darrart_pnet 幻影设备节点)netcfg
K3SYSTEM\CurrentControlSet\Control\Network\{4D36E975-E325-11CE-BFC1-08002BE10318}\{随机GUID}\Connection (值 ComponentId=darrart_pnet)安装包\Services\DriverManager.cs:134 netcfg -l -c p -i DarraRT_Pnetnetcfg
K4SYSTEM\DriverDatabase\DriverPackages\darrart_pnet.inf_amd64_<hash>\* + DriverInfFiles\oemXX.inf (DriverStore)DarraRT_Pnet.inf:9 CatalogFile = darrart_pnet.cat; install-pnet.ps1:119setupapi / pnputil
K5SYSTEM\CurrentControlSet\Services\DarraPnetService安装包\Services\InstallEngine.cs:648 + Darra_Pnet_Service\Install\ServiceInstaller.cs:55 (sc create DarraPnetService)sc.exe / ServiceInstaller
K6SYSTEM\CurrentControlSet\Services\EventLog\Application\DarraPnetServiceDarra_Pnet_Service\Program.cs:326-329 (.AddEventLog, SourceName = "DarraPnetService", .NET 首次写自动注册)EventLog 提供方
K7SOFTWARE\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:227GUI 激活 (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_PnetGUI MainForm.cs:497 / SplashScreen.cs:206驱动服务状态探测 (状态栏)
SYSTEM\CurrentControlSet\Control\Class\{4D36E972-E325-11CE-BFC1-08002BE10318}\<实例>\Linkage\UpperBindGUI 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 deleteinstall-pnet.ps1:175 / 安装包\Services\UninstallService.cs (netcfg -u + sc delete)
K3 (网络组件)netcfg -u DarraRT_PnetDriverManager.cs:178 / install-pnet.ps1:169
K5 (…\Services\DarraPnetService)sc deleteServiceInstaller.cs:151 / InstallEngine.cs:595
SOFTWARE\Darra\Profinet (整树)Microsoft.Win32.Registry.LocalMachine.DeleteSubKeyTreeUninstallService.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_PDarraRT_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\DarraPnetServiceOther / 放行
K7SOFTWARE\Darra\Profinet\LicenseOther / 放行

逐字符核对关键点 (子串匹配唯一接近处):

  • DarraRT_PnetDarraRT_Eth 前 8 字符相同 (DarraRT_), 第 9 字符 P vs E 即分叉 — 不构成子串
  • 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\DarraPnetServiceOther放行放行 (sc delete)放行 (sc config/failure)
…\Services\EventLog\Application\DarraPnetServiceOther放行(随服务键清理或残留无害)放行
SOFTWARE\Darra\Profinet\LicenseOther放行放行 (DeleteSubKeyTree)放行 (Certificate/TrialStartUtc 重写)

注意: 上述删除者均非 PID 4, 若这些键 DarraRT_Eth 会被 ETH 回调拒删 — 但判定结果全部为 Other, 故无此风险。


6. 碰撞发现

无碰撞 (0 处)。 无需修复。

附带说明 (非碰撞, 供参考):

  1. 旧宽片段曾误伤: 若 ETH 回调回退为宽片段 "DarraRT", PNET 的 K1/K1a-c/K2 路径 (含 DarraRT_Pnet) 会再次被拒删/拒装 — 严禁回退片段, 当前 "DarraRT_Eth" 收紧版是两产品共存的前提。
  2. PNET 代码内 DarraRT_Eth 字面量仅 3 处非注释: probe3.ps1:11 (设备路径探测数组, _Stage 现场诊断脚本, 不落仓库产品载荷) — 保持即可, 无需改。
  3. 建议 (不自行改代码): 后续若 ETH 侧再新增保护片段 (如 "DarraRT" 前缀通用保护), 必须重新跑本审计; PNET 侧若新增注册表键域, 保持键名不含 DarraRT_Eth 即安全。

7. PNET × ETH NDIS 共存点结论

两产品在同一台测试机/工业机上注册表层面零冲突, NDIS 层面以下四项全部不同, 可并存注册:

维度PNET (DarraRT_Pnet)ETH (DarraRT_Eth)结论
EtherTypeRT Class 1 周期帧 = 0x8892 (DarraRT_Pnet_Frame.h:17); 另收 LLDP 0x88CC / VLAN 0x8100EtherCAT 帧 = 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_PnetServices\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
内核零注册表 APIDarra_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