Added ReadMemoryString(), reading a string from the team's memory.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@33589 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -3,9 +3,52 @@
|
|||||||
* Distributed under the terms of the MIT License.
|
* Distributed under the terms of the MIT License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
#include "TeamMemory.h"
|
#include "TeamMemory.h"
|
||||||
|
|
||||||
|
#include <algorithm>
|
||||||
|
|
||||||
|
#include <OS.h>
|
||||||
|
#include <String.h>
|
||||||
|
|
||||||
|
|
||||||
TeamMemory::~TeamMemory()
|
TeamMemory::~TeamMemory()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
status_t
|
||||||
|
TeamMemory::ReadMemoryString(target_addr_t address, size_t maxLength,
|
||||||
|
BString& _string)
|
||||||
|
{
|
||||||
|
char buffer[B_PAGE_SIZE];
|
||||||
|
|
||||||
|
BString string;
|
||||||
|
|
||||||
|
while (maxLength > 0) {
|
||||||
|
// read at max maxLength bytes, but don't read across page bounds
|
||||||
|
size_t toRead = std::min(maxLength,
|
||||||
|
B_PAGE_SIZE - size_t(address % B_PAGE_SIZE));
|
||||||
|
|
||||||
|
ssize_t bytesRead = ReadMemory(address, buffer, toRead);
|
||||||
|
if (bytesRead < 0)
|
||||||
|
return string.Length() == 0 ? bytesRead : B_OK;
|
||||||
|
|
||||||
|
if (bytesRead == 0)
|
||||||
|
return string.Length() == 0 ? B_BAD_ADDRESS : B_OK;
|
||||||
|
|
||||||
|
// append the bytes read
|
||||||
|
size_t length = strnlen(buffer, bytesRead);
|
||||||
|
string.Append(buffer, length);
|
||||||
|
|
||||||
|
// stop at end of string
|
||||||
|
if (length < (size_t)bytesRead)
|
||||||
|
return B_OK;
|
||||||
|
|
||||||
|
address += bytesRead;
|
||||||
|
maxLength -= bytesRead;
|
||||||
|
}
|
||||||
|
|
||||||
|
return B_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -5,9 +5,13 @@
|
|||||||
#ifndef TEAM_MEMORY_H
|
#ifndef TEAM_MEMORY_H
|
||||||
#define TEAM_MEMORY_H
|
#define TEAM_MEMORY_H
|
||||||
|
|
||||||
|
|
||||||
#include "TargetAddressRange.h"
|
#include "TargetAddressRange.h"
|
||||||
|
|
||||||
|
|
||||||
|
class BString;
|
||||||
|
|
||||||
|
|
||||||
class TeamMemory {
|
class TeamMemory {
|
||||||
public:
|
public:
|
||||||
virtual ~TeamMemory();
|
virtual ~TeamMemory();
|
||||||
@@ -15,6 +19,8 @@ public:
|
|||||||
|
|
||||||
virtual ssize_t ReadMemory(target_addr_t address, void* buffer,
|
virtual ssize_t ReadMemory(target_addr_t address, void* buffer,
|
||||||
size_t size) = 0;
|
size_t size) = 0;
|
||||||
|
virtual status_t ReadMemoryString(target_addr_t address,
|
||||||
|
size_t maxLength, BString& _string);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user