From a7280472812d4a0d82d402e22181c781e0039ebf Mon Sep 17 00:00:00 2001 From: hikari Date: Sat, 1 Oct 2022 17:12:23 +0300 Subject: [PATCH 1/5] sys/windows: add a bunch of stuff --- core/sys/windows/advapi32.odin | 30 ++++++++ core/sys/windows/gdi32.odin | 1 + core/sys/windows/shell32.odin | 5 ++ core/sys/windows/shlwapi.odin | 1 + core/sys/windows/types.odin | 132 ++++++++++++++++++++++++++++++++- core/sys/windows/user32.odin | 1 + 6 files changed, 169 insertions(+), 1 deletion(-) diff --git a/core/sys/windows/advapi32.odin b/core/sys/windows/advapi32.odin index 82031d4f7..c2fbb560a 100644 --- a/core/sys/windows/advapi32.odin +++ b/core/sys/windows/advapi32.odin @@ -128,4 +128,34 @@ foreign advapi32 { lpData: LPCVOID, cbData: DWORD, ) -> LSTATUS --- + + GetFileSecurityA :: proc( + lpFileName: LPCSTR, + RequestedInformation: SECURITY_INFORMATION, + pSecurityDescriptor: PSECURITY_DESCRIPTOR, + nLength: DWORD, + lpnLengthNeeded: LPDWORD, + ) -> BOOL --- + + DuplicateToken :: proc( + ExistingTokenHandle: HANDLE, + ImpersonationLevel: SECURITY_IMPERSONATION_LEVEL, + DuplicateTokenHandle: PHANDLE, + ) -> BOOL --- + + MapGenericMask :: proc( + AccessMask: PDWORD, + GenericMapping: PGENERIC_MAPPING, + ) --- + + AccessCheck :: proc( + pSecurityDescriptor: PSECURITY_DESCRIPTOR, + ClientToken: HANDLE, + DesiredAccess: DWORD, + GenericMapping: PGENERIC_MAPPING, + PrivilegeSet: PPRIVILEGE_SET, + PrivilegeSetLength: LPDWORD, + GrantedAccess: LPDWORD, + AccessStatus: LPBOOL, + ) -> BOOL --- } diff --git a/core/sys/windows/gdi32.odin b/core/sys/windows/gdi32.odin index 4403a5dc3..274cae35b 100644 --- a/core/sys/windows/gdi32.odin +++ b/core/sys/windows/gdi32.odin @@ -77,6 +77,7 @@ foreign gdi32 { ) -> HFONT --- TextOutW :: proc(hdc: HDC, x, y: c_int, lpString: LPCWSTR, c: c_int) -> BOOL --- GetTextExtentPoint32W :: proc(hdc: HDC, lpString: LPCWSTR, c: c_int, psizl: LPSIZE) -> BOOL --- + GetTextMetricsW :: proc(hdc: HDC, lptm: LPTEXTMETRICW) -> BOOL --- } RGB :: #force_inline proc "contextless" (r, g, b: u8) -> COLORREF { diff --git a/core/sys/windows/shell32.odin b/core/sys/windows/shell32.odin index fa7a24906..a3d6c6fb8 100644 --- a/core/sys/windows/shell32.odin +++ b/core/sys/windows/shell32.odin @@ -14,4 +14,9 @@ foreign shell32 { lpDirectory: LPCWSTR, nShowCmd: INT, ) -> HINSTANCE --- + SHCreateDirectoryExW :: proc( + hwnd: HWND, + pszPath: LPCWSTR, + psa: ^SECURITY_ATTRIBUTES, + ) -> c_int --- } diff --git a/core/sys/windows/shlwapi.odin b/core/sys/windows/shlwapi.odin index 1852d536f..241ade8f6 100644 --- a/core/sys/windows/shlwapi.odin +++ b/core/sys/windows/shlwapi.odin @@ -8,4 +8,5 @@ foreign shlwapi { PathFileExistsW :: proc(pszPath: wstring) -> BOOL --- PathFindExtensionW :: proc(pszPath: wstring) -> wstring --- PathFindFileNameW :: proc(pszPath: wstring) -> wstring --- + SHAutoComplete :: proc(hwndEdit: HWND, dwFlags: DWORD) -> LWSTDAPI --- } diff --git a/core/sys/windows/types.odin b/core/sys/windows/types.odin index 85c94284c..0b7729767 100644 --- a/core/sys/windows/types.odin +++ b/core/sys/windows/types.odin @@ -20,6 +20,7 @@ DWORD :: c_ulong DWORDLONG :: c.ulonglong QWORD :: c.ulonglong HANDLE :: distinct LPVOID +PHANDLE :: ^HANDLE HINSTANCE :: HANDLE HMODULE :: distinct HINSTANCE HRESULT :: distinct LONG @@ -133,6 +134,11 @@ LPWSAOVERLAPPED :: distinct rawptr LPWSAOVERLAPPED_COMPLETION_ROUTINE :: distinct rawptr LPCVOID :: rawptr +PACCESS_TOKEN :: PVOID +PSECURITY_DESCRIPTOR :: PVOID +PSID :: PVOID +PCLAIMS_BLOB :: PVOID + PCONDITION_VARIABLE :: ^CONDITION_VARIABLE PLARGE_INTEGER :: ^LARGE_INTEGER PSRWLOCK :: ^SRWLOCK @@ -175,6 +181,7 @@ FILE_SHARE_DELETE: DWORD : 0x00000004 FILE_GENERIC_ALL: DWORD : 0x10000000 FILE_GENERIC_EXECUTE: DWORD : 0x20000000 FILE_GENERIC_READ: DWORD : 0x80000000 +FILE_ALL_ACCESS :: STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x1FF FILE_ACTION_ADDED :: 0x00000001 FILE_ACTION_REMOVED :: 0x00000002 @@ -230,6 +237,20 @@ SECURITY_SQOS_PRESENT: DWORD : 0x00100000 FIONBIO: c_ulong : 0x8004667e +OWNER_SECURITY_INFORMATION :: 0x00000001 +GROUP_SECURITY_INFORMATION :: 0x00000002 +DACL_SECURITY_INFORMATION :: 0x00000004 +SACL_SECURITY_INFORMATION :: 0x00000008 +LABEL_SECURITY_INFORMATION :: 0x00000010 +ATTRIBUTE_SECURITY_INFORMATION :: 0x00000020 +SCOPE_SECURITY_INFORMATION :: 0x00000040 +PROCESS_TRUST_LABEL_SECURITY_INFORMATION :: 0x00000080 +ACCESS_FILTER_SECURITY_INFORMATION :: 0x00000100 +BACKUP_SECURITY_INFORMATION :: 0x00010000 +PROTECTED_DACL_SECURITY_INFORMATION :: 0x80000000 +PROTECTED_SACL_SECURITY_INFORMATION :: 0x40000000 +UNPROTECTED_DACL_SECURITY_INFORMATION :: 0x20000000 +UNPROTECTED_SACL_SECURITY_INFORMATION :: 0x10000000 GET_FILEEX_INFO_LEVELS :: distinct i32 GetFileExInfoStandard: GET_FILEEX_INFO_LEVELS : 0 @@ -773,6 +794,30 @@ MSG :: struct { LPMSG :: ^MSG +TEXTMETRICW :: struct { + tmHeight: LONG, + tmAscent: LONG, + tmDescent: LONG, + tmInternalLeading: LONG, + tmExternalLeading: LONG, + tmAveCharWidth: LONG, + tmMaxCharWidth: LONG, + tmWeight: LONG, + tmOverhang: LONG, + tmDigitizedAspectX: LONG, + tmDigitizedAspectY: LONG, + tmFirstChar: WCHAR, + tmLastChar: WCHAR, + tmDefaultChar: WCHAR, + tmBreakChar: WCHAR, + tmItalic: BYTE, + tmUnderlined: BYTE, + tmStruckOut: BYTE, + tmPitchAndFamily: BYTE, + tmCharSet: BYTE, +} +LPTEXTMETRICW :: ^TEXTMETRICW + PAINTSTRUCT :: struct { hdc: HDC, fErase: BOOL, @@ -1462,6 +1507,24 @@ IDI_WARNING := IDI_EXCLAMATION IDI_ERROR := IDI_HAND IDI_INFORMATION := IDI_ASTERISK +IMAGE_BITMAP :: 0 +IMAGE_ICON :: 1 +IMAGE_CURSOR :: 2 +IMAGE_ENHMETAFILE :: 3 + +LR_DEFAULTCOLOR :: 0x00000000 +LR_MONOCHROME :: 0x00000001 +LR_COLOR :: 0x00000002 +LR_COPYRETURNORG :: 0x00000004 +LR_COPYDELETEORG :: 0x00000008 +LR_LOADFROMFILE :: 0x00000010 +LR_LOADTRANSPARENT :: 0x00000020 +LR_DEFAULTSIZE :: 0x00000040 +LR_VGACOLOR :: 0x00000080 +LR_LOADMAP3DCOLORS :: 0x00001000 +LR_CREATEDIBSECTION :: 0x00002000 +LR_COPYFROMRESOURCE :: 0x00004000 +LR_SHARED :: 0x00008000 // DIB color table identifiers DIB_RGB_COLORS :: 0 @@ -1793,7 +1856,58 @@ HEAP_ZERO_MEMORY: DWORD : 0x00000008 HANDLE_FLAG_INHERIT: DWORD : 0x00000001 HANDLE_FLAG_PROTECT_FROM_CLOSE :: 0x00000002 -TOKEN_READ: DWORD : 0x20008 +GENERIC_MAPPING :: struct { + GenericRead: ACCESS_MASK, + GenericWrite: ACCESS_MASK, + GenericExecute: ACCESS_MASK, + GenericAll: ACCESS_MASK, +} +PGENERIC_MAPPING :: ^GENERIC_MAPPING + +SECURITY_IMPERSONATION_LEVEL :: enum { + SecurityAnonymous, + SecurityIdentification, + SecurityImpersonation, + SecurityDelegation, +} + +SECURITY_INFORMATION :: DWORD +ANYSIZE_ARRAY :: 1 + +LUID_AND_ATTRIBUTES :: struct { + Luid: LUID, + Attributes: DWORD, +} + +PRIVILEGE_SET :: struct { + PrivilegeCount: DWORD, + Control: DWORD, + Privilege: [ANYSIZE_ARRAY]LUID_AND_ATTRIBUTES, +} +PPRIVILEGE_SET :: ^PRIVILEGE_SET + +// Token Specific Access Rights. +TOKEN_ASSIGN_PRIMARY :: 0x0001 +TOKEN_DUPLICATE :: 0x0002 +TOKEN_IMPERSONATE :: 0x0004 +TOKEN_QUERY :: 0x0008 +TOKEN_QUERY_SOURCE :: 0x0010 +TOKEN_ADJUST_PRIVILEGES :: 0x0020 +TOKEN_ADJUST_GROUPS :: 0x0040 +TOKEN_ADJUST_DEFAULT :: 0x0080 +TOKEN_ADJUST_SESSIONID :: 0x0100 + +TOKEN_ALL_ACCESS_P :: STANDARD_RIGHTS_REQUIRED | TOKEN_ASSIGN_PRIMARY | TOKEN_DUPLICATE | TOKEN_IMPERSONATE | TOKEN_QUERY |\ + TOKEN_QUERY_SOURCE | TOKEN_ADJUST_PRIVILEGES | TOKEN_ADJUST_GROUPS | TOKEN_ADJUST_DEFAULT + +TOKEN_ALL_ACCESS :: TOKEN_ALL_ACCESS_P | TOKEN_ADJUST_SESSIONID +TOKEN_READ :: STANDARD_RIGHTS_READ | TOKEN_QUERY +TOKEN_WRITE :: STANDARD_RIGHTS_WRITE | TOKEN_ADJUST_PRIVILEGES | TOKEN_ADJUST_GROUPS | TOKEN_ADJUST_DEFAULT +TOKEN_EXECUTE :: STANDARD_RIGHTS_EXECUTE +TOKEN_TRUST_CONSTRAINT_MASK :: STANDARD_RIGHTS_READ | TOKEN_QUERY | TOKEN_QUERY_SOURCE +TOKEN_ACCESS_PSEUDO_HANDLE_WIN8 :: TOKEN_QUERY | TOKEN_QUERY_SOURCE +TOKEN_ACCESS_PSEUDO_HANDLE :: TOKEN_ACCESS_PSEUDO_HANDLE_WIN8 + CP_ACP :: 0 // default to ANSI code page CP_OEMCP :: 1 // default to OEM code page @@ -3048,6 +3162,22 @@ SHCONTF_FLATLIST :: 0x4000 SHCONTF_ENABLE_ASYNC :: 0x8000 SHCONTF_INCLUDESUPERHIDDEN :: 0x10000 +SHACF_DEFAULT :: 0x00000000 // Currently (SHACF_FILESYSTEM | SHACF_URLALL) +SHACF_FILESYSTEM :: 0x00000001 // This includes the File System as well as the rest of the shell (Desktop\My Computer\Control Panel\) +SHACF_URLALL :: (SHACF_URLHISTORY | SHACF_URLMRU) +SHACF_URLHISTORY :: 0x00000002 // URLs in the User's History +SHACF_URLMRU :: 0x00000004 // URLs in the User's Recently Used list. +SHACF_USETAB :: 0x00000008 // Use the tab to move thru the autocomplete possibilities instead of to the next dialog/window control. +SHACF_FILESYS_ONLY :: 0x00000010 // This includes the File System +SHACF_FILESYS_DIRS :: 0x00000020 // Same as SHACF_FILESYS_ONLY except it only includes directories, UNC servers, and UNC server shares. +SHACF_VIRTUAL_NAMESPACE :: 0x00000040 // Also include the virtual namespace +SHACF_AUTOSUGGEST_FORCE_ON :: 0x10000000 // Ignore the registry default and force the feature on. +SHACF_AUTOSUGGEST_FORCE_OFF :: 0x20000000 // Ignore the registry default and force the feature off. +SHACF_AUTOAPPEND_FORCE_ON :: 0x40000000 // Ignore the registry default and force the feature on. (Also know as AutoComplete) +SHACF_AUTOAPPEND_FORCE_OFF :: 0x80000000 // Ignore the registry default and force the feature off. (Also know as AutoComplete) + +LWSTDAPI :: HRESULT + CLSID_FileOpenDialog := &GUID{0xDC1C5A9C, 0xE88A, 0x4DDE, {0xA5, 0xA1, 0x60, 0xF8, 0x2A, 0x20, 0xAE, 0xF7}} CLSID_FileSaveDialog := &GUID{0xC0B4E2F3, 0xBA21, 0x4773, {0x8D, 0xBA, 0x33, 0x5E, 0xC9, 0x46, 0xEB, 0x8B}} diff --git a/core/sys/windows/user32.odin b/core/sys/windows/user32.odin index ffb82ad0e..9a30e6454 100644 --- a/core/sys/windows/user32.odin +++ b/core/sys/windows/user32.odin @@ -78,6 +78,7 @@ foreign user32 { LoadIconW :: proc(hInstance: HINSTANCE, lpIconName: LPCWSTR) -> HICON --- LoadCursorA :: proc(hInstance: HINSTANCE, lpCursorName: LPCSTR) -> HCURSOR --- LoadCursorW :: proc(hInstance: HINSTANCE, lpCursorName: LPCWSTR) -> HCURSOR --- + LoadImageW :: proc(hInst: HINSTANCE, name: LPCWSTR, type: UINT, cx: c_int, cy: c_int, fuLoad: UINT) -> HANDLE --- GetWindowRect :: proc(hWnd: HWND, lpRect: LPRECT) -> BOOL --- GetClientRect :: proc(hWnd: HWND, lpRect: LPRECT) -> BOOL --- From ce09cb0bdb123cca72021117e700b9b404361aeb Mon Sep 17 00:00:00 2001 From: hikari Date: Sat, 1 Oct 2022 17:13:17 +0300 Subject: [PATCH 2/5] sys/windows: add comctl32 --- core/sys/windows/comctl32.odin | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 core/sys/windows/comctl32.odin diff --git a/core/sys/windows/comctl32.odin b/core/sys/windows/comctl32.odin new file mode 100644 index 000000000..983c45d36 --- /dev/null +++ b/core/sys/windows/comctl32.odin @@ -0,0 +1,9 @@ +// +build windows +package sys_windows + +foreign import "system:Comctl32.lib" + +@(default_calling_convention="stdcall") +foreign Comctl32 { + LoadIconWithScaleDown :: proc(hinst: HINSTANCE, pszName: PCWSTR, cx: c_int, cy: c_int, phico: ^HICON) -> HRESULT --- +} From bb9b58b8c42eec3d810688939a7dd454b6fa0c32 Mon Sep 17 00:00:00 2001 From: hikari Date: Fri, 7 Oct 2022 03:53:14 +0300 Subject: [PATCH 3/5] sys/windows: add some constants --- core/sys/windows/types.odin | 13 +++++++++++-- core/sys/windows/window_messages.odin | 3 +++ 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/core/sys/windows/types.odin b/core/sys/windows/types.odin index 0b7729767..d4983fd06 100644 --- a/core/sys/windows/types.odin +++ b/core/sys/windows/types.odin @@ -1111,8 +1111,14 @@ WS_EX_TOPMOST : UINT : 0x0000_0008 WS_EX_TRANSPARENT : UINT : 0x0000_0020 WS_EX_WINDOWEDGE : UINT : 0x0000_0100 -PBS_SMOOTH :: 0x01 -PBS_VERTICAL :: 0x04 +PBS_SMOOTH :: 0x01 +PBS_VERTICAL :: 0x04 +PBS_MARQUEE :: 0x08 +PBS_SMOOTHREVERSE :: 0x10 + +PBST_NORMAL :: 0x0001 +PBST_ERROR :: 0x0002 +PBST_PAUSED :: 0x0003 QS_ALLEVENTS : UINT : QS_INPUT | QS_POSTMESSAGE | QS_TIMER | QS_PAINT | QS_HOTKEY QS_ALLINPUT : UINT : QS_INPUT | QS_POSTMESSAGE | QS_TIMER | QS_PAINT | QS_HOTKEY | QS_SENDMESSAGE @@ -1837,12 +1843,15 @@ WAIT_FAILED: DWORD : 0xFFFFFFFF PIPE_ACCESS_INBOUND: DWORD : 0x00000001 PIPE_ACCESS_OUTBOUND: DWORD : 0x00000002 +PIPE_ACCESS_DUPLEX: DWORD : 0x00000003 FILE_FLAG_FIRST_PIPE_INSTANCE: DWORD : 0x00080000 FILE_FLAG_OVERLAPPED: DWORD : 0x40000000 PIPE_WAIT: DWORD : 0x00000000 PIPE_TYPE_BYTE: DWORD : 0x00000000 +PIPE_TYPE_MESSAGE: DWORD : 0x00000004 PIPE_REJECT_REMOTE_CLIENTS: DWORD : 0x00000008 PIPE_READMODE_BYTE: DWORD : 0x00000000 +PIPE_READMODE_MESSAGE: DWORD : 0x00000002 PIPE_ACCEPT_REMOTE_CLIENTS: DWORD : 0x00000000 FD_SETSIZE :: 64 diff --git a/core/sys/windows/window_messages.odin b/core/sys/windows/window_messages.odin index 616247f59..888c5ccf9 100644 --- a/core/sys/windows/window_messages.odin +++ b/core/sys/windows/window_messages.odin @@ -454,6 +454,7 @@ TB_ISBUTTONENABLED :: 0x0409 TBM_CLEARTICS :: 0x0409 TTM_SETTOOLINFOA :: 0x0409 CBEM_HASEDITCHANGED :: 0x040a +PBM_SETMARQUEE :: 0x040a RB_INSERTBANDW :: 0x040a SB_GETRECT :: 0x040a TB_ISBUTTONCHECKED :: 0x040a @@ -488,10 +489,12 @@ TTM_ENUMTOOLSA :: 0x040e SB_SETICON :: 0x040f TBM_GETTICPOS :: 0x040f TTM_GETCURRENTTOOLA :: 0x040f +PBM_SETSTATE :: 0x0410 RB_IDTOINDEX :: 0x0410 SB_SETTIPTEXTA :: 0x0410 TBM_GETNUMTICS :: 0x0410 TTM_WINDOWFROMPOINT :: 0x0410 +PBM_GETSTATE :: 0x0411 RB_GETTOOLTIPS :: 0x0411 SB_SETTIPTEXTW :: 0x0411 TBM_GETSELSTART :: 0x0411 From fa6cfde4b0e97e6fffb1a373de37fb9251ac7cfd Mon Sep 17 00:00:00 2001 From: hikari Date: Mon, 10 Oct 2022 07:26:32 +0300 Subject: [PATCH 4/5] sys/windows: add free disk space function binding --- core/sys/windows/kernel32.odin | 7 +++++++ core/sys/windows/types.odin | 1 + 2 files changed, 8 insertions(+) diff --git a/core/sys/windows/kernel32.odin b/core/sys/windows/kernel32.odin index 9e5e5448b..05686b7d2 100644 --- a/core/sys/windows/kernel32.odin +++ b/core/sys/windows/kernel32.odin @@ -346,6 +346,13 @@ foreign kernel32 { GenerateConsoleCtrlEvent :: proc(dwCtrlEvent: DWORD, dwProcessGroupId: DWORD) -> BOOL --- FreeConsole :: proc() -> BOOL --- GetConsoleWindow :: proc() -> HWND --- + + GetDiskFreeSpaceExW :: proc( + lpDirectoryName: LPCWSTR, + lpFreeBytesAvailableToCaller: PULARGE_INTEGER, + lpTotalNumberOfBytes: PULARGE_INTEGER, + lpTotalNumberOfFreeBytes: PULARGE_INTEGER, + ) -> BOOL --- } diff --git a/core/sys/windows/types.odin b/core/sys/windows/types.odin index d4983fd06..30cc62451 100644 --- a/core/sys/windows/types.odin +++ b/core/sys/windows/types.odin @@ -44,6 +44,7 @@ BOOLEAN :: distinct b8 GROUP :: distinct c_uint LARGE_INTEGER :: distinct c_longlong ULARGE_INTEGER :: distinct c_ulonglong +PULARGE_INTEGER :: ^ULARGE_INTEGER LONG :: c_long UINT :: c_uint INT :: c_int From a1935bc1f4b4f966e132cb42f4d0f6419a60222b Mon Sep 17 00:00:00 2001 From: hikari Date: Mon, 10 Oct 2022 20:40:41 +0300 Subject: [PATCH 5/5] sys/windows: replace A with W --- core/sys/windows/advapi32.odin | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/sys/windows/advapi32.odin b/core/sys/windows/advapi32.odin index c2fbb560a..e98aa6c43 100644 --- a/core/sys/windows/advapi32.odin +++ b/core/sys/windows/advapi32.odin @@ -129,8 +129,8 @@ foreign advapi32 { cbData: DWORD, ) -> LSTATUS --- - GetFileSecurityA :: proc( - lpFileName: LPCSTR, + GetFileSecurityW :: proc( + lpFileName: LPCWSTR, RequestedInformation: SECURITY_INFORMATION, pSecurityDescriptor: PSECURITY_DESCRIPTOR, nLength: DWORD,