diff options
| author | Mason Reed <35282038+emesare@users.noreply.github.com> | 2026-02-22 20:40:28 -0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2026-02-22 20:40:28 -0800 |
| commit | 017349bdbe171c66974a5835f2f74f76138386ea (patch) | |
| tree | 2e81f92e683f4b1d12c129360c788e0e52217d82 /plugins/warp/src/plugin | |
| parent | e2e420c91147f2a83cf59b37c973f57e209ef67a (diff) | |
[WARP] Allow containers to be constructed programmatically (#7952)
Diffstat (limited to 'plugins/warp/src/plugin')
| -rw-r--r-- | plugins/warp/src/plugin/ffi/container.rs | 19 |
1 files changed, 18 insertions, 1 deletions
diff --git a/plugins/warp/src/plugin/ffi/container.rs b/plugins/warp/src/plugin/ffi/container.rs index 2376ef10..a107a785 100644 --- a/plugins/warp/src/plugin/ffi/container.rs +++ b/plugins/warp/src/plugin/ffi/container.rs @@ -1,4 +1,5 @@ -use crate::cache::container::cached_containers; +use crate::cache::container::{add_cached_container, cached_container_by_name, cached_containers}; +use crate::container::disk::DiskContainer; use crate::container::{ ContainerSearchItem, ContainerSearchItemKind, ContainerSearchQuery, SourcePath, SourceTag, }; @@ -12,6 +13,7 @@ use binaryninja::rc::Ref; use binaryninja::string::BnString; use binaryninja::types::Type; use binaryninjacore_sys::{BNArchitecture, BNBinaryView, BNType}; +use std::collections::HashMap; use std::ffi::{c_char, CStr}; use std::mem::ManuallyDrop; use std::ops::Deref; @@ -173,6 +175,21 @@ pub unsafe extern "C" fn BNWARPContainerSearchItemGetFunction( } #[no_mangle] +pub unsafe extern "C" fn BNWARPAddContainer(name: *const c_char) -> *mut BNWARPContainer { + let name_cstr = unsafe { CStr::from_ptr(name) }; + let name_str = name_cstr.to_str().unwrap(); + // TODO: Using this generic API name for disk container, I think anything like the network container + // TODO: should probably be a second class name so something like BNWARPAddNetworkContainer. + let disk_container = DiskContainer::new(name_str.to_string(), HashMap::new()); + let container_name = disk_container.to_string(); + add_cached_container(disk_container); + match cached_container_by_name(&container_name) { + Some(container) => Arc::into_raw(container) as *mut BNWARPContainer, + None => std::ptr::null_mut(), + } +} + +#[no_mangle] pub unsafe extern "C" fn BNWARPGetContainers(count: *mut usize) -> *mut *mut BNWARPContainer { // NOTE: Leak the arc pointers to be freed by BNWARPFreeContainerList let boxed_raw_containers: Box<[_]> = |
