2025-04-27 07:49:33 -04:00

154 lines
3.9 KiB
C++

//+----------------------------------------------------------------------------
//
// Copyright (C) 2001, Microsoft Corporation
//
// File: DfsServerSiteInfo.hxx
//
// Contents: the Dfs Site Information class.
//
// Classes: DfsServerSiteInfo
//
// History: Jan. 8 2001, Author: udayh
//
//-----------------------------------------------------------------------------
#ifndef __DFS_SITE_SUPPORT__
#define __DFS_SITE_SUPPORT__
#include "DfsGeneric.hxx"
#include "DfsServerSiteInfo.hxx"
#include "dfsnametable.h"
class DfsServerSiteInfo;
class DfsSiteSupport: public DfsGeneric
{
private:
struct _DFS_NAME_TABLE *_pServerTable;
public:
DfsSiteSupport(
DFSSTATUS *pStatus ) : DfsGeneric(DFS_OBJECT_TYPE_SITE_SUPPORT)
{
NTSTATUS NtStatus;
NtStatus = DfsInitializeNameTable ( 0,
&_pServerTable );
*pStatus = RtlNtStatusToDosError(NtStatus);
}
DFSSTATUS
LookupServerSiteInfo(
PUNICODE_STRING pServerName,
DfsServerSiteInfo **ppServerInfo)
{
DFSSTATUS Status;
NTSTATUS NtStatus;
PVOID pData;
NtStatus = DfsNameTableAcquireReadLock( _pServerTable );
if ( NtStatus == STATUS_SUCCESS )
{
NtStatus = DfsLookupNameTableLocked( _pServerTable,
pServerName,
&pData );
if (NtStatus == STATUS_SUCCESS)
{
Status = ERROR_SUCCESS;
*ppServerInfo = (DfsServerSiteInfo *)pData;
(*ppServerInfo)->AcquireReference();
}
DfsNameTableReleaseLock( _pServerTable );
}
if ( NtStatus != STATUS_SUCCESS )
{
Status = ERROR_NOT_FOUND;
}
return Status;
}
DFSSTATUS
AddServerSiteInfo(
PUNICODE_STRING pServerName,
DfsServerSiteInfo **ppServerInfo)
{
DFSSTATUS Status = ERROR_SUCCESS;
NTSTATUS NtStatus = STATUS_SUCCESS;
DfsServerSiteInfo *pNewServer = NULL;
pNewServer = new DfsServerSiteInfo(pServerName,
&Status );
if(pNewServer == NULL)
{
Status = ERROR_NOT_ENOUGH_MEMORY;
}
if (Status == ERROR_SUCCESS)
{
*ppServerInfo = pNewServer;
NtStatus = DfsNameTableAcquireWriteLock( _pServerTable );
if ( NtStatus == STATUS_SUCCESS )
{
NtStatus = DfsInsertInNameTableLocked( _pServerTable,
pNewServer->GetServerName(),
(PVOID)(pNewServer));
if (NtStatus == STATUS_SUCCESS)
{
pNewServer->AcquireReference();
}
DfsNameTableReleaseLock( _pServerTable );
}
}
return Status;
}
DFSSTATUS
GetServerSiteInfo(
IN PUNICODE_STRING pServerName,
OUT DfsServerSiteInfo **ppServerInfo )
{
DFSSTATUS Status;
Status = LookupServerSiteInfo( pServerName,
ppServerInfo );
if (Status == ERROR_SUCCESS)
{
Status = (*ppServerInfo)->Refresh();
} else {
Status = AddServerSiteInfo( pServerName,
ppServerInfo );
}
return Status;
}
DFSSTATUS
ReleaseServerSiteInfo(
DfsServerSiteInfo *pServerInfo )
{
pServerInfo->ReleaseReference();
return STATUS_SUCCESS;
}
};
#endif __DFS_SITE_SUPPORT__