use crate::{
WdResult,
dbgmodel::{DebugHostModule, DebugHostType, HostContextBy, *},
impl_debug_interface, pcw,
};
use windows::Win32::System::Diagnostics::Debug::Extensions::{
IDebugHostSymbols, Location,
};
use windy::WStr;
impl_debug_interface!(DebugHostSymbols, DebugHostSymbolsRef, IDebugHostSymbols);
impl DebugHostSymbols {
pub fn create_module_signature(
&self,
module_name: impl AsRef<WStr>,
min_version: impl AsRef<WStr>,
max_version: impl AsRef<WStr>,
) -> WdResult<DebugHostModuleSignature> {
unsafe {
Ok(self
.0
.CreateModuleSignature(
pcw!(module_name),
pcw!(min_version),
pcw!(max_version),
)?
.into())
}
}
pub fn create_type_signature(
&self,
signature_specification: impl AsRef<WStr>,
module: &DebugHostModule,
) -> WdResult<DebugHostTypeSignature> {
unsafe {
Ok(self
.0
.CreateTypeSignature(
pcw!(signature_specification),
module.as_raw(),
)?
.into())
}
}
pub fn create_type_signature_for_module_range(
&self,
signature_specification: impl AsRef<WStr>,
module_name: impl AsRef<WStr>,
min_version: impl AsRef<WStr>,
max_version: impl AsRef<WStr>,
) -> WdResult<DebugHostTypeSignature> {
unsafe {
Ok(self
.0
.CreateTypeSignatureForModuleRange(
pcw!(signature_specification),
pcw!(module_name),
pcw!(min_version),
pcw!(max_version),
)?
.into())
}
}
pub fn enumerate_modules<'a>(
&self,
context: impl Into<NonNullHostContextBy<'a>>,
) -> WdResult<DebugHostSymbolEnumerator> {
unsafe { Ok(self.0.EnumerateModules(context.into().as_raw())?.into()) }
}
pub fn find_module_by_name<'a>(
&self,
context: impl Into<NonNullHostContextBy<'a>>,
module_name: impl AsRef<WStr>,
) -> WdResult<DebugHostModule> {
unsafe {
Ok(self
.0
.FindModuleByName(context.into().as_raw(), pcw!(module_name))?
.into())
}
}
pub fn find_module_by_location<'a>(
&self,
context: impl Into<NonNullHostContextBy<'a>>,
location: Location,
) -> WdResult<DebugHostModule> {
unsafe {
Ok(self
.0
.FindModuleByLocation(context.into().as_raw(), location)?
.into())
}
}
pub fn get_most_derived_object<'a>(
&self,
context: impl Into<HostContextBy<'a>>,
location: Location,
object_type: &DebugHostType,
) -> WdResult<(Location, DebugHostType)> {
let mut derived_location = Location::default();
let mut derived_type = None;
unsafe {
self.0.GetMostDerivedObject(
context.into().as_raw(),
location,
object_type.as_raw(),
&mut derived_location,
&mut derived_type,
)?;
}
Ok((derived_location, derived_type.unwrap().into()))
}
}
impl DebugHostSymbols {
}