Leaked source code of windows server 2003
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
//
// REGDYKEY.C
//
// Copyright (C) Microsoft Corporation, 1995
//
// Implementation of RegCreateDynKey and supporting functions.
//
#include "pch.h"
#ifdef WANT_DYNKEY_SUPPORT
#ifdef VXD
#pragma VxD_RARE_CODE_SEG
#endif
//
// VMMRegCreateDynKey
//
// See VMM DDK of _RegCreateDynKey.
//
LONG REGAPI VMMRegCreateDynKey( LPCSTR lpKeyName, LPVOID KeyContext, PPROVIDER pProvider, PPVALUE pValueList, DWORD ValueCount, LPHKEY lphKey ) {
LONG ErrorCode; HKEY hKey; PINTERNAL_PROVIDER pProviderCopy; PPVALUE pCurrentValue;
if (IsBadHugeReadPtr(pProvider, sizeof(REG_PROVIDER)) || (IsNullPtr(pProvider-> pi_R0_1val) && IsNullPtr(pProvider-> pi_R0_allvals)) || IsBadHugeReadPtr(pValueList, sizeof(PVALUE) * ValueCount)) return ERROR_INVALID_PARAMETER;
// The key could currently exist. Win95 didn't handle this case,
// so would we have problems changing this behavior now?
if ((ErrorCode = RgCreateOrOpenKey(HKEY_DYN_DATA, lpKeyName, &hKey, LK_CREATE | LK_CREATEDYNDATA)) != ERROR_SUCCESS) return ErrorCode;
if (!RgLockRegistry()) ErrorCode = ERROR_LOCK_FAILED;
else {
pProviderCopy = RgSmAllocMemory(sizeof(INTERNAL_PROVIDER));
if (IsNullPtr(pProviderCopy)) ErrorCode = ERROR_OUTOFMEMORY;
else {
// ErrorCode = ERROR_SUCCESS; // Must be true if we're here...
hKey-> pProvider = pProviderCopy;
// If no "get single" callback was provided, we can just use the
// "get atomic" callback.
if (IsNullPtr(pProvider-> pi_R0_1val)) pProviderCopy-> ipi_R0_1val = pProvider-> pi_R0_allvals; else pProviderCopy-> ipi_R0_1val = pProvider-> pi_R0_1val;
pProviderCopy-> ipi_R0_allvals = pProvider-> pi_R0_allvals; pProviderCopy-> ipi_key_context = KeyContext;
// No point in keeping a whole DWORD for one bit when we can fit
// it inside the main key structure.
if (pProvider-> pi_flags & PROVIDER_KEEPS_VALUE_LENGTH) hKey-> Flags |= KEYF_PROVIDERHASVALUELENGTH;
// Loop over all the values and store each name in the registry
// with a partial PVALUE record as the value's data.
for (pCurrentValue = pValueList; ValueCount > 0; ValueCount--, pCurrentValue++) {
if (IsBadStringPtr(pCurrentValue-> pv_valuename, (UINT) -1)) { ErrorCode = ERROR_INVALID_PARAMETER; break; }
// Skip storing the pv_valuename field.
if ((ErrorCode = RgSetValue(hKey, pCurrentValue-> pv_valuename, REG_BINARY, (LPBYTE) &(pCurrentValue-> pv_valuelen), sizeof(PVALUE) - FIELD_OFFSET(PVALUE, pv_valuelen))) != ERROR_SUCCESS) { TRAP(); break; }
}
}
RgUnlockRegistry();
}
// Win95 difference: on an error, don't modify lphKey and close the key
// created above.
if (ErrorCode == ERROR_SUCCESS) *lphKey = hKey; else VMMRegCloseKey(hKey);
return ErrorCode;
}
#endif // WANT_DYNKEY_SUPPORT
|