|
|
/*++
Copyright (c) 1991 Microsoft Corporation
Module Name:
wsuse.h
Abstract:
Private header file to be included by Workstation service modules that implement the NetUse APIs.
Author:
Rita Wong (ritaw) 05-Mar-1991
Revision History:
--*/
#ifndef _WSUSE_INCLUDED_
#define _WSUSE_INCLUDED_
#include <lmuse.h> // LAN Man Use API definitions
#include <dns.h> // DNS_MAX_NAME_LENGTH definition
//
// Length of fixed size portion of a use info structure
//
#define USE_FIXED_LENGTH(Level) \
(DWORD) \ ((Level == 0) ? sizeof(USE_INFO_0) : \ ((Level == 1) ? sizeof(USE_INFO_1) : \ ((Level == 2) ? sizeof(USE_INFO_2) : \ sizeof(USE_INFO_3))))
//
// Total length of a use info structure (fixed and variable length portions)
//
#define USE_TOTAL_LENGTH(Level, LocalandUncNameLength, UserNameLength) \
(DWORD) \ ((Level >= 2) ? (LocalandUncNameLength) + (UserNameLength) + \ ((Level == 3) ? sizeof(USE_INFO_3) : sizeof(USE_INFO_2)) : \ (LocalandUncNameLength) + ((Level == 1) ? \ sizeof(USE_INFO_1) : \ sizeof(USE_INFO_0)))
//
// Hint size of an entry of use information from redirector
//
#define HINT_REDIR_INFO(Level) \
(DWORD) \ ((Level == 1) ? sizeof(LMR_CONNECTION_INFO_1) + \ MAX_PATH * sizeof(WCHAR) : \ sizeof(LMR_CONNECTION_INFO_2) + \ (MAX_PATH + MAX_PATH) * sizeof(WCHAR)) //
// Length of fixed size portion of a redirector enumerate info structure
//
#define REDIR_ENUM_INFO_FIXED_LENGTH(Level) \
(DWORD) \ ((Level == 0) ? sizeof(LMR_CONNECTION_INFO_0) : \ ((Level == 1) ? sizeof(LMR_CONNECTION_INFO_1) : \ sizeof(LMR_CONNECTION_INFO_2)))
#define REDIR_LIST 0x80000000
//-----------------------------------------------------------------------//
// //
// Use Table //
// //
// +-----------------+ +-----------------+ //
// |TotalUseCount = 6| |TotalUseCount = 1| //
// +-----------------+ +-----------------+ //
// | RedirUseInfo | | RedirUseInfo | //
// +-----------------+ +-----------------+ //
// | UncNameLength | | UncNameLength | //
// +-----------------+ +-----------------+ //
// |\\POPCORN\RAZZLE | |\\FUZZY\PRINTER | //
// +-----------------+ +-----------------+ //
// ^ ^ ^ //
// | | | //
// +---+ +---+ | //
// | | | //
// +------------+ +--|--+------+ +--|--+------+ +--|--+------+ //
// | | | * | *---->| * | *---->| * | *---->... //
// | *-------->+-----+------+ +-----+------+ +-----+------+ //
// | | | P: |Local | |NULL |Local | |LPT1 |Local | //
// +------------+ | |Length| | |Length| | |Length| //
// | | +-----+------+ +-----+------+ +-----+------+ //
// | | |UseCount = 1| |UseCount = 5| |UseCount = 1| //
// 0 | LogonId | +------------+ +------------+ +------------+ //
// | | |Tree | |Tree | |Tree | //
// | | |Connection | |Connection | |Connection | //
// | | +------------+ +------------+ +------------+ //
// | | |ResumeKey | |ResumeKey | |ResumeKey | //
// | | +------------+ +------------+ +------------+ //
// | | |TreeConnStr | | NULL | |TreeConnStr | //
// | | +------------+ +------------+ +------------+ //
// | | //
// +============+ //
// | | //
// | *--------> ... //
// | | //
// +------------+ //
// | | //
// | LogonId | //
// 1 | | //
// | | //
// | | //
// | | //
// | | //
// | | //
// | | //
// | | //
// +============+ //
// | . | //
// | . | //
// | . | //
// //
// //
// The Use Table maintained by the Workstation service keeps a list of //
// explicit connections established by each user. A use entry is always //
// inserted into the end of the list. //
// //
// Implicit connections are not maintained in the Use Table. The //
// Workstation service has to ask the redirector to list all established //
// implicit connections when enumerating all active connections for a //
// user. //
// //
//-----------------------------------------------------------------------//
//
// The structure definition for the per user entry, which consists of a
// Logon Id and a pointer to a list, is defined in wsutil.h
//
//
// A remote entry for every unique shared resource name (\\server\share)
// of explicit connections.
//
typedef struct _UNC_NAME { DWORD TotalUseCount; DWORD UncNameLength; LPTSTR UncName[1]; } UNC_NAME, *PUNC_NAME;
//
// A use entry in the linked list of connections.
//
typedef struct _USE_ENTRY { struct _USE_ENTRY *Next; PUNC_NAME Remote; LPTSTR Local; DWORD LocalLength; DWORD UseCount; HANDLE TreeConnection; DWORD ResumeKey; LPTSTR TreeConnectStr; DWORD Flags; } USE_ENTRY, *PUSE_ENTRY;
//
// Values for flags field
//
// USE_DEFAULT_CREDENTIALS 0x4 (defined in lmuse.h)
//
// Enumerated data type to say whether to pause or continue the redirection
//
typedef enum _REDIR_OPERATION { PauseRedirection, ContinueRedirection } REDIR_OPERATION;
//-------------------------------------------------------------------//
// //
// Utility functions from useutil.c //
// //
//-------------------------------------------------------------------//
NET_API_STATUS WsInitUseStructures( VOID );
VOID WsDestroyUseStructures( VOID );
VOID WsFindInsertLocation( IN PUSE_ENTRY UseList, IN LPTSTR UncName, OUT PUSE_ENTRY *MatchedPointer, OUT PUSE_ENTRY *InsertPointer );
NET_API_STATUS WsFindUse( IN PLUID LogonId, IN PUSE_ENTRY UseList, IN LPTSTR UseName, OUT PHANDLE TreeConnection, OUT PUSE_ENTRY *MatchedPointer, OUT PUSE_ENTRY *BackPointer OPTIONAL );
VOID WsFindUncName( IN PUSE_ENTRY UseList, IN LPTSTR UncName, OUT PUSE_ENTRY *MatchedPointer, OUT PUSE_ENTRY *BackPointer );
NET_API_STATUS WsCreateTreeConnectName( IN LPTSTR UncName, IN DWORD UncNameLength, IN LPTSTR LocalName, IN DWORD SessionId, OUT PUNICODE_STRING TreeConnectStr );
NET_API_STATUS WsOpenCreateConnection( IN PUNICODE_STRING TreeConnectionName, IN LPTSTR UserName OPTIONAL, IN LPTSTR DomainName OPTIONAL, IN LPTSTR Password OPTIONAL, IN ULONG CreateFlags, IN ULONG CreateDisposition, IN ULONG ConnectionType, OUT PHANDLE TreeConnectionHandle, OUT PULONG_PTR Information OPTIONAL );
NET_API_STATUS WsDeleteConnection( IN PLUID LogonId, IN HANDLE TreeConnection, IN DWORD ForceLevel );
BOOL WsRedirectionPaused( IN LPTSTR LocalDeviceName );
VOID WsPauseOrContinueRedirection( IN REDIR_OPERATION OperationType );
NET_API_STATUS WsCreateSymbolicLink( IN LPWSTR Local, IN DWORD DeviceType, IN LPWSTR TreeConnectStr, IN PUSE_ENTRY UseList, IN OUT LPWSTR *Session, IN OUT HANDLE *lphToken );
VOID WsDeleteSymbolicLink( IN LPWSTR LocalDeviceName, IN LPWSTR TreeConnectStr, IN LPWSTR SessionDeviceName, IN HANDLE hToken );
NET_API_STATUS WsUseCheckRemote( IN LPTSTR RemoteResource, OUT LPTSTR UncName, OUT LPDWORD UncNameLength );
NET_API_STATUS WsUseCheckLocal( IN LPTSTR LocalDevice, OUT LPTSTR Local, OUT LPDWORD LocalLength );
//-------------------------------------------------------------------//
// //
// External global variables //
// //
//-------------------------------------------------------------------//
//
// Use Table
//
extern USERS_OBJECT Use;
#endif // ifndef _WSUSE_INCLUDED_
|