diff --git a/core/sys/windows/advapi32.odin b/core/sys/windows/advapi32.odin index 20badb5da..1eb6d7049 100644 --- a/core/sys/windows/advapi32.odin +++ b/core/sys/windows/advapi32.odin @@ -70,4 +70,44 @@ foreign advapi32 { lpStartupInfo: LPSTARTUPINFO, lpProcessInformation: LPPROCESS_INFORMATION, ) -> BOOL --- -} \ No newline at end of file + + RegCreateKeyExW :: proc( + hKey: HKEY, + lpSubKey: LPCWSTR, + Reserved: DWORD, + lpClass: LPWSTR, + dwOptions: DWORD, + samDesired: REGSAM, + lpSecurityAttributes: LPSECURITY_ATTRIBUTES, + phkResult: PHKEY, + lpdwDisposition: LPDWORD, + ) -> LSTATUS --- + + RegOpenKeyW :: proc( + hKey: HKEY, + lpSubKey: LPCWSTR, + phkResult: PHKEY, + ) -> LSTATUS --- + + RegOpenKeyExW :: proc( + hKey: HKEY, + lpSubKey: LPCWSTR, + ulOptions: DWORD, + samDesired: REGSAM, + phkResult: PHKEY, + ) -> LSTATUS --- + + RegCloseKey :: proc( + hKey: HKEY, + ) -> LSTATUS --- + + RegGetValueW :: proc( + hkey: HKEY, + lpSubKey: LPCWSTR, + lpValue: LPCWSTR, + dwFlags: DWORD, + pdwType: LPDWORD, + pvData: PVOID, + pcbData: LPDWORD, + ) -> LSTATUS --- +} diff --git a/core/sys/windows/kernel32.odin b/core/sys/windows/kernel32.odin index 98b93ffb9..8f6c63e42 100644 --- a/core/sys/windows/kernel32.odin +++ b/core/sys/windows/kernel32.odin @@ -329,7 +329,6 @@ foreign kernel32 { } -STANDARD_RIGHTS_REQUIRED :: DWORD(0x000F0000) SECTION_QUERY :: DWORD(0x0001) SECTION_MAP_WRITE :: DWORD(0x0002) SECTION_MAP_READ :: DWORD(0x0004) diff --git a/core/sys/windows/types.odin b/core/sys/windows/types.odin index a0649c5f3..2b2880ff6 100644 --- a/core/sys/windows/types.odin +++ b/core/sys/windows/types.odin @@ -33,6 +33,7 @@ HGDIOBJ :: distinct HANDLE HBITMAP :: distinct HANDLE HGLOBAL :: distinct HANDLE HHOOK :: distinct HANDLE +HKEY :: distinct HANDLE BOOL :: distinct b32 BYTE :: distinct u8 BOOLEAN :: distinct b8 @@ -64,6 +65,8 @@ WPARAM :: UINT_PTR LRESULT :: LONG_PTR LPRECT :: ^RECT LPPOINT :: ^POINT +LSTATUS :: LONG +PHKEY :: ^HKEY UINT8 :: u8 UINT16 :: u16 @@ -194,11 +197,8 @@ FILE_APPEND_DATA: DWORD : 0x00000004 FILE_WRITE_EA: DWORD : 0x00000010 FILE_WRITE_ATTRIBUTES: DWORD : 0x00000100 FILE_READ_ATTRIBUTES: DWORD : 0x000000080 -READ_CONTROL: DWORD : 0x00020000 -SYNCHRONIZE: DWORD : 0x00100000 GENERIC_READ: DWORD : 0x80000000 GENERIC_WRITE: DWORD : 0x40000000 -STANDARD_RIGHTS_WRITE: DWORD : READ_CONTROL FILE_GENERIC_WRITE: DWORD : STANDARD_RIGHTS_WRITE | FILE_WRITE_DATA | FILE_WRITE_ATTRIBUTES | @@ -266,6 +266,156 @@ REASON_CONTEXT :: struct { } PREASON_CONTEXT :: ^REASON_CONTEXT +// RRF - Registry Routine Flags (for RegGetValue) +RRF_RT_REG_NONE :: 0x00000001 +RRF_RT_REG_SZ :: 0x00000002 +RRF_RT_REG_EXPAND_SZ :: 0x00000004 +RRF_RT_REG_BINARY :: 0x00000008 +RRF_RT_REG_DWORD :: 0x00000010 +RRF_RT_REG_MULTI_SZ :: 0x00000020 +RRF_RT_REG_QWORD :: 0x00000040 +RRF_RT_DWORD :: (RRF_RT_REG_BINARY | RRF_RT_REG_DWORD) +RRF_RT_QWORD :: (RRF_RT_REG_BINARY | RRF_RT_REG_QWORD) +RRF_RT_ANY :: 0x0000ffff +RRF_NOEXPAND :: 0x10000000 +RRF_ZEROONFAILURE :: 0x20000000 + +ACCESS_MASK :: DWORD +PACCESS_MASK :: ^ACCESS_MASK +REGSAM :: ACCESS_MASK + +// Reserved Key Handles. +HKEY_CLASSES_ROOT :: HKEY(uintptr(0x80000000)) +HKEY_CURRENT_USER :: HKEY(uintptr(0x80000001)) +HKEY_LOCAL_MACHINE :: HKEY(uintptr(0x80000002)) +HKEY_USERS :: HKEY(uintptr(0x80000003)) +HKEY_PERFORMANCE_DATA :: HKEY(uintptr(0x80000004)) +HKEY_PERFORMANCE_TEXT :: HKEY(uintptr(0x80000050)) +HKEY_PERFORMANCE_NLSTEXT :: HKEY(uintptr(0x80000060)) +HKEY_CURRENT_CONFIG :: HKEY(uintptr(0x80000005)) +HKEY_DYN_DATA :: HKEY(uintptr(0x80000006)) +HKEY_CURRENT_USER_LOCAL_SETTINGS :: HKEY(uintptr(0x80000007)) + +// The following are masks for the predefined standard access types +DELETE : DWORD : 0x00010000 +READ_CONTROL : DWORD : 0x00020000 +WRITE_DAC : DWORD : 0x00040000 +WRITE_OWNER : DWORD : 0x00080000 +SYNCHRONIZE : DWORD : 0x00100000 + +STANDARD_RIGHTS_REQUIRED : DWORD : 0x000F0000 +STANDARD_RIGHTS_READ : DWORD : READ_CONTROL +STANDARD_RIGHTS_WRITE : DWORD : READ_CONTROL +STANDARD_RIGHTS_EXECUTE : DWORD : READ_CONTROL +STANDARD_RIGHTS_ALL : DWORD : 0x001F0000 +SPECIFIC_RIGHTS_ALL : DWORD : 0x0000FFFF + +// Registry Specific Access Rights. +KEY_QUERY_VALUE :: 0x0001 +KEY_SET_VALUE :: 0x0002 +KEY_CREATE_SUB_KEY :: 0x0004 +KEY_ENUMERATE_SUB_KEYS :: 0x0008 +KEY_NOTIFY :: 0x0010 +KEY_CREATE_LINK :: 0x0020 +KEY_WOW64_32KEY :: 0x0200 +KEY_WOW64_64KEY :: 0x0100 +KEY_WOW64_RES :: 0x0300 + +KEY_READ :: (STANDARD_RIGHTS_READ | KEY_QUERY_VALUE | KEY_ENUMERATE_SUB_KEYS | KEY_NOTIFY) & (~SYNCHRONIZE) +KEY_WRITE :: (STANDARD_RIGHTS_WRITE | KEY_SET_VALUE | KEY_CREATE_SUB_KEY) & (~SYNCHRONIZE) +KEY_EXECUTE :: (KEY_READ) & (~SYNCHRONIZE) +KEY_ALL_ACCESS :: (STANDARD_RIGHTS_ALL | + KEY_QUERY_VALUE | + KEY_SET_VALUE | + KEY_CREATE_SUB_KEY | + KEY_ENUMERATE_SUB_KEYS | + KEY_NOTIFY | + KEY_CREATE_LINK) & (~SYNCHRONIZE) + +// Open/Create Options +REG_OPTION_RESERVED :: 0x00000000 +REG_OPTION_NON_VOLATILE :: 0x00000000 +REG_OPTION_VOLATILE :: 0x00000001 +REG_OPTION_CREATE_LINK :: 0x00000002 +REG_OPTION_BACKUP_RESTORE :: 0x00000004 +REG_OPTION_OPEN_LINK :: 0x00000008 +REG_OPTION_DONT_VIRTUALIZE :: 0x00000010 + +REG_LEGAL_OPTION :: REG_OPTION_RESERVED | + REG_OPTION_NON_VOLATILE | + REG_OPTION_VOLATILE | + REG_OPTION_CREATE_LINK | + REG_OPTION_BACKUP_RESTORE | + REG_OPTION_OPEN_LINK | + REG_OPTION_DONT_VIRTUALIZE + +REG_OPEN_LEGAL_OPTION :: REG_OPTION_RESERVED | + REG_OPTION_BACKUP_RESTORE | + REG_OPTION_OPEN_LINK | + REG_OPTION_DONT_VIRTUALIZE + +// Key creation/open disposition +REG_CREATED_NEW_KEY :: 0x00000001 +REG_OPENED_EXISTING_KEY :: 0x00000002 + +// hive format to be used by Reg(Nt)SaveKeyEx +REG_STANDARD_FORMAT :: 1 +REG_LATEST_FORMAT :: 2 +REG_NO_COMPRESSION :: 4 + +// Key restore & hive load flags +REG_WHOLE_HIVE_VOLATILE :: 0x00000001 +REG_REFRESH_HIVE :: 0x00000002 +REG_NO_LAZY_FLUSH :: 0x00000004 +REG_FORCE_RESTORE :: 0x00000008 +REG_APP_HIVE :: 0x00000010 +REG_PROCESS_PRIVATE :: 0x00000020 +REG_START_JOURNAL :: 0x00000040 +REG_HIVE_EXACT_FILE_GROWTH :: 0x00000080 +REG_HIVE_NO_RM :: 0x00000100 +REG_HIVE_SINGLE_LOG :: 0x00000200 +REG_BOOT_HIVE :: 0x00000400 +REG_LOAD_HIVE_OPEN_HANDLE :: 0x00000800 +REG_FLUSH_HIVE_FILE_GROWTH :: 0x00001000 +REG_OPEN_READ_ONLY :: 0x00002000 +REG_IMMUTABLE :: 0x00004000 +REG_NO_IMPERSONATION_FALLBACK :: 0x00008000 +REG_APP_HIVE_OPEN_READ_ONLY :: REG_OPEN_READ_ONLY + +// Unload Flags +REG_FORCE_UNLOAD :: 1 +REG_UNLOAD_LEGAL_FLAGS :: REG_FORCE_UNLOAD + +// Notify filter values +REG_NOTIFY_CHANGE_NAME :: 0x00000001 +REG_NOTIFY_CHANGE_ATTRIBUTES :: 0x00000002 +REG_NOTIFY_CHANGE_LAST_SET :: 0x00000004 +REG_NOTIFY_CHANGE_SECURITY :: 0x00000008 +REG_NOTIFY_THREAD_AGNOSTIC :: 0x10000000 + +REG_LEGAL_CHANGE_FILTER :: REG_NOTIFY_CHANGE_NAME | + REG_NOTIFY_CHANGE_ATTRIBUTES | + REG_NOTIFY_CHANGE_LAST_SET | + REG_NOTIFY_CHANGE_SECURITY | + REG_NOTIFY_THREAD_AGNOSTIC + +// Predefined Value Types. +REG_NONE :: 0 +REG_SZ :: 1 +REG_EXPAND_SZ :: 2 +REG_BINARY :: 3 +REG_DWORD :: 4 +REG_DWORD_LITTLE_ENDIAN :: 4 +REG_DWORD_BIG_ENDIAN :: 5 +REG_LINK :: 6 +REG_MULTI_SZ :: 7 +REG_RESOURCE_LIST :: 8 +REG_FULL_RESOURCE_DESCRIPTOR :: 9 +REG_RESOURCE_REQUIREMENTS_LIST :: 10 +REG_QWORD :: 11 +REG_QWORD_LITTLE_ENDIAN :: 11 + + PTIMERAPCROUTINE :: #type proc "stdcall" (lpArgToCompletionRoutine: LPVOID, dwTimerLowValue, dwTimerHighValue: DWORD) TIMERPROC :: #type proc "stdcall" (HWND, UINT, UINT_PTR, DWORD) @@ -1126,34 +1276,6 @@ STD_ERROR_HANDLE: DWORD : ~DWORD(0) -12 + 1 PROGRESS_CONTINUE: DWORD : 0 -ERROR_FILE_NOT_FOUND: DWORD : 2 -ERROR_PATH_NOT_FOUND: DWORD : 3 -ERROR_ACCESS_DENIED: DWORD : 5 -ERROR_NOT_ENOUGH_MEMORY: DWORD : 8 -ERROR_INVALID_HANDLE: DWORD : 6 -ERROR_NO_MORE_FILES: DWORD : 18 -ERROR_SHARING_VIOLATION: DWORD : 32 -ERROR_LOCK_VIOLATION: DWORD : 33 -ERROR_HANDLE_EOF: DWORD : 38 -ERROR_NOT_SUPPORTED: DWORD : 50 -ERROR_FILE_EXISTS: DWORD : 80 -ERROR_INVALID_PARAMETER: DWORD : 87 -ERROR_BROKEN_PIPE: DWORD : 109 -ERROR_CALL_NOT_IMPLEMENTED: DWORD : 120 -ERROR_INSUFFICIENT_BUFFER: DWORD : 122 -ERROR_INVALID_NAME: DWORD : 123 -ERROR_BAD_ARGUMENTS: DWORD: 160 -ERROR_LOCK_FAILED: DWORD : 167 -ERROR_ALREADY_EXISTS: DWORD : 183 -ERROR_NO_DATA: DWORD : 232 -ERROR_ENVVAR_NOT_FOUND: DWORD : 203 -ERROR_OPERATION_ABORTED: DWORD : 995 -ERROR_IO_PENDING: DWORD : 997 -ERROR_TIMEOUT: DWORD : 0x5B4 -ERROR_NO_UNICODE_TRANSLATION: DWORD : 1113 - -E_NOTIMPL :: HRESULT(-0x7fff_bfff) // 0x8000_4001 - INVALID_HANDLE :: HANDLE(~uintptr(0)) INVALID_HANDLE_VALUE :: INVALID_HANDLE @@ -2329,4 +2451,4 @@ IMAGE_EXPORT_DIRECTORY :: struct { AddressOfFunctions: DWORD, // RVA from base of image AddressOfNames: DWORD, // RVA from base of image AddressOfNameOrdinals: DWORD, // RVA from base of image -} \ No newline at end of file +} diff --git a/core/sys/windows/winerror.odin b/core/sys/windows/winerror.odin new file mode 100644 index 000000000..82d3e4fc1 --- /dev/null +++ b/core/sys/windows/winerror.odin @@ -0,0 +1,46 @@ +// +build windows +package sys_windows + +ERROR_SUCCESS : DWORD : 0 +NO_ERROR :: 0 +SEC_E_OK : HRESULT : 0x00000000 + +ERROR_INVALID_FUNCTION : DWORD : 1 +ERROR_FILE_NOT_FOUND : DWORD : 2 +ERROR_PATH_NOT_FOUND : DWORD : 3 +ERROR_ACCESS_DENIED : DWORD : 5 +ERROR_INVALID_HANDLE : DWORD : 6 +ERROR_NOT_ENOUGH_MEMORY : DWORD : 8 +ERROR_INVALID_BLOCK : DWORD : 9 +ERROR_BAD_ENVIRONMENT : DWORD : 10 +ERROR_BAD_FORMAT : DWORD : 11 +ERROR_INVALID_ACCESS : DWORD : 12 +ERROR_INVALID_DATA : DWORD : 13 +ERROR_OUTOFMEMORY : DWORD : 14 +ERROR_INVALID_DRIVE : DWORD : 15 +ERROR_CURRENT_DIRECTORY : DWORD : 16 +ERROR_NO_MORE_FILES : DWORD : 18 +ERROR_SHARING_VIOLATION : DWORD : 32 +ERROR_LOCK_VIOLATION : DWORD : 33 +ERROR_HANDLE_EOF : DWORD : 38 +ERROR_NOT_SUPPORTED : DWORD : 50 +ERROR_FILE_EXISTS : DWORD : 80 +ERROR_INVALID_PARAMETER : DWORD : 87 +ERROR_BROKEN_PIPE : DWORD : 109 +ERROR_CALL_NOT_IMPLEMENTED : DWORD : 120 +ERROR_INSUFFICIENT_BUFFER : DWORD : 122 +ERROR_INVALID_NAME : DWORD : 123 +ERROR_BAD_ARGUMENTS : DWORD : 160 +ERROR_LOCK_FAILED : DWORD : 167 +ERROR_ALREADY_EXISTS : DWORD : 183 +ERROR_NO_DATA : DWORD : 232 +ERROR_ENVVAR_NOT_FOUND : DWORD : 203 +ERROR_OPERATION_ABORTED : DWORD : 995 +ERROR_IO_PENDING : DWORD : 997 +ERROR_NO_UNICODE_TRANSLATION : DWORD : 1113 +ERROR_TIMEOUT : DWORD : 1460 +ERROR_DATATYPE_MISMATCH : DWORD : 1629 +ERROR_UNSUPPORTED_TYPE : DWORD : 1630 +ERROR_NOT_SAME_OBJECT : DWORD : 1656 + +E_NOTIMPL :: HRESULT(-0x7fff_bfff) // 0x8000_4001