pai 0.1.11

Process Analyzer and Instrumenter
Documentation
use crate::{
	api::{
		messages::{CbAction, Event, EventInner, RegEvent, SyscallItem},
		ArgsBuilder, Client, Command, Response,
	},
	ctx,
	plugin::Plugin,
	utils, Result, TargetPtr,
};

#[derive(Default)]
pub struct Mmap;

impl Mmap {
	fn new() -> Self {
		Self
	}
	pub fn dependecies() -> &'static [Plugin] {
		&[]
	}
	fn gen_mmap(sys: &SyscallItem, istwo: bool) -> Result<Event> {
		let addr = sys.args[0].raw_value();
		let size = sys.args[1].raw_value();
		let prot = sys.args[2].raw_value();
		let flags = sys.args[3].raw_value();
		let fd = sys.args[4].raw_value();
		let mut offset = sys.args[5].raw_value();
		if istwo {
			offset *= 4096.into();
		}
		let evt = EventInner::Mmap {
			addr,
			size,
			prot,
			flags,
			fd,
			offset,
		};
		let evt = Event::new_attached(sys.tid, evt);
		Ok(evt)
	}
	pub fn init(client: crate::Client) -> Result<ctx::Secondary<Self, crate::Error>> {
		let data = Self::new();

		let mut ctx = ctx::Secondary::new_second(client, data)?;

		let mmap = ctx.client_mut().resolve_syscall("mmap")?;
		let mmap2 = ctx.client_mut().resolve_syscall("mmap2");

		if let Ok(mmap2) = mmap2 {
			ctx.set_syscall_hook_exit(mmap2, |cl, sys| {
				debug_assert!(sys.is_exit());
				let event = Self::gen_mmap(sys, true)?;
				cl.client_mut().send_event(event)?;
				Ok(CbAction::None)
			});
		}

		ctx.set_syscall_hook_exit(mmap, |cl, sys| {
			debug_assert!(sys.is_exit());
			let event = Self::gen_mmap(sys, true)?;
			cl.client_mut().send_event(event)?;
			Ok(CbAction::None)
		});
		Ok(ctx)
	}
}