Skip to content

Instantly share code, notes, and snippets.

@Cauterite
Created August 17, 2016 20:33
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Cauterite/ab6cfefd2dee5dccd7052c889f64ee3e to your computer and use it in GitHub Desktop.
Save Cauterite/ab6cfefd2dee5dccd7052c889f64ee3e to your computer and use it in GitHub Desktop.
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