Skip to content

Commit 2a86e35

Browse files
committed
Implement readMem error checking and logging, return a zero-buffer on failed reads for WiFi and USB, bump version.
1 parent 9915f03 commit 2a86e35

4 files changed

Lines changed: 51 additions & 14 deletions

File tree

include/memoryCommands.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ namespace MemoryCommands {
2020
void poke(u64 offset, u64 size, const std::vector<char>& buffer);
2121

2222
u64 followMainPointer(const s64& main, const std::vector<s64>& jumps, std::vector<char>& buffer);
23-
void readMem(const std::vector<char>& data, u64 offset, u64 size, u64 multi = 0);
23+
Result readMem(const std::vector<char>& data, u64 offset, u64 size, u64 multi = 0);
2424
void writeMem(u64 offset, u64 size, const std::vector<char>& buffer);
2525
};
2626
}

include/moduleBase.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ namespace ModuleBase {
8989

9090
private:
9191
static std::string getCurrentSbbVersion() {
92-
return !g_enableBackwardsCompat ? "3.3\r\n" : "3.31\r\n";
92+
return !g_enableBackwardsCompat ? "3.32\r\n" : "3.33\r\n";
9393
}
9494

9595
void setButtonClickSleepTime(const std::vector<std::string>& params);

source/commandHandler.cpp

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -232,7 +232,9 @@ namespace CommandHandler {
232232
val += finalJump;
233233
std::memcpy(buffer.data(), &val, sizeof(val));
234234
} else {
235-
Logger::instance().log("pointerAll_cmd() val is 0, not adding final jump.");
235+
Logger::instance().log("pointerAll_cmd() value is 0, is your pointer chain correct?");
236+
buffer.assign(sizeof(u64), 0);
237+
return;
236238
}
237239

238240
if (g_enableBackwardsCompat && !Utils::isUSB()) {
@@ -269,7 +271,9 @@ namespace CommandHandler {
269271
val -= m_metaData.heap_base;
270272
std::memcpy(buffer.data(), &val, sizeof(val));
271273
} else {
272-
Logger::instance().log("pointerRelative_cmd() val is 0, not adding final jump.");
274+
Logger::instance().log("pointerRelative_cmd() value is 0, is your pointer chain correct?");
275+
buffer.assign(sizeof(u64), 0);
276+
return;
273277
}
274278

275279
if (g_enableBackwardsCompat && !Utils::isUSB()) {
@@ -304,6 +308,12 @@ namespace CommandHandler {
304308
}
305309

306310
u64 val = followMainPointer(mainJump, jumps, buffer);
311+
if (val == 0) {
312+
Logger::instance().log("pointerPeek_cmd() value is 0, is your pointer chain correct?");
313+
buffer.assign(sizeof(u64), 0);
314+
return;
315+
}
316+
307317
val += finalJump;
308318
std::memcpy(buffer.data(), &val, sizeof(val));
309319
peek(val, size, buffer);
@@ -361,8 +371,13 @@ namespace CommandHandler {
361371
}
362372

363373
u64 val = followMainPointer(mainJump, jumps, buffer);
364-
val += finalJump;
374+
if (val == 0) {
375+
Logger::instance().log("pointerPeekMulti_cmd() value is 0, is your pointer chain correct?");
376+
buffer.assign(sizeof(u64), 0);
377+
return;
378+
}
365379

380+
val += finalJump;
366381
offsets.push_back(val);
367382
sizes.push_back(size);
368383
}
@@ -399,6 +414,11 @@ namespace CommandHandler {
399414

400415
std::vector<char> buffer;
401416
u64 val = followMainPointer(mainJump, jumps, buffer);
417+
if (val == 0) {
418+
Logger::instance().log("pointerPoke_cmd() value is 0, is your pointer chain correct?");
419+
return;
420+
}
421+
402422
val += finalJump;
403423
poke(val, data.size(), data);
404424
}

source/memoryCommands.cpp

Lines changed: 26 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,12 @@ namespace MemoryCommands {
2424
while (remainder > 0) {
2525
u64 receive = remainder > MAX_LINE_LENGTH ? MAX_LINE_LENGTH : remainder;
2626
remainder -= receive;
27-
readMem(buffer, offset + total, receive);
27+
Result rc = readMem(buffer, offset + total, receive);
28+
if (R_FAILED(rc)) {
29+
Logger::instance().log("peek() readMem() failed. Offset=" + std::to_string(offset + total) + ", Size=" + std::to_string(receive), std::to_string(R_DESCRIPTION(rc)));
30+
buffer.assign(size, 0);
31+
break;
32+
}
2833
total += receive;
2934
}
3035

@@ -50,7 +55,12 @@ namespace MemoryCommands {
5055
buffer.resize(totalSize * sizeof(u8));
5156
int count = (int)offsets.size();
5257
for (int i = 0; i < count; i++) {
53-
readMem(buffer, offsets[i], sizes[i], ofs);
58+
Result rc = readMem(buffer, offsets[i], sizes[i], ofs);
59+
if (R_FAILED(rc)) {
60+
Logger::instance().log("peekMulti() readMem() failed. Offset=" + std::to_string(offsets[i]) + ", Size=" + std::to_string(sizes[i]), std::to_string(R_DESCRIPTION(rc)));
61+
buffer.assign(totalSize * sizeof(u8), 0);
62+
break;
63+
}
5464
ofs += sizes[i];
5565
}
5666

@@ -81,12 +91,21 @@ namespace MemoryCommands {
8191
u64 size = sizeof(u64);
8292
buffer.resize(size);
8393

84-
readMem(buffer, m_metaData.main_nso_base + main, size);
85-
std::memcpy(&offset, buffer.data(), size);
94+
Result rc = readMem(buffer, m_metaData.main_nso_base + main, size);
95+
if (R_FAILED(rc)) {
96+
Logger::instance().log("followMainPointer() initial readMem() failed. Main=" + std::to_string(main), std::to_string(R_DESCRIPTION(rc)));
97+
return 0;
98+
}
8699

100+
std::memcpy(&offset, buffer.data(), size);
87101
int count = (int)jumps.size();
88102
for (int i = 0; i < count; i++) {
89-
readMem(buffer, offset + jumps[i], size);
103+
rc = readMem(buffer, offset + jumps[i], size);
104+
if (R_FAILED(rc)) {
105+
Logger::instance().log("followMainPointer() readMem() failed. Offset=" + std::to_string(offset) + ", Jump=" + std::to_string(jumps[i]), std::to_string(R_DESCRIPTION(rc)));
106+
return 0;
107+
}
108+
90109
std::memcpy(&offset, buffer.data(), size);
91110
if (offset == 0) {
92111
break;
@@ -103,13 +122,11 @@ namespace MemoryCommands {
103122
* @param The number of bytes to read.
104123
* @param Offset into the buffer for multi-read (default 0).
105124
*/
106-
void Vision::readMem(const std::vector<char>& buffer, u64 offset, u64 size, u64 multi) {
125+
Result Vision::readMem(const std::vector<char>& buffer, u64 offset, u64 size, u64 multi) {
107126
attach();
108127
Result rc = svcReadDebugProcessMemory((void*)(buffer.data() + multi), m_debugHandle, offset, size);
109-
if (R_FAILED(rc)) {
110-
Logger::instance().log("readMem() svcReadDebugProcessMemory() failed. Offset=" + std::to_string(offset) + ", Size=" + std::to_string(size), std::to_string(R_DESCRIPTION(rc)));
111-
}
112128
detach();
129+
return rc;
113130
}
114131

115132
/**

0 commit comments

Comments
 (0)