@@ -4,9 +4,12 @@ use memflow::prelude::v1::*;
44use windows:: core:: PCSTR ;
55use windows:: Wdk :: System :: SystemInformation :: { NtQuerySystemInformation , SYSTEM_INFORMATION_CLASS } ;
66use 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
1215use 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
88113pub ( crate ) fn conv_ntstatus ( status : NTSTATUS ) -> Error {
0 commit comments