549 lines
14 KiB
C
549 lines
14 KiB
C
/*****************************************************************************
|
|
*
|
|
* (C) Copyright MICROSOFT Corp., 1993
|
|
*
|
|
* Title: VMMREG.H - Include file for VMM/Loader Registry Services
|
|
*
|
|
* Version: 1.00
|
|
*
|
|
* Date: 03-June-1993
|
|
*
|
|
* Author: Nagara
|
|
*
|
|
*-----------------------------------------------------------------------------
|
|
*
|
|
* Change log:
|
|
*
|
|
******************************************************************************
|
|
*/
|
|
|
|
#ifndef _VMMREG_H
|
|
#define _VMMREG_H
|
|
|
|
typedef DWORD VMMHKEY;
|
|
typedef VMMHKEY *PVMMHKEY;
|
|
typedef DWORD VMMREGRET; // return type for the REG Functions
|
|
|
|
#define MAX_VMM_REG_KEY_LEN 256 // includes the \0 terminator
|
|
|
|
#ifndef REG_SZ // define only if not there already
|
|
#define REG_SZ 0x0001
|
|
#endif
|
|
#ifndef REG_BINARY // define only if not there already
|
|
#define REG_BINARY 0x0003
|
|
#endif
|
|
#ifndef REG_DWORD // define only if not there already
|
|
#define REG_DWORD 0x0004
|
|
#endif
|
|
|
|
|
|
#ifndef HKEY_LOCAL_MACHINE // define only if not there already
|
|
|
|
#define HKEY_CLASSES_ROOT 0x80000000
|
|
#define HKEY_CURRENT_USER 0x80000001
|
|
#define HKEY_LOCAL_MACHINE 0x80000002
|
|
#define HKEY_USERS 0x80000003
|
|
#define HKEY_PERFORMANCE_DATA 0x80000004
|
|
#define HKEY_CURRENT_CONFIG 0x80000005
|
|
#define HKEY_DYN_DATA 0x80000006
|
|
|
|
#endif
|
|
|
|
|
|
// ERROR CODES returned by Registry
|
|
// NOTE THAT THESE ARE ALSO DEFINED IN WINERROR.H
|
|
// and so VMMREG.H should be included after WINERROR.H
|
|
|
|
#ifndef ERROR_FILE_NOT_FOUND
|
|
#define ERROR_FILE_NOT_FOUND 2L
|
|
#endif
|
|
|
|
#ifndef ERROR_BADDB
|
|
#define ERROR_BADDB 1009L
|
|
#endif
|
|
|
|
#ifndef ERROR_MORE_DATA
|
|
#define ERROR_MORE_DATA 234L
|
|
#endif
|
|
|
|
#ifndef ERROR_BADKEY
|
|
#define ERROR_BADKEY 1010L
|
|
#endif
|
|
|
|
#ifndef ERROR_CANTOPEN
|
|
#define ERROR_CANTOPEN 1011L
|
|
#endif
|
|
|
|
#ifndef ERROR_CANTREAD
|
|
#define ERROR_CANTREAD 1012L
|
|
#define ERROR_CANTWRITE 1013L
|
|
#endif
|
|
|
|
#ifndef ERROR_REGISTRY_CORRUPT
|
|
#define ERROR_REGISTRY_CORRUPT 1015L
|
|
#define ERROR_REGISTRY_IO_FAILED 1016L
|
|
#endif
|
|
|
|
#ifndef ERROR_KEY_DELETED
|
|
#define ERROR_KEY_DELETED 1018L
|
|
#endif
|
|
|
|
#ifndef ERROR_OUTOFMEMORY
|
|
#define ERROR_OUTOFMEMORY 14L
|
|
#endif
|
|
|
|
#ifndef ERROR_INVALID_PARAMETER
|
|
#define ERROR_INVALID_PARAMETER 87L
|
|
#endif
|
|
|
|
#ifndef ERROR_LOCK_FAILED
|
|
#define ERROR_LOCK_FAILED 167L
|
|
#endif
|
|
|
|
#ifndef ERROR_NO_MORE_ITEMS
|
|
#define ERROR_NO_MORE_ITEMS 259L
|
|
#endif
|
|
|
|
|
|
#ifndef ERROR_SUCCESS
|
|
#define ERROR_SUCCESS 0L
|
|
#endif
|
|
|
|
// END ERROR CODES
|
|
|
|
/*XLATOFF*/
|
|
#ifndef Not_VxD
|
|
|
|
/*NOINC*/
|
|
#ifndef _PROVIDER_STRUCTS_DEFINED
|
|
#define _PROVIDER_STRUCTS_DEFINED
|
|
|
|
struct val_context {
|
|
int valuelen; // the total length of this value
|
|
PVOID value_context; // provider's context
|
|
PVOID val_buff_ptr; // where in the ouput buffer the value is.
|
|
};
|
|
|
|
typedef struct val_context *PVALCONTEXT;
|
|
|
|
typedef struct pvalue { // Provider supplied value/context.
|
|
PCHAR pv_valuename; // The value name pointer
|
|
DWORD pv_valuelen;
|
|
PVOID pv_value_context;
|
|
DWORD pv_type;
|
|
}PVALUE;
|
|
|
|
typedef struct pvalue *PPVALUE;
|
|
|
|
typedef VMMREGRET (_cdecl *PQUERYHANDLER)(PVOID pvKeyContext, PVALCONTEXT pvalcontextValues, DWORD cvalcontextValues, PVOID pbData, DWORD * pcbData, DWORD dwReserved);
|
|
|
|
#define PROVIDER_KEEPS_VALUE_LENGTH 0x1
|
|
typedef struct provider_info {
|
|
PQUERYHANDLER pi_R0_1val;
|
|
PQUERYHANDLER pi_R0_allvals;
|
|
PQUERYHANDLER pi_R3_1val;
|
|
PQUERYHANDLER pi_R3_allvals;
|
|
DWORD pi_flags; // Only PROVIDER_KEEPS_VALUE_LENGTH for now.
|
|
}PROVIDER;
|
|
|
|
typedef PROVIDER *PPROVIDER;
|
|
|
|
struct value_ent {
|
|
PCHAR ve_valuename;
|
|
DWORD ve_valuelen;
|
|
DWORD ve_valueptr;
|
|
DWORD ve_type;
|
|
};
|
|
|
|
typedef struct value_ent VALENT;
|
|
typedef VALENT *PVALENT;
|
|
|
|
#endif // not(_PROVIDER_STRUCTS_DEFINED)
|
|
/*INC*/
|
|
|
|
#ifndef WIN31COMPAT
|
|
|
|
#pragma warning (disable:4035) // turn off no return code warning
|
|
|
|
#ifndef WANTVXDWRAPS
|
|
|
|
|
|
|
|
VMMREGRET VXDINLINE
|
|
VMM_RegOpenKey(VMMHKEY hkey, PCHAR lpszSubKey, PVMMHKEY phkResult)
|
|
{
|
|
_asm push phkResult
|
|
_asm push lpszSubKey
|
|
_asm push hkey
|
|
Touch_Register(eax)
|
|
Touch_Register(ecx)
|
|
Touch_Register(edx)
|
|
VMMCall(_RegOpenKey);
|
|
_asm add esp, 3*4
|
|
}
|
|
|
|
VMMREGRET VXDINLINE
|
|
VMM_RegCloseKey(VMMHKEY hkey)
|
|
{
|
|
_asm push hkey
|
|
Touch_Register(eax)
|
|
Touch_Register(ecx)
|
|
Touch_Register(edx)
|
|
VMMCall(_RegCloseKey);
|
|
_asm add esp, 1*4
|
|
}
|
|
|
|
VMMREGRET VXDINLINE
|
|
VMM_RegCreateKey(VMMHKEY hkey, PCHAR lpszSubKey, PVMMHKEY phkResult)
|
|
{
|
|
_asm push phkResult
|
|
_asm push lpszSubKey
|
|
_asm push hkey
|
|
Touch_Register(eax)
|
|
Touch_Register(ecx)
|
|
Touch_Register(edx)
|
|
VMMCall(_RegCreateKey);
|
|
_asm add esp, 3*4
|
|
}
|
|
|
|
|
|
VMMREGRET VXDINLINE
|
|
VMM_RegCreateDynKey(PCHAR lpszSubKey, PVOID pvKeyContext, PVOID pprovHandlerInfo, PVOID ppvalueValueInfo, DWORD cpvalueValueInfo, PVMMHKEY phkResult)
|
|
{
|
|
_asm push phkResult
|
|
_asm push cpvalueValueInfo
|
|
_asm push ppvalueValueInfo
|
|
_asm push pprovHandlerInfo
|
|
_asm push pvKeyContext
|
|
_asm push lpszSubKey
|
|
Touch_Register(eax)
|
|
Touch_Register(ecx)
|
|
Touch_Register(edx)
|
|
VMMCall(_RegCreateDynKey);
|
|
_asm add esp, 6*4
|
|
}
|
|
|
|
VMMREGRET VXDINLINE
|
|
VMM_RegQueryMultipleValues (VMMHKEY hKey, PVOID val_list, DWORD num_vals, PCHAR lpValueBuf, DWORD *ldwTotsize)
|
|
{
|
|
_asm push ldwTotsize
|
|
_asm push lpValueBuf
|
|
_asm push num_vals
|
|
_asm push val_list
|
|
_asm push hKey
|
|
Touch_Register(eax)
|
|
Touch_Register(ecx)
|
|
Touch_Register(edx)
|
|
VMMCall(_RegQueryMultipleValues);
|
|
_asm add esp, 5*4
|
|
}
|
|
|
|
VMMREGRET VXDINLINE
|
|
VMM_RegDeleteKey(VMMHKEY hkey, PCHAR lpszSubKey)
|
|
{
|
|
_asm push lpszSubKey
|
|
_asm push hkey
|
|
Touch_Register(eax)
|
|
Touch_Register(ecx)
|
|
Touch_Register(edx)
|
|
VMMCall(_RegDeleteKey);
|
|
_asm add esp, 2*4
|
|
}
|
|
|
|
VMMREGRET VXDINLINE
|
|
VMM_RegEnumKey(VMMHKEY hkey, DWORD iSubKey, PCHAR lpszName, DWORD cchName)
|
|
{
|
|
_asm push cchName
|
|
_asm push lpszName
|
|
_asm push iSubKey
|
|
_asm push hkey
|
|
Touch_Register(eax)
|
|
Touch_Register(ecx)
|
|
Touch_Register(edx)
|
|
VMMCall(_RegEnumKey);
|
|
_asm add esp, 4*4
|
|
}
|
|
|
|
VMMREGRET VXDINLINE
|
|
VMM_RegQueryValue(VMMHKEY hkey, PCHAR lpszSubKey, PCHAR lpszValue, PDWORD lpcbValue)
|
|
{
|
|
_asm push lpcbValue
|
|
_asm push lpszValue
|
|
_asm push lpszSubKey
|
|
_asm push hkey
|
|
Touch_Register(eax)
|
|
Touch_Register(ecx)
|
|
Touch_Register(edx)
|
|
VMMCall(_RegQueryValue);
|
|
_asm add esp, 4*4
|
|
}
|
|
|
|
VMMREGRET VXDINLINE
|
|
VMM_RegSetValue(VMMHKEY hkey, PCHAR lpszSubKey, DWORD fdwType, PCHAR lpszData, DWORD cbData)
|
|
{
|
|
_asm push cbData
|
|
_asm push lpszData
|
|
_asm push fdwType
|
|
_asm push lpszSubKey
|
|
_asm push hkey
|
|
Touch_Register(eax)
|
|
Touch_Register(ecx)
|
|
Touch_Register(edx)
|
|
VMMCall(_RegSetValue);
|
|
_asm add esp, 5*4
|
|
}
|
|
|
|
VMMREGRET VXDINLINE
|
|
VMM_RegDeleteValue(VMMHKEY hkey, PCHAR lpszValue)
|
|
{
|
|
_asm push lpszValue
|
|
_asm push hkey
|
|
Touch_Register(eax)
|
|
Touch_Register(ecx)
|
|
Touch_Register(edx)
|
|
VMMCall(_RegDeleteValue);
|
|
_asm add esp, 2*4
|
|
}
|
|
|
|
VMMREGRET VXDINLINE
|
|
VMM_RegEnumValue(VMMHKEY hkey, DWORD iValue, PCHAR lpszValue, PDWORD lpcbValue, PDWORD lpdwReserved, PDWORD lpdwType, PBYTE lpbData, PDWORD lpcbData)
|
|
{
|
|
_asm push lpcbData
|
|
_asm push lpbData
|
|
_asm push lpdwType
|
|
_asm push lpdwReserved
|
|
_asm push lpcbValue
|
|
_asm push lpszValue
|
|
_asm push iValue
|
|
_asm push hkey
|
|
Touch_Register(eax)
|
|
Touch_Register(ecx)
|
|
Touch_Register(edx)
|
|
VMMCall(_RegEnumValue);
|
|
_asm add esp, 8*4
|
|
}
|
|
|
|
VMMREGRET VXDINLINE
|
|
VMM_RegQueryValueEx(VMMHKEY hkey, PCHAR lpszValueName, PDWORD lpdwReserved, PDWORD lpdwType, PBYTE lpbData, PDWORD lpcbData)
|
|
{
|
|
_asm push lpcbData
|
|
_asm push lpbData
|
|
_asm push lpdwType
|
|
_asm push lpdwReserved
|
|
_asm push lpszValueName
|
|
_asm push hkey
|
|
Touch_Register(eax)
|
|
Touch_Register(ecx)
|
|
Touch_Register(edx)
|
|
VMMCall(_RegQueryValueEx);
|
|
_asm add esp, 6*4
|
|
}
|
|
|
|
VMMREGRET VXDINLINE
|
|
VMM_RegSetValueEx(VMMHKEY hkey, PCHAR lpszValueName, DWORD dwReserved, DWORD fdwType, PBYTE lpbData, DWORD cbData)
|
|
{
|
|
_asm push cbData
|
|
_asm push lpbData
|
|
_asm push fdwType
|
|
_asm push dwReserved
|
|
_asm push lpszValueName
|
|
_asm push hkey
|
|
Touch_Register(eax)
|
|
Touch_Register(ecx)
|
|
Touch_Register(edx)
|
|
VMMCall(_RegSetValueEx);
|
|
_asm add esp, 6*4
|
|
}
|
|
|
|
VMMREGRET VXDINLINE
|
|
VMM_RegFlushKey(VMMHKEY hkey)
|
|
{
|
|
_asm push hkey
|
|
Touch_Register(eax)
|
|
Touch_Register(ecx)
|
|
Touch_Register(edx)
|
|
VMMCall(_RegFlushKey);
|
|
_asm add esp, 1*4
|
|
}
|
|
|
|
VMMREGRET VXDINLINE
|
|
VMM_RegQueryInfoKey(VMMHKEY hkey, PCHAR lpszClass, PDWORD lpcchClass,PDWORD lpdwReserved, PDWORD lpcSubKeys, PDWORD lpcchMaxSubKey, PDWORD lpcchMaxClass,
|
|
PDWORD lpcValues, PDWORD lpcchMaxValueName, PDWORD lpcbMaxValueData,PDWORD lpcbSecurityDesc, PDWORD lpftLastWriteTime)
|
|
{
|
|
_asm push lpftLastWriteTime
|
|
_asm push lpcbSecurityDesc
|
|
_asm push lpcbMaxValueData
|
|
_asm push lpcchMaxValueName
|
|
_asm push lpcValues
|
|
_asm push lpcchMaxClass
|
|
_asm push lpcchMaxSubKey
|
|
_asm push lpcSubKeys
|
|
_asm push lpdwReserved
|
|
_asm push lpcchClass
|
|
_asm push lpszClass
|
|
_asm push hkey
|
|
Touch_Register(eax)
|
|
Touch_Register(ecx)
|
|
Touch_Register(edx)
|
|
VMMCall(_RegQueryInfoKey);
|
|
_asm add esp, 12*4
|
|
}
|
|
|
|
#endif // WANTVXDWRAPS
|
|
|
|
#pragma warning (default:4035) // turn on no return code warning
|
|
|
|
#endif // WIN31COMPAT
|
|
|
|
#endif // Not_VxD
|
|
|
|
/*XLATON*/
|
|
|
|
/* ASM
|
|
;**************************************************************
|
|
; Macros for Realmode loader registry Services
|
|
;
|
|
;**************************************************************
|
|
LDR_RegOpenKey Macro hKey,OffSubKey,SegSubKey,OffphKey,SegphKey
|
|
push SegphKey
|
|
push OffphKey ; lphKey
|
|
push SegSubKey
|
|
push OffSubKey ; lpszSubKey
|
|
push dword ptr hKey ; hKey
|
|
mov ax,LDRSRV_RegOpenKey
|
|
call dword ptr [_ServiceEntry]
|
|
add sp,3*4 ; for 3 parameters on stack
|
|
ENDM
|
|
;**************************************************************
|
|
LDR_RegCloseKey Macro hKey
|
|
push dword ptr hKey
|
|
mov ax,LDRSRV_RegCloseKey
|
|
call dword ptr [_ServiceEntry]
|
|
add sp,1*4 ; for 1 parameter on stack
|
|
ENDM
|
|
;**************************************************************
|
|
LDR_RegCreateKey Macro hKey,OffSubKey,SegSubKey,OffphKey,SegphKey
|
|
push SegphKey
|
|
push OffphKey ; lphKey
|
|
push SegSubKey
|
|
push OffSubKey ; lpszSubKey
|
|
push dword ptr hKey ; hKey
|
|
mov ax,LDRSRV_RegCreateKey
|
|
call dword ptr [_ServiceEntry]
|
|
add sp,3*4 ; for 3 parameters on stack
|
|
ENDM
|
|
;**************************************************************
|
|
LDR_RegDeleteKey Macro hKey,OffSubKey,SegSubKey
|
|
push SegSubKey
|
|
push OffSubKey ; lpszSubKey
|
|
push dword ptr hKey ; hKey
|
|
mov ax,LDRSRV_RegDeleteKey
|
|
call dword ptr [_ServiceEntry]
|
|
add sp,2*4 ; for 2 parameters on stack
|
|
ENDM
|
|
;**************************************************************
|
|
LDR_RegEnumKey Macro hKey,iSubKey,OffszName,SegszName,BufLen
|
|
push dword ptr BufLen
|
|
push SegszName
|
|
push OffszName
|
|
push dword ptr iSubKey
|
|
push dword ptr hKey
|
|
mov ax,LDRSRV_RegEnumKey
|
|
call dword ptr [_ServiceEntry]
|
|
add sp,4*4 ; for 4 parameters on stack
|
|
ENDM
|
|
;**************************************************************
|
|
LDR_RegQueryValue Macro hKey,OffSubKey,SegSubKey,OffValue,SegValue,OffcbValue,SegcbValue
|
|
push SegcbValue
|
|
push OffcbValue
|
|
push SegValue
|
|
push OffValue
|
|
push SegSubKey
|
|
push OffSubKey
|
|
push dword ptr hKey
|
|
mov ax,LDRSRV_RegQueryValue
|
|
call dword ptr [_ServiceEntry]
|
|
add sp,4*4 ; for 4 parameters on stack
|
|
ENDM
|
|
;**************************************************************
|
|
LDR_RegSetValue Macro hKey,OffSubKey,SegSubKey,dwType,OffData,SegData,cbData
|
|
push dword ptr cbData
|
|
push SegData
|
|
push OffData
|
|
push dword ptr dwType
|
|
push SegSubKey
|
|
push OffSubKey
|
|
push dword ptr hKey
|
|
mov ax,LDRSRV_RegSetValue
|
|
call dword ptr [_ServiceEntry]
|
|
add sp,5*4 ; for 4 parameters on stack
|
|
ENDM
|
|
;**************************************************************
|
|
LDR_RegDeleteValue Macro hKey,OffValue,SegValue
|
|
push SegValue
|
|
push OffValue ; lpszValue
|
|
push dword ptr hKey ; hKey
|
|
mov ax,LDRSRV_RegDeleteValue
|
|
call dword ptr [_ServiceEntry]
|
|
add sp,2*4 ; for 2 parameters on stack
|
|
ENDM
|
|
;**************************************************************
|
|
LDR_RegEnumValue Macro hKey,iValue,OffValue,SegValue,OffcbValue,SegcbValue,RegReserved,OffdwType,SegdwType,OffData,SegData,OffcbData,SegcbData
|
|
push SegcbData
|
|
push OffcbData
|
|
push SegData
|
|
push OffData
|
|
push SegdwType
|
|
push OffdwType
|
|
push dword ptr RegReserved
|
|
push SegcbValue
|
|
push OffcbValue
|
|
push SegValue
|
|
push OffValue
|
|
push dword ptr iValue
|
|
push dword ptr hKey ; hKey
|
|
mov ax,LDRSRV_RegEnumValue
|
|
call dword ptr [_ServiceEntry]
|
|
add sp,8*4 ; for 8 parameters on stack
|
|
ENDM
|
|
;**************************************************************
|
|
LDR_RegQueryValueEx Macro hKey,OffValue,SegValue,RegReserved,OffdwType,SegdwType,OffData,SegData,OffcbData,SegcbData
|
|
push SegcbData
|
|
push OffcbData
|
|
push SegData
|
|
push OffData
|
|
push SegdwType
|
|
push OffdwType
|
|
push dword ptr RegReserved
|
|
push SegValue
|
|
push OffValue
|
|
push dword ptr hKey
|
|
mov ax,LDRSRV_RegQueryValueEx
|
|
call dword ptr [_ServiceEntry]
|
|
add sp,6*4 ; for 6 parameters on stack
|
|
ENDM
|
|
;**************************************************************
|
|
LDR_RegSetValueEx Macro hKey,OffValue,SegValue,RegReserved,dwType,OffData,SegData,cbData
|
|
push dword ptr cbData
|
|
push SegData
|
|
push OffData
|
|
push dword ptr dwType
|
|
push dword ptr RegReserved
|
|
push SegValue
|
|
push OffValue
|
|
push dword ptr hKey
|
|
mov ax,LDRSRV_RegSetValueEx
|
|
call dword ptr [_ServiceEntry]
|
|
add sp,6*4 ; for 6 parameters on stack
|
|
ENDM
|
|
;**************************************************************
|
|
LDR_RegFlushKey Macro hKey
|
|
push dword ptr hKey
|
|
mov ax,LDRSRV_RegFlushKey
|
|
call dword ptr [_ServiceEntry]
|
|
add sp,1*4 ; for 1 parameter on stack
|
|
ENDM
|
|
;**************************************************************
|
|
*/
|
|
#endif /* _VMMREG_H */
|