Decode GPS result point array
This commit is contained in:
@@ -155,9 +155,12 @@ Latest GPS-query finding:
|
|||||||
- `GPSQueryResultFetch 0x7094b8` returning `1` is the route-solve completion
|
- `GPSQueryResultFetch 0x7094b8` returning `1` is the route-solve completion
|
||||||
signal. The caller at return RVA `0x52069c` starts handling a completed
|
signal. The caller at return RVA `0x52069c` starts handling a completed
|
||||||
result, then the caller at return RVA `0x520783` drains result records.
|
result, then the caller at return RVA `0x520783` drains result records.
|
||||||
The visible route record currently appears as a packed point/count pair in
|
The visible route record appears in the object passed as `outPath`: offset
|
||||||
the object passed as `outPath`: the deliberate routes produced `11`, `16`,
|
`0x30` is a packed point count (`N/N` on the first drain record, then `N`),
|
||||||
`15`, and `14` point-like counts.
|
and offset `0x28` looks like the route point array pointer. The deliberate
|
||||||
|
routes produced the familiar `11`, `16`, `15`, and `14` point-like counts in
|
||||||
|
the 2026-06-20 19:03 run, and `11`, `16`, `15`, `11` in the 19:16 map
|
||||||
|
routine where the custom pin was different.
|
||||||
- Static disassembly confirms `0xaa5704` takes `(manager, queryId)` and returns
|
- Static disassembly confirms `0xaa5704` takes `(manager, queryId)` and returns
|
||||||
a small status code; one caller checks for value `1`. Runtime logging shows
|
a small status code; one caller checks for value `1`. Runtime logging shows
|
||||||
this is HUD/display lifecycle polling rather than solve completion: it polls
|
this is HUD/display lifecycle polling rather than solve completion: it polls
|
||||||
@@ -165,8 +168,9 @@ Latest GPS-query finding:
|
|||||||
not rendered.
|
not rendered.
|
||||||
- The current installed probe adds a read-only dump of suspected result-object
|
- The current installed probe adds a read-only dump of suspected result-object
|
||||||
fields around offsets `0x20` through `0x5f` on successful active-route
|
fields around offsets `0x20` through `0x5f` on successful active-route
|
||||||
fetches. This is intended to identify whether the returned route is a raw
|
fetches, including first/last route point candidates from `outPath + 0x28`.
|
||||||
solver path, a smoothed draw path, or both.
|
This is intended to identify whether the returned route is a raw solver path,
|
||||||
|
a smoothed draw path, or both.
|
||||||
|
|
||||||
Build and install from the Fedora toolbox:
|
Build and install from the Fedora toolbox:
|
||||||
|
|
||||||
|
|||||||
@@ -743,6 +743,27 @@ struct Vector4Value
|
|||||||
float w;
|
float w;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct Vector3Value
|
||||||
|
{
|
||||||
|
float x;
|
||||||
|
float y;
|
||||||
|
float z;
|
||||||
|
};
|
||||||
|
|
||||||
|
void AppendVector3Pointer(std::ostringstream& aLine, const char* aLabel, const void* aVector)
|
||||||
|
{
|
||||||
|
Vector3Value value{};
|
||||||
|
aLine << " " << aLabel << "=";
|
||||||
|
if (aVector && TryReadMemory(aVector, value))
|
||||||
|
{
|
||||||
|
aLine << "(" << value.x << "," << value.y << "," << value.z << ")";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
aLine << "<unreadable>";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void AppendVector4Pointer(std::ostringstream& aLine, const char* aLabel, const void* aVector)
|
void AppendVector4Pointer(std::ostringstream& aLine, const char* aLabel, const void* aVector)
|
||||||
{
|
{
|
||||||
Vector4Value value{};
|
Vector4Value value{};
|
||||||
@@ -768,6 +789,32 @@ void AppendVector4Field(std::ostringstream& aLine, const char* aLabel, void* aOb
|
|||||||
AppendVector4Pointer(aLine, aLabel, reinterpret_cast<const void*>(reinterpret_cast<uintptr_t>(aObject) + aOffset));
|
AppendVector4Pointer(aLine, aLabel, reinterpret_cast<const void*>(reinterpret_cast<uintptr_t>(aObject) + aOffset));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void AppendVector3ListCandidate(std::ostringstream& aLine, const char* aPrefix, void* aObject, uintptr_t aDataOffset,
|
||||||
|
uintptr_t aCountOffset, uintptr_t aStride)
|
||||||
|
{
|
||||||
|
uint32_t count = 0;
|
||||||
|
auto* data = ReadPointerField(aObject, aDataOffset);
|
||||||
|
TryReadMemory(reinterpret_cast<const void*>(reinterpret_cast<uintptr_t>(aObject) + aCountOffset), count);
|
||||||
|
|
||||||
|
const auto dataLabel = std::string(aPrefix) + "_data";
|
||||||
|
const auto countLabel = std::string(aPrefix) + "_count";
|
||||||
|
AppendPointerWithRva(aLine, dataLabel.c_str(), data);
|
||||||
|
aLine << " " << countLabel << "=" << count;
|
||||||
|
|
||||||
|
if (!data || reinterpret_cast<uintptr_t>(data) < 0x10000 || count == 0 || count > 10000)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
AppendVector3Pointer(aLine, (std::string(aPrefix) + "_first3").c_str(), data);
|
||||||
|
if (count > 1)
|
||||||
|
{
|
||||||
|
AppendVector3Pointer(aLine, (std::string(aPrefix) + "_last3").c_str(),
|
||||||
|
reinterpret_cast<const void*>(reinterpret_cast<uintptr_t>(data) +
|
||||||
|
static_cast<uintptr_t>(count - 1) * aStride));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void AppendVectorListCandidate(std::ostringstream& aLine, const char* aPrefix, void* aObject, uintptr_t aDataOffset,
|
void AppendVectorListCandidate(std::ostringstream& aLine, const char* aPrefix, void* aObject, uintptr_t aDataOffset,
|
||||||
uintptr_t aCountOffset, uintptr_t aStride)
|
uintptr_t aCountOffset, uintptr_t aStride)
|
||||||
{
|
{
|
||||||
@@ -832,6 +879,11 @@ void AppendGpsResultObjectSummary(std::ostringstream& aLine, const char* aPrefix
|
|||||||
}
|
}
|
||||||
|
|
||||||
AppendBytesField(aLine, (std::string(aPrefix) + "_bytes20").c_str(), aResultObject, 0x20, 0x40);
|
AppendBytesField(aLine, (std::string(aPrefix) + "_bytes20").c_str(), aResultObject, 0x20, 0x40);
|
||||||
|
AppendUint32Field(aLine, (std::string(aPrefix) + "_u20").c_str(), aResultObject, 0x20);
|
||||||
|
AppendUint32Field(aLine, (std::string(aPrefix) + "_u24").c_str(), aResultObject, 0x24);
|
||||||
|
AppendPointerField(aLine, (std::string(aPrefix) + "_ptr28").c_str(), aResultObject, 0x28);
|
||||||
|
AppendVector3ListCandidate(aLine, (std::string(aPrefix) + "_vec28s12").c_str(), aResultObject, 0x28, 0x30, 12);
|
||||||
|
AppendVectorListCandidate(aLine, (std::string(aPrefix) + "_vec28s16").c_str(), aResultObject, 0x28, 0x30, 16);
|
||||||
AppendVectorListCandidate(aLine, (std::string(aPrefix) + "_vec20").c_str(), aResultObject, 0x20, 0x2C, 12);
|
AppendVectorListCandidate(aLine, (std::string(aPrefix) + "_vec20").c_str(), aResultObject, 0x20, 0x2C, 12);
|
||||||
AppendVectorListCandidate(aLine, (std::string(aPrefix) + "_vec20s16").c_str(), aResultObject, 0x20, 0x2C, 16);
|
AppendVectorListCandidate(aLine, (std::string(aPrefix) + "_vec20s16").c_str(), aResultObject, 0x20, 0x2C, 16);
|
||||||
AppendUint32Field(aLine, (std::string(aPrefix) + "_u2c").c_str(), aResultObject, 0x2C);
|
AppendUint32Field(aLine, (std::string(aPrefix) + "_u2c").c_str(), aResultObject, 0x2C);
|
||||||
|
|||||||
Reference in New Issue
Block a user