## 本次策略
枚举账户、到期、隐藏模块、PayWall、连接器和数据提供商路径后收敛到最小补丁集。
实际需要修改的 DLL:
OFT.Core.dll
OFT.Platform.Core.dll
StockSharp.Licensing.dll
“`
没有修改的关键路径:
AuthClient.get_State
ServerConnector.get_State
AccountInfoProviderExtensions.IsLoggedIn
AuthorizationViewModel 登录/连接状态机
ConnectorsManager
AuthClient.CheckFeature
登录/状态机、自动连接和连接器全局放行路径此前会造成登录验证、窗口初始化、连接列表和品种列表副作用,本次避开。Ultra 权限保留在账户、到期、隐藏模块、工作区和通用 PayWall 功能权限层。
关键结论
– `Prop` 是受限账户线索,不是最高权限。
– 最高权限显示目标为 `Ultra`。
– `Ultra` 不是 `OFT.Core.Server.AccountTypes` 枚举成员;账户枚举只到 `Prop = 6`,所以最高权限需要从 tariff/显示格式化路径处理。
– 到期日期统一改为 `9999-12-31`。
– 自定义/三方模块加载保持原始逻辑;`HiddenModules。(此处用.)cnf` 保留完整 6 项模块列表,并禁用登录同步写回,避免受限账号覆盖为少量模块。
– 连接器自动创建与自动连接显式关闭;数据提供商只应在手动“添加”流程中选择。
## OFT.Core.dll 修改点
| 目标 | Token | RVA | 修改后行为 |
| — | —: | —: | — |
| `OFT.Core.Server.AccountRole.get_Expiration` | `0x06001065` | `0x00050A84` | 返回 `new DateTime(9999, 12, 31)` |
| `OFT.Core.Server.AccountModule.get_Expiration` | `0x06001059` | `0x00050888` | 返回 `DateTime?(9999-12-31)` |
| `OFT.Core.Server.Auth.LogonResponse.get_ExpiryDate` | `0x0600117F` | `0x00054F88` | 服务端响应全局到期 tick 改为 `9999-12-31` |
| `OFT.Core.Server.Auth.RoleValue.get_Expiration` | `0x06001215` | `0x0005643C` | 服务端响应角色到期 tick 改为 `9999-12-31` |
| `OFT.Core.Server.Auth.ModuleValue.get_Expiration` | `0x060011D5` | `0x00055B7C` | 服务端响应模块到期 tick 改为 `9999-12-31` |
| `OFT.Core.Server.Auth.AuthClient.get_IsPropAccount` | `0x060010C1` | `0x00052014` | 返回 `false`,清理 Prop 账户分支残留 |
| `OFT.Core.Server.Auth.LogonResponse.get_IsPropAccount` | `0x060011A7` | `0x00055518` | 响应层 Prop 标记改为 `false` |
| `OFT.Core.Server.Auth.AuthClient.get_ExpiryDate` | `0x060010A8` | `0x00051CF0` | 返回 `DateTime?(9999-12-31)` |
| `OFT.Core.Server.Auth.AuthClient.get_Tariff` | `0x060010AA` | `0x00051D30` | 返回 `new PlatformTariff(1, null)`,配合界面格式化显示为 `Ultra` |
## OFT.Platform.Core.dll 修改点
| 目标 | Token/RVA | 修改后行为 |
| — | —: | — |
| `AccountInfoProviderExtensions.IsExpired` | `0x06001975 / 0x0006582C` | 返回 `false` |
| `LicenseInformationViewModelBase.get_Expiration` | `0x060031BC / 0x000DA2D0` | 返回 `new DateTime(9999, 12, 31)` |
| `LicenseInformationViewModelBase` 权限格式化方法 | `0x000DA990` | 返回解码字符串 `Ultra` |
| `AccountInfoProviderExtensions` 选定功能权限方法 | 多个 RVA | 返回 `true`,但不改自动连接/连接器过滤 |
| `PayWallDataManager.TryCheckAllowFeature<T>` | `0x06004DE7 / 0x00187D20` | 返回 `true`,开放通用功能权限 |
| `PayWallDataManager.HasPayWallData` | `0x06004DEF / 0x001880C8` | 返回 `false`,不再显示 PayWall 数据阻断 |
| `PayWallDataManager.CheckAllowOpenWorkspace` | `0x06004DF1 / 0x00188180` | 返回 `true`,允许打开工作区 |
| `IsSupportedAutoCreateConnection` | `0x06001979 / 0x0600197A` | 返回 `false`,禁止自动创建连接 |
| `IsSupportedAlwaysCreateConnection` | `0x0600197C / 0x0600197D` | 返回 `false`,禁止强制创建连接 |
| `GetAllowAutoConnectConnectors` | 保留原始逻辑 | 允许已手动添加且勾选自动连接的连接器启动后自动连接 |
| `ConnectorPayWallRestrictions.GetLimitAddFromCategory` | 多个 RVA | 返回 `PayWallFeatures.None`,允许手动添加连接 |
| `ConnectorSettingsItemViewModel` 连接前限制检查 | `0x060065C0 / 0x00211D74` | 返回 `false`,不显示限制窗口,继续执行原始 `ConnectAsync` |
| `ConnectorTypesProvider` 类型可见性谓词 | `0x06002595 / 0x000A4A78` | 返回 `true`,允许“添加连接器”弹窗显示 connector type |
| `SelectConnectorTypeViewModel` 添加弹窗 server 可见性谓词 | `0x060066AE / 0x00216520` | 返回 `true`,允许添加弹窗显示 server description |
| `ConnectorsManager` 连接前访问判定 | `0x06001C32 / 0x00074B58` | 保留连接状态检查,跳过 `CheckFeature(settings.Type)` 失败时抛出的 `ConnectionLicenseExpired` |
| `PayWallExtensions.CheckAllowConnector` | `0x06001A53 / 0x0006B088` | 返回 `true`,忽略账号 connector 白名单 |
| `ConnectorPayWallRestrictions.GetLimitConnect` 状态机 | `0x06002B69 / 0x000C10CC` | 返回 `PayWallFeatures.None`,允许手动连接 |
| 模块隐藏/三方模块/自定义模块加载 | 保留原始逻辑 | 避免影响三方模块与自定义模块加载 |
| `ThirdPartyModulesManager.TrySaveHiddenModules` | `0x06002069 / 0x00086110` | 直接 `ret`,阻止登录同步用受限账号模块覆盖本地完整模块列表 |
| `ThirdPartyModulesManager.ApplyModulesChanges` 状态机 | `0x06002092 / 0x00086D90` | 没有可下载 `AccountModule` 时不保存删减后的可用模块列表,避免安装失败后模块消失 |
保留原逻辑的连接相关函数包括:
ConnectorsManager.*
AuthorizationViewModel 登录/连接状态机
AuthClient.CheckFeature
PayWallExtensions.AllowDXFeed
PayWallExtensions.CheckAllowForDelayedData
## StockSharp.Licensing.dll 修改点
目标 | Token | RVA | 修改后行为
| `LicenseHelper.ValidateLicense` | `0x0600004B` | `0x0000288C` | 返回 `null`,表示本地 license 校验成功 |
| `LicenseHelper.SkipLicenseCheck` | `0x0600004C` | `0x000028E8` | 返回 `true` |






没有回复内容