📄 srfunc.c
字号:
pszKey = pValues[i].pszKey;
switch (dwType)
{
case REG_SZ:
GetRegsz(hCurrentKey, pszKey, &pValues[i].pvValue,
&pValues[i].dwLength);
break;
case REG_DWORD:
GetRegdw(hCurrentKey, pszKey, &pValues[i].pvValue,
&pValues[i].dwLength);
break;
case REG_EXPAND_SZ:
GetRegesz(hCurrentKey, pszKey, &pValues[i].pvValue,
&pValues[i].dwLength);
break;
case REG_MULTI_SZ:
GetRegmsz(hCurrentKey, pszKey, &pValues[i].pvValue,
&pValues[i].dwLength);
break;
case REG_BINARY:
DbgP(( TEXT("%s is a REG_BINARY and won't be duplicated\n"), pszKey ));
break;
default:
DbgP(( TEXT("%s is an unknown type; %d (decimal)\n"), pszKey, dwType ));
break;
}
}
}
//
// Get a REG_SZ value and stick it in the table entry, along with the
// length
//
BOOL GetRegsz(HKEY hKey, LPTSTR pszKey, PVOID * ppvValue, DWORD *pdwLength)
{
BYTE achValue[1024];
DWORD dwLength;
LONG Status;
DWORD dwType = REG_SZ;
PBYTE pszValue = NULL;
if ( (NULL == pszKey) || (NULL == ppvValue) ||
(NULL == hKey) || (NULL == pdwLength))
{
return FALSE;
}
#ifdef _DEBUG
FillMemory(achValue, sizeof(achValue), 0xcd);
#endif
dwLength = sizeof(achValue);
Status = RegQueryValueEx( hKey,
pszKey,
NULL,
&dwType,
(PUCHAR) &achValue[0],
&dwLength);
if ((ERROR_SUCCESS != Status) || (REG_SZ != dwType) )
{
return FALSE;
}
pszValue = malloc(dwLength);
if (NULL == pszValue)
{
return FALSE;
}
CopyMemory(pszValue, achValue, dwLength);
*ppvValue = pszValue;
*pdwLength = dwLength;
return TRUE;
}
//
// Get the value of a REG_EXPAND_SZ and its length
//
BOOL GetRegesz(HKEY hKey, LPTSTR pszKey, PVOID * ppvValue, DWORD * pdwLength)
{
BYTE achValue[1024];
DWORD dwLength;
LONG Status;
DWORD dwType = REG_EXPAND_SZ;
PBYTE pszValue = NULL;
if ( (NULL == pszKey) || (NULL == ppvValue) ||
(NULL == hKey) || (NULL == pdwLength))
{
return FALSE;
}
#ifdef _DEBUG
FillMemory(achValue, sizeof(achValue), 0xcd);
#endif
dwLength = sizeof(achValue);
Status = RegQueryValueEx( hKey,
pszKey,
NULL,
&dwType,
(PUCHAR) &achValue[0],
&dwLength);
if ((ERROR_SUCCESS != Status) || (REG_EXPAND_SZ != dwType))
{
return FALSE;
}
pszValue = malloc(dwLength);
if (NULL == pszValue)
{
return FALSE;
}
CopyMemory(pszValue, achValue, dwLength);
*ppvValue = pszValue;
*pdwLength = dwLength;
return TRUE;
}
//
// Get value and length of REG_MULTI_SZ
//
BOOL GetRegmsz(HKEY hKey, LPTSTR pszKey, PVOID * ppvValue, DWORD * pdwLength)
{
//BYTE achValue[1024];
BYTE achValue[2048]; // careful, some of these strings are quite long
DWORD dwLength;
LONG Status;
DWORD dwType = REG_MULTI_SZ;
PBYTE pszValue = NULL;
if ( (NULL == pszKey) || (NULL == ppvValue) ||
(NULL == hKey) || (NULL == pdwLength))
{
return FALSE;
}
#ifdef _DEBUG
FillMemory(achValue, sizeof(achValue), 0xcd);
#endif
dwLength = sizeof(achValue);
Status = RegQueryValueEx( hKey,
pszKey,
NULL,
&dwType,
(PUCHAR) &achValue[0],
&dwLength);
if ((ERROR_SUCCESS != Status) || (REG_MULTI_SZ != dwType))
{
return FALSE;
}
pszValue = malloc(dwLength);
if (NULL == pszValue)
{
return FALSE;
}
CopyMemory(pszValue, achValue, dwLength);
*ppvValue = pszValue;
*pdwLength = dwLength;
return TRUE;
}
//
// Get value and length of REG_DWORD
//
BOOL GetRegdw(HKEY hKey, LPTSTR pszKey, PVOID * ppvValue, DWORD * pdwLength)
{
DWORD dwValue = 0;
DWORD dwLength;
LONG Status;
DWORD dwType = REG_DWORD;
if ( (NULL == pszKey) || (NULL == ppvValue) ||
(NULL == hKey) || (NULL == pdwLength) )
{
return FALSE;
}
dwLength = sizeof(dwValue);
Status = RegQueryValueEx( hKey,
pszKey,
NULL,
&dwType,
(PUCHAR) &dwValue,
&dwLength);
if ((ERROR_SUCCESS != Status) || (REG_DWORD != dwType))
{
return FALSE;
}
*ppvValue = (PVOID) (ULONG_PTR) dwValue;
*pdwLength = dwLength;
return TRUE;
}
void
WriteRegistryKeyValues(
HKEY hCurrentKey,
DWORD NumberOfValues,
PREGENTRY pValues)
/*++
Routine Description:
This routine reads a bunch of values associated with a given key.
Arguments:
hCurrentKey - the key
NumberOfValues - the number of values
pValues - the array of values
Return Value:
None
--*/
{
DWORD i;
for (i = 0; i < NumberOfValues; i++)
{
DWORD dwType;
PVOID pvValue;
DWORD dwLength;
LPTSTR pszKey;
pszKey = pValues[i].pszKey;
dwType = pValues[i].dwType;
dwLength = pValues[i].dwLength;
pvValue = pValues[i].pvValue;
switch (dwType)
{
case REG_SZ:
AddValue(hCurrentKey, pszKey, dwType, dwLength, pvValue);
break;
case REG_DWORD:
AddValue(hCurrentKey, pszKey, dwType, dwLength, &pvValue);
break;
case REG_EXPAND_SZ:
AddValue(hCurrentKey, pszKey, dwType, dwLength, pvValue);
break;
case REG_MULTI_SZ:
AddValue(hCurrentKey, pszKey, dwType, dwLength, pvValue);
break;
case REG_BINARY:
//
// There are no binary values we need to copy. If we did, we'd
// put something here
//
break;
default:
DbgP(( TEXT("%s is an unknown type; %d (decimal)\n"), pszKey, dwType ));
break;
}
}
}
//
// Open a key so we can read the values
//
BOOL OpenKey(
LPTSTR pszKey,
PHKEY phKey)
/*++
Routine Description:
This routine opens a registry key.
Arguments:
pszKey - the name of the key relative to HKEY_LOCAL_MACHINE
phKey - the key handlle
Return Value:
TRUE if successful, otherwise FALSE
--*/
{
HKEY hNewKey = 0;
DWORD Status;
Status = RegOpenKeyEx( HKEY_LOCAL_MACHINE,
pszKey,
0,
KEY_QUERY_VALUE,
&hNewKey);
if (ERROR_SUCCESS != Status)
{
*phKey = NULL;
return FALSE;
}
else
{
*phKey = hNewKey;
return TRUE;
}
}
BOOL CreateKey(LPTSTR pszKey, PHKEY phKey)
/*++
Routine Description:
This routine creates a registry key.
Arguments:
pszKey - the name of the key relative to HKEY_LOCAL_MACHINE
phKey - the key handlle
Return Value:
TRUE if successful, otherwise FALSE
--*/
{
LONG Status;
DWORD Disposition;
Status = RegCreateKeyEx( HKEY_LOCAL_MACHINE,
pszKey,
0,
REG_NONE,
REG_OPTION_NON_VOLATILE,
KEY_ALL_ACCESS,
NULL,
phKey,
&Disposition);
if ( ERROR_SUCCESS == Status)
{
return TRUE;
}
else
{
DbgP(( TEXT("error creating key %s Status %d\n"), pszKey, Status ));
return FALSE;
}
}
//
// Add a value to the registry
//
BOOL AddValue(HKEY hKey, LPTSTR pszKey, DWORD dwType, DWORD dwLength, PVOID pvValue)
{
BOOL fSuccess = TRUE;
LONG Status = ERROR_SUCCESS;
HANDLE th;
Status = RegSetValueEx( hKey,
pszKey,
0,
dwType,
pvValue,
dwLength);
if (Status != ERROR_SUCCESS)
{
fSuccess = FALSE;
//RegCloseKey(hKey);
}
return fSuccess;
}
int _cdecl _vsnwprintf( wchar_t *buffer, size_t count, wchar_t *format, va_list arg_ptr);
// Format and write debug information to OutputDebugString
ULONG
_cdecl
DbgPrint(
LPTSTR Format,
...
)
{
ULONG rc = 0;
TCHAR szbuffer[256];
va_list marker;
va_start( marker, Format );
{
rc = _vsnwprintf( szbuffer, 254, Format, marker );
szbuffer[255] = (TCHAR)0;
OutputDebugString( TRACE_TAG );
OutputDebugString( szbuffer );
}
return rc;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -