diff --git a/src/macros.rs b/src/macros.rs index d054e8f..10d0249 100644 --- a/src/macros.rs +++ b/src/macros.rs @@ -6,18 +6,18 @@ #[macro_export] macro_rules! EXTERN { (extern $c:tt {$( - fn $n:ident ($( $p:tt $(: $t:ty)*),* $(,)*) $(-> $r:ty)*; + fn $n:ident ($( $p:tt $(: $t:ty)?),* $(,)?) $(-> $r:ty)?; )+}) => { #[cfg_attr(all(target_env = "msvc", feature = "user"), link(name = "ntdll"))] #[cfg_attr(all(target_env = "msvc", feature = "kernel"), link(name = "ntoskrnl"))] extern $c {$( pub fn $n( - $($p $(: $t)*),* - ) $(-> $r)*; + $($p $(: $t)?),* + ) $(-> $r)?; )+} $( #[cfg(feature = "func-types")] - pub type $n = unsafe extern $c fn($($p $(: $t)*),*) $(-> $r)*; + pub type $n = unsafe extern $c fn($($p $(: $t)?),*) $(-> $r)?; )+ }; (extern $c:tt {$( @@ -31,7 +31,7 @@ macro_rules! EXTERN { } #[macro_export] macro_rules! FIELD_OFFSET { - ($_type:ident, $field:ident$(.$cfields:ident)*) => { + ($_type:ty, $field:ident$(.$cfields:ident)*) => { unsafe { &(*$crate::_core::ptr::null::<$_type>()).$field$(.$cfields)* as *const _ as usize } @@ -43,15 +43,15 @@ macro_rules! BITFIELD { ]) => { impl $base {$( #[inline] - pub fn $thing(&self) -> $fieldtype { - let size = $crate::_core::mem::size_of::<$fieldtype>() * 8; - self.$field << (size - $r.end) >> (size - $r.end + $r.start) + pub const fn $thing(&self) -> $fieldtype { + const SIZE: usize = $crate::_core::mem::size_of::<$fieldtype>() * 8; + self.$field << (SIZE - $r.end) >> (SIZE - $r.end + $r.start) } #[inline] pub fn $set_thing(&mut self, val: $fieldtype) { - let mask = ((1 << ($r.end - $r.start)) - 1) << $r.start; - self.$field &= !mask; - self.$field |= (val << $r.start) & mask; + const MASK: $fieldtype = ((1 << ($r.end - $r.start)) - 1) << $r.start; + self.$field &= !MASK; + self.$field |= (val << $r.start) & MASK; } )+} }; @@ -61,23 +61,18 @@ macro_rules! BITFIELD { impl $base {$( #[inline] pub unsafe fn $thing(&self) -> $fieldtype { - let size = $crate::_core::mem::size_of::<$fieldtype>() * 8; - self.$field << (size - $r.end) >> (size - $r.end + $r.start) + const SIZE: usize = $crate::_core::mem::size_of::<$fieldtype>() * 8; + self.$field << (SIZE - $r.end) >> (SIZE - $r.end + $r.start) } #[inline] pub unsafe fn $set_thing(&mut self, val: $fieldtype) { - let mask = ((1 << ($r.end - $r.start)) - 1) << $r.start; - self.$field &= !mask; - self.$field |= (val << $r.start) & mask; + const MASK: $fieldtype = ((1 << ($r.end - $r.start)) - 1) << $r.start; + self.$field &= !MASK; + self.$field |= (val << $r.start) & MASK; } )+} }; } -macro_rules! CTL_CODE { - ($DeviceType:expr, $Function:expr, $Method:expr, $Access:expr) => { - ($DeviceType << 16) | ($Access << 14) | ($Function << 2) | $Method - }; -} macro_rules! UNION { ($(#[$attrs:meta])* union $name:ident { $($variant:ident: $ftype:ty,)+ diff --git a/src/ntapi_base.rs b/src/ntapi_base.rs index 575101a..bf8b8b2 100644 --- a/src/ntapi_base.rs +++ b/src/ntapi_base.rs @@ -11,15 +11,15 @@ pub type PRTL_ATOM = *mut RTL_ATOM; pub const NT_FACILITY_MASK: ULONG = 0xfff; pub const NT_FACILITY_SHIFT: ULONG = 16; #[inline] -pub fn NT_FACILITY(Status: NTSTATUS) -> ULONG { +pub const fn NT_FACILITY(Status: NTSTATUS) -> ULONG { (Status as u32) >> NT_FACILITY_SHIFT & NT_FACILITY_MASK } #[inline] -pub fn NT_NTWIN32(Status: NTSTATUS) -> bool { +pub const fn NT_NTWIN32(Status: NTSTATUS) -> bool { NT_FACILITY(Status) == FACILITY_NTWIN32 as u32 } #[inline] -pub fn WIN32_FROM_NTSTATUS(Status: NTSTATUS) -> ULONG { +pub const fn WIN32_FROM_NTSTATUS(Status: NTSTATUS) -> ULONG { (Status as u32) & 0xffff } STRUCT!{struct CLIENT_ID { diff --git a/src/ntgdi.rs b/src/ntgdi.rs index 3d01a10..fe6c494 100644 --- a/src/ntgdi.rs +++ b/src/ntgdi.rs @@ -21,23 +21,23 @@ pub const GDI_HANDLE_UNIQUE_SHIFT: ULONG = 24; pub const GDI_HANDLE_UNIQUE_BITS: ULONG = 8; pub const GDI_HANDLE_UNIQUE_MASK: ULONG = 0xff; #[inline] -pub fn GDI_HANDLE_INDEX(Handle: ULONG) -> ULONG { +pub const fn GDI_HANDLE_INDEX(Handle: ULONG) -> ULONG { Handle & GDI_HANDLE_INDEX_MASK } #[inline] -pub fn GDI_HANDLE_TYPE(Handle: ULONG) -> ULONG { +pub const fn GDI_HANDLE_TYPE(Handle: ULONG) -> ULONG { Handle >> GDI_HANDLE_TYPE_SHIFT & GDI_HANDLE_TYPE_MASK } #[inline] -pub fn GDI_HANDLE_ALTTYPE(Handle: ULONG) -> ULONG { +pub const fn GDI_HANDLE_ALTTYPE(Handle: ULONG) -> ULONG { Handle >> GDI_HANDLE_ALTTYPE_SHIFT & GDI_HANDLE_ALTTYPE_MASK } #[inline] -pub fn GDI_HANDLE_STOCK(Handle: ULONG) -> ULONG { +pub const fn GDI_HANDLE_STOCK(Handle: ULONG) -> ULONG { Handle >> GDI_HANDLE_STOCK_SHIFT & GDI_HANDLE_STOCK_MASK } #[inline] -pub fn GDI_MAKE_HANDLE(Index: ULONG, Unique: ULONG) -> ULONG { +pub const fn GDI_MAKE_HANDLE(Index: ULONG, Unique: ULONG) -> ULONG { Unique << GDI_HANDLE_INDEX_BITS | Index } pub const GDI_DEF_TYPE: ULONG = 0; @@ -72,12 +72,12 @@ pub const GDI_DRVOBJ_TYPE: ULONG = 28; pub const GDI_DCIOBJ_TYPE: ULONG = 29; pub const GDI_SPOOL_TYPE: ULONG = 30; #[inline] -pub fn GDI_CLIENT_TYPE_FROM_HANDLE(Handle: ULONG) -> ULONG { +pub const fn GDI_CLIENT_TYPE_FROM_HANDLE(Handle: ULONG) -> ULONG { Handle & (GDI_HANDLE_ALTTYPE_MASK << GDI_HANDLE_ALTTYPE_SHIFT | GDI_HANDLE_TYPE_MASK << GDI_HANDLE_TYPE_SHIFT) } #[inline] -pub fn GDI_CLIENT_TYPE_FROM_UNIQUE(Unique: ULONG) -> ULONG { +pub const fn GDI_CLIENT_TYPE_FROM_UNIQUE(Unique: ULONG) -> ULONG { GDI_CLIENT_TYPE_FROM_HANDLE(Unique << 16) } pub const GDI_ALTTYPE_1: ULONG = 1 << GDI_HANDLE_ALTTYPE_SHIFT; diff --git a/src/ntioapi.rs b/src/ntioapi.rs index 265c6f1..269732a 100644 --- a/src/ntioapi.rs +++ b/src/ntioapi.rs @@ -4,6 +4,7 @@ // http://opensource.org/licenses/MIT>, at your option. This file may not be // copied, modified, or distributed except according to those terms. use crate::string::UTF16Const; +use crate::winapi_local::um::winioctl::CTL_CODE; use winapi::shared::basetsd::ULONG_PTR; use winapi::shared::guiddef::GUID; use winapi::shared::minwindef::DWORD; @@ -1346,47 +1347,47 @@ pub const DEVICE_NAMED_PIPE: UTF16Const = UTF16Const(&[ 0x0064, 0x0050, 0x0069, 0x0070, 0x0065, 0x005C, 0u16, ]); pub const FSCTL_PIPE_ASSIGN_EVENT: u32 = - CTL_CODE!(FILE_DEVICE_NAMED_PIPE, 0, METHOD_BUFFERED, FILE_ANY_ACCESS); -pub const FSCTL_PIPE_DISCONNECT: u32 = - CTL_CODE!(FILE_DEVICE_NAMED_PIPE, 1, METHOD_BUFFERED, FILE_ANY_ACCESS); -pub const FSCTL_PIPE_LISTEN: u32 = - CTL_CODE!(FILE_DEVICE_NAMED_PIPE, 2, METHOD_BUFFERED, FILE_ANY_ACCESS); -pub const FSCTL_PIPE_PEEK: u32 = - CTL_CODE!(FILE_DEVICE_NAMED_PIPE, 3, METHOD_BUFFERED, FILE_READ_DATA); -pub const FSCTL_PIPE_QUERY_EVENT: u32 = - CTL_CODE!(FILE_DEVICE_NAMED_PIPE, 4, METHOD_BUFFERED, FILE_ANY_ACCESS); -pub const FSCTL_PIPE_TRANSCEIVE: u32 = - CTL_CODE!(FILE_DEVICE_NAMED_PIPE, 5, METHOD_NEITHER, FILE_READ_DATA | FILE_WRITE_DATA); -pub const FSCTL_PIPE_WAIT: u32 = - CTL_CODE!(FILE_DEVICE_NAMED_PIPE, 6, METHOD_BUFFERED, FILE_ANY_ACCESS); -pub const FSCTL_PIPE_IMPERSONATE: u32 = - CTL_CODE!(FILE_DEVICE_NAMED_PIPE, 7, METHOD_BUFFERED, FILE_ANY_ACCESS); -pub const FSCTL_PIPE_SET_CLIENT_PROCESS: u32 = - CTL_CODE!(FILE_DEVICE_NAMED_PIPE, 8, METHOD_BUFFERED, FILE_ANY_ACCESS); -pub const FSCTL_PIPE_QUERY_CLIENT_PROCESS: u32 = - CTL_CODE!(FILE_DEVICE_NAMED_PIPE, 9, METHOD_BUFFERED, FILE_ANY_ACCESS); -pub const FSCTL_PIPE_GET_PIPE_ATTRIBUTE: u32 = - CTL_CODE!(FILE_DEVICE_NAMED_PIPE, 10, METHOD_BUFFERED, FILE_ANY_ACCESS); -pub const FSCTL_PIPE_SET_PIPE_ATTRIBUTE: u32 = - CTL_CODE!(FILE_DEVICE_NAMED_PIPE, 11, METHOD_BUFFERED, FILE_ANY_ACCESS); -pub const FSCTL_PIPE_GET_CONNECTION_ATTRIBUTE: u32 = - CTL_CODE!(FILE_DEVICE_NAMED_PIPE, 12, METHOD_BUFFERED, FILE_ANY_ACCESS); -pub const FSCTL_PIPE_SET_CONNECTION_ATTRIBUTE: u32 = - CTL_CODE!(FILE_DEVICE_NAMED_PIPE, 13, METHOD_BUFFERED, FILE_ANY_ACCESS); -pub const FSCTL_PIPE_GET_HANDLE_ATTRIBUTE: u32 = - CTL_CODE!(FILE_DEVICE_NAMED_PIPE, 14, METHOD_BUFFERED, FILE_ANY_ACCESS); -pub const FSCTL_PIPE_SET_HANDLE_ATTRIBUTE: u32 = - CTL_CODE!(FILE_DEVICE_NAMED_PIPE, 15, METHOD_BUFFERED, FILE_ANY_ACCESS); -pub const FSCTL_PIPE_FLUSH: u32 = - CTL_CODE!(FILE_DEVICE_NAMED_PIPE, 16, METHOD_BUFFERED, FILE_WRITE_DATA); -pub const FSCTL_PIPE_INTERNAL_READ: u32 = - CTL_CODE!(FILE_DEVICE_NAMED_PIPE, 2045, METHOD_BUFFERED, FILE_READ_DATA); -pub const FSCTL_PIPE_INTERNAL_WRITE: u32 = - CTL_CODE!(FILE_DEVICE_NAMED_PIPE, 2046, METHOD_BUFFERED, FILE_WRITE_DATA); -pub const FSCTL_PIPE_INTERNAL_TRANSCEIVE: u32 = - CTL_CODE!(FILE_DEVICE_NAMED_PIPE, 2047, METHOD_NEITHER, FILE_READ_DATA | FILE_WRITE_DATA); -pub const FSCTL_PIPE_INTERNAL_READ_OVFLOW: u32 = - CTL_CODE!(FILE_DEVICE_NAMED_PIPE, 2048, METHOD_BUFFERED, FILE_READ_DATA); + CTL_CODE(FILE_DEVICE_NAMED_PIPE, 0, METHOD_BUFFERED, FILE_ANY_ACCESS); +pub const FSTL_PIPE_DISCONNECT: u32 = + CTL_CODE(FILE_DEVICE_NAMED_PIPE, 1, METHOD_BUFFERED, FILE_ANY_ACCESS); +pub const FSTL_PIPE_LISTEN: u32 = + CTL_CODE(FILE_DEVICE_NAMED_PIPE, 2, METHOD_BUFFERED, FILE_ANY_ACCESS); +pub const FSTL_PIPE_PEEK: u32 = + CTL_CODE(FILE_DEVICE_NAMED_PIPE, 3, METHOD_BUFFERED, FILE_READ_DATA); +pub const FSTL_PIPE_QUERY_EVENT: u32 = + CTL_CODE(FILE_DEVICE_NAMED_PIPE, 4, METHOD_BUFFERED, FILE_ANY_ACCESS); +pub const FSTL_PIPE_TRANSCEIVE: u32 = + CTL_CODE(FILE_DEVICE_NAMED_PIPE, 5, METHOD_NEITHER, FILE_READ_DATA | FILE_WRITE_DATA); +pub const FSTL_PIPE_WAIT: u32 = + CTL_CODE(FILE_DEVICE_NAMED_PIPE, 6, METHOD_BUFFERED, FILE_ANY_ACCESS); +pub const FSTL_PIPE_IMPERSONATE: u32 = + CTL_CODE(FILE_DEVICE_NAMED_PIPE, 7, METHOD_BUFFERED, FILE_ANY_ACCESS); +pub const FSTL_PIPE_SET_CLIENT_PROCESS: u32 = + CTL_CODE(FILE_DEVICE_NAMED_PIPE, 8, METHOD_BUFFERED, FILE_ANY_ACCESS); +pub const FSTL_PIPE_QUERY_CLIENT_PROCESS: u32 = + CTL_CODE(FILE_DEVICE_NAMED_PIPE, 9, METHOD_BUFFERED, FILE_ANY_ACCESS); +pub const FSTL_PIPE_GET_PIPE_ATTRIBUTE: u32 = + CTL_CODE(FILE_DEVICE_NAMED_PIPE, 10, METHOD_BUFFERED, FILE_ANY_ACCESS); +pub const FSTL_PIPE_SET_PIPE_ATTRIBUTE: u32 = + CTL_CODE(FILE_DEVICE_NAMED_PIPE, 11, METHOD_BUFFERED, FILE_ANY_ACCESS); +pub const FSTL_PIPE_GET_CONNECTION_ATTRIBUTE: u32 = + CTL_CODE(FILE_DEVICE_NAMED_PIPE, 12, METHOD_BUFFERED, FILE_ANY_ACCESS); +pub const FSTL_PIPE_SET_CONNECTION_ATTRIBUTE: u32 = + CTL_CODE(FILE_DEVICE_NAMED_PIPE, 13, METHOD_BUFFERED, FILE_ANY_ACCESS); +pub const FSTL_PIPE_GET_HANDLE_ATTRIBUTE: u32 = + CTL_CODE(FILE_DEVICE_NAMED_PIPE, 14, METHOD_BUFFERED, FILE_ANY_ACCESS); +pub const FSTL_PIPE_SET_HANDLE_ATTRIBUTE: u32 = + CTL_CODE(FILE_DEVICE_NAMED_PIPE, 15, METHOD_BUFFERED, FILE_ANY_ACCESS); +pub const FSTL_PIPE_FLUSH: u32 = + CTL_CODE(FILE_DEVICE_NAMED_PIPE, 16, METHOD_BUFFERED, FILE_WRITE_DATA); +pub const FSTL_PIPE_INTERNAL_READ: u32 = + CTL_CODE(FILE_DEVICE_NAMED_PIPE, 2045, METHOD_BUFFERED, FILE_READ_DATA); +pub const FSTL_PIPE_INTERNAL_WRITE: u32 = + CTL_CODE(FILE_DEVICE_NAMED_PIPE, 2046, METHOD_BUFFERED, FILE_WRITE_DATA); +pub const FSTL_PIPE_INTERNAL_TRANSCEIVE: u32 = + CTL_CODE(FILE_DEVICE_NAMED_PIPE, 2047, METHOD_NEITHER, FILE_READ_DATA | FILE_WRITE_DATA); +pub const FSTL_PIPE_INTERNAL_READ_OVFLOW: u32 = + CTL_CODE(FILE_DEVICE_NAMED_PIPE, 2048, METHOD_BUFFERED, FILE_READ_DATA); pub const FILE_PIPE_READ_DATA: u32 = 0x00000000; pub const FILE_PIPE_WRITE_SPACE: u32 = 0x00000001; STRUCT!{struct FILE_PIPE_ASSIGN_EVENT_BUFFER { @@ -1433,7 +1434,7 @@ pub type PFILE_PIPE_CLIENT_PROCESS_BUFFER_EX = *mut FILE_PIPE_CLIENT_PROCESS_BUF pub const MAILSLOT_CLASS_FIRSTCLASS: u32 = 1; pub const MAILSLOT_CLASS_SECONDCLASS: u32 = 2; pub const FSCTL_MAILSLOT_PEEK: u32 = - CTL_CODE!(FILE_DEVICE_MAILSLOT, 0, METHOD_NEITHER, FILE_READ_DATA); + CTL_CODE(FILE_DEVICE_MAILSLOT, 0, METHOD_NEITHER, FILE_READ_DATA); STRUCT!{struct FILE_MAILSLOT_PEEK_BUFFER { ReadDataAvailable: ULONG, NumberOfMessages: ULONG, diff --git a/src/ntldr.rs b/src/ntldr.rs index 911fdd1..af0e3d4 100644 --- a/src/ntldr.rs +++ b/src/ntldr.rs @@ -197,16 +197,16 @@ BITFIELD!{unsafe LDR_DATA_TABLE_ENTRY_u2 Flags: ULONG [ ]} pub type PLDR_DATA_TABLE_ENTRY = *mut LDR_DATA_TABLE_ENTRY; #[inline] -pub fn LDR_IS_DATAFILE(DllHandle: ULONG_PTR) -> bool { +pub const fn LDR_IS_DATAFILE(DllHandle: ULONG_PTR) -> bool { DllHandle & 1 != 0 } #[inline] -pub fn LDR_IS_IMAGEMAPPING(DllHandle: ULONG_PTR) -> bool { +pub const fn LDR_IS_IMAGEMAPPING(DllHandle: ULONG_PTR) -> bool { DllHandle & 2 != 0 } #[inline] -pub fn LDR_IS_RESOURCE(DllHandle: ULONG_PTR) -> bool { - LDR_IS_IMAGEMAPPING(DllHandle) || LDR_IS_DATAFILE(DllHandle) +pub const fn LDR_IS_RESOURCE(DllHandle: ULONG_PTR) -> bool { + (LDR_IS_IMAGEMAPPING(DllHandle) | LDR_IS_DATAFILE(DllHandle)) as u8 != 0 //fixme } EXTERN!{extern "system" { fn LdrLoadDll( diff --git a/src/ntpsapi.rs b/src/ntpsapi.rs index 3193cee..05bd2b0 100644 --- a/src/ntpsapi.rs +++ b/src/ntpsapi.rs @@ -563,7 +563,7 @@ pub const PS_PROTECTED_SIGNER_MASK: UCHAR = 0xFF; pub const PS_PROTECTED_AUDIT_MASK: UCHAR = 0x08; pub const PS_PROTECTED_TYPE_MASK: UCHAR = 0x07; #[inline] -pub fn PsProtectedValue( +pub const fn PsProtectedValue( aSigner: PS_PROTECTED_SIGNER, aAudit: u8, aType: PS_PROTECTED_TYPE, @@ -1084,14 +1084,14 @@ ENUM!{enum PS_ATTRIBUTE_NUM { PsAttributeMax = 27, }} #[inline] -pub fn PsAttributeValue( +pub const fn PsAttributeValue( Number: PS_ATTRIBUTE_NUM, Thread: bool, Input: bool, Additive: bool, -) -> ULONG_PTR { - (Number & PS_ATTRIBUTE_NUMBER_MASK | if Thread { PS_ATTRIBUTE_THREAD } else { 0 } - | if Input { PS_ATTRIBUTE_INPUT } else { 0 } | if Additive { PS_ATTRIBUTE_ADDITIVE } else { 0 } +) -> ULONG_PTR { //fixme + (Number & PS_ATTRIBUTE_NUMBER_MASK | [0, PS_ATTRIBUTE_THREAD][Thread as usize] + | [0, PS_ATTRIBUTE_INPUT][Input as usize] | [0, PS_ATTRIBUTE_ADDITIVE][Additive as usize] ) as usize } pub const PS_ATTRIBUTE_PARENT_PROCESS: ULONG_PTR = 0x00060000; diff --git a/src/ntrtl.rs b/src/ntrtl.rs index 7a3d699..ea05860 100644 --- a/src/ntrtl.rs +++ b/src/ntrtl.rs @@ -249,15 +249,15 @@ pub fn RtlInitializeSplayLinks(Links: &mut RTL_SPLAY_LINKS) { Links.RightChild = null_mut(); } #[inline] -pub fn RtlParent(Links: &RTL_SPLAY_LINKS) -> PRTL_SPLAY_LINKS { +pub const fn RtlParent(Links: &RTL_SPLAY_LINKS) -> PRTL_SPLAY_LINKS { Links.Parent } #[inline] -pub fn RtlLeftChild(Links: &RTL_SPLAY_LINKS) -> PRTL_SPLAY_LINKS { +pub const fn RtlLeftChild(Links: &RTL_SPLAY_LINKS) -> PRTL_SPLAY_LINKS { Links.LeftChild } #[inline] -pub fn RtlRightChild(Links: &RTL_SPLAY_LINKS) -> PRTL_SPLAY_LINKS { +pub const fn RtlRightChild(Links: &RTL_SPLAY_LINKS) -> PRTL_SPLAY_LINKS { Links.RightChild } #[inline] @@ -417,7 +417,7 @@ STRUCT!{struct RTL_DYNAMIC_HASH_TABLE_ENTRY { }} pub type PRTL_DYNAMIC_HASH_TABLE_ENTRY = *mut RTL_DYNAMIC_HASH_TABLE_ENTRY; #[inline] -pub fn HASH_ENTRY_KEY(x: &RTL_DYNAMIC_HASH_TABLE_ENTRY) -> ULONG_PTR { +pub const fn HASH_ENTRY_KEY(x: &RTL_DYNAMIC_HASH_TABLE_ENTRY) -> ULONG_PTR { x.Signature } STRUCT!{struct RTL_DYNAMIC_HASH_TABLE_CONTEXT { @@ -459,23 +459,23 @@ pub fn RtlInitHashTableContextFromEnumerator( } // RtlReleaseHashTableContext #[inline] -pub fn RtlTotalBucketsHashTable(HashTable: &RTL_DYNAMIC_HASH_TABLE) -> ULONG { +pub const fn RtlTotalBucketsHashTable(HashTable: &RTL_DYNAMIC_HASH_TABLE) -> ULONG { HashTable.TableSize } #[inline] -pub fn RtlNonEmptyBucketsHashTable(HashTable: &RTL_DYNAMIC_HASH_TABLE) -> ULONG { +pub const fn RtlNonEmptyBucketsHashTable(HashTable: &RTL_DYNAMIC_HASH_TABLE) -> ULONG { HashTable.NonEmptyBuckets } #[inline] -pub fn RtlEmptyBucketsHashTable(HashTable: &RTL_DYNAMIC_HASH_TABLE) -> ULONG { +pub const fn RtlEmptyBucketsHashTable(HashTable: &RTL_DYNAMIC_HASH_TABLE) -> ULONG { HashTable.TableSize - HashTable.NonEmptyBuckets } #[inline] -pub fn RtlTotalEntriesHashTable(HashTable: &RTL_DYNAMIC_HASH_TABLE) -> ULONG { +pub const fn RtlTotalEntriesHashTable(HashTable: &RTL_DYNAMIC_HASH_TABLE) -> ULONG { HashTable.NumEntries } #[inline] -pub fn RtlActiveEnumeratorsHashTable(HashTable: &RTL_DYNAMIC_HASH_TABLE) -> ULONG { +pub const fn RtlActiveEnumeratorsHashTable(HashTable: &RTL_DYNAMIC_HASH_TABLE) -> ULONG { HashTable.NumEnumerators } EXTERN!{extern "system" { @@ -2490,22 +2490,19 @@ EXTERN!{extern "system" { ) -> LOGICAL; }} #[inline] -pub fn RtlIsEqualLuid(L1: &LUID, L2: &LUID) -> bool { - L1.LowPart == L2.LowPart && L1.HighPart == L2.HighPart +pub const fn RtlIsEqualLuid(L1: &LUID, L2: &LUID) -> bool { + ((L1.LowPart == L2.LowPart) & (L1.HighPart == L2.HighPart)) as u8 != 0 //fixme } #[inline] -pub fn RtlIsZeroLuid(L1: &LUID) -> bool { +pub const fn RtlIsZeroLuid(L1: &LUID) -> bool { (L1.LowPart | L1.HighPart as u32) == 0 } #[inline] -pub unsafe fn RtlConvertLongToLuid(Long: LONG) -> LUID { - use core::mem::uninitialized; - let mut tempLi: LARGE_INTEGER = uninitialized(); - *tempLi.QuadPart_mut() = Long as i64; - LUID { LowPart: tempLi.s().LowPart, HighPart: tempLi.s().HighPart } +pub const fn RtlConvertLongToLuid(Long: LONG) -> LUID { + LUID { LowPart: Long as u32, HighPart: ((Long as i64) >> 32) as i32 } } #[inline] -pub fn RtlConvertUlongToLuid(Ulong: ULONG) -> LUID { +pub const fn RtlConvertUlongToLuid(Ulong: ULONG) -> LUID { LUID { LowPart: Ulong, HighPart: 0 } } EXTERN!{extern "system" { diff --git a/src/winapi_local/um.rs b/src/winapi_local/um.rs index 9bdf106..2708e58 100644 --- a/src/winapi_local/um.rs +++ b/src/winapi_local/um.rs @@ -3,4 +3,5 @@ // http://apache.org/licenses/LICENSE-2.0> or the MIT license , at your option. This file may not be // copied, modified, or distributed except according to those terms. +pub(crate) mod winioctl; pub mod winnt; diff --git a/src/winapi_local/um/winioctl.rs b/src/winapi_local/um/winioctl.rs new file mode 100644 index 0000000..da49026 --- /dev/null +++ b/src/winapi_local/um/winioctl.rs @@ -0,0 +1,4 @@ +#[inline] +pub(crate) const fn CTL_CODE(DeviceType: u32, Function: u32, Method: u32, Access: u32) -> u32 { + (DeviceType << 16) | (Access << 14) | (Function << 2) | Method +} diff --git a/src/winapi_local/um/winnt.rs b/src/winapi_local/um/winnt.rs index f95cc38..05e234d 100644 --- a/src/winapi_local/um/winnt.rs +++ b/src/winapi_local/um/winnt.rs @@ -4,7 +4,7 @@ // http://opensource.org/licenses/MIT>, at your option. This file may not be // copied, modified, or distributed except according to those terms. #[inline] -pub fn UInt32x32To64(a: u32, b: u32) -> u64 { +pub const fn UInt32x32To64(a: u32, b: u32) -> u64 { a as u64 * b as u64 } #[cfg(feature = "nightly")]