/*++

Copyright (c) 1991-1992 Microsoft Corporation

Module Name:

    SrvSvcP.h

Abstract:

    This is the header file for the NT server service.

Author:

    David Treadwell (davidtr)    10-Jan-1991

Revision History:

--*/

#ifndef _SRVSVCP_
#define _SRVSVCP_

#include <nt.h>
#include <ntrtl.h>
#include <nturtl.h>
#include <windows.h>
#include <rpc.h>
#include <lmcons.h>
#include <secobj.h>
#include <ntlsapi.h>
#include <srvfsctl.h>
#include <srvsvc.h>
#include <svcs.h>
#include <winreg.h>

#include "ssdebug.h"
#include "sssec.h"

//
// String constants.
//

#define IPC_SHARE_NAME TEXT("IPC$")
#define ADMIN_SHARE_NAME TEXT("ADMIN$")

#define  SRVSVC_MAX_NUMBER_OF_DISKS 26

//
// Internationalizable strings
//
extern LPWSTR SsAdminShareRemark ;
extern LPWSTR SsIPCShareRemark ;
extern LPWSTR SsDiskAdminShareRemark ;

//
// Bits of server type (in announcement messages) that can only be set
// by the server itself -- not by services via the internal API
// I_NetServerSetServiceBits.
//
// SV_TYPE_TIME_SOURCE is a pseudo internal bit.  It can be set internally or
//  it can be set by the w32time service.
//

#define SERVER_TYPE_INTERNAL_BITS (SV_TYPE_SERVER |         \
                                   SV_TYPE_PRINTQ_SERVER |  \
                                   SV_TYPE_NT |             \
                                   SV_TYPE_DFS)

//
// INITIAL_BUFFER_SIZE is the buffer size that GetInfo and Enum requests
// first try to fill.  If this buffer isn't large enough, they allocate
// a buffer large enough to hold all the information plus a fudge factor,
// EXTRA_ALLOCATION.
//

#define INITIAL_BUFFER_SIZE (ULONG)8192
#define EXTRA_ALLOCATION    1024

//
// ServerProductName in SERVER_SERVICE_DATA is the name passed to the
//  Licensing DLL as the name of this service.  MAXPRODNAME is the max
//  number of characters in the service name.

#define    SERVER_PRODUCT_NAME    L"SMBServer"

//  szVersionNumber in SERVER_SERVICE_DATA is the version string passed
//    to the Licensing DLL as the vesion of this service.  MAXVERSIONSZ
//    is the max number of characters for the version string

#define MAXVERSIONSZ    10

//
// Structures used to hold transport specific server type bits
//
typedef struct _TRANSPORT_LIST_ENTRY {
    struct _TRANSPORT_LIST_ENTRY    *Next;
    LPWSTR                          TransportName;                     // device name for xport
    DWORD                           ServiceBits;                       // SV... announce bits
} TRANSPORT_LIST_ENTRY, *PTRANSPORT_LIST_ENTRY;

typedef struct _NAME_LIST_ENTRY {
    struct _NAME_LIST_ENTRY         *Next;
    CHAR                            TransportAddress[ MAX_PATH ];       // address of this server
    ULONG                           TransportAddressLength;
    LPWSTR                          DomainName;                         // name of the domain
    DWORD                           ServiceBits;                        // SV... announce bits
    struct {
        ULONG                       PrimaryName: 1;   // Is this the server's primary name?
    };
    PTRANSPORT_LIST_ENTRY           Transports;
} NAME_LIST_ENTRY, *PNAME_LIST_ENTRY;

