windows-dll

Macro for dynamically loading windows dll functions

Usage

```rust use { windowsdll::dll, winapi::shared::{ minwindef::ULONG, ntdef::{NTSTATUS, NTSUCCESS, WCHAR}, }, };

[allow(nonsnakecase)]

[repr(C)]

struct OSVERSIONINFOW { dwOSVersionInfoSize: ULONG, dwMajorVersion: ULONG, dwMinorVersion: ULONG, dwBuildNumber: ULONG, dwPlatformId: ULONG, szCSDVersion: [WCHAR; 128], }

[dll("ntdll.dll")]

extern "system" { #[allow(nonsnakecase)] fn RtlGetVersion(lpVersionInformation: *mut OSVERSIONINFOW) -> NTSTATUS; }

fn osversioninfo() -> OSVERSIONINFOW { unsafe { let mut vi = OSVERSIONINFOW { dwOSVersionInfoSize: 0, dwMajorVersion: 0, dwMinorVersion: 0, dwBuildNumber: 0, dwPlatformId: 0, szCSDVersion: [0; 128], };

    let status = RtlGetVersion(&mut vi as _);

    if NT_SUCCESS(status) {
        vi
    } else {
        panic!()
    }
}

} ```

Return a result to determine whether the function can be retrieved

```rust

[dll("ntdll.dll")]

extern "system" { #[allow(nonsnakecase)] #[fallible] fn RtlGetVersion(lpVersionInformation: *mut OSVERSIONINFOW) -> NTSTATUS; }

fn osversioninfo() -> Result { unsafe { let mut vi = OSVERSIONINFOW { dwOSVersionInfoSize: 0, dwMajorVersion: 0, dwMinorVersion: 0, dwBuildNumber: 0, dwPlatformId: 0, szCSDVersion: [0; 128], };

    let status = RtlGetVersion(&mut vi as _)?;

    if NT_SUCCESS(status) {
        Ok(vi)
    } else {
        panic!()
    }
}

} ```

Give the rust wrapper a different name to the dll export

```rust

[dll("ntdll.dll")]

extern "system" { #[linkname = "RtlGetVersion"] fn rtlgetversion(lpversion_information: *mut OSVERSIONINFOW) -> NTSTATUS; } ```

Use a dll export without a name

```rust

[dll("uxtheme.dll")]

extern "system" { #[linkordinal = 133] fn allowdarkmodefor_window(hwnd: HWND, allow: BOOL) -> BOOL; } ```