/*

Copyright (c) 1992  Microsoft Corporation

Module Name:

	macfile.h

Abstract:

	This module contains data structures, related constants and functions,
	error retuen codes and prototypes of AfpAdminxxx APIs. This file should
	be included by any application that will administer the MACFILE service.

Author:

	Narendra Gidwani (microsoft!nareng)


Revision History:
	12 Jume 1992	NarenG	Initial version. Split admin.h into admin.h
					and macfile.h.
--*/

#ifndef _MACFILE_
#define _MACFILE_

// Used as RPC binding handle to server

typedef ULONG	AFP_SERVER_HANDLE;
typedef ULONG	*PAFP_SERVER_HANDLE;

#define AFP_SERVICE_NAME	TEXT("MacFile")

// Error return values from AfpAdminxxx Api's
// WARNING! If you change any any codes below, please change
//		afpmgr.h accoringly.

#define AFPERR_BASE						-6000

#define	AFPERR_InvalidVolumeName		(AFPERR_BASE-1)
#define	AFPERR_InvalidId				(AFPERR_BASE-2)
#define	AFPERR_InvalidParms				(AFPERR_BASE-3)
#define AFPERR_CodePage					(AFPERR_BASE-4)
#define	AFPERR_InvalidServerName		(AFPERR_BASE-5)
#define	AFPERR_DuplicateVolume			(AFPERR_BASE-6)
#define	AFPERR_VolumeBusy				(AFPERR_BASE-7)
#define	AFPERR_VolumeReadOnly			(AFPERR_BASE-8)
#define AFPERR_DirectoryNotInVolume		(AFPERR_BASE-9)
#define AFPERR_SecurityNotSupported		(AFPERR_BASE-10)
#define	AFPERR_BufferSize				(AFPERR_BASE-11)
#define AFPERR_DuplicateExtension		(AFPERR_BASE-12)
#define AFPERR_UnsupportedFS			(AFPERR_BASE-13)
#define	AFPERR_InvalidSessionType		(AFPERR_BASE-14)
#define AFPERR_InvalidServerState		(AFPERR_BASE-15)
#define AFPERR_NestedVolume				(AFPERR_BASE-16)
#define AFPERR_InvalidComputername		(AFPERR_BASE-17)
#define AFPERR_DuplicateTypeCreator		(AFPERR_BASE-18)
#define	AFPERR_TypeCreatorNotExistant	(AFPERR_BASE-19)
#define AFPERR_CannotDeleteDefaultTC	(AFPERR_BASE-20)
#define	AFPERR_CannotEditDefaultTC		(AFPERR_BASE-21)
#define	AFPERR_InvalidTypeCreator		(AFPERR_BASE-22)
#define	AFPERR_InvalidExtension			(AFPERR_BASE-23)
#define AFPERR_TooManyEtcMaps			(AFPERR_BASE-24)
#define AFPERR_InvalidPassword			(AFPERR_BASE-25)
#define AFPERR_VolumeNonExist			(AFPERR_BASE-26)
#define AFPERR_NoSuchUserGroup			(AFPERR_BASE-27)
#define AFPERR_NoSuchUser				(AFPERR_BASE-28)
#define AFPERR_NoSuchGroup				(AFPERR_BASE-29)

#define AFPERR_MIN						AFPERR_NoSuchGroup			

// Constants related to the following data strucutures.

#define AFP_SERVERNAME_LEN				31
#define AFP_VOLNAME_LEN					27
#define AFP_VOLPASS_LEN					8
#define AFP_WKSTANAME_LEN				65
#define	AFP_EXTENSION_LEN				3
#define AFP_CREATOR_LEN					4
#define AFP_TYPE_LEN					4
#define AFP_MESSAGE_LEN					199
#define	AFP_MAXICONSIZE					2048
#define AFP_MAXSESSIONS					0XFFFFFFFF
#define AFP_ETC_COMMENT_LEN				36


// Relative paths to registry keys that contain information for the macfile
// server.

#define AFP_KEYPATH_SERVER_PARAMS \
 TEXT("SYSTEM\\CurrentControlSet\\Services\\MacFile\\PARAMETERS")

#define AFP_KEYPATH_VOLUMES \
 TEXT("SYSTEM\\CurrentControlSet\\Services\\MacFile\\PARAMETERS\\VOLUMES")

#define AFP_KEYPATH_TYPE_CREATORS	\
 TEXT("SYSTEM\\CurrentControlSet\\Services\\MacFile\\PARAMETERS\\TYPE_CREATORS")

#define AFP_KEYPATH_EXTENSIONS	\
 TEXT("SYSTEM\\CurrentControlSet\\Services\\MacFile\\PARAMETERS\\EXTENSIONS")

#define AFP_KEYPATH_ICONS	\
 TEXT("SYSTEM\\CurrentControlSet\\Services\\MacFile\\PARAMETERS\\ICONS")

#define AFP_KEYPATH_CODEPAGE	\
 TEXT("SYSTEM\\CurrentControlSet\\Control\\Nls\\Codepage")

// Value names for server parameters

#define AFPREG_VALNAME_SVRNAME				TEXT("ServerName")
#define AFPREG_VALNAME_SRVOPTIONS			TEXT("ServerOptions")
#define AFPREG_VALNAME_MAXSESSIONS			TEXT("MaxSessions")
#define AFPREG_VALNAME_LOGINMSG				TEXT("LoginMsg")
#define AFPREG_VALNAME_MAXPAGEDMEM			TEXT("PagedMemLimit")
#define AFPREG_VALNAME_MAXNONPAGEDMEM		TEXT("NonPagedMemLimit")
#define AFPREG_VALNAME_TYPE					TEXT("Type")
#define AFPREG_VALNAME_CREATOR				TEXT("Creator")
#define AFPREG_VALNAME_COMMENT				TEXT("Comment")
#define AFPREG_VALNAME_PASSWORD				TEXT("Password")
#define AFPREG_VALNAME_MAXUSES				TEXT("MaxUses")
#define AFPREG_VALNAME_PROPS				TEXT("Properties")
#define AFPREG_VALNAME_PATH					TEXT("Path")
#define AFPREG_VALNAME_ID					TEXT("Id")
#define AFPREG_VALNAME_ICONTYPE				TEXT("IconType")
#define AFPREG_VALNAME_DATA					TEXT("Data")
#define	AFPREG_VALNAME_LENGTH				TEXT("Length")
#define	AFPREG_VALNAME_CODEPAGE				TEXT("MACCP")
#define	AFPREG_VALNAME_CATSEARCH			TEXT("DisableCatsearch")

