Browse Source

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

hikari 3 years ago
parent
commit
a2e0373934

+ 41 - 1
core/sys/windows/advapi32.odin

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

+ 0 - 1
core/sys/windows/kernel32.odin

@@ -329,7 +329,6 @@ foreign kernel32 {
 }
 }
 
 
 
 
-STANDARD_RIGHTS_REQUIRED     :: DWORD(0x000F0000)
 SECTION_QUERY                :: DWORD(0x0001)
 SECTION_QUERY                :: DWORD(0x0001)
 SECTION_MAP_WRITE            :: DWORD(0x0002)
 SECTION_MAP_WRITE            :: DWORD(0x0002)
 SECTION_MAP_READ             :: DWORD(0x0004)
 SECTION_MAP_READ             :: DWORD(0x0004)

+ 154 - 32
core/sys/windows/types.odin

@@ -33,6 +33,7 @@ HGDIOBJ :: distinct HANDLE
 HBITMAP :: distinct HANDLE
 HBITMAP :: distinct HANDLE
 HGLOBAL :: distinct HANDLE
 HGLOBAL :: distinct HANDLE
 HHOOK :: distinct HANDLE
 HHOOK :: distinct HANDLE
+HKEY :: distinct HANDLE
 BOOL :: distinct b32
 BOOL :: distinct b32
 BYTE :: distinct u8
 BYTE :: distinct u8
 BOOLEAN :: distinct b8
 BOOLEAN :: distinct b8
@@ -64,6 +65,8 @@ WPARAM :: UINT_PTR
 LRESULT :: LONG_PTR
 LRESULT :: LONG_PTR
 LPRECT :: ^RECT
 LPRECT :: ^RECT
 LPPOINT :: ^POINT
 LPPOINT :: ^POINT
+LSTATUS :: LONG
+PHKEY :: ^HKEY
 
 
 UINT8  ::  u8
 UINT8  ::  u8
 UINT16 :: u16
 UINT16 :: u16
@@ -194,11 +197,8 @@ FILE_APPEND_DATA: DWORD : 0x00000004
 FILE_WRITE_EA: DWORD : 0x00000010
 FILE_WRITE_EA: DWORD : 0x00000010
 FILE_WRITE_ATTRIBUTES: DWORD : 0x00000100
 FILE_WRITE_ATTRIBUTES: DWORD : 0x00000100
 FILE_READ_ATTRIBUTES: DWORD : 0x000000080
 FILE_READ_ATTRIBUTES: DWORD : 0x000000080
-READ_CONTROL: DWORD : 0x00020000
-SYNCHRONIZE: DWORD : 0x00100000
 GENERIC_READ: DWORD : 0x80000000
 GENERIC_READ: DWORD : 0x80000000
 GENERIC_WRITE: DWORD : 0x40000000
 GENERIC_WRITE: DWORD : 0x40000000
-STANDARD_RIGHTS_WRITE: DWORD : READ_CONTROL
 FILE_GENERIC_WRITE: DWORD : STANDARD_RIGHTS_WRITE |
 FILE_GENERIC_WRITE: DWORD : STANDARD_RIGHTS_WRITE |
 	FILE_WRITE_DATA |
 	FILE_WRITE_DATA |
 	FILE_WRITE_ATTRIBUTES |
 	FILE_WRITE_ATTRIBUTES |
@@ -266,6 +266,156 @@ REASON_CONTEXT :: struct {
 }
 }
 PREASON_CONTEXT :: ^REASON_CONTEXT
 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)
 PTIMERAPCROUTINE :: #type proc "stdcall" (lpArgToCompletionRoutine: LPVOID, dwTimerLowValue, dwTimerHighValue: DWORD)
 
 
 TIMERPROC :: #type proc "stdcall" (HWND, UINT, UINT_PTR, 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
 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 :: HANDLE(~uintptr(0))
 INVALID_HANDLE_VALUE :: INVALID_HANDLE
 INVALID_HANDLE_VALUE :: INVALID_HANDLE
 
 
@@ -2329,4 +2451,4 @@ IMAGE_EXPORT_DIRECTORY :: struct {
 	AddressOfFunctions:    DWORD, // RVA from base of image
 	AddressOfFunctions:    DWORD, // RVA from base of image
 	AddressOfNames:        DWORD, // RVA from base of image
 	AddressOfNames:        DWORD, // RVA from base of image
 	AddressOfNameOrdinals: DWORD, // RVA from base of image
 	AddressOfNameOrdinals: DWORD, // RVA from base of image
-}
+}

+ 46 - 0
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