local ffi = require( "ffi" ) ffi.cdef[[ typedef char* PCIDLIST_ABSOLUTE; typedef char* LPCTSTR; typedef char* LPCSTR; typedef char* LPTSTR; typedef char* LPSTR; typedef void* LPVOID; typedef uint64_t HANDLE; typedef uint64_t HHOOK; typedef uint32_t HRESULT; typedef unsigned __int64 UINT_PTR, *PUINT_PTR; typedef __int64 LONG_PTR, *PLONG_PTR; typedef UINT_PTR WPARAM; typedef LONG_PTR LPARAM; typedef uint64_t LRESULT; typedef uint32_t UINT; typedef uint64_t HWND; typedef uint32_t DWORD; typedef DWORD * LPDWORD; typedef uint32_t LONG; typedef uint32_t HINSTANCE; typedef uint16_t WORD; typedef uint32_t COLORREF; typedef unsigned char BYTE; enum { // Use crKey as the transparency color. LWA_COLORKEY = 0x00000001, //Use bAlpha to determine the opacity of the layered window. LWA_ALPHA = 0x00000002, }; typedef struct tagRECT { LONG left; LONG top; LONG right; LONG bottom; } RECT; typedef RECT *PRECT; typedef RECT *NPRECT; typedef RECT *LPRECT; typedef struct tagBITMAP { LONG bmType; LONG bmWidth; LONG bmHeight; LONG bmWidthBytes; WORD bmPlanes; WORD bmBitsPixel; void * bmBits; } BITMAP; typedef BITMAP *PBITMAP; typedef struct tagBITMAPFILEHEADER { WORD bfType; DWORD bfSize; WORD bfReserved1; WORD bfReserved2; DWORD bfOffBits; } BITMAPFILEHEADER; typedef BITMAPFILEHEADER *PBITMAPFILEHEADER; typedef struct tagOFN { DWORD lStructSize; HWND hwndOwner; HINSTANCE hInstance; LPCTSTR lpstrFilter; LPTSTR lpstrCustomFilter; DWORD nMaxCustFilter; DWORD nFilterIndex; LPTSTR lpstrFile; DWORD nMaxFile; LPTSTR lpstrFileTitle; DWORD nMaxFileTitle; LPCTSTR lpstrInitialDir; LPCTSTR lpstrTitle; DWORD Flags; WORD nFileOffset; WORD nFileExtension; LPCTSTR lpstrDefExt; LPARAM lCustData; HANDLE lpfnHook; LPCTSTR lpTemplateName; void * pvReserved; DWORD dwReserved; DWORD FlagsEx; } OPENFILENAME; typedef OPENFILENAME *LPOPENFILENAME; typedef int32_t bool32; typedef intptr_t (__stdcall *WNDPROC)(HWND hwnd, unsigned int message, uintptr_t wparam, intptr_t lparam); enum { PROCESS_P_WAIT = 0, PROCESS_P_NOWAIT = 1, PROCESS_P_OVERLAY = 2, PROCESS_OLD_P_OVERLAY = 2, PROCESS_P_NOWAITO = 3, PROCESS_P_DETACH = 4, STATUS_PENDING = 0x00000103, STARTF_USESTDHANDLES = 0x00000100, CS_VREDRAW = 0x0001, CS_HREDRAW = 0x0002, WM_DESTROY = 0x0002, WM_SIZE = 0x0005, WM_CLOSE = 0x0010, WM_GETMINMAXINFO = 0x0024, WM_NCHITTEST = 0x0084, WM_QUIT = 0x0012, WM_ERASEBKGND = 0x0014, WM_SYSCOLORCHANGE = 0x0015, WM_SHOWWINDOW = 0x0018, WM_WININICHANGE = 0x001A, WM_MOUSEFIRST = 0x0200, WM_MOUSEMOVE = 0x0200, WM_LBUTTONDOWN = 0x0201, WM_LBUTTONUP = 0x0202, WM_LBUTTONDBLCLK = 0x0203, WM_RBUTTONDOWN = 0x0204, WM_RBUTTONUP = 0x0205, WM_RBUTTONDBLCLK = 0x0206, WM_MBUTTONDOWN = 0x0207, WM_MBUTTONUP = 0x0208, WM_MBUTTONDBLCLK = 0x0209, WM_MOUSEWHEEL = 0x020A, WM_NCMOUSEMOVE = 0x00A0, WM_NCLBUTTONDOWN = 0x00A1, WM_NCLBUTTONUP = 0x00A2, WM_NCLBUTTONDBLCLK = 0x00A3, WM_NCRBUTTONDOWN = 0x00A4, WM_NCRBUTTONUP = 0x00A5, WM_NCRBUTTONDBLCLK = 0x00A6, WM_NCMBUTTONDOWN = 0x00A7, WM_NCMBUTTONUP = 0x00A8, WM_NCMBUTTONDBLCLK = 0x00A9, WS_BORDER = 0x00800000, WS_CAPTION = 0x00C00000, WS_CHILD = 0x40000000, WS_CHILDWINDOW = 0x40000000, WS_CLIPCHILDREN = 0x02000000, WS_CLIPSIBLINGS = 0x04000000, WS_DISABLED = 0x08000000, WS_DLGFRAME = 0x00400000, WS_GROUP = 0x00020000, WS_HSCROLL = 0x00100000, WS_ICONIC = 0x20000000, WS_MAXIMIZE = 0x01000000, WS_MAXIMIZEBOX = 0x00010000, WS_MINIMIZE = 0x20000000, WS_MINIMIZEBOX = 0x00020000, WS_OVERLAPPED = 0x00000000, WS_SIZEBOX = 0x00040000, WS_SYSMENU = 0x00080000, WS_TABSTOP = 0x00010000, WS_THICKFRAME = 0x00040000, WS_TILED = 0x00000000, WS_VISIBLE = 0x10000000, WS_VSCROLL = 0x00200000, WS_EX_DLGMODALFRAME = 0x00000001, WS_EX_TOPMOST = 0x00000008, WS_EX_TRANSPARENT = 0x00000020, WS_EX_TOOLWINDOW = 0x00000080, WS_EX_WINDOWEDGE= 0x00000100, WS_EX_CLIENTEDGE= 0x00000200, WS_EX_APPWINDOW = 0x00040000, WS_EX_LAYERED = 0x00080000, WS_EX_STATICEDGE= 0x00200000, WS_POPUP = ((int)0x80000000), WS_OVERLAPPEDWINDOW = WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX, WS_POPUPWINDOW = WS_POPUP | WS_BORDER, WS_TILEDWINDOW = WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX, WS_SIMPLEWINDOW = WS_POPUP | WS_BORDER| WS_THICKFRAME, WS_NOBORDERS = WS_CAPTION | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_SYSMENU, WAIT_OBJECT_0 = 0x00000000, PM_NOREMOVE = 0x0000, PM_REMOVE = 0x0001, SW_SHOW = 5, SW_MAXIMIZE = 3, INFINITE = 0xFFFFFFFF, QS_ALLEVENTS = 0x04BF, WH_KEYBOARD = 2, WH_GETMESSAGE = 3, WH_CALLWNDPROC = 4, WH_SYSMSGFILTER = 6, WH_MOUSE = 7, WH_CALLWNDPROCRET = 12, /* * WM_NCHITTEST and MOUSEHOOKSTRUCT Mouse Position Codes */ HTERROR = (-2), HTTRANSPARENT = (-1), HTNOWHERE = 0, HTCLIENT = 1, HTCAPTION = 2, /* * Window field offsets for GetWindowLong() */ GWL_WNDPROC = (-4), GWL_HINSTANCE = (-6), GWL_HWNDPARENT = (-8), GWL_STYLE = (-16), GWL_EXSTYLE = (-20), GWL_USERDATA = (-21), GWL_ID = (-12), GWLP_WNDPROC = (-4), SWP_NOSIZE = 0x0001, SWP_NOZORDER = 0x0004, SWP_FRAMECHANGED = 0x0020, SEE_MASK_NOCLOSEPROCESS = 0x00000040, SEE_MASK_FLAG_NO_UI = 0x00000400 }; typedef struct _SHELLEXECUTEINFOA { DWORD cbSize; uint64_t fMask; HWND hwnd; LPCSTR lpVerb; LPCSTR lpFile; LPCSTR lpParameters; LPCSTR lpDirectory; int nShow; HINSTANCE hInstApp; void *lpIDList; LPCSTR lpClass; HANDLE hkeyClass; DWORD dwHotKey; union { HANDLE hIcon; HANDLE hMonitor; } DUMMYUNIONNAME; HANDLE hProcess; } SHELLEXECUTEINFOA, *LPSHELLEXECUTEINFOA; typedef struct _STARTUPINFOA { uint32_t cb; void * lpReserved; void * lpDesktop; void * lpTitle; uint32_t dwX; uint32_t dwY; uint32_t dwXSize; uint32_t dwYSize; uint32_t dwXCountChars; uint32_t dwYCountChars; uint32_t dwFillAttribute; uint32_t dwFlags; uint16_t wShowWindow; uint16_t cbReserved2; void * lpReserved2; void * hStdInput; void * hStdOutput; void * hStdError; } STARTUPINFOA, *LPSTARTUPINFOA; typedef struct _PROCESS_INFORMATION { uint64_t hProcess; uint64_t hThread; uint32_t dwProcessId; uint32_t dwThreadId; } PROCESS_INFORMATION, *LPPROCESS_INFORMATION; typedef struct POINT { int32_t x, y; } POINT; typedef struct WNDCLASSEXA { uint32_t cbSize, style; WNDPROC lpfnWndProc; int32_t cbClsExtra, cbWndExtra; HANDLE hInstance; HANDLE hIcon; HANDLE hCursor; HANDLE hbrBackground; const char* lpszMenuName; const char* lpszClassName; HANDLE hIconSm; } WNDCLASSEXA; typedef struct MSG { HWND hwnd; uint32_t message; uintptr_t wParam, lParam; uint32_t time; POINT pt; } MSG; typedef struct SECURITY_ATTRIBUTES { uint32_t nLength; void* lpSecurityDescriptor; bool32 bInheritHandle; } SECURITY_ATTRIBUTES; enum { CF_TEXT = 1, CF_BITMAP = 2, CF_DIB = 8 }; typedef enum tagCOINIT { COINIT_APARTMENTTHREADED = 0x2, COINIT_MULTITHREADED = 0x0, COINIT_DISABLE_OLE1DDE = 0x4, COINIT_SPEED_OVER_MEMORY = 0x8 } COINIT; typedef enum { ASSOCF_NONE = 0x00000000, ASSOCF_INIT_NOREMAPCLSID = 0x00000001, ASSOCF_INIT_BYEXENAME = 0x00000002, ASSOCF_OPEN_BYEXENAME = 0x00000002, ASSOCF_INIT_DEFAULTTOSTAR = 0x00000004, ASSOCF_INIT_DEFAULTTOFOLDER = 0x00000008, ASSOCF_NOUSERSETTINGS = 0x00000010, ASSOCF_NOTRUNCATE = 0x00000020, ASSOCF_VERIFY = 0x00000040, ASSOCF_REMAPRUNDLL = 0x00000080, ASSOCF_NOFIXUPS = 0x00000100, ASSOCF_IGNOREBASECLASS = 0x00000200, ASSOCF_INIT_IGNOREUNKNOWN = 0x00000400, ASSOCF_INIT_FIXED_PROGID = 0x00000800, ASSOCF_IS_PROTOCOL = 0x00001000, ASSOCF_INIT_FOR_FILE = 0x00002000, ASSOCF_IS_FULL_URI = 0x00004000, ASSOCF_PER_MACHINE_ONLY = 0x00008000, ASSOCF_APP_TO_APP = 0x00010000, } ASSOCF; typedef enum { ASSOCSTR_COMMAND = 1, ASSOCSTR_EXECUTABLE, ASSOCSTR_FRIENDLYDOCNAME, ASSOCSTR_FRIENDLYAPPNAME, ASSOCSTR_NOOPEN, ASSOCSTR_SHELLNEWVALUE, ASSOCSTR_DDECOMMAND, ASSOCSTR_DDEIFEXEC, ASSOCSTR_DDEAPPLICATION, ASSOCSTR_DDETOPIC, ASSOCSTR_INFOTIP, ASSOCSTR_QUICKTIP, ASSOCSTR_TILEINFO, ASSOCSTR_CONTENTTYPE, ASSOCSTR_DEFAULTICON, ASSOCSTR_SHELLEXTENSION, ASSOCSTR_DROPTARGET, ASSOCSTR_DELEGATEEXECUTE, ASSOCSTR_SUPPORTED_URI_PROTOCOLS, ASSOCSTR_PROGID, ASSOCSTR_APPID, ASSOCSTR_APPPUBLISHER, ASSOCSTR_APPICONREFERENCE, ASSOCSTR_MAX } ASSOCSTR; typedef bool32 (*WinEnumWindowsProc)( HWND hwnd, LPARAM lParam ); typedef LRESULT (* HOOKPROC)(int code, WPARAM wParam, LPARAM lParam); typedef LRESULT (* WNDPROC)(HWND hwnd, int code, WPARAM wParam, LPARAM lParam); typedef int64_t (* FARPROC)(); uint32_t _spawnvp(int mode, const char *cmdname, const char *const *argv); bool GetExitCodeProcess( uint64_t hProcess, uint32_t * lpExitCode); uint32_t WaitForInputIdle(uint64_t hProcess, uint32_t dwMilliseconds); uint32_t CreateProcessA( void *, const char * commandLine, void *, void *, bool, uint32_t, void *, const char * currentDirectory, LPSTARTUPINFOA, LPPROCESS_INFORMATION ); bool32 ShellExecuteExA(SHELLEXECUTEINFOA *pExecInfo); bool32 TerminateProcess(HANDLE hProcess, uint32_t uExitCode); bool32 CloseHandle(HANDLE hObject); HRESULT CoInitializeEx(LPVOID pvReserved, DWORD dwCoInit); HRESULT AssocQueryStringA(ASSOCF flags, ASSOCSTR str, LPCSTR pszAssoc, LPCSTR pszExtra, LPSTR pszOut, DWORD *pcchOut); int OpenClipboard(HANDLE); HANDLE GetClipboardData(unsigned); int CloseClipboard(); HANDLE GlobalLock(HANDLE); int GlobalUnlock(HANDLE); size_t GlobalSize(HANDLE); bool32 EmptyClipboard(void); bool32 IsClipboardFormatAvailable(uint32_t format); HANDLE GetModuleHandleA(const char* name); uint16_t RegisterClassExA(const WNDCLASSEXA*); intptr_t DefWindowProcA(HWND hwnd, uint32_t msg, uintptr_t wparam, uintptr_t lparam); void PostQuitMessage(int exitCode); HANDLE LoadIconA(HANDLE hInstance, const char* iconName); HANDLE LoadCursorA(HANDLE hInstance, const char* cursorName); uint32_t GetLastError(); DWORD GetWindowThreadProcessId( HWND hWnd, LPDWORD lpdwProcessId ); bool32 SetDllDirectoryA( LPCSTR lpPathName ); DWORD GetDllDirectoryA( DWORD nBufferLength, LPSTR lpBuffer); HANDLE CreateWindowExA(uint32_t exstyle, const char* classname, const char* windowname, int32_t style, int32_t x, int32_t y, int32_t width, int32_t height, HWND parent_hwnd, HWND hmenu, HANDLE hinstance, void* param); bool32 SetWindowPos(HWND hWnd,int hWndInsertAfter, int X, int Y, int cx, int cy, uint32_t uFlags); bool32 ShowWindow(HWND hwnd, int32_t command); bool32 CloseWindow(HWND hWnd); bool32 UpdateWindow(HWND hwnd); HWND FindWindowA(const char * lpClassName, const char * lpWindowName ); bool32 SetLayeredWindowAttributes(HWND hwnd, COLORREF crKey, BYTE bAlpha,uint32_t dwFlags); bool32 UpdateLayeredWindow(HWND hWnd, HANDLE hdcDst, void *pptDst,void *psize, HANDLE hdcSrc, POINT *pptSrc, COLORREF crKey, void *pblend, uint32_t dwFlags); HWND SetParent( HWND hWndChild, HWND hWndNewParent); bool32 MoveWindow( HWND hWnd, int X, int Y, int nWidth, int nHeight, bool32 bRepaint); LONG GetWindowLongA( HWND hWnd,int nIndex); LONG SetWindowLongA( HWND hWnd, int nIndex, LONG dwNewLong); bool32 GetClientRect(HWND hWnd, LPRECT lpRect); bool32 EnumWindows( WinEnumWindowsProc lpEnumFunc,LPARAM lParam ); int GetWindowTextA(HWND hWnd, LPSTR lpString, int nMaxCount); HWND SetFocus(HWND hWnd); HHOOK SetWindowsHookExA(int idHook, HOOKPROC lpfn, HINSTANCE hmod, DWORD dwThreadId); bool32 SetProcessDPIAware(); bool32 PeekMessageA(MSG* out_msg, HWND hwnd, uint32_t filter_min, uint32_t filter_max, uint32_t removalMode); bool32 TranslateMessage(const MSG* msg); intptr_t DispatchMessageA(const MSG* msg); uint32_t SendMessageA(HWND hWnd, uint32_t Msg, uintptr_t wParam, uintptr_t lParam ); uint32_t PostMessageA(HWND hWnd, uint32_t Msg, uintptr_t wParam, uintptr_t lParam ); bool32 InvalidateRect(HWND hwnd, const RECT*, bool32 erase); HANDLE CreateEventA(SECURITY_ATTRIBUTES*, bool32 manualReset, bool32 initialState, const char* name); uint32_t MsgWaitForMultipleObjects(uint32_t count, HANDLE* handles, bool32 waitAll, uint32_t ms, uint32_t wakeMask); DWORD WaitForSingleObject(HANDLE hHandle, DWORD dwMilliseconds); bool32 SetEnvironmentVariableA(const char * lpName, const char * lpValue); uint32_t SetWindowLongA(HWND hWnd, int nIndex, uint32_t dwNewLong ); LONG_PTR SetWindowLongPtrA( HWND hWnd, int nIndex, LONG_PTR dwNewLong ); LRESULT CallWindowProcA( WNDPROC lpPrevWndFunc, HWND hWnd, UINT Msg,WPARAM wParam,LPARAM lParam); bool32 IsWindow(HWND hWnd); HWND GetDesktopWindow(); bool32 GetWindowRect(HWND hWnd, LPRECT lpRect); bool32 GetOpenFileNameA( LPOPENFILENAME lpofn); void keybd_event(uint8_t bVk, uint8_t bScan, uint32_t dwFlags, void * dwExtraInfo); void Sleep(DWORD dwMilliseconds); int GetObjectA(void * hgdiobj, uint32_t cbBuffer, void * lpvObject); uint32_t GetBitmapBits( void * hbmp, uint32_t cbBuffer,void * lpvBits); ]]