AutoInUseEnumerator.h [plain text]
#pragma once
#ifndef __AUTO_INUSEENUMERATOR__
#define __AUTO_INUSEENUMERATOR__
#include <malloc/malloc.h>
#include "AutoDefs.h"
#include "AutoAdmin.h"
namespace Auto {
class InUseEnumerator {
private:
task_t _task; void *_context; unsigned _type_mask; vm_address_t _zone_address; memory_reader_t _reader; vm_range_recorder_t _recorder; kern_return_t _error;
public:
InUseEnumerator(task_t task, void *context, unsigned type_mask, vm_address_t zone_address, memory_reader_t reader, vm_range_recorder_t recorder)
: _task(task)
, _context(context)
, _type_mask(type_mask)
, _zone_address(zone_address)
, _reader(reader)
, _recorder(recorder)
, _error(KERN_SUCCESS)
{}
inline void *read(void *task_address, usword_t size) {
void *local_address;
kern_return_t err = _reader(_task, (vm_address_t)task_address, (vm_size_t)size, &local_address);
if (err) {
_error = err;
return NULL;
}
return local_address;
}
inline void record(void *address, usword_t size, unsigned type) {
if (_type_mask & type) {
vm_range_t range;
range.address = (vm_address_t)address;
range.size = size;
_recorder(_task, _context, type, &range, 1);
}
}
kern_return_t scan();
};
};
#endif // __AUTO_INUSEENUMERATOR__