@jellybrick/ffi-cjs
Version:
Foreign Function Interface Helper.
371 lines (364 loc) • 9.6 kB
JavaScript
/*
Copyright (c) Anthony Beaumont
This source code is licensed under the MIT License
found in the LICENSE file in the root directory of this source tree.
*/
const koffi = require("koffi");
/*
⚠️ The following might be incorrect and / or incomplete.
Take it with a grain of salt as it is a "written and checked as I need it" kind of thing.
//Source: https://docs.microsoft.com/en-us/windows/win32/winprog/windows-data-types?redirectedfrom=MSDN
*/
const _WIN64 = process.arch === "x64";
const VOID = koffi.types.void;
const ENUM = koffi.types.uint32;
const DWORD = koffi.types.long;
const WORD = koffi.types.uint16;
const SHORT = koffi.types.int16;
const BYTE = koffi.types.uint8;
const WCHAR = koffi.types.char16;
const ACCESS_MASK = koffi.types.int32; //https://docs.microsoft.com/en-us/windows/win32/secauthz/access-mask-format
const ATOM = koffi.types.uint16;
const PVOID = _WIN64 ? koffi.pointer(koffi.types.uint64) : koffi.pointer(koffi.types.uint32);
//const HANDLE = koffi.opaque();
const LONG_PTR = _WIN64 ? koffi.pointer(koffi.types.int64) : koffi.pointer(koffi.types.long);
const ULONG_PTR = _WIN64 ? koffi.pointer(koffi.types.uint64) : koffi.pointer(koffi.types.ulong);
const BOOL = koffi.types.int;
const BOOLEAN = koffi.types.bool;
const CALLBACK = koffi.pointer(koffi.types.void);
const CCHAR = koffi.types.uint8;
const CHAR = koffi.types.uint8;
const COLORREF = DWORD;
const DWORDLONG = koffi.types.uint64;
const DWORD_PTR = ULONG_PTR;
const DWORD32 = koffi.types.uint32;
const DWORD64 = koffi.types.uint64;
const FLOAT = koffi.types.float;
//const HACCEL = HANDLE;
const HALF_PTR = _WIN64 ? koffi.types.int32 : SHORT;
//const HBITMAP = HANDLE;
//const HBRUSH = HANDLE;
//const HCOLORSPACE = HANDLE;
//const HCONV = HANDLE;
//const HCONVLIST = HANDLE;
//const HCURSOR = HANDLE;
//const HDC = HANDLE;
//const HDDEDATA = HANDLE;
//const HDESK = HANDLE;
//const HDROP = HANDLE;
//const HDWP = HANDLE;
//const HENHMETAFILE = HANDLE;
//const HFILE = HANDLE;
//const HFONT = HANDLE;
//const HGDIOBJ = HANDLE;
//const HGLOBAL = HANDLE;
//const HHOOK = HANDLE;
//const HICON = HANDLE;
//const HINSTANCE = HANDLE;
//const HKEY = HANDLE;
//const HKL = HANDLE;
//const HLOCAL = HANDLE;
//const HMENU = HANDLE;
//const HMETAFILE = HANDLE;
//const HMODULE = HINSTANCE;
//const HMONITOR = HANDLE;
//const HPALETTE = HANDLE;
//const HPEN = HANDLE;
const HRESULT = koffi.types.long;
const NTSTATUS = koffi.types.long;
//const HRGN = HANDLE;
//const HRSRC = HANDLE;
//const HSZ = HANDLE;
//const HWINEVENTHOOK = HANDLE;
//const HWINSTA = HANDLE;
//const HWND = HANDLE;
const INT = koffi.types.int;
const INT_PTR = _WIN64 ? koffi.types.int64 : koffi.types.int32;
const INT8 = koffi.types.int8;
const INT16 = koffi.types.int16;
const INT32 = koffi.types.int32;
const INT64 = koffi.types.int64;
const LANGID = WORD;
const LCID = DWORD;
const LCTYPE = DWORD;
const LGRPID = DWORD;
const LONG = koffi.types.long;
const LONGLONG = koffi.types.longlong;
const LONG32 = koffi.types.int32;
const LONG64 = koffi.types.int64;
const LPARAM = LONG_PTR;
const LPBOOL = BOOL;
const LPBYTE = koffi.pointer(BYTE);
const LPCOLORREF = DWORD;
const LPCSTR = koffi.types.string;
const LPCTSTR = koffi.types.string16;
const LPCWSTR = koffi.types.string16;
const LPVOID = koffi.pointer(koffi.types.void);
const LPCVOID = LPVOID;
const LPDWORD = koffi.pointer(koffi.types.uint16);
const LPHANDLE = _WIN64 ? koffi.pointer(koffi.types.int64) : koffi.pointer(koffi.types.int32);
const LPINT = koffi.pointer(koffi.types.int);
const LPLONG = koffi.pointer(koffi.types.int32);
//const LPMSG = koffi.pointer(koffi.types.void);
//const LPPOINT = koffi.pointer(koffi.types.void);
const LPSTR = koffi.pointer(koffi.types.char);
const LPWSTR = koffi.pointer(koffi.types.uint16);
const LPTSTR = koffi.pointer(koffi.types.uint16);
const LPWORD = koffi.pointer(koffi.types.uint16);
const LRESULT = LONG_PTR;
const PBOOL = koffi.pointer(koffi.types.int);
const PBOOLEAN = koffi.pointer(koffi.types.bool);
const PBYTE = koffi.pointer(BYTE);
const PCHAR = koffi.pointer(koffi.types.char);
const PCSTR = koffi.pointer(koffi.types.uint8);
const PCTSTR = _WIN64 ? koffi.pointer(koffi.types.int16) : koffi.pointer(koffi.types.int8);
const PCWSTR = koffi.pointer(koffi.types.uint16);
const PDWORD = koffi.pointer(koffi.types.uint32);
const PDWORDLONG = koffi.pointer(koffi.types.uint64);
const PDWORD_PTR = DWORD_PTR;
const PDWORD32 = koffi.pointer(koffi.types.uint32);
const PDWORD64 = koffi.pointer(koffi.types.uint64);
const PFLOAT = koffi.pointer(koffi.types.float);
//const PHALF_PTR = koffi.pointer(koffi.types.void);
const PHANDLE = _WIN64 ? koffi.pointer(koffi.pointer(koffi.types.uint64)) : koffi.pointer(koffi.pointer(koffi.types.uint32));
const PHKEY = _WIN64 ? koffi.pointer(koffi.pointer(koffi.types.uint64)) : koffi.pointer(koffi.pointer(koffi.types.uint32));
const PINT = koffi.pointer(koffi.types.int);
const PINT_PTR = koffi.pointer(koffi.pointer(koffi.types.int));
const PINT8 = koffi.pointer(koffi.types.int8);
const PINT16 = koffi.pointer(koffi.types.int16);
const PINT32 = koffi.pointer(koffi.types.int32);
const PINT64 = koffi.pointer(koffi.types.int64);
const PLCID = koffi.pointer(koffi.types.uint32);
const PLONG = koffi.pointer(koffi.types.long);
const PLONGLONG = koffi.pointer(koffi.types.int64);
//const PLONG_PTR = koffi.pointer(koffi.types.void);
const PLONG32 = koffi.pointer(koffi.types.int32);
const PLONG64 = koffi.pointer(koffi.types.int64);
const POINTER_32 = koffi.pointer(koffi.types.int32);
const POINTER_64 = _WIN64 ? koffi.pointer(koffi.types.int64) : koffi.pointer(koffi.types.int32);
//const POINTER_SIGNED = koffi.pointer(koffi.types.void);
//const POINTER_UNSIGNED = koffi.pointer(koffi.types.void);
const PSHORT = koffi.pointer(koffi.types.int16);
const PSIZE = ULONG_PTR;
//const PSSIZE = koffi.types["void *"];
const PSTR = koffi.pointer(koffi.types.char);
const PTBYTE = koffi.pointer(koffi.types.int16);
const PTCHAR = koffi.pointer(koffi.types.uint16);
const PTSTR = koffi.pointer(koffi.types.uint16);
//const PUCHAR = koffi.pointer(koffi.types.void)
//const PUHALF_PTR = koffi.pointer(koffi.types.void);
const PUINT = koffi.pointer(koffi.types.uint);
const PUINT_PTR = koffi.pointer(koffi.pointer(koffi.types.uint));
const PUINT8 = koffi.pointer(koffi.types.uint8);
const PUINT16 = koffi.pointer(koffi.types.uint16);
const PUINT32 = koffi.pointer(koffi.types.uint32);
const PUINT64 = koffi.pointer(koffi.types.uint64);
const PULONG = koffi.pointer(koffi.types.uint);
const PULONGLONG = koffi.pointer(koffi.types.uint64);
const PULONG_PTR = koffi.pointer(koffi.pointer(koffi.types.uint64));
const PULONG32 = koffi.pointer(koffi.types.uint);
const PULONG64 = koffi.pointer(koffi.types.uint64);
const PUSHORT = koffi.pointer(koffi.types.uint16);
const PWCHAR = koffi.pointer(koffi.types.uint16);
const PWORD = koffi.pointer(koffi.types.uint16);
const PWSTR = koffi.pointer(koffi.types.uint16);
const QWORD = koffi.pointer(koffi.types.uint64);
//const SC_HANDLE = HANDLE;
//const SC_LOCK = LPVOID;
//const SERVICE_STATUS_HANDLE = HANDLE;
const SIZE = ULONG_PTR;
const SSIZE = LONG_PTR;
const TBYTE = koffi.types.int16;
const TCHAR = koffi.types.uint16;
const UCHAR = koffi.types.uchar;
const UHALF_PTR = _WIN64 ? koffi.types.uint32 : koffi.types.uint16;
const UINT = koffi.types.uint;
const UINT_PTR = _WIN64 ? koffi.types.uint64 : koffi.types.uint32;
const UINT8 = koffi.types.uint8;
const UINT16 = koffi.types.uint16;
const UINT32 = koffi.types.uint32;
const UINT64 = koffi.types.uint64;
const ULONG = koffi.types.ulong;
const ULONGLONG = koffi.types.ulonglong;
const ULONG32 = koffi.types.uint32;
const ULONG64 = koffi.types.uint64;
const USHORT = koffi.types.ushort;
const USN = LONGLONG;
const WPARAM = UINT_PTR;
module.exports = {
VOID,
ENUM,
DWORD,
WORD,
SHORT,
BYTE,
WCHAR,
ACCESS_MASK,
ATOM,
PVOID,
//HANDLE,
LONG_PTR,
ULONG_PTR,
BOOL,
BOOLEAN,
CALLBACK,
CCHAR,
CHAR,
COLORREF,
DWORDLONG,
DWORD_PTR,
DWORD32,
DWORD64,
FLOAT,
//HACCEL,
HALF_PTR,
//HBITMAP,
//HBRUSH,
//HCOLORSPACE,
//HCONV,
//HCONVLIST,
//HCURSOR,
//HDC,
//HDDEDATA,
//HDESK,
//HDROP,
//HDWP,
//HENHMETAFILE,
//HFILE,
//HFONT,
//HGDIOBJ,
//HGLOBAL,
//HHOOK,
//HICON,
//HINSTANCE,
//HKEY,
//HKL,
//HLOCAL,
//HMENU,
//HMETAFILE,
//HMODULE,
//HMONITOR,
//HPALETTE,
//HPEN,
HRESULT,
NTSTATUS,
//HRGN,
//HRSRC,
//HSZ,
//HWINEVENTHOOK,
//HWINSTA,
//HWND,
INT,
INT_PTR,
INT8,
INT16,
INT32,
INT64,
LANGID,
LCID,
LCTYPE,
LGRPID,
LONG,
LONGLONG,
LONG32,
LONG64,
LPARAM,
LPBOOL,
LPBYTE,
LPCOLORREF,
LPCSTR,
LPCTSTR,
LPCWSTR,
LPVOID,
LPCVOID,
LPDWORD,
LPHANDLE,
LPINT,
LPLONG,
//LPMSG,
//LPPOINT,
LPSTR,
LPWSTR,
LPTSTR,
LPWORD,
LRESULT,
PBOOL,
PBOOLEAN,
PBYTE,
PCHAR,
PCSTR,
PCTSTR,
PCWSTR,
PDWORD,
PDWORDLONG,
PDWORD_PTR,
PDWORD32,
PDWORD64,
PFLOAT,
//PHALF_PTR,
PHANDLE,
PHKEY,
PINT,
PINT_PTR,
PINT8,
PINT16,
PINT32,
PINT64,
PLCID,
PLONG,
PLONGLONG,
//PLONG_PTR,
PLONG32,
PLONG64,
POINTER_32,
POINTER_64,
//POINTER_SIGNED,
//POINTER_UNSIGNED,
PSHORT,
PSIZE,
//PSSIZE,
PSTR,
PTBYTE,
PTCHAR,
PTSTR,
//PUCHAR,
//PUHALF_PTR,
PUINT,
PUINT_PTR,
PUINT8,
PUINT16,
PUINT32,
PUINT64,
PULONG,
PULONGLONG,
PULONG_PTR,
PULONG32,
PULONG64,
PUSHORT,
PWCHAR,
PWORD,
PWSTR,
QWORD,
//SC_HANDLE,
//SC_LOCK,
//SERVICE_STATUS_HA,NDLE
SIZE,
SSIZE,
TBYTE,
TCHAR,
UCHAR,
UHALF_PTR,
UINT,
UINT_PTR,
UINT8,
UINT16,
UINT32,
UINT64,
ULONG,
ULONGLONG,
ULONG32,
ULONG64,
USHORT,
USN,
WPARAM,
}