Skip to content

Commit 6f7a375

Browse files
committed
Map Win32 errors to typed memflow kinds and replace unsafe Send/Sync impls with compile-time assertions
1 parent 756b966 commit 6f7a375

3 files changed

Lines changed: 42 additions & 11 deletions

File tree

src/windows/mem.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,11 @@ use windows::Win32::System::Threading::{
1616
pub struct ProcessVirtualMemory {
1717
pub(crate) handle: Arc<Handle>,
1818
}
19-
unsafe impl Send for ProcessVirtualMemory {}
20-
unsafe impl Sync for ProcessVirtualMemory {}
19+
20+
const _: () = {
21+
fn assert_send_sync<T: Send + Sync>() {}
22+
assert_send_sync::<ProcessVirtualMemory>();
23+
};
2124

2225
impl ProcessVirtualMemory {
2326
pub fn try_new(info: &ProcessInfo) -> Result<Self> {

src/windows/mod.rs

Lines changed: 32 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,12 @@ use memflow::prelude::v1::*;
44
use windows::core::PCSTR;
55
use windows::Wdk::System::SystemInformation::{NtQuerySystemInformation, SYSTEM_INFORMATION_CLASS};
66
use windows::Win32::Foundation::{
7-
CloseHandle, HANDLE, NTSTATUS, STATUS_ACCESS_DENIED, STATUS_INFO_LENGTH_MISMATCH,
8-
STATUS_INSUFFICIENT_RESOURCES, STATUS_INVALID_HANDLE, STATUS_INVALID_INFO_CLASS,
9-
STATUS_INVALID_PARAMETER, STATUS_NOT_IMPLEMENTED, STATUS_NO_MEMORY, STATUS_PRIVILEGE_NOT_HELD,
7+
CloseHandle, ERROR_ACCESS_DENIED, ERROR_BAD_LENGTH, ERROR_INSUFFICIENT_BUFFER,
8+
ERROR_INVALID_ADDRESS, ERROR_INVALID_FLAGS, ERROR_INVALID_HANDLE, ERROR_INVALID_PARAMETER,
9+
ERROR_NOACCESS, ERROR_NOT_FOUND, ERROR_PARTIAL_COPY, ERROR_PRIVILEGE_NOT_HELD, HANDLE, HRESULT,
10+
NTSTATUS, STATUS_ACCESS_DENIED, STATUS_INFO_LENGTH_MISMATCH, STATUS_INSUFFICIENT_RESOURCES,
11+
STATUS_INVALID_HANDLE, STATUS_INVALID_INFO_CLASS, STATUS_INVALID_PARAMETER,
12+
STATUS_NOT_IMPLEMENTED, STATUS_NO_MEMORY, STATUS_PRIVILEGE_NOT_HELD,
1013
};
1114

1215
use windows::Win32::System::Diagnostics::ToolHelp::{
@@ -79,10 +82,32 @@ impl Drop for Handle {
7982
}
8083
}
8184

82-
pub fn conv_err(_err: windows::core::Error) -> Error {
83-
// TODO: proper error kind
84-
// TODO: proper origin
85-
Error(ErrorOrigin::OsLayer, ErrorKind::Unknown)
85+
pub fn conv_err(err: windows::core::Error) -> Error {
86+
let kind = match err.code() {
87+
c if c == HRESULT::from_win32(ERROR_INVALID_PARAMETER.0)
88+
|| c == HRESULT::from_win32(ERROR_INVALID_FLAGS.0)
89+
|| c == HRESULT::from_win32(ERROR_BAD_LENGTH.0)
90+
|| c == HRESULT::from_win32(ERROR_INSUFFICIENT_BUFFER.0) =>
91+
{
92+
ErrorKind::ArgValidation
93+
}
94+
c if c == HRESULT::from_win32(ERROR_ACCESS_DENIED.0)
95+
|| c == HRESULT::from_win32(ERROR_PRIVILEGE_NOT_HELD.0) =>
96+
{
97+
ErrorKind::NotSupported
98+
}
99+
c if c == HRESULT::from_win32(ERROR_INVALID_HANDLE.0) => ErrorKind::ProcessNotFound,
100+
c if c == HRESULT::from_win32(ERROR_NOT_FOUND.0) => ErrorKind::NotFound,
101+
c if c == HRESULT::from_win32(ERROR_NOACCESS.0)
102+
|| c == HRESULT::from_win32(ERROR_INVALID_ADDRESS.0)
103+
|| c == HRESULT::from_win32(ERROR_PARTIAL_COPY.0) =>
104+
{
105+
ErrorKind::UnableToReadMemory
106+
}
107+
_ => ErrorKind::Unknown,
108+
};
109+
110+
Error(ErrorOrigin::OsLayer, kind)
86111
}
87112

88113
pub(crate) fn conv_ntstatus(status: NTSTATUS) -> Error {

src/windows/process.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,11 @@ pub struct WindowsProcess {
3333
info: ProcessInfo,
3434
cached_modules: Vec<HMODULE>,
3535
}
36-
unsafe impl Send for WindowsProcess {}
37-
unsafe impl Sync for WindowsProcess {}
36+
37+
const _: () = {
38+
fn assert_send_sync<T: Send + Sync>() {}
39+
assert_send_sync::<WindowsProcess>();
40+
};
3841

3942
impl WindowsProcess {
4043
pub fn try_new(info: ProcessInfo) -> Result<Self> {

0 commit comments

Comments
 (0)