105 lines
2.3 KiB
C
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;
|
||
|
|
||
|
}
|