5
#include "kdlib/memaccess.h"
6
#include "kdlib/exceptions.h"
11
///////////////////////////////////////////////////////////////////////////////
15
readPtr( MEMOFFSET_64 offset )
18
readMemory( offset, &val, sizeof(T), false );
22
///////////////////////////////////////////////////////////////////////////////
24
unsigned char ptrByte( MEMOFFSET_64 offset )
26
return readPtr<unsigned char>(offset);
29
///////////////////////////////////////////////////////////////////////////////
31
unsigned short ptrWord( MEMOFFSET_64 offset )
33
return readPtr<unsigned short>(offset);
36
///////////////////////////////////////////////////////////////////////////////
38
unsigned long ptrDWord( MEMOFFSET_64 offset )
40
return readPtr<unsigned long>(offset);
43
///////////////////////////////////////////////////////////////////////////////
45
unsigned long long ptrQWord( MEMOFFSET_64 offset )
47
return readPtr<unsigned long long>(offset);
50
///////////////////////////////////////////////////////////////////////////////
52
unsigned long long ptrMWord( MEMOFFSET_64 offset )
54
return ptrSize() == 8 ? ptrQWord( offset ) : ptrDWord( offset );
57
///////////////////////////////////////////////////////////////////////////////
59
char ptrSignByte( MEMOFFSET_64 offset )
61
return readPtr<char>(offset);
64
///////////////////////////////////////////////////////////////////////////////
66
short ptrSignWord( MEMOFFSET_64 offset )
68
return readPtr<short>(offset);
71
///////////////////////////////////////////////////////////////////////////////
73
long ptrSignDWord( MEMOFFSET_64 offset )
75
return readPtr<long>(offset);
78
///////////////////////////////////////////////////////////////////////////////
80
long long ptrSignQWord( MEMOFFSET_64 offset )
82
return readPtr<long long>(offset);
85
///////////////////////////////////////////////////////////////////////////////
87
long long ptrSignMWord( MEMOFFSET_64 offset )
89
return ptrSize() == 8 ? ptrSignQWord( offset ) : ptrSignDWord( offset );
92
///////////////////////////////////////////////////////////////////////////////
94
float ptrSingleFloat( MEMOFFSET_64 offset )
96
return readPtr<float>(offset);
99
///////////////////////////////////////////////////////////////////////////////
101
double ptrDoubleFloat( MEMOFFSET_64 offset )
103
return readPtr<double>(offset);
106
///////////////////////////////////////////////////////////////////////////////
109
void setImpl( MEMOFFSET_64 offset, T value )
111
writeMemory( offset, &value, sizeof(value), false );
114
///////////////////////////////////////////////////////////////////////////////
116
void setByte( MEMOFFSET_64 offset, unsigned char value )
118
setImpl(offset, value);
121
///////////////////////////////////////////////////////////////////////////////
123
void setWord( MEMOFFSET_64 offset, unsigned short value )
125
setImpl(offset, value);
128
///////////////////////////////////////////////////////////////////////////////
131
void setDWord( MEMOFFSET_64 offset, unsigned long value )
133
setImpl(offset, value);
136
///////////////////////////////////////////////////////////////////////////////
139
void setQWord( MEMOFFSET_64 offset, unsigned long long value )
141
setImpl(offset, value);
144
///////////////////////////////////////////////////////////////////////////////
147
void setSignByte( MEMOFFSET_64 offset, char value )
149
setImpl(offset, value);
152
///////////////////////////////////////////////////////////////////////////////
155
void setSignWord( MEMOFFSET_64 offset, short value )
157
setImpl(offset, value);
160
///////////////////////////////////////////////////////////////////////////////
163
void setSignDWord( MEMOFFSET_64 offset, long value )
165
setImpl(offset, value);
168
///////////////////////////////////////////////////////////////////////////////
171
void setSignQWord( MEMOFFSET_64 offset, long long value )
173
setImpl(offset, value);
176
///////////////////////////////////////////////////////////////////////////////
179
void setSingleFloat( MEMOFFSET_64 offset, float value )
181
setImpl(offset, value);
184
///////////////////////////////////////////////////////////////////////////////
187
void setDoubleFloat( MEMOFFSET_64 offset, double value )
189
setImpl(offset, value);
192
///////////////////////////////////////////////////////////////////////////////
196
loadArray( MEMOFFSET_64 offset, unsigned long number, bool phyAddr )
198
if (!phyAddr && !isVaRegionValid(offset, number*sizeof(T)))
199
throw MemoryException(offset);
201
std::vector<T> buffer(number);
204
readMemory( offset, &buffer[0], number*sizeof(T), phyAddr );
209
/////////////////////////////////////////////////////////////////////////////////////
211
std::vector<unsigned char> loadBytes( MEMOFFSET_64 offset, unsigned long number, bool phyAddr )
213
return loadArray<unsigned char>( offset, number, phyAddr );
216
/////////////////////////////////////////////////////////////////////////////////////
218
std::vector<unsigned short> loadWords( MEMOFFSET_64 offset, unsigned long number, bool phyAddr )
220
return loadArray<unsigned short>( offset, number, phyAddr );
223
///////////////////////////////////////////////////////////////////////////////
225
std::vector<unsigned long> loadDWords( MEMOFFSET_64 offset, unsigned long number, bool phyAddr )
227
return loadArray<unsigned long>( offset, number, phyAddr );
230
///////////////////////////////////////////////////////////////////////////////
232
std::vector<unsigned long long> loadQWords( MEMOFFSET_64 offset, unsigned long number, bool phyAddr )
234
return loadArray<unsigned long long>( offset, number, phyAddr );
237
/////////////////////////////////////////////////////////////////////////////////////
239
std::vector<char> loadSignBytes( MEMOFFSET_64 offset, unsigned long number, bool phyAddr )
241
return loadArray<char>( offset, number, phyAddr );
244
///////////////////////////////////////////////////////////////////////////////
246
std::vector<short> loadSignWords( MEMOFFSET_64 offset, unsigned long number, bool phyAddr )
248
return loadArray<short>( offset, number, phyAddr );
251
///////////////////////////////////////////////////////////////////////////////
253
std::vector<long> loadSignDWords( MEMOFFSET_64 offset, unsigned long number, bool phyAddr )
255
return loadArray<long>( offset, number, phyAddr );
258
///////////////////////////////////////////////////////////////////////////////
260
std::vector<long long> loadSignQWords( MEMOFFSET_64 offset, unsigned long number, bool phyAddr )
262
return loadArray<long long>( offset, number, phyAddr );
265
///////////////////////////////////////////////////////////////////////////////
267
std::vector<float> loadFloats( MEMOFFSET_64 offset, unsigned long number, bool phyAddr )
269
return loadArray<float>( offset, number, phyAddr );
272
///////////////////////////////////////////////////////////////////////////////
274
std::vector<double> loadDoubles( MEMOFFSET_64 offset, unsigned long number, bool phyAddr )
276
return loadArray<double>( offset, number, phyAddr );
279
///////////////////////////////////////////////////////////////////////////////
282
void writeArray( MEMOFFSET_64 offset, const std::vector<T> &values, bool phyAddr )
287
const auto length = values.size() * sizeof(T);
289
if (!phyAddr && !isVaRegionValid(offset, length))
290
throw MemoryException(offset);
292
writeMemory( offset, &values[0], length, phyAddr );
295
///////////////////////////////////////////////////////////////////////////////
297
void writeBytes(MEMOFFSET_64 offset, const std::vector<unsigned char> &values, bool phyAddr )
299
writeArray(offset, values, phyAddr);
302
///////////////////////////////////////////////////////////////////////////////
304
void writeWords( MEMOFFSET_64 offset, const std::vector<unsigned short> &values, bool phyAddr )
306
writeArray(offset, values, phyAddr);
309
///////////////////////////////////////////////////////////////////////////////
311
void writeDWords( MEMOFFSET_64 offset, const std::vector<unsigned long> &values, bool phyAddr )
313
writeArray(offset, values, phyAddr);
316
///////////////////////////////////////////////////////////////////////////////
319
void writeQWords( MEMOFFSET_64 offset, std::vector<unsigned long long> const &values, bool phyAddr )
321
writeArray(offset, values, phyAddr);
324
///////////////////////////////////////////////////////////////////////////////
327
void writeSignBytes( MEMOFFSET_64 offset, const std::vector<char> &values, bool phyAddr )
329
writeArray(offset, values, phyAddr);
332
///////////////////////////////////////////////////////////////////////////////
335
void writeSignWords( MEMOFFSET_64 offset, const std::vector<short> &values, bool phyAddr )
337
writeArray(offset, values, phyAddr);
340
///////////////////////////////////////////////////////////////////////////////
343
void writeSignDWords( MEMOFFSET_64 offset, const std::vector<long> &values, bool phyAddr )
345
writeArray(offset, values, phyAddr);
348
///////////////////////////////////////////////////////////////////////////////
351
void writeSignQWords( MEMOFFSET_64 offset, std::vector<long long> const &values, bool phyAddr )
353
writeArray(offset, values, phyAddr);
356
///////////////////////////////////////////////////////////////////////////////
359
void writeFloats( MEMOFFSET_64 offset, const std::vector<float> &values, bool phyAddr )
361
writeArray(offset, values, phyAddr);
364
///////////////////////////////////////////////////////////////////////////////
367
void writeDoubles( MEMOFFSET_64 offset, const std::vector<double> &values, bool phyAddr )
369
writeArray(offset, values, phyAddr);
372
///////////////////////////////////////////////////////////////////////////////
374
std::string loadChars( MEMOFFSET_64 offset, unsigned long number, bool phyAddr )
376
unsigned long bufferSize = (unsigned long)(sizeof(std::vector<char>::value_type)*number);
378
if (!phyAddr && !isVaRegionValid(offset, bufferSize))
379
throw MemoryException(offset);
381
std::vector<char> buffer(number);
384
readMemory( offset, &buffer[0], bufferSize, phyAddr );
386
return std::string( buffer.begin(), buffer.end() );
389
///////////////////////////////////////////////////////////////////////////////
391
std::wstring loadWChars( MEMOFFSET_64 offset, unsigned long number, bool phyAddr )
393
unsigned long bufferSize = (unsigned long)(sizeof(std::vector<wchar_t>::value_type)*number);
395
if (!phyAddr && !isVaRegionValid(offset, bufferSize))
396
throw MemoryException(offset);
398
std::vector<wchar_t> buffer(number);
401
readMemory( offset, &buffer[0], bufferSize, phyAddr );
403
return std::wstring( buffer.begin(), buffer.end() );
406
///////////////////////////////////////////////////////////////////////////////
408
MEMOFFSET_64 ptrPtr( MEMOFFSET_64 offset, size_t psize)
410
psize = psize == 0 ? ptrSize() : psize;
413
return addr64(ptrDWord(offset) );
416
return addr64(ptrQWord(offset) );
418
throw DbgException("unknown pointer size");
421
///////////////////////////////////////////////////////////////////////////////
423
std::vector<MEMOFFSET_64> loadPtrs( MEMOFFSET_64 offset, unsigned long number, size_t psize )
425
offset = addr64( offset );
427
psize = psize == 0 ? ptrSize() : psize;
429
if (!isVaRegionValid(offset, psize*number))
430
throw MemoryException(offset);
432
std::vector<MEMOFFSET_64> ptrs(number);
434
for ( unsigned long i = 0; i < number; ++i )
435
ptrs[i] =ptrPtr( offset + i*psize, psize );
440
///////////////////////////////////////////////////////////////////////////////
442
std::vector<MEMOFFSET_64> loadPtrList( MEMOFFSET_64 offset, size_t psize )
444
offset = addr64( offset );
446
psize = psize == 0 ? ptrSize() : psize;
448
std::vector<MEMOFFSET_64> ptrs;
451
MEMOFFSET_64 entryAddress = 0;
453
for( entryAddress = ptrPtr( offset, psize ); entryAddress != offset && entryAddress != 0; entryAddress = ptrPtr( entryAddress, psize ) )
454
ptrs.push_back( entryAddress );
459
///////////////////////////////////////////////////////////////////////////////
461
void setPtr(MEMOFFSET_64 offset, MEMOFFSET_64 value, size_t psize)
463
psize = psize == 0 ? ptrSize() : psize;
466
return setDWord( offset, value & std::numeric_limits<MEMOFFSET_32>::max() );
469
return setQWord( offset, value );
471
throw DbgException("unknown pointer size");
474
///////////////////////////////////////////////////////////////////////////////
476
bool compareMemory( MEMOFFSET_64 addr1, MEMOFFSET_64 addr2, size_t length, bool phyAddr )
480
addr1 = addr64( addr1 );
481
addr2 = addr64( addr2 );
483
std::vector<char> m1(length);
484
std::vector<char> m2(length);
486
readMemory( addr1, &m1[0], length, phyAddr );
487
readMemory( addr2, &m2[0], length, phyAddr );
489
return std::equal( m1.begin(), m1.end(), m2.begin() );
492
///////////////////////////////////////////////////////////////////////////////
494
} // kdlib namespace end