Enumerating Windows processes using Rust and the windows crate
Windows API documentation has an example for Enumerating All Processes using C++. As an exercise, I decided to implement the same functionality using Rust and the windows crate.
- Dependency on the windows crate and features are needed. I also used the
anyhow
crate for cleaner error handling, and thelog
andenv_logger
crates for logging:
# Cargo.toml
[package]
name = "process-info"
version = "0.1.0"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
anyhow = "1.0.75"
env_logger = "0.10.0"
log = "0.4.20"
windows-sys = {version = "0.48.0", features = [
"Win32_System_ProcessStatus", "Win32_Foundation", # K32EnumProcessModules, K32EnumProcesses
"Win32_System_Threading", # OpenProcess
"Win32_System_LibraryLoader", # GetModuleFileNameA
]}
- The complete Rust code:
// main.rs
use anyhow::Result;
use std::error::Error;
use std::fmt::Display;
use windows_sys::Win32::Foundation::CloseHandle;
use windows_sys::Win32::Foundation::{GetLastError, MAX_PATH};
use windows_sys::Win32::Foundation::{HANDLE, HMODULE};
use windows_sys::Win32::System::ProcessStatus::EnumProcessModules;
use windows_sys::Win32::System::ProcessStatus::EnumProcesses;
use windows_sys::Win32::System::ProcessStatus::GetModuleBaseNameA;
use windows_sys::Win32::System::ProcessStatus::GetModuleFileNameExA;
use windows_sys::Win32::System::Threading::OpenProcess;
use windows_sys::Win32::System::Threading::{PROCESS_QUERY_INFORMATION, PROCESS_VM_READ};
const DEFAULT_BUFF_SIZE: usize = 1024;
fn main() {
env_logger::init();
match get_process_list() {
Ok(process_list) => process_list.iter().for_each(|item| {
log::info!("{:?}", item);
}),
Err(err) => {
log::error!("{}", err);
}
}
}
#[derive(Debug)]
struct ProcessModule {
name: String,
path: String,
id: u32,
}
#[derive(Debug)]
struct CustomError {
message: String,
code: Option<u32>,
}
impl Display for CustomError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{:?}", self)
}
}
impl Error for CustomError {}
struct AutoProcessHandle {
handle: HANDLE,
}
// RAI-style deallocator for the process handle
impl Drop for AutoProcessHandle {
fn drop(&mut self) {
if self.handle == 0 {
return;
}
match unsafe { CloseHandle(self.handle) } {
0 => {
log::error!("Failed to drop process handle {}", self.handle);
}
_ => {}
};
}
}
fn get_process_ids() -> Result<Vec<u32>> {
let mut process_ids = Vec::with_capacity(DEFAULT_BUFF_SIZE);
process_ids.resize(DEFAULT_BUFF_SIZE, 0);
let mut cb_needed: u32 = 0;
match unsafe {
EnumProcesses(
process_ids.as_mut_ptr(),
process_ids.len().try_into()?,
&mut cb_needed,
)
} {
0 => {
return Err(CustomError {
message: "EnumProcesses failed".to_owned(),
code: Some(unsafe { GetLastError() }),
}
.into())
}
_ => {
log::debug!("{} bytes is needed to store all process info", cb_needed)
}
}
if cb_needed != process_ids.len().try_into()? {
return Ok(process_ids);
}
// The buffer isn't large enough so we need to reallocate
process_ids.resize(cb_needed as usize / std::mem::size_of::<u32>(), 0);
match unsafe {
EnumProcesses(
process_ids.as_mut_ptr(),
(process_ids.len() * std::mem::size_of::<u32>()).try_into()?,
&mut cb_needed,
)
} {
0 => {
return Err(CustomError {
message: "EnumProcesses failed".to_owned(),
code: Some(unsafe { GetLastError() }),
}
.into())
}
_ => {}
}
assert_ne!(cb_needed, process_ids.len().try_into()?);
Ok(process_ids)
}
fn get_module_handle(process_handle: HANDLE) -> Result<HMODULE> {
let mut module_handle = 0;
let mut cb_needed = 0;
match unsafe { EnumProcessModules(process_handle, &mut module_handle, 0, &mut cb_needed) } {
0 => {
return Err(CustomError {
message: "EnumProcessModules failed".to_owned(),
code: Some(unsafe { GetLastError() }),
}
.into())
}
_ => {}
};
Ok(module_handle)
}
fn get_process_module_info(
process_handle: HANDLE,
process_id: u32,
module_handle: HMODULE,
) -> Result<Option<ProcessModule>> {
let mut module_path = Vec::<u8>::with_capacity(MAX_PATH.try_into()?);
module_path.resize(MAX_PATH.try_into()?, 0);
match unsafe {
GetModuleFileNameExA(
process_handle,
module_handle,
module_path.as_mut_ptr(),
module_path.len().try_into()?,
)
} {
0 => {
return Ok(None);
}
_ => {}
};
let mut module_name = Vec::<u8>::with_capacity(MAX_PATH.try_into()?);
module_name.resize(MAX_PATH.try_into()?, 0);
match unsafe {
GetModuleBaseNameA(
process_handle,
module_handle,
module_name.as_mut_ptr(),
module_name.len().try_into()?,
)
} {
0 => {
return Ok(None);
}
_ => {}
};
Ok(Some(ProcessModule {
name: String::from_iter(
module_name
.iter()
.take_while(|&&x| x != 0)
.map(|&x| x as char),
),
path: String::from_iter(
module_path
.iter()
.take_while(|&&x| x != 0)
.map(|&x| x as char),
),
id: process_id,
}))
}
fn get_process_list() -> Result<Vec<ProcessModule>> {
let mut process_module_infos = Vec::new();
let process_ids = get_process_ids()?;
for i in 0..process_ids.len() {
let process_handle = unsafe {
OpenProcess(
PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,
0,
process_ids[i],
)
};
if process_handle == 0 {
continue;
}
// RAII-style process handle
let process_handle = AutoProcessHandle {
handle: process_handle,
};
let module_handle = get_module_handle(process_handle.handle)?;
if let Some(process_module_info) =
get_process_module_info(process_handle.handle, process_ids[i], module_handle)?
{
process_module_infos.push(process_module_info);
}
}
Ok(process_module_infos)
}
The above Rust implementation is a bit more verbose compared to the original C++ code because it checks the required buffer size after calling EnumProcesses
and resizes the buffer dynamically and retries (if needed).
The output of running set RUST_LOG=process_info && cargo run
in debug
build looks like the following:
[2023-08-19T23:28:36Z DEBUG process_info] 784 bytes is needed to store all process info
[2023-08-19T23:28:36Z INFO process_info] ProcessModule { name: "sihost.exe", path: "C:\\Windows\\System32\\sihost.exe", id: 8320 }
[2023-08-19T23:28:36Z INFO process_info] ProcessModule { name: "nvcontainer.exe", path: "C:\\Program Files\\NVIDIA Corporation\\NvContainer\\nvcontainer.exe", id: 14352 }
[2023-08-19T23:28:36Z INFO process_info] ProcessModule { name: "svchost.exe", path: "C:\\Windows\\System32\\svchost.exe", id: 7164 }
[2023-08-19T23:28:36Z INFO process_info] ProcessModule { name: "svchost.exe", path: "C:\\Windows\\System32\\svchost.exe", id: 12564 }
[2023-08-19T23:28:36Z INFO process_info] ProcessModule { name: "nvcontainer.exe", path: "C:\\Program Files\\NVIDIA Corporation\\NvContainer\\nvcontainer.exe", id: 8256 }
[2023-08-19T23:28:36Z INFO process_info] ProcessModule { name: "svchost.exe", path: "C:\\Windows\\System32\\svchost.exe", id: 8252 }
[2023-08-19T23:28:36Z INFO process_info] ProcessModule { name: "taskhostw.exe", path: "C:\\Windows\\System32\\taskhostw.exe", id: 12860 }
[2023-08-19T23:28:36Z INFO process_info] ProcessModule { name: "Explorer.EXE", path: "C:\\Windows\\explorer.exe", id: 13020 }
[2023-08-19T23:28:36Z INFO process_info] ProcessModule { name: "svchost.exe", path: "C:\\Windows\\System32\\svchost.exe", id: 1072 }
[2023-08-19T23:28:36Z INFO process_info] ProcessModule { name: "StartMenuExperienceHost.exe", path: "C:\\Windows\\SystemApps\\Microsoft.Windows.StartMenuExperienceHost_cw5n1h2txyewy\\StartMenuExperienceHost.exe", id: 13644 }
[2023-08-19T23:28:36Z INFO process_info] ProcessModule { name: "RuntimeBroker.exe", path: "C:\\Windows\\System32\\RuntimeBroker.exe", id: 10940 }
[2023-08-19T23:28:36Z INFO process_info] ProcessModule { name: "NVIDIA Web Helper.exe", path: "C:\\Program Files (x86)\\NVIDIA Corporation\\NvNode\\NVIDIA Web Helper.exe", id: 7200 }
[2023-08-19T23:28:36Z INFO process_info] ProcessModule { name: "SearchApp.exe", path: "C:\\Windows\\SystemApps\\Microsoft.Windows.Search_cw5n1h2txyewy\\SearchApp.exe", id: 5152 }
[2023-08-19T23:28:36Z INFO process_info] ProcessModule { name: "conhost.exe", path: "C:\\Windows\\System32\\conhost.exe", id: 7236 }
[2023-08-19T23:28:36Z INFO process_info] ProcessModule { name: "RuntimeBroker.exe", path: "C:\\Windows\\System32\\RuntimeBroker.exe", id: 12268 }
[2023-08-19T23:28:36Z INFO process_info] ProcessModule { name: "RuntimeBroker.exe", path: "C:\\Windows\\System32\\RuntimeBroker.exe", id: 14984 }
[2023-08-19T23:28:36Z INFO process_info] ProcessModule { name: "ConEmu64.exe", path: "C:\\Users\\####\\cmder\\vendor\\conemu-maximus5\\ConEmu64.exe", id: 13600 }
[2023-08-19T23:28:36Z INFO process_info] ProcessModule { name: "PhoneExperienceHost.exe", path: "C:\\Program Files\\WindowsApps\\Microsoft.YourPhone_1.23062.153.0_x64__8wekyb3d8bbwe\\PhoneExperienceHost.exe", id: 7676 }
[2023-08-19T23:28:36Z INFO process_info] ProcessModule { name: "ConEmuC64.exe", path: "C:\\Users\\####\\cmder\\vendor\\conemu-maximus5\\ConEmu\\ConEmuC64.exe", id: 6728 }
[2023-08-19T23:28:36Z INFO process_info] ProcessModule { name: "conhost.exe", path: "C:\\Windows\\System32\\conhost.exe", id: 6900 }
[2023-08-19T23:28:36Z INFO process_info] ProcessModule { name: "TextInputHost.exe", path: "C:\\Windows\\SystemApps\\MicrosoftWindows.Client.CBS_cw5n1h2txyewy\\TextInputHost.exe", id: 10460 }
[2023-08-19T23:28:36Z INFO process_info] ProcessModule { name: "cmd.exe", path: "C:\\Windows\\System32\\cmd.exe", id: 15076 }
[2023-08-19T23:28:36Z INFO process_info] ProcessModule { name: "RuntimeBroker.exe", path: "C:\\Windows\\System32\\RuntimeBroker.exe", id: 10404 }
[2023-08-19T23:28:36Z INFO process_info] ProcessModule { name: "BingWallpaperApp.exe", path: "C:\\Users\\####\\AppData\\Local\\Microsoft\\BingWallpaperApp\\BingWallpaperApp.exe", id: 14472 }
[2023-08-19T23:28:36Z INFO process_info] ProcessModule { name: "svchost.exe", path: "C:\\Windows\\System32\\svchost.exe", id: 9572 }
[2023-08-19T23:28:36Z INFO process_info] ProcessModule { name: "ShellExperienceHost.exe", path: "C:\\Windows\\SystemApps\\ShellExperienceHost_cw5n1h2txyewy\\ShellExperienceHost.exe", id: 10736 }
[2023-08-19T23:28:36Z INFO process_info] ProcessModule { name: "RuntimeBroker.exe", path: "C:\\Windows\\System32\\RuntimeBroker.exe", id: 6544 }
[2023-08-19T23:28:36Z INFO process_info] ProcessModule { name: "SystemSettingsBroker.exe", path: "C:\\Windows\\System32\\SystemSettingsBroker.exe", id: 2012 }
[2023-08-19T23:28:36Z INFO process_info] ProcessModule { name: "NVIDIA Share.exe", path: "C:\\Program Files\\NVIDIA Corporation\\NVIDIA GeForce Experience\\NVIDIA Share.exe", id: 10340 }
[2023-08-19T23:28:36Z INFO process_info] ProcessModule { name: "NVIDIA Share.exe", path: "C:\\Program Files\\NVIDIA Corporation\\NVIDIA GeForce Experience\\NVIDIA Share.exe", id: 13272 }
[2023-08-19T23:28:36Z INFO process_info] ProcessModule { name: "NVIDIA Share.exe", path: "C:\\Program Files\\NVIDIA Corporation\\NVIDIA GeForce Experience\\NVIDIA Share.exe", id: 1468 }
[2023-08-19T23:28:36Z INFO process_info] ProcessModule { name: "Video.UI.exe", path: "C:\\Program Files\\WindowsApps\\Microsoft.ZuneVideo_10.22091.10041.0_x64__8wekyb3d8bbwe\\Video.UI.exe", id: 11848 }
[2023-08-19T23:28:36Z INFO process_info] ProcessModule { name: "RuntimeBroker.exe", path: "C:\\Windows\\System32\\RuntimeBroker.exe", id: 7920 }
[2023-08-19T23:28:36Z INFO process_info] ProcessModule { name: "svchost.exe", path: "C:\\Windows\\System32\\svchost.exe", id: 10660 }
[2023-08-19T23:28:36Z INFO process_info] ProcessModule { name: "SystemSettings.exe", path: "C:\\Windows\\ImmersiveControlPanel\\SystemSettings.exe", id: 14220 }
[2023-08-19T23:28:36Z INFO process_info] ProcessModule { name: "ApplicationFrameHost.exe", path: "C:\\Windows\\System32\\ApplicationFrameHost.exe", id: 3376 }
[2023-08-19T23:28:36Z INFO process_info] ProcessModule { name: "UserOOBEBroker.exe", path: "C:\\Windows\\System32\\oobe\\UserOOBEBroker.exe", id: 10900 }
[2023-08-19T23:28:36Z INFO process_info] ProcessModule { name: "Cortana.exe", path: "C:\\Program Files\\WindowsApps\\Microsoft.549981C3F5F10_4.2308.1005.0_x64__8wekyb3d8bbwe\\Cortana.exe", id: 13672 }
[2023-08-19T23:28:36Z INFO process_info] ProcessModule { name: "Code.exe", path: "C:\\Users\\####\\AppData\\Local\\Programs\\Microsoft VS Code\\Code.exe", id: 3028 }
[2023-08-19T23:28:36Z INFO process_info] ProcessModule { name: "Code.exe", path: "C:\\Users\\####\\AppData\\Local\\Programs\\Microsoft VS Code\\Code.exe", id: 7700 }
[2023-08-19T23:28:36Z INFO process_info] ProcessModule { name: "Code.exe", path: "C:\\Users\\####\\AppData\\Local\\Programs\\Microsoft VS Code\\Code.exe", id: 5240 }
[2023-08-19T23:28:36Z INFO process_info] ProcessModule { name: "Code.exe", path: "C:\\Users\\####\\AppData\\Local\\Programs\\Microsoft VS Code\\Code.exe", id: 7624 }
[2023-08-19T23:28:36Z INFO process_info] ProcessModule { name: "Code.exe", path: "C:\\Users\\####\\AppData\\Local\\Programs\\Microsoft VS Code\\Code.exe", id: 7328 }
[2023-08-19T23:28:36Z INFO process_info] ProcessModule { name: "Code.exe", path: "C:\\Users\\####\\AppData\\Local\\Programs\\Microsoft VS Code\\Code.exe", id: 10292 }
[2023-08-19T23:28:36Z INFO process_info] ProcessModule { name: "Code.exe", path: "C:\\Users\\####\\AppData\\Local\\Programs\\Microsoft VS Code\\Code.exe", id: 11612 }
[2023-08-19T23:28:36Z INFO process_info] ProcessModule { name: "Code.exe", path: "C:\\Users\\####\\AppData\\Local\\Programs\\Microsoft VS Code\\Code.exe", id: 5644 }
[2023-08-19T23:28:36Z INFO process_info] ProcessModule { name: "rust-analyzer.exe", path: "C:\\Users\\####\\.vscode\\extensions\\rust-lang.rust-analyzer-0.3.1623-win32-x64\\server\\rust-analyzer.exe", id: 5732 }
[2023-08-19T23:28:36Z INFO process_info] ProcessModule { name: "conhost.exe", path: "C:\\Windows\\System32\\conhost.exe", id: 9768 }
[2023-08-19T23:28:36Z INFO process_info] ProcessModule { name: "Code.exe", path: "C:\\Users\\####\\AppData\\Local\\Programs\\Microsoft VS Code\\Code.exe", id: 5040 }
[2023-08-19T23:28:36Z INFO process_info] ProcessModule { name: "rust-analyzer-proc-macro-srv.exe", path: "C:\\Users\\####\\.rustup\\toolchains\\stable-x86_64-pc-windows-msvc\\libexec\\rust-analyzer-proc-macro-srv.exe", id: 8636 }
[2023-08-19T23:28:36Z INFO process_info] ProcessModule { name: "Code.exe", path: "C:\\Users\\####\\AppData\\Local\\Programs\\Microsoft VS Code\\Code.exe", id: 13684 }
[2023-08-19T23:28:36Z INFO process_info] ProcessModule { name: "Code.exe", path: "C:\\Users\\####\\AppData\\Local\\Programs\\Microsoft VS Code\\Code.exe", id: 10680 }
[2023-08-19T23:28:36Z INFO process_info] ProcessModule { name: "conhost.exe", path: "C:\\Windows\\System32\\conhost.exe", id: 11916 }
[2023-08-19T23:28:36Z INFO process_info] ProcessModule { name: "powershell.exe", path: "C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe", id: 5792 }
[2023-08-19T23:28:36Z INFO process_info] ProcessModule { name: "ConEmuC64.exe", path: "C:\\Users\\####\\cmder\\vendor\\conemu-maximus5\\ConEmu\\ConEmuC64.exe", id: 10212 }
[2023-08-19T23:28:36Z INFO process_info] ProcessModule { name: "conhost.exe", path: "C:\\Windows\\System32\\conhost.exe", id: 8100 }
[2023-08-19T23:28:36Z INFO process_info] ProcessModule { name: "cmd.exe", path: "C:\\Windows\\System32\\cmd.exe", id: 12432 }
[2023-08-19T23:28:36Z INFO process_info] ProcessModule { name: "Code.exe", path: "C:\\Users\\####\\AppData\\Local\\Programs\\Microsoft VS Code\\Code.exe", id: 13204 }
[2023-08-19T23:28:36Z INFO process_info] ProcessModule { name: "Code.exe", path: "C:\\Users\\####\\AppData\\Local\\Programs\\Microsoft VS Code\\Code.exe", id: 15152 }
[2023-08-19T23:28:36Z INFO process_info] ProcessModule { name: "Code.exe", path: "C:\\Users\\####\\AppData\\Local\\Programs\\Microsoft VS Code\\Code.exe", id: 7320 }
[2023-08-19T23:28:36Z INFO process_info] ProcessModule { name: "Code.exe", path: "C:\\Users\\####\\AppData\\Local\\Programs\\Microsoft VS Code\\Code.exe", id: 7152 }
[2023-08-19T23:28:36Z INFO process_info] ProcessModule { name: "Code.exe", path: "C:\\Users\\####\\AppData\\Local\\Programs\\Microsoft VS Code\\Code.exe", id: 11028 }
[2023-08-19T23:28:36Z INFO process_info] ProcessModule { name: "Code.exe", path: "C:\\Users\\####\\AppData\\Local\\Programs\\Microsoft VS Code\\Code.exe", id: 14308 }
[2023-08-19T23:28:36Z INFO process_info] ProcessModule { name: "msedge.exe", path: "C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\msedge.exe", id: 10964 }
[2023-08-19T23:28:36Z INFO process_info] ProcessModule { name: "msedge.exe", path: "C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\msedge.exe", id: 1664 }
[2023-08-19T23:28:36Z INFO process_info] ProcessModule { name: "msedge.exe", path: "C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\msedge.exe", id: 11608 }
[2023-08-19T23:28:36Z INFO process_info] ProcessModule { name: "msedge.exe", path: "C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\msedge.exe", id: 9956 }
[2023-08-19T23:28:36Z INFO process_info] ProcessModule { name: "msedge.exe", path: "C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\msedge.exe", id: 1932 }
[2023-08-19T23:28:36Z INFO process_info] ProcessModule { name: "msedge.exe", path: "C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\msedge.exe", id: 12416 }
[2023-08-19T23:28:36Z INFO process_info] ProcessModule { name: "msedge.exe", path: "C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\msedge.exe", id: 14504 }
[2023-08-19T23:28:36Z INFO process_info] ProcessModule { name: "msedge.exe", path: "C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\msedge.exe", id: 1088 }
[2023-08-19T23:28:36Z INFO process_info] ProcessModule { name: "msedge.exe", path: "C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\msedge.exe", id: 12236 }
[2023-08-19T23:28:36Z INFO process_info] ProcessModule { name: "msedge.exe", path: "C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\msedge.exe", id: 8776 }
[2023-08-19T23:28:36Z INFO process_info] ProcessModule { name: "msedge.exe", path: "C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\msedge.exe", id: 7068 }
[2023-08-19T23:28:36Z INFO process_info] ProcessModule { name: "msedge.exe", path: "C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\msedge.exe", id: 9112 }
[2023-08-19T23:28:36Z INFO process_info] ProcessModule { name: "msedge.exe", path: "C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\msedge.exe", id: 5868 }
[2023-08-19T23:28:36Z INFO process_info] ProcessModule { name: "msedge.exe", path: "C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\msedge.exe", id: 7580 }
[2023-08-19T23:28:36Z INFO process_info] ProcessModule { name: "msedge.exe", path: "C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\msedge.exe", id: 1132 }
[2023-08-19T23:28:36Z INFO process_info] ProcessModule { name: "msedge.exe", path: "C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\msedge.exe", id: 12012 }
[2023-08-19T23:28:36Z INFO process_info] ProcessModule { name: "msedge.exe", path: "C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\msedge.exe", id: 4892 }
[2023-08-19T23:28:36Z INFO process_info] ProcessModule { name: "msedge.exe", path: "C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\msedge.exe", id: 8676 }
[2023-08-19T23:28:36Z INFO process_info] ProcessModule { name: "msedge.exe", path: "C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\msedge.exe", id: 11484 }
[2023-08-19T23:28:36Z INFO process_info] ProcessModule { name: "msedge.exe", path: "C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\msedge.exe", id: 14924 }
[2023-08-19T23:28:36Z INFO process_info] ProcessModule { name: "msedge.exe", path: "C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\msedge.exe", id: 6316 }
[2023-08-19T23:28:36Z INFO process_info] ProcessModule { name: "msedge.exe", path: "C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\msedge.exe", id: 5048 }
[2023-08-19T23:28:36Z INFO process_info] ProcessModule { name: "msedge.exe", path: "C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\msedge.exe", id: 12456 }
[2023-08-19T23:28:36Z INFO process_info] ProcessModule { name: "msedge.exe", path: "C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\msedge.exe", id: 9240 }
[2023-08-19T23:28:36Z INFO process_info] ProcessModule { name: "cargo.exe", path: "C:\\Users\\####\\.cargo\\bin\\cargo.exe", id: 6500 }
[2023-08-19T23:28:36Z INFO process_info] ProcessModule { name: "cargo.exe", path: "C:\\Users\\####\\.rustup\\toolchains\\stable-x86_64-pc-windows-msvc\\bin\\cargo.exe", id: 12984 }
[2023-08-19T23:28:36Z INFO process_info] ProcessModule { name: "cargo-watch.exe", path: "C:\\Users\\####\\.cargo\\bin\\cargo-watch.exe", id: 15060 }
[2023-08-19T23:28:36Z INFO process_info] ProcessModule { name: "cmd.exe", path: "C:\\Windows\\System32\\cmd.exe", id: 8480 }
[2023-08-19T23:28:36Z INFO process_info] ProcessModule { name: "cargo.exe", path: "C:\\Users\\####\\.rustup\\toolchains\\stable-x86_64-pc-windows-msvc\\bin\\cargo.exe", id: 10820 }
[2023-08-19T23:28:36Z INFO process_info] ProcessModule { name: "VCTIP.EXE", path: "C:\\Program Files (x86)\\Microsoft Visual Studio\\2022\\BuildTools\\VC\\Tools\\MSVC\\14.36.32532\\bin\\Hostx64\\x64\\vctip.exe", id: 3892 }
[2023-08-19T23:28:36Z INFO process_info] ProcessModule { name: "process-info.exe", path: "C:\\Users\\####\\rust\\process-info\\target\\debug\\process-info.exe", id: 11860 }