|
|
/*++
Copyright (c) 1996-1999 Microsoft Corporation
Module Name:
fmprop.c
Abstract:
Implements the management of group properties.
Author:
Rod Gamache (rodga) 7-Jan-1996
Revision History:
--*/ #include "fmp.h"
//#include "stdio.h"
#define MAX_DWORD ((DWORD)-1)
//
// Group Common properties.
//
//
// Read-Write Common Properties.
//
RESUTIL_PROPERTY_ITEM FmpGroupCommonProperties[] = { { CLUSREG_NAME_GRP_DESC, NULL, CLUSPROP_FORMAT_SZ, 0, 0, 0, 0 }, { CLUSREG_NAME_GRP_PERSISTENT_STATE, NULL, CLUSPROP_FORMAT_DWORD, 0, 0, 1, 0 }, { CLUSREG_NAME_GRP_FAILOVER_THRESHOLD, NULL, CLUSPROP_FORMAT_DWORD, CLUSTER_GROUP_DEFAULT_FAILOVER_THRESHOLD, 0, MAX_DWORD, 0 }, { CLUSREG_NAME_GRP_FAILOVER_PERIOD, NULL, CLUSPROP_FORMAT_DWORD, CLUSTER_GROUP_DEFAULT_FAILOVER_PERIOD, 0, CLUSTER_GROUP_MAXIMUM_FAILOVER_PERIOD, 0 }, { CLUSREG_NAME_GRP_FAILBACK_TYPE, NULL, CLUSPROP_FORMAT_DWORD, CLUSTER_GROUP_DEFAULT_AUTO_FAILBACK_TYPE, 0, CLUSTER_GROUP_MAXIMUM_AUTO_FAILBACK_TYPE, 0 }, { CLUSREG_NAME_GRP_FAILBACK_WIN_START, NULL, CLUSPROP_FORMAT_DWORD, CLUSTER_GROUP_DEFAULT_FAILBACK_WINDOW_START, CLUSTER_GROUP_MINIMUM_FAILBACK_WINDOW_START, CLUSTER_GROUP_MAXIMUM_FAILBACK_WINDOW_START, RESUTIL_PROPITEM_SIGNED }, { CLUSREG_NAME_GRP_FAILBACK_WIN_END, NULL, CLUSPROP_FORMAT_DWORD, CLUSTER_GROUP_DEFAULT_FAILBACK_WINDOW_END, CLUSTER_GROUP_MINIMUM_FAILBACK_WINDOW_END, CLUSTER_GROUP_MAXIMUM_FAILBACK_WINDOW_END, RESUTIL_PROPITEM_SIGNED }, { CLUSREG_NAME_GRP_LOADBAL_STATE, NULL, CLUSPROP_FORMAT_DWORD, CLUSTER_GROUP_DEFAULT_LOADBAL_STATE, 0, 1, 0 }, { CLUSREG_NAME_GRP_ANTI_AFFINITY_CLASS_NAME, NULL, CLUSPROP_FORMAT_MULTI_SZ, 0, 0, 0, 0 }, { 0 } };
//
// Read-Only Common Properties.
//
RESUTIL_PROPERTY_ITEM FmpGroupROCommonProperties[] = { { CLUSREG_NAME_GRP_NAME, NULL, CLUSPROP_FORMAT_SZ, 0, 0, 0, RESUTIL_PROPITEM_READ_ONLY, 0 }, // { CLUSREG_NAME_GRP_CONTAINS, NULL, CLUSPROP_FORMAT_MULTI_SZ, 0, 0, 0, RESUTIL_PROPITEM_READ_ONLY, 0 },
// { CLUSREG_NAME_GRP_PREFERRED_OWNERS, NULL, CLUSPROP_FORMAT_MULTI_SZ, 0, 0, 0, RESUTIL_PROPITEM_READ_ONLY, 0 },
{ 0 } };
//
// Cluster registry API function pointers.
//
CLUSTER_REG_APIS FmpClusterRegApis = { (PFNCLRTLCREATEKEY) DmRtlCreateKey, (PFNCLRTLOPENKEY) DmRtlOpenKey, (PFNCLRTLCLOSEKEY) DmCloseKey, (PFNCLRTLSETVALUE) DmSetValue, (PFNCLRTLQUERYVALUE) DmQueryValue, (PFNCLRTLENUMVALUE) DmEnumValue, (PFNCLRTLDELETEVALUE) DmDeleteValue, NULL, NULL, NULL };
DWORD FmpGroupEnumCommonProperties( OUT PVOID OutBuffer, IN DWORD OutBufferSize, OUT LPDWORD BytesReturned, OUT LPDWORD Required )
/*++
Routine Description:
Enumerates the common property names for a given group.
Arguments:
OutBuffer - Supplies the output buffer.
OutBufferSize - Supplies the size of the output buffer.
BytesReturned - The number of bytes returned in OutBuffer.
Required - The required number of bytes if OutBuffer is too small.
Return Value:
ERROR_SUCCESS if successful.
A Win32 error code on failure.
--*/
{ DWORD status;
//
// Enumerate the common properties.
//
status = ClRtlEnumProperties( FmpGroupCommonProperties, OutBuffer, OutBufferSize, BytesReturned, Required );
return(status);
} // FmpGroupEnumCommonProperties
DWORD FmpGroupGetCommonProperties( IN PFM_GROUP Group, IN BOOL ReadOnly, OUT PVOID OutBuffer, IN DWORD OutBufferSize, OUT LPDWORD BytesReturned, OUT LPDWORD Required )
/*++
Routine Description:
Gets the common properties for a given group.
Arguments:
Group - Supplies the group.
ReadOnly - TRUE if the read-only properties should be read. FALSE otherwise.
OutBuffer - Supplies the output buffer.
OutBufferSize - Supplies the size of the output buffer.
BytesReturned - The number of bytes returned in OutBuffer.
Required - The required number of bytes if OutBuffer is too small.
Return Value:
ERROR_SUCCESS if successful.
A Win32 error code on failure.
--*/
{ DWORD status; DWORD outBufferSize = OutBufferSize;
//
// Clear the output buffer
//
ZeroMemory( OutBuffer, OutBufferSize );
//
// Get the common properties.
//
if ( ReadOnly ) { //
// We have to be particularly careful about the group name.
// If a remote node owns the group, and changes the name, then
// the registry field is updated after the name is set into OM.
// Therefore, we must read the OM info, rather than the registry
// which could be stale.
//
status = ClRtlPropertyListFromParameterBlock( FmpGroupROCommonProperties, OutBuffer, &outBufferSize, (LPBYTE) &OmObjectName(Group), BytesReturned, Required ); } else { status = ClRtlGetProperties( Group->RegistryKey, &FmpClusterRegApis, FmpGroupCommonProperties, OutBuffer, OutBufferSize, BytesReturned, Required ); }
return(status);
} // FmpGroupGetCommonProperties
DWORD FmpGroupValidateCommonProperties( IN PFM_GROUP Group, IN PVOID InBuffer, IN DWORD InBufferSize )
/*++
Routine Description:
Validates the common properties for a given group.
Arguments:
Group - Supplies the group.
InBuffer - Supplies the input buffer.
InBufferSize - Supplies the size of the input buffer.
Return Value:
ERROR_SUCCESS if successful.
A Win32 error code on failure.
--*/
{ DWORD status;
//
// Validate the property list.
//
status = ClRtlVerifyPropertyTable( FmpGroupCommonProperties, NULL, // Reserved
FALSE, // Don't allow uknowns
InBuffer, InBufferSize, NULL );
if ( status != ERROR_SUCCESS ) { ClRtlLogPrint( LOG_ERROR, "[FM] ValidateCommonProperties, error in verify routine.\n"); }
return(status);
} // FmpGroupValidateCommonProperties
DWORD FmpGroupSetCommonProperties( IN PFM_GROUP Group, IN PVOID InBuffer, IN DWORD InBufferSize )
/*++
Routine Description:
Sets the common properties for a given group.
Arguments:
Group - Supplies the group.
InBuffer - Supplies the input buffer.
InBufferSize - Supplies the size of the input buffer.
Return Value:
ERROR_SUCCESS if successful.
A Win32 error code on failure.
--*/
{ DWORD status;
//
// Validate the property list.
//
status = ClRtlVerifyPropertyTable( FmpGroupCommonProperties, NULL, // Reserved
FALSE, // Don't allow uknowns
InBuffer, InBufferSize, NULL );
if ( status == ERROR_SUCCESS ) {
status = ClRtlSetPropertyTable( NULL, Group->RegistryKey, &FmpClusterRegApis, FmpGroupCommonProperties, NULL, // Reserved
FALSE, // Don't allow unknowns
InBuffer, InBufferSize, FALSE, // bForceWrite
NULL ); if ( status != ERROR_SUCCESS ) { ClRtlLogPrint( LOG_ERROR, "[FM] SetCommonProperties, error in set routine.\n"); } } else { ClRtlLogPrint( LOG_ERROR, "[FM] SetCommonProperties, error in verify routine.\n"); }
return(status);
} // FmpGroupSetCommonProperties
DWORD FmpGroupEnumPrivateProperties( PFM_GROUP Group, OUT PVOID OutBuffer, IN DWORD OutBufferSize, OUT LPDWORD BytesReturned, OUT LPDWORD Required )
/*++
Routine Description:
Enumerates the private property names for a given group.
Arguments:
OutBuffer - Supplies the output buffer.
OutBufferSize - Supplies the size of the output buffer.
BytesReturned - The number of bytes returned in OutBuffer.
Required - The required number of bytes if OutBuffer is too small.
Return Value:
ERROR_SUCCESS if successful.
A Win32 error code on failure.
--*/
{ DWORD status; HDMKEY groupKey; DWORD totalBufferSize = 0;
*BytesReturned = 0; *Required = 0;
//
// Clear the output buffer
//
ZeroMemory( OutBuffer, OutBufferSize );
//
// Open the cluster group parameters key.
//
groupKey = DmOpenKey( Group->RegistryKey, CLUSREG_KEYNAME_PARAMETERS, MAXIMUM_ALLOWED ); if ( groupKey == NULL ) { status = GetLastError(); if ( status == ERROR_FILE_NOT_FOUND ) { status = ERROR_SUCCESS; } return(status); }
//
// Enumerate the private properties.
//
status = ClRtlEnumPrivateProperties( groupKey, &FmpClusterRegApis, OutBuffer, OutBufferSize, BytesReturned, Required ); DmCloseKey( groupKey );
return(status);
} // FmpGroupEnumPrivateProperties
DWORD FmpGroupGetPrivateProperties( IN PFM_GROUP Group, OUT PVOID OutBuffer, IN DWORD OutBufferSize, OUT LPDWORD BytesReturned, OUT LPDWORD Required )
/*++
Routine Description:
Gets the private properties for a given group.
Arguments:
Group - Supplies the group.
OutBuffer - Supplies the output buffer.
OutBufferSize - Supplies the size of the output buffer.
BytesReturned - The number of bytes returned in OutBuffer.
Required - The required number of bytes if OutBuffer is too small.
Return Value:
ERROR_SUCCESS if successful.
A Win32 error code on failure.
--*/
{ DWORD status; HDMKEY groupKey; DWORD totalBufferSize = 0;
*BytesReturned = 0; *Required = 0;
//
// Clear the output buffer
//
ZeroMemory( OutBuffer, OutBufferSize );
//
// Open the cluster group parameters key.
//
groupKey = DmOpenKey( Group->RegistryKey, CLUSREG_KEYNAME_PARAMETERS, MAXIMUM_ALLOWED ); if ( groupKey == NULL ) { status = GetLastError(); if ( status == ERROR_FILE_NOT_FOUND ) { //
// If we don't have a parameters key, then return an
// item count of 0 and an endmark.
//
totalBufferSize = sizeof(DWORD) + sizeof(CLUSPROP_SYNTAX); if ( OutBufferSize < totalBufferSize ) { *Required = totalBufferSize; status = ERROR_MORE_DATA; } else { // This is somewhat redundant since we zero the
// buffer above, but it's here for clarity.
CLUSPROP_BUFFER_HELPER buf; buf.pb = OutBuffer; buf.pList->nPropertyCount = 0; buf.pdw++; buf.pSyntax->dw = CLUSPROP_SYNTAX_ENDMARK; *BytesReturned = totalBufferSize; status = ERROR_SUCCESS; } } return(status); }
//
// Get private properties for the group.
//
status = ClRtlGetPrivateProperties( groupKey, &FmpClusterRegApis, OutBuffer, OutBufferSize, BytesReturned, Required );
DmCloseKey( groupKey );
return(status);
} // FmpGroupGetPrivateProperties
DWORD FmpGroupValidatePrivateProperties( IN PFM_GROUP Group, IN PVOID InBuffer, IN DWORD InBufferSize )
/*++
Routine Description:
Validates the private properties for a given group.
Arguments:
Group - Supplies the group.
InBuffer - Supplies the input buffer.
InBufferSize - Supplies the size of the input buffer.
Return Value:
ERROR_SUCCESS if successful.
A Win32 error code on failure.
--*/
{ DWORD status;
//
// Validate the property list.
//
status = ClRtlVerifyPrivatePropertyList( InBuffer, InBufferSize );
return(status);
} // FmpGroupValidatePrivateProperties
DWORD FmpGroupSetPrivateProperties( IN PFM_GROUP Group, IN PVOID InBuffer, IN DWORD InBufferSize )
/*++
Routine Description:
Sets the private properties for a given group.
Arguments:
Group - Supplies the group.
InBuffer - Supplies the input buffer.
InBufferSize - Supplies the size of the input buffer.
Return Value:
ERROR_SUCCESS if successful.
A Win32 error code on failure.
--*/
{ DWORD status; HDMKEY groupKey; DWORD disposition;
//
// Validate the property list.
//
status = ClRtlVerifyPrivatePropertyList( InBuffer, InBufferSize );
if ( status == ERROR_SUCCESS ) {
//
// Open the cluster group\parameters key
//
groupKey = DmOpenKey( Group->RegistryKey, CLUSREG_KEYNAME_PARAMETERS, MAXIMUM_ALLOWED ); if ( groupKey == NULL ) { status = GetLastError(); if ( status == ERROR_FILE_NOT_FOUND ) { //
// Try to create the parameters key.
//
groupKey = DmCreateKey( Group->RegistryKey, CLUSREG_KEYNAME_PARAMETERS, 0, KEY_READ | KEY_WRITE, NULL, &disposition ); if ( groupKey == NULL ) { status = GetLastError(); return(status); } } }
status = ClRtlSetPrivatePropertyList( NULL, // IN HANDLE hXsaction
groupKey, &FmpClusterRegApis, InBuffer, InBufferSize ); DmCloseKey( groupKey );
}
return(status);
} // FmpGroupSetPrivateProperties
DWORD FmpGroupGetFlags( IN PFM_GROUP Group, OUT PVOID OutBuffer, IN DWORD OutBufferSize, OUT LPDWORD BytesReturned, OUT LPDWORD Required )
/*++
Routine Description:
Gets the flags for a given group.
Arguments:
Group - Supplies the group.
OutBuffer - Supplies the output buffer.
OutBufferSize - Supplies the size of the output buffer.
BytesReturned - The number of bytes returned in OutBuffer.
Required - The required number of bytes if OutBuffer is too small.
Return Value:
ERROR_SUCCESS if successful.
A Win32 error code on failure.
--*/
{ DWORD status;
*BytesReturned = 0;
if ( OutBufferSize < sizeof(DWORD) ) { *Required = sizeof(DWORD); if ( OutBuffer == NULL ) { status = ERROR_SUCCESS; } else { status = ERROR_MORE_DATA; } } else { DWORD valueType;
//
// Read the Flags value for the group.
//
*BytesReturned = OutBufferSize; status = DmQueryValue( Group->RegistryKey, CLUSREG_NAME_FLAGS, &valueType, OutBuffer, BytesReturned ); if ( status == ERROR_FILE_NOT_FOUND ) { *BytesReturned = sizeof(DWORD); *(LPDWORD)OutBuffer = 0; status = ERROR_SUCCESS; } }
return(status);
} // FmpGroupGetFlags
|