windows-nt/Source/XPSP1/NT/sdktools/vmmreg32/regdval.c
2020-09-26 16:20:57 +08:00

105 lines
2.3 KiB
C

//
// REGDVAL.C
//
// Copyright (C) Microsoft Corporation, 1995
//
// Implementation of RegDeleteValue and supporting functions.
//
#include "pch.h"
//
// RgDeleteValueRecord
//
// Deletes the specified VALUE_RECORD from the provided KEY_RECORD.
//
VOID
INTERNAL
RgDeleteValueRecord(
LPKEY_RECORD lpKeyRecord,
LPVALUE_RECORD lpValueRecord
)
{
UINT ValueRecordLength;
LPBYTE lpSource;
UINT BytesToPushDown;
ASSERT(lpKeyRecord-> ValueCount > 0);
ValueRecordLength = sizeof(VALUE_RECORD) + lpValueRecord-> NameLength +
lpValueRecord-> DataLength - 1;
ASSERT(lpKeyRecord-> RecordSize >= ValueRecordLength);
//
// If this isn't the last value of this KEY_RECORD, then push down any
// VALUE_RECORDs after the VALUE_RECORD to delete.
//
if (--lpKeyRecord-> ValueCount) {
lpSource = (LPBYTE) lpValueRecord + ValueRecordLength;
BytesToPushDown = (UINT) ((LPBYTE) lpKeyRecord + lpKeyRecord->
RecordSize - lpSource);
MoveMemory((LPBYTE) lpValueRecord, lpSource, BytesToPushDown);
}
lpKeyRecord-> RecordSize -= ValueRecordLength;
}
//
// VMMRegDeleteValue
//
// See Win32 documentation of RegDeleteValue.
//
LONG
REGAPI
VMMRegDeleteValue(
HKEY hKey,
LPCSTR lpValueName
)
{
int ErrorCode;
LPKEY_RECORD lpKeyRecord;
LPVALUE_RECORD lpValueRecord;
if (IsBadOptionalStringPtr(lpValueName, (UINT) -1))
return ERROR_INVALID_PARAMETER;
if (!RgLockRegistry())
return ERROR_LOCK_FAILED;
if ((ErrorCode = RgValidateAndConvertKeyHandle(&hKey)) == ERROR_SUCCESS) {
if ((ErrorCode = RgLookupValueByName(hKey, lpValueName, &lpKeyRecord,
&lpValueRecord)) == ERROR_SUCCESS) {
if ((hKey-> PredefinedKeyIndex == INDEX_DYN_DATA) || (hKey->
lpFileInfo-> Flags & FI_READONLY))
ErrorCode = ERROR_ACCESS_DENIED;
else {
RgDeleteValueRecord(lpKeyRecord, lpValueRecord);
RgSignalWaitingNotifies(hKey-> lpFileInfo, hKey-> KeynodeIndex,
REG_NOTIFY_CHANGE_LAST_SET);
}
RgUnlockDatablock(hKey-> lpFileInfo, hKey-> BlockIndex, TRUE);
}
}
RgUnlockRegistry();
return ErrorCode;
}