//
// Structure for server service global data.
//
typedef struct _SERVER_SERVICE_DATA {
    SERVER_INFO_102 ServerInfo102;
    SERVER_INFO_599 ServerInfo599;
    SERVER_INFO_598 ServerInfo598;

    //
    // Handle for accessing the server.
    //
    HANDLE SsServerDeviceHandle;

    //
    // Pointer to global data made available by SVCS main image.
    //
    PSVCHOST_GLOBAL_DATA SsLmsvcsGlobalData;

    //
    // Resource for synchronizing access to server info.
    //
    RTL_RESOURCE SsServerInfoResource;
    BOOL SsServerInfoResourceInitialized;

    //
    // Boolean indicating whether the server service is initialized.
    //
    BOOL SsInitialized;

    //
    // Boolean indicating whether the kernel-mode server FSP has been
    // started.
    //
    BOOL SsServerFspStarted;

    //
    // Event used for synchronizing server service termination.
    //
    HANDLE SsTerminationEvent;

    //
    // Event used for forcing the server to announce itself on the network from
    // remote clients.
    //
    HANDLE SsAnnouncementEvent;

    //
    // Event used for forcing the server to announce itself on the network from
    // inside the server service.
    //
    HANDLE SsStatusChangedEvent;

    //
    // Event used to detect domain name changes
    //
    HANDLE SsDomainNameChangeEvent;

    //
    // Name of this computer in OEM format.
    //
    CHAR SsServerTransportAddress[ MAX_PATH ];
    ULONG SsServerTransportAddressLength;

    //
    // List containing transport specific service names and bits
    //
    PNAME_LIST_ENTRY SsServerNameList;

    //
    // If we are asked to set some service bits before we've bound to
    //  any transports, we need to save those bits here and use them later
    //  when we finally do bind to transports.
    //
    DWORD   ServiceBits;

    BOOLEAN IsDfsRoot;                  // TRUE if we are the root of a DFS tree
    UNICODE_STRING ServerAnnounceName;
    LONG  NumberOfPrintShares;
    WCHAR ServerNameBuffer[MAX_PATH];
    WCHAR AnnounceNameBuffer[MAX_PATH];
    WCHAR ServerCommentBuffer[MAXCOMMENTSZ+1];
    WCHAR UserPathBuffer[MAX_PATH+1];
    WCHAR DomainNameBuffer[MAX_PATH];
    WCHAR ServerProductName[ sizeof( SERVER_PRODUCT_NAME ) ];
    WCHAR szVersionNumber[ MAXVERSIONSZ+1 ];

    //
    // Number of XACTSRV worker threads.
    //
    LONG XsThreads;

    //
    // This is the number of Xs threads blocked waiting for an LPC request.
    //  When it drops to zero, all threads are active and another thread is
    //  created.
    //
    LONG XsWaitingApiThreads;

    //
    // Event signalled when the last XACTSRV worker thread terminates.
    //
    HANDLE XsAllThreadsTerminatedEvent;

    //
    // Boolean indicating whether XACTSRV is active or terminating.
    //
    BOOL XsTerminating;

    //
    // Handle for the LPC port used for communication between the file server
    // and XACTSRV.
    //
    HANDLE XsConnectionPortHandle;
    HANDLE XsCommunicationPortHandle;

    //
    // Handle to the NTLSAPI.DLL library
    //
    HMODULE XsLicenseLibrary;

    //
    // Entry point for obtaining a client license
    //
    PNT_LICENSE_REQUEST_W SsLicenseRequest;

    //
    // Entry point for freeing a client license
    //
    PNT_LS_FREE_HANDLE SsFreeLicense;

    //
    // Handle to the XACT library
    //
    HMODULE XsXactsrvLibrary;

    BOOL ApiThreadsStarted;

    //
    // This resource is used to ensure that more than one thread aren't trying
    //  to load the xactsrv library at the same time.
    //
    BOOL LibraryResourceInitialized;
    RTL_RESOURCE LibraryResource;

} SERVER_SERVICE_DATA, *PSERVER_SERVICE_DATA;

extern SERVER_SERVICE_DATA SsData;

//
// Structure type used for generalized switch matching.
//

typedef struct _FIELD_DESCRIPTOR {
    LPWCH     FieldName;
    ULONG     FieldType;
    ULONG     FieldOffset;
    ULONG     Level;
    DWORD     ParameterNumber;
    ULONG     Settable;
    DWORD_PTR DefaultValue;
    DWORD     MinimumValue;
    DWORD     MaximumValue;
} FIELD_DESCRIPTOR, *PFIELD_DESCRIPTOR;

//
// Used by NetrShareEnumSticky to get share information from the registry.
//

typedef struct _SRVSVC_SHARE_ENUM_INFO  {
    ULONG Level;
    ULONG ResumeHandle;
    ULONG EntriesRead;
    ULONG TotalEntries;
    ULONG TotalBytesNeeded;
    PVOID OutputBuffer;
    ULONG OutputBufferLength;

    //
    // Scratch fields used by SsEnumerateStickyShares
    //

    ULONG ShareEnumIndex;
    PCHAR StartOfFixedData;
    PCHAR EndOfVariableData;
} SRVSVC_SHARE_ENUM_INFO, *PSRVSVC_SHARE_ENUM_INFO;

//
// Internal structure used for two-step delete of share's
//
typedef struct _SHARE_DEL_CONTEXT {
    struct _SHARE_DEL_CONTEXT* Next;
    SERVER_REQUEST_PACKET Srp;
    BOOL IsPrintShare;
    BOOL IsSpecial;
    //WCHAR NetName[];
} SHARE_DEL_CONTEXT, *PSHARE_DEL_CONTEXT;


//
// Manifests that determine field type.
//

#define BOOLEAN_FIELD 0
#define DWORD_FIELD 1
#define LPSTR_FIELD 2

//
// Manifests that determine when a field may be set.
//

#define NOT_SETTABLE 0
#define SET_ON_STARTUP 1
#define ALWAYS_SETTABLE 2

//
// Data for all server info fields.
//
extern FIELD_DESCRIPTOR SsServerInfoFields[];
extern VOID SsInitializeServerInfoFields( VOID );

//
// Macros.
//

#define POINTER_TO_OFFSET(val,start)               \
    (val) = (val) == NULL ? NULL : (PVOID)( (PCHAR)(val) - (ULONG_PTR)(start) )

#define OFFSET_TO_POINTER(val,start)               \
    (val) = (val) == NULL ? NULL : (PVOID)( (PCHAR)(val) + (ULONG_PTR)(start) )

