Files
histsdk/docs/reverse-engineering/starttagquery-request-buffer-latest.json
T
dohertj2 c95824a65d Initial commit: managed .NET 10 AVEVA Historian SDK + reverse-engineering toolkit
Full read-only SDK (src/AVEVA.Historian.Client) implementing the CLAUDE.md required
surface against AVEVA Historian's binary WCF protocol — no native AVEVA runtime
dependency. All operations live-verified against a local Historian:

- ProbeAsync, ReadRawAsync, ReadAggregateAsync, ReadAtTimeAsync, ReadEventsAsync
- BrowseTagNamesAsync, GetTagMetadataAsync (17 native data-type codes mapped)
- GetConnectionStatusAsync, GetStoreForwardStatusAsync, GetSystemParameterAsync
- 108/108 unit + integration tests pass

Includes the reverse-engineering toolkit (tools/AVEVA.Historian.ReverseEngineering)
used to decode the protocol: WCF probes, IL inspection via dnlib, and IL-rewrite
instrumentation (instrument-wcf-{write,read}message etc.) plus the .NET Framework
trace harness (tools/AVEVA.Historian.NativeTraceHarness) for parity testing.

Sanitized handoff evidence under docs/reverse-engineering/. Native AVEVA binaries
(current/, aveva-install-x64/, aveva-install-x86/) are gitignored — fetch separately
from the AVEVA installer.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-04 06:31:48 -04:00

62 lines
2.1 KiB
JSON

{
"LatestRequest": {
"Phase": "StartTagQuery.Request",
"Length": 4,
"Sha256": "17956e4fbe53d5edc0f9170203b013432e4afcc0591c795a10522a98d9fce926",
"NativeTagFilter": "TagName eq 'OtOpcUaParityTest_001.Counter'",
"Fields": {
"Marker": 26449,
"Version": 1
},
"Hex": "51 67 01 00"
},
"EarlierCapturedRequestCandidate": {
"Phase": "StartTagQuery.Request",
"Length": 92,
"Sha256": "af1dbcdd3eb0ad91a18882c22252aa74aff82998e96a39b63415ab4792a962ac",
"NativeTagFilter": "TagName eq 'OtOpcUaParityTest_001.Counter'",
"Fields": {
"Marker": 26449,
"Version": 1,
"FilterLength": 42,
"FilterEncoding": "UTF-16LE without terminator",
"FilterOffset": "0x0008"
},
"Hex": "51 67 01 00 2A 00 00 00 54 00 61 00 67 00 4E 00 61 00 6D 00 65 00 20 00 65 00 71 00 20 00 27 00 4F 00 74 00 4F 00 70 00 63 00 55 00 61 00 50 00 61 00 72 00 69 00 74 00 79 00 54 00 65 00 73 00 74 00 5F 00 30 00 30 00 31 00 2E 00 43 00 6F 00 75 00 6E 00 74 00 65 00 72 00 27 00"
},
"Response": {
"Phase": "StartTagQuery.Response",
"Length": 8,
"Sha256": "3f36b44b323f7d4760626302368f492bced79999112a9b7f9dbd2544326b2c7e",
"Fields": {
"QueryHandle": 12,
"TagCount": 1
},
"Hex": "0C 00 00 00 01 00 00 00"
},
"NativeResult": {
"StartQuerySuccess": true,
"TagNames": [
"OtOpcUaParityTest_001.Counter"
],
"TagInfo": [
{
"TagName": "OtOpcUaParityTest_001.Counter",
"TagKey": 238,
"TagDataType": 4,
"TagStorageType": 3,
"EngineeringUnit": "None"
}
]
},
"ManagedReplayResult": {
"HeaderOnlyRequestWithOpen2DerivedHandles": "negative",
"FilterRequestWithOpen2DerivedHandles": "negative",
"ErrorCodes": [
51,
1
]
},
"Notes": "Raw instrumentation capture is retained only under ignored artifacts. The tag name is the deterministic local parity test tag. Latest combined instrumentation shows the successful WCF StartTagQuery request is header-only; the filter was already processed by an earlier native metadata layer before this WCF call."
}