use super::{arg_dword, trap_to_win32_local, HostState, Registry, StubFn, Win32Error};
use crate::emulator::{Cpu, Mmu};
pub fn register(registry: &mut Registry) {
registry.register("msi.dll", "@112", stub_msi_get_file_sig_info as StubFn, 5);
registry.register("msi.dll", "@87", stub_msi_install_product_a as StubFn, 2);
registry.register("msi.dll", "@136", stub_msi_set_external_ui_a as StubFn, 3);
registry.register("msi.dll", "@141", stub_msi_set_internal_ui as StubFn, 2);
}
fn stub_msi_get_file_sig_info(
_cpu: &mut Cpu,
_mmu: &mut Mmu,
_state: &mut HostState,
_registry: &Registry,
) -> Result<u32, Win32Error> {
Ok(0x0000_03EE)
}
fn stub_msi_install_product_a(
cpu: &mut Cpu,
mmu: &mut Mmu,
state: &mut HostState,
_registry: &Registry,
) -> Result<u32, Win32Error> {
let p_pkg = arg_dword(cpu, mmu, 0).map_err(|t| trap_to_win32_local("MsiInstallProductA", t))?;
let p_cmd = arg_dword(cpu, mmu, 1).map_err(|t| trap_to_win32_local("MsiInstallProductA", t))?;
let pkg = if p_pkg != 0 {
super::read_cstr_local(mmu, p_pkg, 260)?
} else {
String::new()
};
let cmd = if p_cmd != 0 {
super::read_cstr_local(mmu, p_cmd, 4096)?
} else {
String::new()
};
state
.debug_log
.push(format!("MsiInstallProductA(pkg={pkg:?}, cmd={cmd:?})"));
Ok(0) }
fn stub_msi_set_external_ui_a(
cpu: &mut Cpu,
mmu: &mut Mmu,
state: &mut HostState,
_registry: &Registry,
) -> Result<u32, Win32Error> {
let p_handler =
arg_dword(cpu, mmu, 0).map_err(|t| trap_to_win32_local("MsiSetExternalUIA", t))?;
let filter = arg_dword(cpu, mmu, 1).map_err(|t| trap_to_win32_local("MsiSetExternalUIA", t))?;
let _ctx = arg_dword(cpu, mmu, 2).map_err(|t| trap_to_win32_local("MsiSetExternalUIA", t))?;
state.debug_log.push(format!(
"MsiSetExternalUIA(handler={p_handler:#010x}, filter={filter:#010x})"
));
Ok(0)
}
fn stub_msi_set_internal_ui(
cpu: &mut Cpu,
mmu: &mut Mmu,
state: &mut HostState,
_registry: &Registry,
) -> Result<u32, Win32Error> {
let level = arg_dword(cpu, mmu, 0).map_err(|t| trap_to_win32_local("MsiSetInternalUI", t))?;
let _hwnd = arg_dword(cpu, mmu, 1).map_err(|t| trap_to_win32_local("MsiSetInternalUI", t))?;
state
.debug_log
.push(format!("MsiSetInternalUI(level={level:#x})"));
Ok(1) }