sys/windows: add registry functions and create winerror.odin

This commit is contained in:
hikari
2022-06-03 06:43:23 +03:00
parent ba5f7c4e2a
commit a2e0373934
4 changed files with 241 additions and 34 deletions

View File

@@ -70,4 +70,44 @@ foreign advapi32 {
lpStartupInfo: LPSTARTUPINFO,
lpProcessInformation: LPPROCESS_INFORMATION,
) -> BOOL ---
}
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 ---
}

View File

@@ -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)

View File

@@ -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
}
}

View File

@@ -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