// Limits on server parameters

#define AFP_MAX_ALLOWED_SRV_SESSIONS 		AFP_MAXSESSIONS
#define AFP_MIN_ALLOWED_PAGED_MEM 			1000
#define AFP_MAX_ALLOWED_PAGED_MEM 			256000
#define AFP_MIN_ALLOWED_NONPAGED_MEM		256
#define AFP_MAX_ALLOWED_NONPAGED_MEM		16000

// Server default parameter values

#define AFP_DEF_SRVOPTIONS					(AFP_SRVROPT_GUESTLOGONALLOWED)
#define AFP_DEF_MAXSESSIONS 				AFP_MAXSESSIONS
#define AFP_DEF_TYPE 						TEXT("TEXT")
#define AFP_DEF_CREATOR			 			TEXT("LMAN")
#define AFP_DEF_EXTENSION_W					L"*"
#define AFP_DEF_EXTENSION_A					"*"
#define AFP_DEF_TCID					 	0
#define AFP_DEF_MAXPAGEDMEM					20000
#define AFP_DEF_MAXNONPAGEDMEM				4000
#define AFP_DEF_CODEPAGE_PATH				TEXT("C:\\NT\\SYSTEM32\\C_10000.NLS")

// Will be concatenated to the system path to form source path of volume icon
#define AFP_DEF_VOLICON_SRCNAME				TEXT("\\SFMICON.VOL")

// Server options

#define AFP_SRVROPT_NONE					0x0000
#define AFP_SRVROPT_GUESTLOGONALLOWED 		0x0001
#define AFP_SRVROPT_CLEARTEXTLOGONALLOWED	0x0002
#define AFP_SRVROPT_ALLOWSAVEDPASSWORD		0x0004
#define AFP_SRVROPT_STANDALONE				0x0008
#define	AFP_SRVROPT_4GB_VOLUMES				0x0010
#define AFP_SRVROPT_ALL						( AFP_SRVROPT_GUESTLOGONALLOWED		\
											| AFP_SRVROPT_CLEARTEXTLOGONALLOWED	\
											| AFP_SRVROPT_ALLOWSAVEDPASSWORD	\
											| AFP_SRVROPT_4GB_VOLUMES			\
											| AFP_SRVROPT_STANDALONE )

// AFP Service default parameters


#define AFP_SERVER_PARMNUM_LOGINMSG			0x00000001
#define AFP_SERVER_PARMNUM_MAX_SESSIONS		0x00000002
#define AFP_SERVER_PARMNUM_OPTIONS			0x00000004
#define AFP_SERVER_PARMNUM_NAME				0x00000008
#define AFP_SERVER_PARMNUM_PAGEMEMLIM		0x00000010
#define AFP_SERVER_PARMNUM_NONPAGEMEMLIM	0x00000020
#define AFP_SERVER_PARMNUM_CODEPAGE			0x00000040
#define AFP_SERVER_PARMNUM_ALL				( AFP_SERVER_PARMNUM_LOGINMSG 		\
											| AFP_SERVER_PARMNUM_MAX_SESSIONS	\
											| AFP_SERVER_PARMNUM_OPTIONS 		\
											| AFP_SERVER_PARMNUM_NAME			\
											| AFP_SERVER_PARMNUM_PAGEMEMLIM		\
											| AFP_SERVER_PARMNUM_NONPAGEMEMLIM	\
											| AFP_SERVER_PARMNUM_CODEPAGE)

typedef struct _AFP_SERVER_INFO
{
	LPWSTR	afpsrv_name; 			// Macintosh name of the server
									// max. AFP_SERVERNAME_LEN.
	DWORD	afpsrv_max_sessions;	// Maximum simultaneous sessions
									// In the range 1 - AFP_MAXSESSIONS.
									// 0 is invalid
	DWORD	afpsrv_options;			// Server Options
	DWORD	afpsrv_max_paged_mem;	// Cap on paged memory usage
	DWORD	afpsrv_max_nonpaged_mem;// Cap on paged memory usage
	LPWSTR	afpsrv_login_msg;		// NULL terminated UNICODE string.
									// MAX AFP_MESSAGE_LEN chars.
									// NULL => no login msg.
	LPWSTR	afpsrv_codepage;		// NULL terminated UNICODE path
									// NULL => no codepage path.
} AFP_SERVER_INFO, *PAFP_SERVER_INFO;

// Volume properties mask values. Values may be or'ed together.
// Volume flags with msk 0x0000001F are defined by the AFP specification.
// Do not overload these. Most of these values (except for READONLY above)
// are not exposed via admin apis.
#define	AFP_VOLUME_READONLY			    0x00000001
#define	AFP_VOLUME_GUESTACCESS		    0x00008000
#define	AFP_VOLUME_EXCLUSIVE		    0x00010000
#define	AFP_VOLUME_HAS_CUSTOM_ICON	    0x00020000
#define	AFP_VOLUME_4GB				    0x00040000
#define AFP_VOLUME_AGE_DFES			    0x00080000
#define AFP_VOLUME_DISALLOW_CATSRCH		0x00100000
#define AFP_VOLUME_ALL_DOWNLEVEL	    (AFP_VOLUME_READONLY 	 	|	\
									    AFP_VOLUME_GUESTACCESS)
