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.
 
 
 
 
 
 

387 lines
10 KiB

//+----------------------------------------------------------------------------
//
// Copyright (C) 2000, Microsoft Corporation
//
// File: DfsRegistryStore.hxx
//
// Contents: the Registry DFS Store class, this contains the registry
// specific functionality.
//
// Classes: DfsRegistryStore.
//
// History: Dec. 8 2000, Author: udayh
//
//-----------------------------------------------------------------------------
#ifndef __DFS_REGISTRY_STORE__
#define __DFS_REGISTRY_STORE__
#include "DfsStore.hxx"
//+----------------------------------------------------------------------------
//
// Class: DfsRegistryStore
//
// Synopsis: This class inherits the basic DfsStore, and extends it
// to include the registry specific functionality.
//
//-----------------------------------------------------------------------------
#define DFS_REGISTRY_DATA_TYPE REG_BINARY
extern MARSHAL_INFO MiStdDfsIdProperty;
#define INIT_STANDALONE_DFS_ID_PROPERTY_INFO() \
static MARSHAL_TYPE_INFO _MCode_StdDfsIdProperty[] = { \
_MCode_pwstr(DFS_NAME_INFORMATION, Prefix), \
_MCode_pwstr(DFS_NAME_INFORMATION, ShortPrefix), \
_MCode_guid(DFS_NAME_INFORMATION, VolumeId), \
_MCode_ul(DFS_NAME_INFORMATION, State), \
_MCode_ul(DFS_NAME_INFORMATION, Type), \
_MCode_pwstr(DFS_NAME_INFORMATION, Comment), \
_MCode_struct(DFS_NAME_INFORMATION, PrefixTimeStamp, &MiFileTime), \
_MCode_struct(DFS_NAME_INFORMATION, StateTimeStamp, &MiFileTime), \
_MCode_struct(DFS_NAME_INFORMATION, CommentTimeStamp, &MiFileTime), \
}; \
MARSHAL_INFO MiStdDfsIdProperty = _mkMarshalInfo(DFS_NAME_INFORMATION, _MCode_StdDfsIdProperty);
class DfsRegistryStore: public DfsStore
{
private:
//
// Function UnpackNameInformation: Takes the binary blob in ppBuffer
// and unravels it to return the filled in DfsNameInfo.
//
DFSSTATUS
PackGetNameInformation(
IN PDFS_NAME_INFORMATION pDfsNameInfo,
IN OUT PVOID *ppBuffer,
IN OUT PULONG pSizeRemaining);
//
// Function UnpackNameInformation: Takes the binary blob in ppBuffer
// and unravels it to return the filled in DfsNameInfo.
//
DFSSTATUS
PackSetNameInformation(
IN PDFS_NAME_INFORMATION pDfsNameInfo,
IN OUT PVOID *ppBuffer,
IN OUT PULONG pSizeRemaining);
//
// Function UnpackNameInformation: Takes the binary blob in ppBuffer
// and unravels it to return the filled in DfsNameInfo.
//
ULONG
PackSizeNameInformation(
IN PDFS_NAME_INFORMATION pDfsNameInfo );
//
// Function GetMetadata: Takes the root key, and relative registry
// name and key name, and returns the binary blob associated with
// that registry key.
//
DFSSTATUS
GetMetadata (
IN HKEY DfsMetadataKey,
IN LPWSTR RelativeName,
IN LPWSTR RegistryValueNameString,
OUT PVOID *ppData,
OUT ULONG *pDataSize,
OUT PFILETIME pLastModifiedTime );
//
// Function GetMetadata: Takes the root key, and relative registry
// name and key name, and returns the binary blob associated with
// that registry key.
//
DFSSTATUS
SetMetadata (
IN HKEY DfsMetadataKey,
IN LPWSTR RelativeName,
IN LPWSTR RegistryValueNameString,
IN PVOID pData,
IN ULONG DataSize );
//
// Function GetDataRecoveryState: Gets the recovery state
// of this child.
//
DFSSTATUS
GetDataRecoveryState (
IN HKEY DfsMetadataKey,
IN LPWSTR RelativeName,
OUT PULONG pRecoveryState );
public:
//
// Function DfsRegistryStore: Constructor.
//
DfsRegistryStore(DFSSTATUS *pStatus) :
DfsStore(L"Registry", DFS_OBJECT_TYPE_REGISTRY_STORE, pStatus)
{
NOTHING;
}
//
// Function DfsRegistryStore: Destructor.
//
~DfsRegistryStore()
{
NOTHING;
}
//
// Function StoreRecognizer: given a name, determines if that
// namespace holds a registry based dfs.
//
DFSSTATUS
StoreRecognizer(
LPWSTR Name );
//
// Function StoreRecognizer: given a name, determines if that
// namespace holds a registry based dfs.
//
DFSSTATUS
StoreRecognizer(
LPWSTR Name,
PUNICODE_STRING pShare );
//
// Function CreateNewRootFolder: Creates a new root folder
// for the passed in name context, and logical share.
//
DFSSTATUS
CreateNewRootFolder (
LPWSTR MachineName,
LPWSTR RootRegKeyName,
PUNICODE_STRING pLogicalShare,
PUNICODE_STRING pPhysicalShare,
DfsRootFolder **pRoot );
//
// Function GetRootKey: Gets the key for the root of the DFS
// metadata
//
DFSSTATUS
GetRootKey(
LPWSTR MachineName,
LPWSTR RootRegistryName,
BOOLEAN *pMachineContacted,
OUT PHKEY pDfsRootKey );
//
// Function ReleaseRootKey: closes the opened root key.
//
VOID
ReleaseRootKey(
HKEY RootKey )
{
RegCloseKey( RootKey );
}
DFSSTATUS
StoreRecognizeOldStandaloneDfs(
LPWSTR MachineName,
HKEY OldDfsKey );
DFSSTATUS
CreateNewChild(
IN DFS_METADATA_HANDLE DfsHandle,
IN PVOID pNameBlob,
IN ULONG NameBlobSize,
IN PVOID pReplicaBlob,
IN ULONG ReplicaBlobSize,
OUT PUNICODE_STRING pMetadataName );
DFSSTATUS
RemoveChild(
DFS_METADATA_HANDLE DfsHandle,
LPWSTR ChildName );
DFSSTATUS
CreateStandaloneRoot(
LPWSTR MachineName,
LPWSTR LogicalShare,
LPWSTR Comment );
DFSSTATUS
DeleteStandaloneRoot(
LPWSTR MachineName,
LPWSTR LogicalShare );
DFSSTATUS
EnumerateApiLinks(
DFS_METADATA_HANDLE DfsHandle,
PUNICODE_STRING pRootName,
DWORD Level,
LPBYTE pBuffer,
LONG BufferSize,
LPDWORD pEntriesToRead,
LPDWORD pResumeHandle,
PLONG pNextSizeRequired );
DFSSTATUS
GetMetadataNameBlob(
DFS_METADATA_HANDLE RootHandle,
LPWSTR MetadataName,
PVOID *ppData,
PULONG pDataSize,
PFILETIME pLastModifiedTime );
DFSSTATUS
GetMetadataReplicaBlob(
DFS_METADATA_HANDLE RootHandle,
LPWSTR MetadataName,
PVOID *ppData,
PULONG pDataSize,
PFILETIME pLastModifiedTime );
DFSSTATUS
SetMetadataNameBlob(
DFS_METADATA_HANDLE RootHandle,
LPWSTR MetadataName,
PVOID pData,
ULONG DataSize );
DFSSTATUS
SetMetadataReplicaBlob(
DFS_METADATA_HANDLE RootHandle,
LPWSTR MetadataName,
PVOID pData,
ULONG DataSize );
DFSSTATUS
GenerateMetadataLogicalName(
PUNICODE_STRING pRootName,
PUNICODE_STRING pInput,
PUNICODE_STRING pOutput )
{
UNICODE_STRING FirstComponent;
DFSSTATUS Status;
UNREFERENCED_PARAMETER(pRootName);
Status = DfsGetFirstComponent( pInput,
&FirstComponent,
pOutput );
if (Status == ERROR_SUCCESS)
{
//
// The old standalone dfs has the link name as \share\linkname
// while none of the code really cares, and deals well with
// either share\linkname of \share\linkname, this hack is
// added just to be consistent with one naming.
// Back the output by one to point to the \ just after the
// first component.
//
if (pOutput->Length > 0)
{
pOutput->Buffer--;
pOutput->Length += sizeof(WCHAR);
}
}
return Status;
}
DFSSTATUS
GenerateApiLogicalPath (
IN PUNICODE_STRING pRootName,
IN PUNICODE_STRING pMetadataPrefix,
IN PUNICODE_STRING pApiLogicalName )
{
DFSSTATUS Status;
UNICODE_STRING LinkName = *pMetadataPrefix;
if (LinkName.Length > 0 && LinkName.Buffer[0] == UNICODE_PATH_SEP)
{
LinkName.Buffer++;
LinkName.Length -= sizeof(WCHAR);
}
Status = DfsCreateUnicodePathStringFromUnicode( pApiLogicalName,
2, // 2 leading path sep.
pRootName,
&LinkName );
return Status;
}
VOID
ReleaseApiLogicalPath (
PUNICODE_STRING pName )
{
DfsFreeUnicodeString( pName );
}
VOID
ReleaseMetadataLogicalName(
PUNICODE_STRING pName )
{
UNREFERENCED_PARAMETER(pName);
return NOTHING;
}
DFSSTATUS
AddChild(
DFS_METADATA_HANDLE DfsHandle,
IN PDFS_NAME_INFORMATION pNameInfo,
IN PDFS_REPLICA_LIST_INFORMATION pReplicaListInfo,
IN PUNICODE_STRING pMetadataName );
DFSSTATUS
LookupNewRootByName(
LPWSTR ShareName,
DfsRootFolder **ppRootFolder );
DFSSTATUS
LookupDotNetRootByName(
LPWSTR ShareName,
DfsRootFolder **ppRootFolder );
DFSSTATUS
LookupOldRootByName(
LPWSTR ShareName,
DfsRootFolder **ppRootFolder );
static DFSSTATUS
CleanRegEntry(
LPWSTR MachineName,
LPWSTR LogicalShare);
};
#endif // __DFS_REGISTRY_STORE__