MCPcopy Create free account
hub / github.com/DFHack/dfhack / verifyAccess

Method verifyAccess

library/MemoryPatcher.cpp:17–62  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

15 }
16
17 bool MemoryPatcher::verifyAccess(void* target, size_t count, bool write)
18 {
19 auto* sptr = (uint8_t*)target;
20 uint8_t* eptr = sptr + count;
21
22 // Find the valid memory ranges
23 if (ranges.empty())
24 p->getMemRanges(ranges);
25
26 // Find the ranges that this area spans
27 unsigned start = 0;
28 while (start < ranges.size() && ranges[start].end <= sptr)
29 start++;
30 if (start >= ranges.size() || ranges[start].start > sptr)
31 return false;
32
33 unsigned end = start + 1;
34 while (end < ranges.size() && ranges[end].start < eptr)
35 {
36 if (ranges[end].start != ranges[end - 1].end)
37 return false;
38 end++;
39 }
40 if (ranges[end - 1].end < eptr)
41 return false;
42
43 // Verify current permissions
44 for (unsigned i = start; i < end; i++)
45 if (!ranges[i].valid || !(ranges[i].read || ranges[i].execute) || ranges[i].shared)
46 return false;
47
48 // Apply writable permissions & update
49 for (unsigned i = start; i < end; i++)
50 {
51 auto& perms = ranges[i];
52 if ((perms.write || !write) && perms.read)
53 continue;
54
55 save.push_back(perms);
56 perms.write = perms.read = true;
57 if (!p->setPermissions(perms, perms))
58 return false;
59 }
60
61 return true;
62 }
63
64 bool MemoryPatcher::write(void* target, const void* src, size_t size)
65 {

Callers 1

internal_patchBytesFunction · 0.80

Calls 4

getMemRangesMethod · 0.80
setPermissionsMethod · 0.80
emptyMethod · 0.45
sizeMethod · 0.45

Tested by

no test coverage detected