2022-05-04 03:09:23 +00:00
// utility for registery operation
//
// Date: 2019-10-30
//
# pragma once
# ifndef _INCLUDED_REF_
# define _INCLUDED_REF_
# include "../ref/ref.h"
# endif
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// export interface for other modules on 2017-08-23 by GB
namespace sys_util
{
/////////////////////////////////////////////////////////////////////////////////////////////
// registry utilities ...
enum _wow_type
{
WOW_TYPE_DEFAULT = 0 , // both given path and the Wow6432Node path in 32-bits app
WOW_TYPE_32_BITS , // the same as WOW_TYPE_DEFAULT in 32-bits app
WOW_TYPE_64_BITS , // no affect on registry in 32-bits app
} ;
// if parameter 'temporary' is true, then the key you created would lost after the system restart !!!
PORT_API ( long ) reg_create_key ( const wchar_t * path , HKEY * ret = NULL , HKEY root = HKEY_LOCAL_MACHINE , _wow_type type = WOW_TYPE_DEFAULT , bool temporary = false ) ;
PORT_API ( long ) reg_close_key ( HKEY key ) ;
PORT_API ( long ) reg_remove_key ( const wchar_t * path , HKEY root = HKEY_LOCAL_MACHINE , _wow_type type = WOW_TYPE_DEFAULT ) ;
PORT_API ( long ) reg_remove_value ( const wchar_t * path , const wchar_t * val_name , HKEY root = HKEY_LOCAL_MACHINE , _wow_type type = WOW_TYPE_DEFAULT ) ;
// parameter of cb
// data: (const wchar_t*)
// len: bytes of data
// total: unused
// flag: inter_module_data::DATA_FLAG_FINAL
// param: the same as the parameter 'param'
//
// return: error code
PORT_API ( long ) reg_get_string ( HKEY root , const wchar_t * path , const wchar_t * name , inter_module_data : : set_data cb , void * param , _wow_type type = WOW_TYPE_DEFAULT ) ;
PORT_API ( long ) reg_get_binary ( HKEY root , const wchar_t * path , const wchar_t * name , inter_module_data : : set_data cb , void * param , _wow_type type = WOW_TYPE_DEFAULT ) ;
PORT_API ( long ) reg_get_integer ( HKEY root , const wchar_t * path , const wchar_t * name , int * val , _wow_type type = WOW_TYPE_DEFAULT ) ;
PORT_API ( long ) reg_get_integer ( HKEY root , const wchar_t * path , const wchar_t * name , unsigned long long * val , _wow_type type = WOW_TYPE_DEFAULT ) ;
// parameter of cb
// data: (const wchar_t*)key_name
// len: (const wchar_t*)path
// total: unused
// flag: inter_module_data::DATA_FLAG_FINAL
// param: the same as the parameter 'param'
//
// return: error code
PORT_API ( long ) reg_enum_key ( HKEY root , const wchar_t * path , inter_module_data : : set_data cb , void * param , _wow_type type = WOW_TYPE_DEFAULT ) ;
// parameter of cb
// data: (const wchar_t*) reg_value name
// len: (HIDWORD): type - REG_SZ, (wchar_t*)total; REG_DWORD/REG_QWORD, (DWORD/UINT64)total; REG_BINARY, (unsigned char*)total
// (LODWORD): bytes of data
// total: value
// flag: inter_module_data::DATA_FLAG_FINAL
// param: the same as the parameter 'param'
//
// return: error code
PORT_API ( long ) reg_enum_value ( HKEY root , const wchar_t * path , inter_module_data : : set_data cb , void * param , _wow_type type = WOW_TYPE_DEFAULT ) ;
// function: set string value
// val: can be multi-string fromat such as "123\0456\0789\0\0", in this circumstance, caller must provides val_bytes
// val_bytes: length of val, in bytes. will consider as single string if it was 0
//
// NOTE: this api would not support REG_EXPAND_SZ that with unexpanded string such as %systemroot%
PORT_API ( long ) reg_set_string ( HKEY root , const wchar_t * path , const wchar_t * name , const wchar_t * val , int val_bytes = 0 , _wow_type type = WOW_TYPE_DEFAULT ) ;
PORT_API ( long ) reg_set_integer ( HKEY root , const wchar_t * path , const wchar_t * name , unsigned val , _wow_type type = WOW_TYPE_DEFAULT ) ;
PORT_API ( long ) reg_set_integer ( HKEY root , const wchar_t * path , const wchar_t * name , unsigned long long val , _wow_type type = WOW_TYPE_DEFAULT ) ;
PORT_API ( long ) reg_set_binary ( HKEY root , const wchar_t * path , const wchar_t * name , unsigned char * val , int val_bytes , _wow_type type = WOW_TYPE_DEFAULT ) ;
// function: to find the default opener of given file type
// file_ext: the extension name of the file, such as ".txt", lead with '.'
// cb: data - (const wchar_t*)path_opener
PORT_API ( long ) reg_get_file_opener ( const wchar_t * file_ext /*.txt*/ , inter_module_data : : set_data cb , void * param ) ;
// function: enumerate installed service
// cb: data - (const wchar_t*) reg_service name
// len - (const wchar_t*) reg_service path file
// total - (const wchar_t*) reg_service description
// flag - inter_module_data::DATA_FLAG_FINAL
PORT_API ( long ) reg_enum_service ( inter_module_data : : set_data cb , void * param ) ;
// function: enumerate the auto starting program when system power on
// cb: data - (const wchar_t*) reg_program name
// len - (const wchar_t*) reg_program path file
// total - (const wchar_t*) reg_startup parameter
// flag - inter_module_data::DATA_FLAG_FINAL
PORT_API ( long ) reg_enum_program_on_system_poweron ( inter_module_data : : set_data cb , void * param ) ;
PORT_API ( long ) reg_remove_program_on_system_poweron ( const wchar_t * name ) ; // the name should be the same as in enum_program_on_system_poweron
// function: enumerate installed service
// cb: data - (const wchar_t*) reg_software display name
// len - (const wchar_t*) reg_uninstaller path file
// total - (const wchar_t*) reg_publisher
// flag - inter_module_data::DATA_FLAG_FINAL
PORT_API ( long ) reg_enum_uninstaller ( inter_module_data : : set_data cb , void * param ) ;
PORT_API ( long ) reg_reg_uninstaller ( const wchar_t * app_name , const wchar_t * display_name , const wchar_t * uninstall_pe , const wchar_t * uninstall_param = NULL
, const wchar_t * publisher = NULL , const wchar_t * version = NULL , unsigned size_in_bytes = 0 , _wow_type type = WOW_TYPE_DEFAULT ) ;
PORT_API ( long ) reg_del_uninstaller ( const wchar_t * app_name , _wow_type type = WOW_TYPE_DEFAULT ) ;
/////////////////////////////////////////////////////////////////////////////////////////////
// wmi utilities ...
// initialize a WMI object, use wmi_free to free the returned object
PORT_API ( void * ) wmi_initialize ( void ) ;
// because WMI is query system database, so consider it as registry and provides here ...
// function: query system configuration through by WMI
// win32_cls: the class name like Win32_xxxx, e.g. "Win32_NetworkAdapterConfiguration"
// attr_name: the attribute name in the win32_cls, e.g. "IPAddress" of "Win32_NetworkAdapterConfiguration"
// cb: data - value depends on len, see comments of parameter 'len'
// len - value type: VT_BSTR(const wchar_t*), VT_I1~8(char*, short*, int*, longlong*), VT_R4/8(float*, double*), VT_BOOL(bool*)
// total - unused
// flag - inter_module_data::DATA_FLAG_INSTAR in enumeration, and inter_module_data::DATA_FLAG_FINAL at over, then the data is invalid
// param - the same as parameter 'param'
PORT_API ( HRESULT ) wmi_query ( const wchar_t * win32_cls , const wchar_t * attr_name , inter_module_data : : set_data cb , void * param , void * wmi = NULL /*returned by wmi_initialize*/ ) ;
PORT_API ( void ) wmi_free ( void * wmi /*returned by wmi_initialize*/ ) ;
/////////////////////////////////////////////////////////////////////////////////////////////
// service utilities ...
enum _svc_state
{
SVC_STATE_UNKNOWN = 0 ,
SVC_STATE_STOPPED ,
SVC_STATE_STARTING ,
SVC_STATE_STOPPING ,
SVC_STATE_RUNNING ,
SVC_STATE_RESUMING ,
SVC_STATE_PAUSING ,
SVC_STATE_PAUSED ,
} ;
PORT_API ( long ) svc_install ( const wchar_t * svc_file , const wchar_t * svc_name , const wchar_t * svc_desc , const wchar_t * display_name = NULL ) ;
PORT_API ( long ) svc_uninstall ( const wchar_t * svc_name ) ;
PORT_API ( long ) svc_start ( const wchar_t * svc_name , DWORD wait_running_timeout = 0 /*milliseconds*/ ) ;
PORT_API ( long ) svc_pause ( const wchar_t * svc_name ) ;
PORT_API ( long ) svc_resume ( const wchar_t * svc_name ) ;
PORT_API ( long ) svc_enable ( const wchar_t * svc_name , bool enable ) ;
PORT_API ( long ) svc_stop ( const wchar_t * svc_name , DWORD wait_stopped_timeout = 0 /*milliseconds*/ ) ;
PORT_API ( long ) svc_change_pe_file ( const wchar_t * svc_name , const wchar_t * to_pe_file ) ;
PORT_API ( long ) svc_change_description ( const wchar_t * svc_name , const wchar_t * description ) ;
PORT_API ( bool ) svc_is_running ( const wchar_t * svc_name ) ;
PORT_API ( long ) svc_pe_file ( const wchar_t * svc_name , inter_module_data : : set_data cb , void * param ) ; // NOTE: DLL service will return "%system%\svchost.exe -k name" !!!
// function: handle the service common command, supporting following commands:
// --install: install self, or other service if with "-pe given service file" parameter
// --uninstall: uninstall self
// --restart: restart self
// --start: start self
// --stop: stop self
// --pause: pause self
// --resume: resume self
//
// return: whether handled the command
//
// NOTE: this API's codes must be in the service module; if with parameter "-pe given service file" then all operation are both on the given service
PORT_API ( bool ) svc_handle_common_command ( const wchar_t * svc_name , const wchar_t * svc_desc , long * err ) ;
// function: service enter, call this in main() for exe service.... support --install, --uninstall and --restart startup parameter
// parameter of cb: see the comment of DATA_FALG_SVC_xxx
PORT_API ( long ) start_as_service ( const wchar_t * svc_name , const wchar_t * svc_desc , inter_module_data : : set_data cb , void * param , DWORD timer_elapse = 0 /*millisecond*/ ) ;
/////////////////////////////////////////////////////////////////////////////////////////////
// shortcut utilities ...
//
// lnk_file: the file which with '.lnk' extension name
// target_file: the final file linked by lnk_file
//
PORT_API ( HRESULT ) link_create ( const wchar_t * lnk_file , const wchar_t * target_file , const wchar_t * start_arguments
, const wchar_t * icon_path_file = NULL , int icon_index = 0 , const wchar_t * lnk_desc = NULL ) ;
// icon_index: change the icon in target file of icon index; or not change the icon if it was -1, you can call link_change_icon to change it later
PORT_API ( HRESULT ) link_change_target_file ( const wchar_t * lnk_file , const wchar_t * target_file , int icon_index = 0 ) ;
PORT_API ( HRESULT ) link_change_icon ( const wchar_t * lnk_file , const wchar_t * file_ico , int index = 0 ) ;
PORT_API ( HRESULT ) link_change_startup_arguments ( const wchar_t * lnk_file , const wchar_t * start_arguments ) ;
PORT_API ( HRESULT ) link_change_description ( const wchar_t * lnk_file , const wchar_t * description ) ;
PORT_API ( long ) link_pin_to_taskbar ( const wchar_t * lnk_file , bool pin = true ) ;
// flag: DATA_FLAG_INSTAR for startup arguments, DATA_FLAG_FINAL for the target pe file
PORT_API ( HRESULT ) link_get_target_file ( const wchar_t * lnk_file , inter_module_data : : set_data cb , void * param ) ;
///////////////////////////////////////////////////////////////////////////////////////
// hardware info
enum cpu_cache_type
{
CPU_CACHE_NULL = 0 , // 0 = Null - No more caches.
CPU_CACHE_DATA , // 1 = Data Cache.
CPU_CACHE_INSTRUCTION , // 2 = Instruction Cache.
CPU_CACHE_UNIFIED , // 3 = Unified Cache.
CPU_CACHE_COUNT ,
} ;
2023-09-13 04:45:10 +00:00
typedef union _ecx_80000001
{
unsigned int dword_val ;
struct
{
unsigned int bit_00_lahf : 1 ; // LAHF/SAHF available in 64-bits
unsigned int bit_01_resv : 4 ; // reserved
unsigned int bit_05_lzcnt : 1 ; // LZCNT
unsigned int bit_06_resv : 2 ; // reserved
unsigned int bit_08_prefetch : 1 ; // PREFETCHW
unsigned int bit_09_resv : 23 ; // reserved
} ;
} CPU_ECX_80000001 ;
typedef union _edx_80000001
{
unsigned int dword_val ;
struct
{
unsigned int bit_00_resv : 11 ; // reserved
unsigned int bit_11_syscall : 1 ; // SYSCALL/SYSRET
unsigned int bit_12_resv : 8 ; // reserved
unsigned int bit_20_edb : 1 ; // execute disable bit available
unsigned int bit_21_resv : 5 ; // reserved
unsigned int bit_26_1Gpage : 1 ; // 1GB-pages are available
unsigned int bit_27_rdtscp : 1 ; // RDTSCP & IA32_TSC_AUX are available
unsigned int bit_28_resv : 1 ; // reserved
unsigned int bit_29_ia64 : 1 ; // Intel-64 architecture available
unsigned int bit_30_resv : 2 ; // reserved
} ;
} CPU_EDX_80000001 ;
2022-05-04 03:09:23 +00:00
typedef struct _cpu_cache
{
cpu_cache_type type ;
int level ;
UINT64 bytes ;
} CPUCACHE , * LPCPUCACHE ;
typedef struct _cpu_info
{
int max_cpuid ;
int cores ;
int speed_base ; // in MHz, 0 - not got; < 0 is unreliable
int speed_max ; // in MHz, 0 - not got; < 0 is unreliable
2023-09-13 04:45:10 +00:00
int speed_bus ; // in MHz, 0 - not got; < 0 is unreliable
2022-05-04 03:09:23 +00:00
char * manufactor ;
char * product ;
int cache_num ;
CPUCACHE caches [ 4 ] ;
} CPUINFO , * LPCPUINFO ;
typedef struct _bios_info
{
char * base_board_manufactor ;
char * base_board_product_name ;
char * base_board_version ;
char * bios_vendor ;
char * bios_version ;
char * bios_release_date ;
char bios_major_release ;
char bios_minor_release ;
char controller_major_release ;
char controller_minor_release ;
} BIOSINFO , * LPBIOSINFO ;
// result: data - LPCPUINFO
// len - error code, 0 is success
// total - unused, always be ZERO
// flag - DATA_FLAG_FINAL
// param - same as the parameter 'param'
PORT_API ( bool ) get_cpu_info ( inter_module_data : : set_data result , void * param ) ;
// result: data - LPBIOSINFO
// len - error code, 0 is success
// total - unused, always be ZERO
// flag - DATA_FLAG_FINAL
// param - same as the parameter 'param'
PORT_API ( bool ) get_bios_info ( inter_module_data : : set_data result , void * param ) ;
} ;