windows-nt/Source/XPSP1/NT/base/fs/dfs/dfsm/server/jnpt.cxx
2020-09-26 16:20:57 +08:00

266 lines
6.4 KiB
C++
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//+----------------------------------------------------------------------------
//
// Copyright (C) 1995, Microsoft Corporation
//
// File: jnpt.cxx
//
// Contents: Junction point creation/deletion/modification related
// functions
//
// Classes:
//
// Functions:
//
// History: 8-2-95 Sudk Created
// 12-27-95 Milans Modified for NT/SUR
//
//-----------------------------------------------------------------------------
#include "headers.hxx"
#pragma hdrstop
extern "C" {
#include <string.h>
#include <nodetype.h>
#include <fsctrl.h>
#include <dfsmrshl.h>
#include <upkt.h>
#include <ntddnfs.h>
#include <dfsgluon.h>
#include <dfserr.h>
}
#include "service.hxx"
//+----------------------------------------------------------------------------
//
// Function: IsValidWin32Path
//
// Synopsis: Given a prefix, determines if it is a valid win32 path. This
// routine checks for invalid names in win32, like com1 etc. It
// also checks to see if the prefix, canonicalized for spaces,
// ., and .. is still a valid prefix.
//
// Arguments: [pwszPrefix] -- The prefix to check
//
// Returns: TRUE if valid win32 path, FALSE otherwise
//
//-----------------------------------------------------------------------------
BOOLEAN
IsValidWin32Path(
IN LPWSTR pwszPrefix)
{
BOOLEAN fIsValid = FALSE;
UNICODE_STRING ustrWin32, ustrRoot;
ULONG cwPrefix;
WCHAR wszWin32Path[MAX_PATH];
LPWSTR wszRoot = L"C:\\";
LPWSTR wszRootAndPrefix;
cwPrefix = wcslen( pwszPrefix );
//
// We don't allow the last character to be a backslash
//
if (cwPrefix == 0 || pwszPrefix[cwPrefix-1] == UNICODE_PATH_SEP) {
return( FALSE );
}
//
// Form a dummy path that looks like "c:\<pwszPrefix>"
//
if (cwPrefix < (MAX_PATH - 3)) {
wszRootAndPrefix = wszWin32Path;
} else {
wszRootAndPrefix = new WCHAR[ 3 + cwPrefix + 1 ];
if (wszRootAndPrefix == NULL) {
return( FALSE );
}
}
wcscpy( wszRootAndPrefix, wszRoot );
if (pwszPrefix[0] == UNICODE_PATH_SEP)
wcscat( wszRootAndPrefix, &pwszPrefix[1] );
else
wcscat( wszRootAndPrefix, pwszPrefix );
//
// Convert the dummy path to an NT path and compare against the root
//
if (RtlDosPathNameToNtPathName_U(wszRootAndPrefix, &ustrWin32, 0, 0)) {
if (RtlDosPathNameToNtPathName_U(wszRoot, &ustrRoot, 0, 0)) {
fIsValid = !RtlEqualUnicodeString(&ustrRoot, &ustrWin32, TRUE);
RtlFreeUnicodeString( &ustrRoot );
}
RtlFreeUnicodeString( &ustrWin32 );
}
if (wszRootAndPrefix != wszWin32Path)
delete [] wszRootAndPrefix;
return( fIsValid );
}
//+-------------------------------------------------------------------------
//
// Function: DfsGetDSMachine
//
// Synopsis: This function sets DS_MACHINE property on machine object
//
// Arguments: [pwszServer] -- NetBIOS name of server for which DS_MACHINE
// is required.
//
// [ppMachine] -- On successful return, contains pointer to
// allocated DS_MACHINE.
//
//
// History: 8-2-94 SudK Created
// 12-27-95 Milans Modified for NT/SUR.
//
//--------------------------------------------------------------------------
#define SIZE_OF_DS_MACHINE_WITH_1_ADDR \
(sizeof(DS_MACHINE) + sizeof(LPWSTR) + sizeof(DS_TRANSPORT) + sizeof(TDI_ADDRESS_NETBIOS))
DWORD
DfsGetDSMachine(
LPWSTR pwszServer,
PDS_MACHINE *ppMachine
)
{
DWORD dwErr;
PDS_MACHINE pdsMachine;
PDS_TRANSPORT pdsTransport;
PTDI_ADDRESS_NETBIOS ptdiNB;
LPWSTR wszPrincipalName;
LPWSTR pwszNetBIOSName;
IDfsVolInlineDebOut((DEB_TRACE, "DfsGetDSMachine(%ws)\n", pwszServer));
ASSERT( pwszServer != NULL );
pwszNetBIOSName = pwszServer;
pdsMachine = (PDS_MACHINE) MarshalBufferAllocate(
SIZE_OF_DS_MACHINE_WITH_1_ADDR +
wcslen(pwszServer) * sizeof(WCHAR) +
sizeof(UNICODE_NULL));
if (pdsMachine != NULL) {
ZeroMemory( pdsMachine, sizeof(DS_MACHINE) );
//
// Insert the principal name - simply domain\machine
//
pdsMachine->cPrincipals = 1;
wszPrincipalName = (LPWSTR) (((PCHAR) pdsMachine) +
SIZE_OF_DS_MACHINE_WITH_1_ADDR);
wcscpy( wszPrincipalName, pwszServer );
pdsMachine->prgpwszPrincipals = (LPWSTR *) (pdsMachine + 1);
pdsMachine->prgpwszPrincipals[0] = wszPrincipalName;
//
// Build the NetBIOS DS_TRANSPORT structure
//
pdsMachine->cTransports = 1;
pdsTransport = (PDS_TRANSPORT) (pdsMachine + 1);
pdsTransport = (PDS_TRANSPORT)
(((PUCHAR) pdsTransport) + sizeof(LPWSTR));
pdsMachine->rpTrans[0] = pdsTransport;
pdsTransport->usFileProtocol = FSP_SMB;
pdsTransport->iPrincipal = 0;
pdsTransport->grfModifiers = 0;
//
// Build the TA_ADDRESS_NETBIOS
//
pdsTransport->taddr.AddressLength = sizeof(TDI_ADDRESS_NETBIOS);
pdsTransport->taddr.AddressType = TDI_ADDRESS_TYPE_NETBIOS;
ptdiNB = (PTDI_ADDRESS_NETBIOS) &pdsTransport->taddr.Address[0];
ptdiNB->NetbiosNameType = TDI_ADDRESS_NETBIOS_TYPE_UNIQUE;
FillMemory( &ptdiNB->NetbiosName[0], 16, ' ' );
wcstombs(
(PCHAR) &ptdiNB->NetbiosName[0],
pwszNetBIOSName,
wcslen(pwszNetBIOSName));
*ppMachine = pdsMachine;
dwErr = ERROR_SUCCESS;
} else {
dwErr = ERROR_OUTOFMEMORY;
}
IDfsVolInlineDebOut((DEB_TRACE, "DfsGetDSMachine() exit\n"));
return( dwErr );
}
//+----------------------------------------------------------------------------
//
// Function: DfsMachineFree
//
// Synopsis: Deallocates a DS_MACHINE allocated by DfsGetDSMachine.
//
// Arguments: [pMachine] -- Pointer to DS_MACHINE returned by
// DfsGetDSMachine.
//
// Returns: Nothing
//
//-----------------------------------------------------------------------------
VOID
DfsMachineFree(
PDS_MACHINE pMachine)
{
ULONG i;
MarshalBufferFree(pMachine);
return;
}