// // Copyright (C) 2000, Microsoft Corporation // // File: DfsADBlobStore.hxx // // Contents: the ADBlob DFS Store class, this contains the // old AD blob store specific functionality. // // Classes: DfsADBlobStore. // // History: Dec. 8 2000, Author: udayh // //----------------------------------------------------------------------------- #ifndef __DFS_ADBLOB_STORE__ #define __DFS_ADBLOB_STORE__ #include "DfsStore.hxx" #include "dfsadblobcache.hxx" #include #include #include #include "netdfs.h" //+---------------------------------------------------------------------------- // // Class: DfsADBlobStore // // Synopsis: This class inherits the basic DfsStore, and extends it // to include the old AD blob specific functionality. // //----------------------------------------------------------------------------- extern MARSHAL_INFO MiADBlobDfsIdProperty; #define INIT_ADBLOB_DFS_ID_PROPERTY_INFO() \ static MARSHAL_TYPE_INFO _MCode_ADBlobDfsIdProperty[] = { \ _MCode_guid(DFS_NAME_INFORMATION, VolumeId), \ _MCode_pwstr(DFS_NAME_INFORMATION, Prefix), \ _MCode_pwstr(DFS_NAME_INFORMATION, ShortPrefix), \ _MCode_ul(DFS_NAME_INFORMATION, Type), \ _MCode_ul(DFS_NAME_INFORMATION, State), \ _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), \ _MCode_ul(DFS_NAME_INFORMATION, Version), \ }; \ MARSHAL_INFO MiADBlobDfsIdProperty = _mkMarshalInfo(DFS_NAME_INFORMATION, _MCode_ADBlobDfsIdProperty); class DfsADBlobStore: 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 ); DFSSTATUS RenameNameInfo( IN DFS_METADATA_HANDLE RootHandle, IN PUNICODE_STRING pLinkMetadataName, IN PUNICODE_STRING pNewDomainName, IN PUNICODE_STRING pOldDomainName); DFSSTATUS RenameReplicaInfo( IN DFS_METADATA_HANDLE RootHandle, IN PUNICODE_STRING pLinkMetadataName, IN PUNICODE_STRING pNewDomainName, IN PUNICODE_STRING pOldDomainName); public: DfsADBlobStore(DFSSTATUS *pStatus) : DfsStore(L"ADBlob", DFS_OBJECT_TYPE_ADBLOB_STORE, pStatus) { NOTHING; } ~DfsADBlobStore() { NOTHING; } DFSSTATUS RootEntryExists( IN PVOID DfsMetadataKey, PBOOLEAN pNewRoot ) { PDFSBLOB_DATA BlobData; UNICODE_STRING BlobName; DfsADBlobCache * pBlobCache; DFSSTATUS Status; *pNewRoot = FALSE; RtlInitUnicodeString( &BlobName, NULL); pBlobCache = (DfsADBlobCache *)ExtractFromMetadataHandle( DfsMetadataKey ); Status = pBlobCache->GetNamedBlob(&BlobName, &BlobData); if (Status == ERROR_SUCCESS) { pBlobCache->ReleaseBlobCacheReference(BlobData); *pNewRoot = FALSE; } else if (Status == ERROR_NOT_FOUND) { *pNewRoot = TRUE; Status = ERROR_SUCCESS; } return Status; } // // The recognizers: one to recognize and read in an // entire namespace, the other to do the same for // a specific root. // DFSSTATUS StoreRecognizer( LPWSTR Name ); DFSSTATUS StoreRecognizer ( LPWSTR DfsNameContext, PUNICODE_STRING pLogicalShare ); // // 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 ); DFSSTATUS CreateADBlobRoot( LPWSTR MachineName, LPWSTR DcName, LPWSTR PhysicalShare, LPWSTR LogicalShare, LPWSTR Comment, BOOLEAN NewRoot); DFSSTATUS DeleteADBlobRoot( LPWSTR MachineName, LPWSTR DcName, LPWSTR PhysicalShare, LPWSTR LogicalShare ); DFSSTATUS DeleteADBlobRootForced( LPWSTR MachineName, LPWSTR DcName, LPWSTR PhysicalShare, LPWSTR LogicalShare ); DFSSTATUS AddRootToBlob( LPWSTR MachineName, DfsRootFolder *pRootFolder, BOOLEAN NewRoot, LPWSTR LogicalShare, LPWSTR ShareName, LPWSTR Comment ); DFSSTATUS RemoveRootFromBlob( DfsRootFolder *pRootFolder, LPWSTR MachineName, LPWSTR ShareName, PBOOLEAN IsLastRoot ); VOID ReleaseMetadata( IN PVOID DfsMetadataHandle, IN PVOID pBuffer ) { DfsADBlobCache * pBlobCache = (DfsADBlobCache *) DfsMetadataHandle; pBlobCache->ReleaseBlobCacheReference((PDFSBLOB_DATA) pBuffer); } // // Function ReleaseDataNameInformation: releases the metadata // information allocated in the prior get. // DFSSTATUS GetMetadata ( IN PVOID DfsMetadataKey, IN LPWSTR RelativeName, IN LPWSTR RegistryValueNameString, OUT PVOID *ppData, OUT ULONG *pDataSize, OUT PFILETIME pLastModifiedTime); DFSSTATUS SetMetadata ( IN PVOID DfsMetadataKey, IN LPWSTR RelativeName, IN LPWSTR RegistryValueNameString, IN PVOID pData, IN ULONG DataSize); DFSSTATUS RemoveMetadata ( IN PVOID DfsMetadataKey, IN LPWSTR RelativeName); DFSSTATUS RemoveChild( DFS_METADATA_HANDLE DfsHandle, LPWSTR ChildName ); 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( IN PUNICODE_STRING pRootName, PUNICODE_STRING pInput, PUNICODE_STRING pOutput ) { DFSSTATUS Status; UNICODE_STRING FirstComponent; UNICODE_STRING Remaining; // // For the ad blob store, the metadata prefix holds the // name context, the share name and the link name. // However, we will want to replace the first component // with the rootname, so that when domains are renamed, // we keep passing back correct information even though // the blob has not been updated. // Status = DfsGetFirstComponent( pInput, &FirstComponent, &Remaining ); if (Status == ERROR_SUCCESS) { Status = DfsCreateUnicodePathStringFromUnicode( pOutput, 1, // 1 leading path sep pRootName, &Remaining ); } return Status; } VOID ReleaseMetadataLogicalName( PUNICODE_STRING pName ) { DfsFreeUnicodeString( pName ); } DFSSTATUS GenerateApiLogicalPath ( IN PUNICODE_STRING pRootName, IN PUNICODE_STRING pMetadataPrefix, IN PUNICODE_STRING pApiLogicalName ); VOID ReleaseApiLogicalPath ( PUNICODE_STRING pName ) { DfsFreeUnicodeString( pName ); } DFSSTATUS GenerateLinkMetadataName( UUID *pUid, PUNICODE_STRING pLinkMetadataName ) { DFSSTATUS Status = ERROR_SUCCESS; LPWSTR String; Status = UuidToString( pUid, &String ); if (Status == ERROR_SUCCESS) { Status = DfsCreateUnicodePathString ( pLinkMetadataName, 0, // no leading path sep ADBlobMetaDataNamePrefix, String ); RpcStringFree(&String ); } return Status; } VOID ReleaseLinkMetadataName( PUNICODE_STRING pLinkMetadataName ) { DfsFreeUnicodeString( pLinkMetadataName ); return NOTHING; } DFSSTATUS GetMetadataNameInformation( IN DFS_METADATA_HANDLE RootHandle, IN LPWSTR MetadataName, OUT PDFS_NAME_INFORMATION *ppInfo ); VOID ReleaseMetadataNameInformation( IN DFS_METADATA_HANDLE RootHandle, IN PDFS_NAME_INFORMATION pNameInfo ); DFSSTATUS SetMetadataNameInformation( IN DFS_METADATA_HANDLE RootHandle, IN LPWSTR MetadataName, IN PDFS_NAME_INFORMATION pNameInfo ); DFSSTATUS AddChild( DFS_METADATA_HANDLE DfsHandle, IN PDFS_NAME_INFORMATION pNameInfo, IN PDFS_REPLICA_LIST_INFORMATION pReplicaListInfo, IN PUNICODE_STRING pMetadataName ); DFSSTATUS AddChild( DFS_METADATA_HANDLE DfsHandle, IN PDFS_NAME_INFORMATION pNameInfo, IN PDFS_REPLICA_LIST_INFORMATION pReplicaListInfo, IN PUNICODE_STRING pMetadataName, IN LPWSTR DCName ); DFSSTATUS RenameLinks( DFS_METADATA_HANDLE RootHandle, IN PUNICODE_STRING pLinkMetadataName, IN PUNICODE_STRING pOldDomainName, IN PUNICODE_STRING pNewDomainName); DFSSTATUS GetCompatRootFolder( PUNICODE_STRING pName, DfsRootFolder **pRoot ); static DFSSTATUS CleanRegEntry( LPWSTR MachineName, LPWSTR LogicalShare); DFSSTATUS DoesUserHaveAccess(DfsRootFolder *pRootFolder, DWORD DesiredAccess); }; #endif // __DFS_ADBLOB_STORE__