|
|
//
// REGEVAL.C
//
// Copyright (C) Microsoft Corporation, 1995
//
// Implementation of RegEnumValue and supporting functions.
//
#include "pch.h"
//
// RgLookupValueByIndex
//
// Searches for the value with the specified index and returns a pointer to its
// VALUE_RECORD.
//
int INTERNAL RgLookupValueByIndex( HKEY hKey, UINT Index, LPVALUE_RECORD FAR* lplpValueRecord ) {
int ErrorCode; LPKEY_RECORD lpKeyRecord; LPVALUE_RECORD lpValueRecord;
// Handle Win95 registries that don't have a key record for the root key.
if (IsNullBlockIndex(hKey-> BlockIndex)) return ERROR_NO_MORE_ITEMS;
if ((ErrorCode = RgLockKeyRecord(hKey-> lpFileInfo, hKey-> BlockIndex, hKey-> KeyRecordIndex, &lpKeyRecord)) == ERROR_SUCCESS) {
if (Index >= lpKeyRecord-> ValueCount) { RgUnlockDatablock(hKey-> lpFileInfo, hKey-> BlockIndex, FALSE); ErrorCode = ERROR_NO_MORE_ITEMS; }
else {
lpValueRecord = (LPVALUE_RECORD) ((LPBYTE) &lpKeyRecord-> Name + lpKeyRecord-> NameLength + lpKeyRecord-> ClassLength);
while (Index--) { lpValueRecord = (LPVALUE_RECORD) ((LPBYTE) &lpValueRecord-> Name + lpValueRecord-> NameLength + lpValueRecord-> DataLength); }
*lplpValueRecord = lpValueRecord; ErrorCode = ERROR_SUCCESS;
}
}
return ErrorCode;
}
//
// VMMRegEnumValue
//
// See Win32 documentation for a description of the behavior.
//
LONG REGAPI VMMRegEnumValue( HKEY hKey, DWORD Index, LPSTR lpValueName, LPDWORD lpcbValueName, LPDWORD lpReserved, LPDWORD lpType, LPBYTE lpData, LPDWORD lpcbData ) {
int ErrorCode; LPVALUE_RECORD lpValueRecord;
if (IsBadHugeWritePtr(lpcbValueName, sizeof(DWORD)) || IsBadHugeWritePtr(lpValueName, *lpcbValueName) || (IsBadHugeOptionalWritePtr(lpType, sizeof(DWORD)))) return ERROR_INVALID_PARAMETER;
if (IsBadHugeOptionalWritePtr(lpType, sizeof(DWORD))) return ERROR_INVALID_PARAMETER;
if (IsNullPtr(lpcbData)) { if (!IsNullPtr(lpData)) return ERROR_INVALID_PARAMETER; }
else { // Win95 compatibility: don't validate lpData is of size *lpcbData.
// Instead of validating the entire buffer, we'll validate just the
// required buffer length in RgCopyFromValueRecord.
if (IsBadHugeWritePtr(lpcbData, sizeof(DWORD))) return ERROR_INVALID_PARAMETER; }
if (IsEnumIndexTooBig(Index)) return ERROR_NO_MORE_ITEMS;
if (!RgLockRegistry()) return ERROR_LOCK_FAILED;
if ((ErrorCode = RgValidateAndConvertKeyHandle(&hKey)) == ERROR_SUCCESS) {
if ((ErrorCode = RgLookupValueByIndex(hKey, (UINT) Index, &lpValueRecord)) == ERROR_SUCCESS) { ErrorCode = RgCopyFromValueRecord(hKey, lpValueRecord, lpValueName, lpcbValueName, lpType, lpData, lpcbData); RgUnlockDatablock(hKey-> lpFileInfo, hKey-> BlockIndex, FALSE); }
}
RgUnlockRegistry();
return ErrorCode;
UNREFERENCED_PARAMETER(lpReserved);
}
|