#define AFP_VOLUME_ALL				    (AFP_VOLUME_READONLY 	 	|	\
									    AFP_VOLUME_GUESTACCESS		|	\
									    AFP_VOLUME_EXCLUSIVE	 	|	\
                                        AFP_VOLUME_HAS_CUSTOM_ICON	|	\
									    AFP_VOLUME_4GB				|	\
                                        AFP_VOLUME_DISALLOW_CATSRCH |   \
									    AFP_VOLUME_AGE_DFES)

#define	AFP_VOLUME_UNLIMITED_USES	0xFFFFFFFF

// The following bits define the fields within the AFP_VOLUME_INFO
// structure whose values will be set.
//
#define AFP_VOL_PARMNUM_MAXUSES		0x00000002
#define AFP_VOL_PARMNUM_PROPSMASK	0x00000004
#define AFP_VOL_PARMNUM_PASSWORD	0x00000001
#define AFP_VOL_PARMNUM_ALL			( AFP_VOL_PARMNUM_PASSWORD	\
									| AFP_VOL_PARMNUM_MAXUSES	\
									| AFP_VOL_PARMNUM_PROPSMASK	)

typedef struct _AFP_VOLUME_INFO
{
	LPWSTR	afpvol_name;				// Name of the volume max.
	DWORD	afpvol_id;					// id of this volume. generated by sever
	LPWSTR	afpvol_password;			// Volume password, max. AFP_VOLPASS_LEN
	DWORD	afpvol_max_uses;			// Max opens allowed
	DWORD	afpvol_props_mask;			// Mask of volume properties
	DWORD	afpvol_curr_uses;			// Number of curr open connections.
	LPWSTR	afpvol_path;				// The actual path
										// Ignored for VolumeSetInfo
} AFP_VOLUME_INFO, *PAFP_VOLUME_INFO;

typedef struct _AFP_SESSION_INFO
{
	DWORD	afpsess_id;					// Id of the session
	LPWSTR	afpsess_ws_name;			// Workstation Name,
	LPWSTR	afpsess_username;			// User Name, max. UNLEN
	DWORD	afpsess_num_cons;			// Number of open volumes
	DWORD	afpsess_num_opens;			// Number of open files
	LONG	afpsess_time;				// Time session established
	DWORD	afpsess_logon_type;			// How the user logged on

} AFP_SESSION_INFO, *PAFP_SESSION_INFO;

// afpicon_type values

#define	ICONTYPE_SRVR					0	// Large, monochrome
#define	ICONTYPE_ICN					1	// Large. monochrome
#define	ICONTYPE_ICS					2	// Small, monochrome
#define	ICONTYPE_ICN4					3	// Large, 4 color
#define	ICONTYPE_ICN8					4	// Large, 8 color
#define	ICONTYPE_ICS4					5	// Small, 4 color
#define	ICONTYPE_ICS8					6	// Small, 8 color
#define	MAX_ICONTYPE					7

// afpicon_length values

#define	ICONSIZE_ICN					256	// Large. monochrome
#define	ICONSIZE_ICS					64	// Small, monochrome
#define	ICONSIZE_ICN4					1024// Large, 4 color
#define	ICONSIZE_ICN8					2048// Large, 8 color
#define	ICONSIZE_ICS4					256	// Small, 4 color
#define	ICONSIZE_ICS8					512	// Small, 8 color

typedef struct _AFP_ICON_INFO
{
	WCHAR	afpicon_type[AFP_TYPE_LEN+1];		// Resource Type
	WCHAR	afpicon_creator[AFP_CREATOR_LEN+1]; // Resource Creator
	DWORD	afpicon_icontype;					// Icon type
	DWORD	afpicon_length;						// Length of icon block
	PBYTE	afpicon_data;						// The actual icon.
	
} AFP_ICON_INFO, *PAFP_ICON_INFO;

// The AfpAdminConnectionEnum Filter values

#define AFP_NO_FILTER					0
#define AFP_FILTER_ON_VOLUME_ID			1
#define AFP_FILTER_ON_SESSION_ID		2

typedef struct _AFP_CONNECTION_INFO
{
	DWORD	afpconn_id;					// Connection Id
	LPWSTR	afpconn_username;			// User who has this session open
										// Max. UNLEN
	LPWSTR	afpconn_volumename;			// Volume corresponding to this
										// connection
	ULONG	afpconn_time;				// Time since the vol was opened.(secs)
	DWORD	afpconn_num_opens;			// Number of open resources

} AFP_CONNECTION_INFO, *PAFP_CONNECTION_INFO;

// Various File open modes

#define AFP_OPEN_MODE_NONE				0x00000000
#define AFP_OPEN_MODE_READ				0x00000001
#define AFP_OPEN_MODE_WRITE				0x00000002

// Fork type of an open file
#define	AFP_FORK_DATA					0x00000000
#define	AFP_FORK_RESOURCE				0x00000001

typedef struct _AFP_FILE_INFO
{
	DWORD	afpfile_id;					// Id of the open file fork
	DWORD	afpfile_open_mode;			// Mode in which file is opened
	DWORD	afpfile_num_locks;			// Number of locks on the file
	DWORD	afpfile_fork_type;			// Fork type
	LPWSTR	afpfile_username;			// File opened by this user. max UNLEN
	LPWSTR	afpfile_path;				// Absolute canonical path to the file

} AFP_FILE_INFO, *PAFP_FILE_INFO;

// The following bits define the permissions mask
// NOTE: These MUST be consistent with the AFP permissions

#define	AFP_PERM_WORLD_SFO				0x00010000
#define	AFP_PERM_WORLD_SFI				0x00020000
#define	AFP_PERM_WORLD_MC				0x00040000
#define	AFP_PERM_WORLD_MASK				0x00070000
#define	AFP_PERM_GROUP_SFO				0x00000100
#define	AFP_PERM_GROUP_SFI				0x00000200
#define	AFP_PERM_GROUP_MC				0x00000400
#define	AFP_PERM_GROUP_MASK				0x00000700
#define	AFP_PERM_OWNER_SFO				0x00000001
#define	AFP_PERM_OWNER_SFI				0x00000002
#define	AFP_PERM_OWNER_MC				0x00000004
#define	AFP_PERM_OWNER_MASK				0x00000007
#define	AFP_PERM_INHIBIT_MOVE_DELETE	0x01000000
#define	AFP_PERM_SET_SUBDIRS			0x02000000


// The following bits define the fields within the AFP_DIRECTORY_INFO
// structure whose values will be set.
//
#define AFP_DIR_PARMNUM_PERMS			0x00000001
#define AFP_DIR_PARMNUM_OWNER			0x00000002
#define AFP_DIR_PARMNUM_GROUP			0x00000004
#define AFP_DIR_PARMNUM_ALL				( AFP_DIR_PARMNUM_PERMS \
										| AFP_DIR_PARMNUM_OWNER	\
										| AFP_DIR_PARMNUM_GROUP	)
typedef struct _AFP_DIRECTORY_INFO
{
	LPWSTR	afpdir_path;				// Absolute dir path,
	DWORD	afpdir_perms;				// Directory permissions
	LPWSTR	afpdir_owner;				// Directory owner, max. UNLEN
	LPWSTR	afpdir_group;				// Group Association max. GNLEN
	BOOLEAN	afpdir_in_volume;			// TRUE indicates that this directory
										// is part of a volume, FALSE otherwise.

} AFP_DIRECTORY_INFO, *PAFP_DIRECTORY_INFO;

// The following bits define the fields within the AFP_FINDER_INFO
// structure whos values will be set
//
#define AFP_FD_PARMNUM_TYPE				0x00000001
#define AFP_FD_PARMNUM_CREATOR			0x00000002
#define AFP_FD_PARMNUM_ALL				( AFP_FD_PARMNUM_TYPE \
										| AFP_FD_PARMNUM_CREATOR)
typedef struct _AFP_FINDER_INFO
{
	LPWSTR	afpfd_path;							// Absolute file/dir path
	WCHAR	afpfd_type[AFP_TYPE_LEN+1];			// Finder type
	WCHAR	afpfd_creator[AFP_CREATOR_LEN+1];	// Finder creator

} AFP_FINDER_INFO, *PAFP_FINDER_INFO;

typedef struct _AFP_EXTENSION {

	WCHAR	afpe_extension[AFP_EXTENSION_LEN+1];
	DWORD	afpe_tcid;

} AFP_EXTENSION, *PAFP_EXTENSION;

typedef struct _AFP_TYPE_CREATOR
{
	WCHAR	afptc_creator[AFP_CREATOR_LEN+1];	// Resource Creator
	WCHAR	afptc_type[AFP_TYPE_LEN+1];			// Resource Type
	WCHAR	afptc_comment[AFP_ETC_COMMENT_LEN+1];
	DWORD	afptc_id;

} AFP_TYPE_CREATOR, *PAFP_TYPE_CREATOR;

typedef struct _AFP_MESSAGE_INFO
{
	DWORD	afpmsg_session_id;				// Session Id of the user to which
											// the message is to be sent.
	LPWSTR	afpmsg_text;					// Must be at most AFP_MESSAGE_LEN

} AFP_MESSAGE_INFO, *PAFP_MESSAGE_INFO;

typedef struct _AFP_ETCMAP_INFO {

	DWORD				afpetc_num_type_creators;

#ifdef MIDL_PASS
	[size_is(afpetc_num_type_creators)] PAFP_TYPE_CREATOR afpetc_type_creator;
#else
	PAFP_TYPE_CREATOR	afpetc_type_creator;
#endif

	DWORD				afpetc_num_extensions;
#ifdef MIDL_PASS
	[size_is(afpetc_num_extensions)] PAFP_EXTENSION	afpetc_extension;
#else
	PAFP_EXTENSION		afpetc_extension;
#endif

} AFP_ETCMAP_INFO, *PAFP_ETCMAP_INFO;


/* Our version of the AFP Function codes organized by class */
#define	_AFP_INVALID_OPCODE				0x00
#define	_AFP_UNSUPPORTED_OPCODE			0x01

#define	_AFP_GET_SRVR_INFO				0x02	/* SERVER APIs */
#define	_AFP_GET_SRVR_PARMS				0x03
#define	_AFP_CHANGE_PASSWORD			0x04
#define	_AFP_LOGIN						0x05
#define	_AFP_LOGIN_CONT					0x06
#define	_AFP_LOGOUT						0x07
#define	_AFP_MAP_ID						0x08
#define	_AFP_MAP_NAME					0x09
#define	_AFP_GET_USER_INFO				0x0A
#define	_AFP_GET_SRVR_MSG				0x0B
#define	_AFP_GET_DOMAIN_LIST			0x0C

#define	_AFP_OPEN_VOL					0x0D	/* VOLUME APIs */
#define	_AFP_CLOSE_VOL					0x0E
#define	_AFP_GET_VOL_PARMS				0x0F
#define	_AFP_SET_VOL_PARMS				0x10
#define	_AFP_FLUSH						0x11

#define	_AFP_GET_FILE_DIR_PARMS			0x12	/* FILE-DIRECTORY APIs */
#define	_AFP_SET_FILE_DIR_PARMS			0x13
#define	_AFP_DELETE						0x14
#define	_AFP_RENAME						0x15
#define	_AFP_MOVE_AND_RENAME			0x16