#define FIXED_SIZE_OF_SHARE(level)                  \
    ( (level) == 0 ? sizeof(SHARE_INFO_0) :         \
      (level) == 1 ? sizeof(SHARE_INFO_1) :         \
      (level) == 2 ? sizeof(SHARE_INFO_2) :         \
                     sizeof(SHARE_INFO_502) )

#define SIZE_WSTR( Str )  \
    ( ( Str ) == NULL ? 0 : ((wcslen( Str ) + 1) * sizeof(WCHAR)) )

//
// Internal routine prototypes.
//

PSERVER_REQUEST_PACKET
SsAllocateSrp (
    VOID
    );

NET_API_STATUS
SsCheckAccess (
    IN PSRVSVC_SECURITY_OBJECT SecurityObject,
    IN ACCESS_MASK DesiredAccess
    );

VOID
SsCloseServer (
    VOID
    );

VOID
SsControlCHandler (
    IN ULONG CtrlType
    );

NET_API_STATUS
SsCreateSecurityObjects (
    VOID
    );

VOID
SsDeleteSecurityObjects (
    VOID
    );

VOID
SsFreeSrp (
    IN PSERVER_REQUEST_PACKET Srp
    );

NET_API_STATUS
SsInitialize (
    IN DWORD argc,
    IN LPTSTR argv[]
    );

VOID
SsLogEvent(
    IN DWORD MessageId,
    IN DWORD NumberOfSubStrings,
    IN LPWSTR *SubStrings,
    IN DWORD ErrorCode
    );

NET_API_STATUS
SsOpenServer ( void );

NET_API_STATUS
SsParseCommandLine (
    IN DWORD argc,
    IN LPTSTR argv[],
    IN BOOLEAN Starting
    );

DWORD
SsScavengerThread (
    IN LPVOID lpThreadParameter
    );

NET_API_STATUS
SsServerFsControlGetInfo (
    IN ULONG ServerControlCode,
    IN PSERVER_REQUEST_PACKET Srp,
    IN OUT PVOID *OutputBuffer,
    IN OUT ULONG OutputBufferLength
    );

NET_API_STATUS
SsServerFsControl (
    IN ULONG ServerControlCode,
    IN PSERVER_REQUEST_PACKET Srp,
    IN PVOID Buffer OPTIONAL,
    IN ULONG BufferLength
    );

DWORD
SsGetServerType (
    VOID
    );

VOID
SsSetExportedServerType (
    IN PNAME_LIST_ENTRY Service  OPTIONAL,
    IN BOOL ExternalBitsAlreadyChanged,
    IN BOOL UpdateImmediately
    );

NET_API_STATUS
SsSetField (
    IN PFIELD_DESCRIPTOR Field,
    IN PVOID Value,
    IN BOOLEAN WriteToRegistry,
    OUT BOOLEAN *AnnouncementInformationChanged OPTIONAL
    );

UINT
SsGetDriveType (
    IN LPWSTR path
    );

NET_API_STATUS
SsTerminate (
    VOID
    );

DWORD
SsAtol (
    IN LPTSTR Input
    );

VOID
SsNotifyRdrOfGuid(
    LPGUID Guid
    );

VOID
AnnounceServiceStatus (
    DWORD increment
    );

VOID
BindToTransport (
    IN PVOID TransportName
    );

VOID
BindOptionalNames (
    IN PWSTR TransportName
    );

NET_API_STATUS NET_API_FUNCTION
I_NetrServerTransportAddEx (
    IN DWORD Level,
    IN LPTRANSPORT_INFO Buffer
    );

VOID
I_NetServerTransportDel(
    IN PUNICODE_STRING TransportName
    );

NET_API_STATUS
StartPnpNotifications (
    VOID
    );

NET_API_STATUS NET_API_FUNCTION
I_NetrShareDelStart (
    IN LPWSTR ServerName,
    IN LPWSTR NetName,
    IN DWORD Reserved,
    IN PSHARE_DEL_HANDLE ContextHandle,
    IN BOOLEAN CheckAccess
    );

NET_API_STATUS NET_API_FUNCTION
I_NetrShareAdd (
    IN LPWSTR ServerName,
    IN DWORD Level,
    IN LPSHARE_INFO Buffer,
    OUT LPDWORD ErrorParameter,
    IN BOOLEAN BypassSecurity
    );

//
// XACTSRV functions.
//

DWORD
XsStartXactsrv (
    VOID
    );

VOID
XsStopXactsrv (
    VOID
    );

NET_API_STATUS
ShareEnumCommon (
    IN DWORD Level,
    OUT LPBYTE *Buffer,
    IN DWORD PreferredMaximumLength,
    OUT LPDWORD EntriesRead,
    OUT LPDWORD TotalEntries,
    IN OUT LPDWORD ResumeHandle OPTIONAL,
    IN LPWSTR NetName OPTIONAL
    );

NET_API_STATUS
ConvertStringToTransportAddress (
    IN PUNICODE_STRING InputName,
    OUT CHAR TransportAddress[MAX_PATH],
    OUT PULONG TransportAddressLength
    );

VOID
SsSetDfsRoot();


VOID
SsSetDomainName (
    VOID
    );


#endif // ndef _SRVSVCP_