266 lines
6.4 KiB
C++
266 lines
6.4 KiB
C++
|
//+----------------------------------------------------------------------------
|
|||
|
//
|
|||
|
// 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;
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
|