#define	_AFP_OPEN_DIR					0x17	/* DIRECTORY APIs */
#define	_AFP_CLOSE_DIR					0x18
#define	_AFP_CREATE_DIR					0x19
#define	_AFP_ENUMERATE					0x1A
#define	_AFP_SET_DIR_PARMS				0x1B

#define	_AFP_CREATE_FILE				0x1C	/* FILE APIs */
#define	_AFP_COPY_FILE					0x1D
#define	_AFP_CREATE_ID					0x1E
#define	_AFP_DELETE_ID					0x1F
#define	_AFP_RESOLVE_ID					0x20
#define	_AFP_SET_FILE_PARMS				0x21
#define	_AFP_EXCHANGE_FILES				0x22

#define	_AFP_OPEN_FORK					0x23	/* FORK APIs */
#define	_AFP_CLOSE_FORK					0x24
#define	_AFP_FLUSH_FORK					0x25
#define	_AFP_READ						0x26
#define	_AFP_WRITE						0x27
#define	_AFP_BYTE_RANGE_LOCK			0x28
#define	_AFP_GET_FORK_PARMS				0x29
#define	_AFP_SET_FORK_PARMS				0x2A

#define	_AFP_OPEN_DT					0x2B	/* DESKTOP APIs */
#define	_AFP_CLOSE_DT					0x2C
#define	_AFP_ADD_APPL					0x2D
#define	_AFP_GET_APPL					0x2E
#define	_AFP_REMOVE_APPL				0x2F
#define	_AFP_ADD_COMMENT				0x30
#define	_AFP_GET_COMMENT				0x31
#define	_AFP_REMOVE_COMMENT				0x32
#define	_AFP_ADD_ICON					0x33
#define	_AFP_GET_ICON					0x34
#define	_AFP_GET_ICON_INFO				0x35

#define	_AFP_CAT_SEARCH					0x36
#define	_AFP_MAX_ENTRIES				0x38	/* Keep it even */

typedef struct _AFP_STATISTICS_INFO
{
	DWORD			stat_ServerStartTime;	// Server start time
	DWORD			stat_TimeStamp;			// Statistics collected since
	DWORD			stat_Errors;			// Unexpected Errors
	DWORD			stat_MaxSessions;		// Max. sessions active simulataneously
	DWORD			stat_TotalSessions;		// Total number of sessions created
	DWORD			stat_CurrentSessions;	// Number of sessions active now
	DWORD			stat_NumAdminReqs;		// Total number of admin requests
	DWORD			stat_NumAdminChanges;	// Number of admin reqs causing change
	// The file statistics are actually fork statistics i.e. opening both the
	// data and the resource forks will yield a count of TWO
	DWORD			stat_MaxFilesOpened;	// Max. files opened simulataneously
	DWORD			stat_TotalFilesOpened;	// Total number of files opened
	DWORD			stat_CurrentFilesOpen;	// Number of files open now
	DWORD			stat_CurrentFileLocks;	// Current count of locks
	DWORD			stat_NumFailedLogins;	// Number of unsuccessful logins
	DWORD			stat_NumForcedLogoffs;	// Number of sessions kicked out
	DWORD			stat_NumMessagesSent;	// Number of messages sent out
	DWORD			stat_MaxNonPagedUsage;	// High-water mark of the non-paged
											// memory usage
	DWORD			stat_CurrNonPagedUsage;	// Amount of non-paged memory in use
	DWORD			stat_MaxPagedUsage;		// High-water mark of the paged
											// memory usage
	DWORD			stat_CurrPagedUsage;	// Amount of paged memory in use
} AFP_STATISTICS_INFO, *PAFP_STATISTICS_INFO;

typedef struct _AFP_STATISTICS_INFO_EX
{
	DWORD			stat_ServerStartTime;	// Server start time
	DWORD			stat_TimeStamp;			// Statistics collected since
	DWORD			stat_Errors;			// Unexpected Errors

	DWORD			stat_MaxSessions;		// Max. sessions active simulataneously
	DWORD			stat_TotalSessions;		// Total number of sessions created
	DWORD			stat_CurrentSessions;	// Number of sessions active now

	DWORD			stat_NumAdminReqs;		// Total number of admin requests
	DWORD			stat_NumAdminChanges;	// Number of admin reqs causing change

	// The file statistics are actually fork statistics i.e. opening both the
	// data and the resource forks will yield a count of TWO
	DWORD			stat_MaxFilesOpened;	// Max. files opened simulataneously
	DWORD			stat_TotalFilesOpened;	// Total number of files opened
	DWORD			stat_CurrentFilesOpen;	// Number of files open now
	DWORD			stat_CurrentFileLocks;	// Current count of locks

	DWORD			stat_NumFailedLogins;	// Number of unsuccessful logins
	DWORD			stat_NumForcedLogoffs;	// Number of sessions kicked out
	DWORD			stat_NumMessagesSent;	// Number of messages sent out

	DWORD			stat_MaxNonPagedUsage;	// High-water mark of the non-paged
											// memory usage
	DWORD			stat_CurrNonPagedUsage;	// Amount of non-paged memory in use
	DWORD			stat_MaxPagedUsage;		// High-water mark of the paged
											// memory usage
	DWORD			stat_CurrPagedUsage;	// Amount of paged memory in use

	// NOTE: MAKE SURE THE STRUCTURE ABOVE THIS LINE MATCHES EXACTLY THE AFP_STATISTICS_INFO

	DWORD			stat_PagedCount;		// Number of current allocations
	DWORD			stat_NonPagedCount;		// Number of current allocations

	DWORD			stat_EnumCacheHits;		// # of times cache was hit
	DWORD			stat_EnumCacheMisses;	// # of times cache was missed
	DWORD			stat_IoPoolHits;		// # of times Io Pool was hit
	DWORD			stat_IoPoolMisses;		// # of times Io Pool was missed

	DWORD			stat_MaxInternalOpens;	// Max # of internal opens
	DWORD			stat_TotalInternalOpens;// Total # of internal opens
	DWORD			stat_CurrentInternalOpens;// Current # of internal opens


	DWORD			stat_CurrQueueLength;	// # of requests in the queue
	DWORD			stat_MaxQueueLength;	// Max # of requests in the queue
	DWORD			stat_CurrThreadCount;	// # of worker threads active
	DWORD			stat_MaxThreadCount;	// Max # of worker threads active

	// Make sure the following is Quadword aligned for efficiency
	LARGE_INTEGER	stat_DataRead;			// Amount of data read	(disk)
	LARGE_INTEGER	stat_DataWritten;		// Amount of data written (disk)
	LARGE_INTEGER	stat_DataReadInternal;	// Amount of data read	(disk)
	LARGE_INTEGER	stat_DataWrittenInternal;// Amount of data written (disk)
	LARGE_INTEGER	stat_DataOut;			// Amount of data sent out (wire)
	LARGE_INTEGER	stat_DataIn;			// Amount of data read in	(wire)

} AFP_STATISTICS_INFO_EX, *PAFP_STATISTICS_INFO_EX;

