Created
August 17, 2016 20:33
-
-
Save Cauterite/ab6cfefd2dee5dccd7052c889f64ee3e to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
enum StrZ(alias S) = S~'\0'; | |
alias Cdeclº(Rº, Pº...) = extern(C) Rº function(Pº); | |
alias Stdcallº(Rº, Pº...) = extern(Windows) Rº function(Pº); | |
auto cinvoke(wstring LibName, string FuncName, Rº = void, Pº...)(Pº Params) { | |
alias Ptr = LibSymPtr!(LibName, FuncName); | |
assert(Ptr !is null); | |
return (cast(Cdeclº!(Rº, Pº)) Ptr)(Params); | |
}; | |
auto pinvoke(wstring LibName, string FuncName, Rº = void, Pº...)(Pº Params) { | |
alias Ptr = LibSymPtr!(LibName, FuncName); | |
assert(Ptr !is null); | |
return (cast(Stdcallº!(Rº, Pº)) Ptr)(Params); | |
}; | |
template LibSymPtr(wstring LibName, string SymName) { | |
alias LibSymPtr = S.SymPtr; | |
struct S { | |
static __gshared void* SymPtr; | |
shared static this() { | |
SymPtr = import_sym(StrZ!LibName.ptr, StrZ!SymName.ptr); | |
}; | |
}; | |
}; | |
version (Windows) void* import_sym(in wchar* LibName, in char* SymName) { | |
import W32_ = core.sys.windows.windows; | |
import std.exception : enforce_ = enforce; | |
import std.string : fromStringz_ = fromStringz; | |
auto Lib = W32_.GetModuleHandleW(LibName); | |
if (!Lib) { | |
Lib = W32_.LoadLibraryW(LibName); | |
}; | |
void* Ptr = W32_.GetProcAddress(Lib, SymName); | |
enforce_(Ptr !is null, `failed to import symbol `~SymName.fromStringz_); | |
return Ptr; | |
}; | |
unittest { | |
void* Info; | |
pinvoke!(`ntdll`, `LdrFindEntryForAddress`)( | |
0x400000, &Info | |
); | |
import std.stdio; | |
writeln(Info); | |
}; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment