Creating Network Name Resources
The following code demonstrates the creation of a Network Name resource.
#include <windows.h>
//////////////////////////////////////////////////////////////////////
#include "ClusDocEx.h"
//////////////////////////////////////////////////////////////////////
#ifndef CLUSDOCEX_RESCREATENETWORKNAME_CPP
#define CLUSDOCEX_RESCREATENETWORKNAME_CPP
//--------------------------------------------------------------------
//
// ClusDocEx_ResCreateNetworkName
//
// Creates a Network Name resource,
// sets its required private properties,
// and establishes a dependency on an IP Address resource.
//
// Arguments:
// IN HGROUP hGroup Group handle.
// IN HRESOURCE hIPDependency Handle to the IP Address dependency.
// IN LPWSTR lpszResName Name of the new Network Name
// resource (the resource name).
// IN LPWSTR lpszNetName Specifies the name of the network
// for which the Network Name resource
// is being created. This value will
// be used to set the Name private
// property.
//
// Return Value:
// Resource handle (if successful) or NULL (if unsuccessful)
//
//--------------------------------------------------------------------
HRESOURCE ClusDocEx_ResCreateNetworkName
(
IN HGROUP hGroup,
IN HRESOURCE hIPDependency,
IN LPWSTR lpszResName,
IN LPWSTR lpszNetName
)
{
HRESOURCE hNetNameRes = NULL;
LPVOID lpPropList = NULL;
LPVOID lpNameEntry = NULL;
DWORD cb;
DWORD cbPosition = 0;
DWORD cbNameEntrySize = 0;
DWORD cbPropListSize = 0;
DWORD dwResult = ERROR_SUCCESS;
CLUSPROP_BUFFER_HELPER cbh_read, cbh_write;
hNetNameRes = CreateClusterResource(
hGroup,
lpszResName,
L"Network Name",
0 );
if( hNetNameRes == NULL )
{
dwResult = GetLastError();
goto endf;
}
// Create a property list to set the Name private property.
// This example uses ClusDocEx_CreatePropertyListEntry, which
// is listed under "Creating Property Lists."
lpNameEntry = ClusDocEx_CreatePropertyListEntry(
L"Name",
CLUSPROP_SYNTAX_LIST_VALUE_SZ,
(lstrlenW( lpszNetName ) + 1 ) * sizeof( WCHAR ),
(LPVOID) lpszNetName,
&cbNameEntrySize );
// This is a single-value property list, thus the size is just
// the size of the entry plus the size of the property count.
cbPropListSize = sizeof( DWORD ) + cbNameEntrySize;
lpPropList = LocalAlloc( LPTR, cbPropListSize );
// Use cbh to write the property count (1) and the single entry
// to the property list buffer.
cbh_write.pb = (PBYTE) lpPropList;
cbh_read.pb = (PBYTE) lpNameEntry;
*cbh_write.pdw = 1;
cbPosition = sizeof( DWORD );
for( cb = 0 ; cb < cbNameEntrySize ; cb++, cbPosition++ )
cbh_write.pb[cbPosition] = cbh_read.pb[cb];
dwResult = ClusterResourceControl(
hNetNameRes,
NULL,
CLUSCTL_RESOURCE_SET_PRIVATE_PROPERTIES,
lpPropList,
cbPropListSize,
NULL,
0,
NULL );
if( dwResult != ERROR_SUCCESS )
{
goto endf;
}
// Establish the IP Address dependency.
dwResult = AddClusterResourceDependency(
hNetNameRes,
hIPDependency );
endf:
if( dwResult != ERROR_SUCCESS )
{
if( hNetNameRes != NULL )
{
DeleteClusterResource( hNetNameRes );
CloseClusterResource( hNetNameRes );
hNetNameRes = NULL;
}
}
if( lpNameEntry != NULL ) LocalFree( lpNameEntry );
if( lpPropList != NULL ) LocalFree( lpPropList );
SetLastError( dwResult );
return hNetNameRes;
}
// end ClusDocEx_ResCreateNetworkName
//--------------------------------------------------------------------
#endif