typedef struct _AFP_PROFILE_INFO
{
	DWORD			perf_ApiCounts[_AFP_MAX_ENTRIES];
											// # of times each Api is called
	LARGE_INTEGER	perf_ApiCumTimes[_AFP_MAX_ENTRIES];
											// Cummulative time spent in Apis
	LARGE_INTEGER	perf_ApiWorstTime[_AFP_MAX_ENTRIES];
											// Worst time for an api
	LARGE_INTEGER	perf_ApiBestTime[_AFP_MAX_ENTRIES];
											// Best time for an api
	LARGE_INTEGER	perf_OpenTimeRA;		// Time spent in NtOpenFile for ReadAttr
	LARGE_INTEGER	perf_OpenTimeRC;		// Time spent in NtOpenFile for ReadControl
	LARGE_INTEGER	perf_OpenTimeWC;		// Time spent in NtOpenFile for WriteControl
	LARGE_INTEGER	perf_OpenTimeRW;		// Time spent in NtOpenFile for Read/Write
	LARGE_INTEGER	perf_OpenTimeDL;		// Time spent in NtOpenFile for Delete
	LARGE_INTEGER	perf_OpenTimeDR;		// Time spent in NtOpenFile for Directories
	LARGE_INTEGER	perf_CreateTimeFIL;		// Time spent in NtCreateFile for file/data stream
	LARGE_INTEGER	perf_CreateTimeSTR;		// Time spent in NtCreateFile for file/other streams
	LARGE_INTEGER	perf_CreateTimeDIR;		// Time spent in NtCreateFile for dir/data stream
	LARGE_INTEGER	perf_CloseTime;			// Time spent in NtClose
	LARGE_INTEGER	perf_DeleteTime;		// Time spent in NtSetInformationFile
	LARGE_INTEGER	perf_GetInfoTime;		// Time spent in NtQueryInformationFile
	LARGE_INTEGER	perf_SetInfoTime;		// Time spent in NtSetInformationFile
	LARGE_INTEGER	perf_GetPermsTime;		// Time spent on getting permissions
	LARGE_INTEGER	perf_SetPermsTime;		// Time spent on setting permissions
	LARGE_INTEGER	perf_PathMapTime;		// Time spent in pathmap code
	LARGE_INTEGER	perf_ScavengerTime;		// Time spent in scavenger
	LARGE_INTEGER	perf_IdIndexUpdTime;	// Time spent updating idindex
	LARGE_INTEGER	perf_DesktopUpdTime;	// Time spent updating desktop
	LARGE_INTEGER	perf_SwmrWaitTime;		// Time spent waiting for Swmr
	LARGE_INTEGER	perf_SwmrLockTimeR;		// Time swmr was locked for read
	LARGE_INTEGER	perf_SwmrLockTimeW;		// Time swmr was locked for write
	LARGE_INTEGER	perf_QueueTime;			// Time Apis spent in queue
	LARGE_INTEGER	perf_UnmarshallTime;	// Time spent in un-marshalling a request
	LARGE_INTEGER	perf_InterReqTime;		// Time elapse between subsequent requests
	LARGE_INTEGER	perf_ExAllocTimeN;		// Time spent in ExAllocatePool (NonPaged)
	LARGE_INTEGER	perf_ExFreeTimeN;		// Time spent in ExFreePool (NonPaged)
	LARGE_INTEGER	perf_ExAllocTimeP;		// Time spent in ExAllocatePool (Paged)
	LARGE_INTEGER	perf_ExFreeTimeP;		// Time spent in ExFreePool (Paged)
	LARGE_INTEGER	perf_AfpAllocTimeN;		// Time spent in AfpAllocateMemory (NonPaged)
	LARGE_INTEGER	perf_AfpFreeTimeN;		// Time spent in AfpFreeMemory (NonPaged)
	LARGE_INTEGER	perf_AfpAllocTimeP;		// Time spent in AfpAllocateMemory (Paged)
	LARGE_INTEGER	perf_AfpFreeTimeP;		// Time spent in AfpFreeMemory (Paged)
	LARGE_INTEGER	perf_BPAllocTime;		// Time spent in BP Alloc
	LARGE_INTEGER	perf_BPFreeTime;		// Time spent in BP Free
	LARGE_INTEGER	perf_DFEAllocTime;		// Time spent in allocating a DFE
	LARGE_INTEGER	perf_DFEFreeTime;		// Time spent in freeing a DFE
	LARGE_INTEGER	perf_ChangeNotifyTime;	// Time spent processing change notifies
	LARGE_INTEGER	perf_ScanTreeTime;		// Time spent in scanning a directory tree
	LARGE_INTEGER	perf_PerfFreq;			// Perf. counter frequency
	DWORD			perf_NumFastIoSucceeded;// Fast IO success count
	DWORD			perf_NumFastIoFailed;	// Fast Io failure count
	DWORD			perf_OpenCountRA;		// # of times NtOpenFile called for ReadAttr
	DWORD			perf_OpenCountRC;		// # of times NtOpenFile called for ReadControl
	DWORD			perf_OpenCountWC;		// # of times NtOpenFile called for WriteControl
	DWORD			perf_OpenCountRW;		// # of times NtOpenFile called for Read/Write
	DWORD			perf_OpenCountDL;		// # of times NtOpenFile called for Delete
	DWORD			perf_OpenCountDR;		// # of times NtOpenFile called for Directories
	DWORD			perf_CreateCountFIL;	// # of times NtCreateFile called - file/data
	DWORD			perf_CreateCountSTR;	// # of times NtCreateFile called - file/other
	DWORD			perf_CreateCountDIR;	// # of times NtCreateFile called - dir/data
	DWORD			perf_CloseCount;		// # of times NtClose called
	DWORD			perf_DeleteCount;		// # of times NtSetInformationFile called
	DWORD			perf_GetInfoCount;		// # of times NtQueryInformationFile called
	DWORD			perf_SetInfoCount;		// # of times NtSetInformationFile called
	DWORD			perf_GetPermsCount;		// # of times Get permissions called
	DWORD			perf_SetPermsCount;		// # of times Get permissions called
	DWORD			perf_PathMapCount;		// # of times PathMap was invoked
	DWORD			perf_ScavengerCount;	// # of times scavenger was scheduled
	DWORD			perf_IdIndexUpdCount;	// # of times idindex was updated
	DWORD			perf_DesktopUpdCount;	// # of times desktop was updated
	DWORD			perf_SwmrWaitCount;		// # of times swmr access was blocked
	DWORD			perf_SwmrLockCountR;	// # of times swmr was locked for read
	DWORD			perf_SwmrLockCountW;	// # of times swmr was locked for write
	DWORD			perf_SwmrUpgradeCount;	// # of times swmr was upgraded
	DWORD			perf_SwmrDowngradeCount;// # of times swmr was downgraded
	DWORD			perf_QueueCount;		// # of times worker was queued
	DWORD			perf_UnmarshallCount;	// # of times api unmarshalling done
	DWORD			perf_ReqCount;			// # of apis - this is essentially total of perf_ApiCounts[i]
	DWORD			perf_ExAllocCountN;		// # of times in ExAllocatePool (NonPaged) called
	DWORD			perf_ExFreeCountN;		// # of times in ExFreePool (NonPaged) called
	DWORD			perf_ExAllocCountP;		// # of times in ExAllocatePool (Paged) called
	DWORD			perf_ExFreeCountP;		// # of times in ExFreePool (Paged) called
	DWORD			perf_AfpAllocCountN;	// # of times in AfpAllocateMemory (NonPaged) called
	DWORD			perf_AfpFreeCountN;		// # of times in AfpFreeMemory (NonPaged) called
	DWORD			perf_AfpAllocCountP;	// # of times in AfpAllocateMemory (Paged) called
	DWORD			perf_AfpFreeCountP;		// # of times in AfpFreeMemory (Paged) called
	DWORD			perf_BPAllocCount;		// # of times in BP Alloc called
	DWORD			perf_BPFreeCount;		// # of times in BP Free called
	DWORD			perf_BPAgeCount;		// # of times in BP aged out
	DWORD			perf_DFEAllocCount;		// # of times in a DFE is allocated
	DWORD			perf_DFEFreeCount;		// # of times in a DFE is freed
	DWORD			perf_DFEAgeCount;		// # of times in DFE aged out
	DWORD			perf_ChangeNotifyCount;	// # of times ChangeNotify called
	DWORD			perf_ScanTreeCount;		// # of items scanned during scantree
	DWORD			perf_NumDfeLookupByName;// # of times DFE lookup by Name was called
	DWORD			perf_NumDfeLookupById;	// # of times DFE lookup by Id was called
	DWORD			perf_DfeDepthTraversed;	// How deep in the hash buckets did we go
	DWORD			perf_DfeCacheHits;		// # of times DFE cache was hit
	DWORD			perf_DfeCacheMisses;	// # of times DFE cache was missed
	DWORD			perf_MaxDfrdReqCount;	// Current # of request deferred
	DWORD			perf_CurDfrdReqCount;	// Max # of request deferred
	DWORD			perf_cAllocatedIrps;	// Total # of Irps allocated
	DWORD			perf_cAllocatedMdls;	// Total # of Mdls allocated
} AFP_PROFILE_INFO, *PAFP_PROFILE_INFO;


