#ifndef MEMFLOW_H
#define MEMFLOW_H
#include <stdarg.h>
#include <stdbool.h>
#include <stdint.h>
#include <stdlib.h>
enum Endianess
#ifdef __cplusplus
: uint8_t
#endif {
LittleEndian,
BigEndian,
};
#ifndef __cplusplus
typedef uint8_t Endianess;
#endif
typedef struct ArchitectureObj ArchitectureObj;
typedef struct CloneablePhysicalMemoryObj CloneablePhysicalMemoryObj;
typedef struct ConnectorInventory ConnectorInventory;
typedef struct OsProcessInfoObj OsProcessInfoObj;
typedef struct OsProcessModuleInfoObj OsProcessModuleInfoObj;
typedef struct PhysicalMemoryObj PhysicalMemoryObj;
typedef struct PhysicalReadData PhysicalReadData;
typedef struct PhysicalWriteData PhysicalWriteData;
typedef struct VirtualMemoryObj VirtualMemoryObj;
typedef struct VirtualReadData VirtualReadData;
typedef struct VirtualWriteData VirtualWriteData;
typedef uint64_t Address;
#define Address_NULL 0
typedef uint8_t PageType;
#define PageType_NONE (uint8_t)0
#define PageType_UNKNOWN (uint8_t)1
#define PageType_PAGE_TABLE (uint8_t)2
#define PageType_WRITEABLE (uint8_t)4
#define PageType_READ_ONLY (uint8_t)8
#define PageType_NOEXEC (uint8_t)16
typedef struct PhysicalAddress {
Address address;
PageType page_type;
uint8_t page_size_log2;
} PhysicalAddress;
typedef struct PhysicalMemoryMetadata {
uintptr_t size;
bool readonly;
} PhysicalMemoryMetadata;
typedef uint32_t PID;
#ifdef __cplusplus
extern "C" {
#endif
extern const ArchitectureObj *X86_32;
extern const ArchitectureObj *X86_32_PAE;
extern const ArchitectureObj *X86_64;
void log_init(int32_t level_num);
PhysicalAddress addr_to_paddr(Address address);
ConnectorInventory *inventory_scan(void);
ConnectorInventory *inventory_scan_path(const char *path);
int32_t inventory_add_dir(ConnectorInventory *inv, const char *dir);
CloneablePhysicalMemoryObj *inventory_create_connector(ConnectorInventory *inv,
const char *name,
const char *args);
CloneablePhysicalMemoryObj *connector_clone(const CloneablePhysicalMemoryObj *conn);
void connector_free(CloneablePhysicalMemoryObj *conn);
void inventory_free(ConnectorInventory *inv);
PhysicalMemoryObj *downcast_cloneable(CloneablePhysicalMemoryObj *cloneable);
void phys_free(PhysicalMemoryObj *mem);
int32_t phys_read_raw_list(PhysicalMemoryObj *mem, PhysicalReadData *data, uintptr_t len);
int32_t phys_write_raw_list(PhysicalMemoryObj *mem, const PhysicalWriteData *data, uintptr_t len);
PhysicalMemoryMetadata phys_metadata(const PhysicalMemoryObj *mem);
int32_t phys_read_raw_into(PhysicalMemoryObj *mem,
PhysicalAddress addr,
uint8_t *out,
uintptr_t len);
uint32_t phys_read_u32(PhysicalMemoryObj *mem, PhysicalAddress addr);
uint64_t phys_read_u64(PhysicalMemoryObj *mem, PhysicalAddress addr);
int32_t phys_write_raw(PhysicalMemoryObj *mem,
PhysicalAddress addr,
const uint8_t *input,
uintptr_t len);
int32_t phys_write_u32(PhysicalMemoryObj *mem, PhysicalAddress addr, uint32_t val);
int32_t phys_write_u64(PhysicalMemoryObj *mem, PhysicalAddress addr, uint64_t val);
void virt_free(VirtualMemoryObj *mem);
int32_t virt_read_raw_list(VirtualMemoryObj *mem, VirtualReadData *data, uintptr_t len);
int32_t virt_write_raw_list(VirtualMemoryObj *mem, const VirtualWriteData *data, uintptr_t len);
int32_t virt_read_raw_into(VirtualMemoryObj *mem, Address addr, uint8_t *out, uintptr_t len);
uint32_t virt_read_u32(VirtualMemoryObj *mem, Address addr);
uint64_t virt_read_u64(VirtualMemoryObj *mem, Address addr);
int32_t virt_write_raw(VirtualMemoryObj *mem, Address addr, const uint8_t *input, uintptr_t len);
int32_t virt_write_u32(VirtualMemoryObj *mem, Address addr, uint32_t val);
int32_t virt_write_u64(VirtualMemoryObj *mem, Address addr, uint64_t val);
uint8_t arch_bits(const ArchitectureObj *arch);
Endianess arch_endianess(const ArchitectureObj *arch);
uintptr_t arch_page_size(const ArchitectureObj *arch);
uintptr_t arch_size_addr(const ArchitectureObj *arch);
uint8_t arch_address_space_bits(const ArchitectureObj *arch);
void arch_free(ArchitectureObj *arch);
bool is_x86_arch(const ArchitectureObj *arch);
Address os_process_info_address(const OsProcessInfoObj *obj);
PID os_process_info_pid(const OsProcessInfoObj *obj);
uintptr_t os_process_info_name(const OsProcessInfoObj *obj, char *out, uintptr_t max_len);
const ArchitectureObj *os_process_info_sys_arch(const OsProcessInfoObj *obj);
const ArchitectureObj *os_process_info_proc_arch(const OsProcessInfoObj *obj);
void os_process_info_free(OsProcessInfoObj *obj);
Address os_process_module_address(const OsProcessModuleInfoObj *obj);
Address os_process_module_parent_process(const OsProcessModuleInfoObj *obj);
Address os_process_module_base(const OsProcessModuleInfoObj *obj);
uintptr_t os_process_module_size(const OsProcessModuleInfoObj *obj);
uintptr_t os_process_module_name(const OsProcessModuleInfoObj *obj, char *out, uintptr_t max_len);
void os_process_module_free(OsProcessModuleInfoObj *obj);
#ifdef __cplusplus
} #endif
#endif