// 	AfpAdminXXX API prototypes
//
DWORD
AfpAdminConnect(
		IN	LPWSTR 		 	 	lpwsServerName,
		OUT	PAFP_SERVER_HANDLE	phAfpServer
);

VOID
AfpAdminDisconnect(
		IN	AFP_SERVER_HANDLE 	hAfpServer
);

VOID
AfpAdminBufferFree(
		IN PVOID				pBuffer
);

DWORD
AfpAdminVolumeEnum(
		IN	AFP_SERVER_HANDLE	hAfpServer,
		OUT	LPBYTE *			lpbBuffer,
		IN	DWORD				dwPrefMaxLen,
		OUT	LPDWORD				lpdwEntriesRead,
		OUT	LPDWORD				lpdwTotalEntries,
		IN	LPDWORD				lpdwResumeHandle
);

DWORD
AfpAdminVolumeSetInfo (
		IN	AFP_SERVER_HANDLE 	hAfpServer,
		IN	LPBYTE				pBuffer,
		IN	DWORD				dwParmNum
);

DWORD
AfpAdminVolumeGetInfo (
		IN	AFP_SERVER_HANDLE 	hAfpServer,
		IN	LPWSTR				lpwsVolumeName,
		OUT	LPBYTE *			lpbBuffer
);


DWORD
AfpAdminVolumeDelete(
		IN AFP_SERVER_HANDLE 	hAfpServer,
		IN LPWSTR 				lpwsVolumeName
);

DWORD
AfpAdminVolumeAdd(
		IN AFP_SERVER_HANDLE 	hAfpServer,
		IN LPBYTE				pBuffer
);

DWORD
AfpAdminInvalidVolumeEnum(
		IN	AFP_SERVER_HANDLE	hAfpServer,
		OUT	LPBYTE *			lpbBuffer,
		OUT	LPDWORD				lpdwEntriesRead
);

DWORD
AfpAdminInvalidVolumeDelete(
		IN AFP_SERVER_HANDLE 	hAfpServer,
		IN LPWSTR 				lpwsVolumeName
);

DWORD
AfpAdminDirectoryGetInfo(
		IN	AFP_SERVER_HANDLE	hAfpServer,
		IN	LPWSTR				lpwsPath,
		OUT LPBYTE				*ppAfpDirectoryInfo
);

DWORD
AfpAdminDirectorySetInfo(
		IN	AFP_SERVER_HANDLE	hAfpServer,
		IN	LPBYTE				pAfpDirectoryInfo,
		IN	DWORD				dwParmNum
);

DWORD
AfpAdminServerGetInfo(
		IN	AFP_SERVER_HANDLE	hAfpServer,
		OUT LPBYTE				*ppAfpServerInfo
);

DWORD
AfpAdminServerSetInfo(
		IN	AFP_SERVER_HANDLE	hAfpServer,
		IN	LPBYTE				pAfpServerInfo,
		IN	DWORD				dwParmNum
);

DWORD
AfpAdminSessionEnum(
		IN	AFP_SERVER_HANDLE	hAfpServer,
		OUT	LPBYTE *			lpbBuffer,
		IN	DWORD				dwPrefMaxLen,
		OUT	LPDWORD				lpdwEntriesRead,
		OUT	LPDWORD				lpdwTotalEntries,
		IN	LPDWORD				lpdwResumeHandle
);

DWORD
AfpAdminSessionClose(
		IN AFP_SERVER_HANDLE 	hAfpServer,
		IN DWORD 				dwSessionId
);

DWORD
AfpAdminConnectionEnum(
		IN	AFP_SERVER_HANDLE	hAfpServer,
		OUT	LPBYTE *			lpbBuffer,
		IN	DWORD				dwFilter,
		IN	DWORD				dwId,
		IN	DWORD				dwPrefMaxLen,
		OUT	LPDWORD				lpdwEntriesRead,
		OUT	LPDWORD				lpdwTotalEntries,
		IN	LPDWORD				lpdwResumeHandle
);

DWORD
AfpAdminConnectionClose(
		IN AFP_SERVER_HANDLE 	hAfpServer,
		IN DWORD 				dwConnectionId
);

DWORD
AfpAdminFileEnum(
		IN	AFP_SERVER_HANDLE	hAfpServer,
		OUT	LPBYTE *			lpbBuffer,
		IN	DWORD				dwPrefMaxLen,
		OUT	LPDWORD				lpdwEntriesRead,
		OUT	LPDWORD				lpdwTotalEntries,
		IN	LPDWORD				lpdwResumeHandle
);

DWORD
AfpAdminFileClose(
		IN AFP_SERVER_HANDLE 	hAfpServer,
		IN DWORD 				dwConnectionId
);

DWORD
AfpAdminETCMapGetInfo(
		IN	AFP_SERVER_HANDLE	hAfpServer,
		OUT LPBYTE			*	ppbBuffer
);

DWORD
AfpAdminETCMapAdd(
		IN	AFP_SERVER_HANDLE	hAfpServer,
		IN	PAFP_TYPE_CREATOR	pAfpTypeCreator
);

DWORD
AfpAdminETCMapDelete(
		IN	AFP_SERVER_HANDLE	hAfpServer,
		IN	PAFP_TYPE_CREATOR	pAfpTypeCreator
);

DWORD
AfpAdminETCMapSetInfo(
		IN	AFP_SERVER_HANDLE	hAfpServer,
		IN	PAFP_TYPE_CREATOR	pAfpTypeCreator
);

DWORD
AfpAdminETCMapAssociate(
		IN	AFP_SERVER_HANDLE	hAfpServer,
		IN	PAFP_TYPE_CREATOR	pAfpTypeCreator,
		IN	PAFP_EXTENSION		pAfpExtension
);

DWORD
AfpAdminMessageSend(
		IN	AFP_SERVER_HANDLE	hAfpServer,
		IN	PAFP_MESSAGE_INFO	pAfpMessage
);

DWORD
AfpAdminStatisticsGet(
		IN	AFP_SERVER_HANDLE	hAfpServer,
		OUT LPBYTE *			ppbBuffer
);

DWORD
AfpAdminStatisticsGetEx(
		IN	AFP_SERVER_HANDLE	hAfpServer,
		OUT LPBYTE *			ppbBuffer
);

DWORD
AfpAdminStatisticsClear(
		IN	AFP_SERVER_HANDLE	hAfpServer
);

DWORD
AfpAdminProfileGet(
		IN	AFP_SERVER_HANDLE	hAfpServer,
		OUT LPBYTE *			ppbBuffer
);

DWORD
AfpAdminProfileClear(
		IN	AFP_SERVER_HANDLE	hAfpServer
);

DWORD
AfpAdminFinderSetInfo(
		IN	AFP_SERVER_HANDLE	hAfpServer,
		IN	LPWSTR				pType,
		IN	LPWSTR				pCreator,
		IN	LPWSTR				pData,
		IN	LPWSTR				pResource,
		IN	LPWSTR				pTarget,
		IN	DWORD				dwParmNum
);

#endif // _MACFILE_