523 lines
9.4 KiB
C
523 lines
9.4 KiB
C
/********************************************************************/
|
||
/** Copyright(c) 1989 Microsoft Corporation. **/
|
||
/********************************************************************/
|
||
|
||
//***
|
||
//
|
||
// Filename: afpsvcp.h
|
||
//
|
||
// Description: This is the main header file for the AFP Server Service.
|
||
//
|
||
// History:
|
||
// May 11,1992. NarenG Created original version.
|
||
//
|
||
#ifndef _AFPSVCP_
|
||
#define _AFPSVCP_
|
||
|
||
#include <nt.h>
|
||
#include <ntrtl.h>
|
||
#include <ntseapi.h>
|
||
#include <ntlsa.h>
|
||
#include <ntsam.h>
|
||
#include <ntsamp.h>
|
||
#include <nturtl.h> // needed for winbase.h
|
||
#include <ntmsv1_0.h>
|
||
#include <samrpc.h>
|
||
#include <align.h>
|
||
|
||
#include <windows.h> // Win32 base API's
|
||
#include <winuser.h> // Needed for LoadString
|
||
#include <winsvc.h> // Win32 service control stuff
|
||
#include <winreg.h> // Win32 registry API's
|
||
#include <lm.h>
|
||
#include <srvann.h>
|
||
#include <rpc.h> // RPC api's
|
||
#include <devioctl.h> // FILE_DEVICE_NETWORK, METHOD_BUFFERD constants
|
||
#include <stdlib.h>
|
||
#include <string.h>
|
||
#include <ctype.h>
|
||
#include <wchar.h>
|
||
#include <search.h>
|
||
|
||
#if DBG
|
||
#define DEBUG TRUE
|
||
#endif
|
||
|
||
#include <afpsvc.h> // Generated by MIDL
|
||
#include <admin.h>
|
||
#include <macfile.h>
|
||
#include <afpcomn.h>
|
||
#include "events.h"
|
||
#include "ioctl.h"
|
||
#include "rasfmsub.h"
|
||
#include "debug.h"
|
||
|
||
|
||
#define LOGON_PROCESS_NAME "SFM_SERVICE"
|
||
|
||
#define AFPSTATE_RPC_STARTED 0x1
|
||
#define AFPSTATE_FSD_LOADED 0x2
|
||
#define AFPSTATE_BLOCKED_ON_DOMINFO 0x4
|
||
|
||
// Id's of the various data structures
|
||
//
|
||
typedef enum _AFP_STRUCTURE_TYPE {
|
||
|
||
AFP_EXTENSION_STRUCT,
|
||
AFP_TYPECREATOR_STRUCT,
|
||
AFP_ICON_STRUCT,
|
||
AFP_VOLUME_STRUCT,
|
||
AFP_SERVER_STRUCT,
|
||
AFP_DIRECTORY_STRUCT,
|
||
AFP_SESSION_STRUCT,
|
||
AFP_CONNECTION_STRUCT,
|
||
AFP_MESSAGE_STRUCT,
|
||
AFP_FILE_STRUCT,
|
||
AFP_FINDER_STRUCT
|
||
|
||
} AFP_STRUCTURE_TYPE;
|
||
|
||
// The approximate times (in milliseconds) taken to respond to various
|
||
// service control requests.
|
||
//
|
||
#define AFP_SERVICE_INSTALL_TIME 15*60000 // 15 minutes
|
||
#define AFP_SERVICE_STOP_TIME 5*60000 // 5 minutes
|
||
#define AFP_SERVICE_CONTINUE_TIME 5000
|
||
#define AFP_SERVICE_PAUSE_TIME 1000
|
||
|
||
// Macro to calculate the byte offset of a field in a structure of type type.
|
||
//
|
||
#define AFP_FIELD_OFFSET(type, field) ((LONG)((LONG_PTR)&(((type *)0)->field)))
|
||
|
||
// Macro to calculate the size of a given field within a structure.
|
||
//
|
||
#define AFP_FIELD_SIZE(type, field) sizeof(((type *)0)->field)
|
||
|
||
|
||
// Access mask values
|
||
//
|
||
#define AFPSVC_ALL_ACCESS 0x0001
|
||
|
||
// All global variables are packaged within this structure.
|
||
//
|
||
typedef struct _AFP_GLOBALS {
|
||
|
||
// Handle to the key that contains the server parameters
|
||
//
|
||
HKEY hkeyServerParams;
|
||
|
||
// Handle to the key that contains the volumes list.
|
||
//
|
||
HKEY hkeyVolumesList;
|
||
|
||
// Handle to the key that contains the list of Type/Creator/Comment tupples
|
||
//
|
||
HKEY hkeyTypeCreators;
|
||
|
||
// Handle to the key that contains the list mapped extensions.
|
||
//
|
||
HKEY hkeyExtensions;
|
||
|
||
// Handle to the key that contains the icon list.
|
||
//
|
||
HKEY hkeyIcons;
|
||
|
||
// Service parameters
|
||
//
|
||
WCHAR wchServerName[AFP_SERVERNAME_LEN+1];
|
||
DWORD dwServerOptions;
|
||
DWORD dwMaxSessions;
|
||
WCHAR wchLoginMsg[AFP_MESSAGE_LEN+1];
|
||
DWORD dwMaxPagedMem;
|
||
DWORD dwMaxNonPagedMem;
|
||
WCHAR wchCodePagePath[MAX_PATH];
|
||
|
||
// Localizable strings
|
||
//
|
||
WCHAR wchInvalid[100];
|
||
WCHAR wchDeleted[100];
|
||
WCHAR wchUnknown[100];
|
||
WCHAR wchDefTCComment[AFP_ETC_COMMENT_LEN+1];
|
||
|
||
// Contains information about what components were initialized
|
||
// successfully
|
||
//
|
||
DWORD dwServerState;
|
||
|
||
// Handle to the AFP Server FSD
|
||
//
|
||
HANDLE hFSD;
|
||
|
||
// Handle used to announce the service status
|
||
//
|
||
SERVICE_STATUS_HANDLE hServiceStatus;
|
||
|
||
SERVICE_STATUS ServiceStatus;
|
||
|
||
// This is a cache of ext/type/creator mappings
|
||
//
|
||
AFP_ETCMAP_INFO AfpETCMapInfo;
|
||
|
||
// Will contain the Id of the next type/creator that will be added to the
|
||
// registry via the AfpAdminAddETCMap API.
|
||
//
|
||
DWORD dwCurrentTCId;
|
||
|
||
// Mutex handle for mutual exclusion around volume SetInfo/ Add/ Delete
|
||
// ETC mappings registry and cache operations.
|
||
//
|
||
HANDLE hmutexETCMap;
|
||
|
||
// Mutex handle for mutual exclusion around volume SetInfo/ Add/ Delete
|
||
// volume registry operations.
|
||
//
|
||
HANDLE hmutexVolume;
|
||
|
||
// This will be used by the server helper thread to inicate its
|
||
// success or failure while initializing itself. The parent thread
|
||
// can then take appropriate action.
|
||
//
|
||
HANDLE heventSrvrHlprThread;
|
||
|
||
// This is used by the server helper thread(s) to indicate that they have terminated
|
||
//
|
||
HANDLE heventSrvrHlprThreadTerminate;
|
||
|
||
// This is used in special case: if we have to terminate the helper thread when
|
||
// it's blocked trying to get domain info
|
||
HANDLE heventSrvrHlprSpecial;
|
||
|
||
DWORD nThreadCount;
|
||
|
||
DWORD dwSrvrHlprCode;
|
||
|
||
DWORD dwSrvrHlprCount;
|
||
|
||
NT_PRODUCT_TYPE NtProductType;
|
||
PSID pSidNone;
|
||
|
||
} AFP_GLOBALS, *PAFP_GLOBALS;
|
||
|
||
#ifdef DEFINE_AFP_GLOBALS
|
||
AFP_GLOBALS AfpGlobals;
|
||
HANDLE SfmLsaHandle;
|
||
DWORD SfmAuthPkgId;
|
||
#else
|
||
extern AFP_GLOBALS AfpGlobals;
|
||
extern HANDLE SfmLsaHandle;
|
||
extern DWORD SfmAuthPkgId;
|
||
#endif
|
||
|
||
// prototypes of functions used across modules
|
||
//
|
||
VOID
|
||
AfpAnnounceServiceStatus(
|
||
VOID
|
||
);
|
||
|
||
DWORD
|
||
AfpInitialize(
|
||
VOID
|
||
);
|
||
|
||
VOID
|
||
AfpTerminate(
|
||
VOID
|
||
);
|
||
|
||
DWORD
|
||
AfpRegGetKeyInfo(
|
||
IN HKEY hKey,
|
||
OUT LPDWORD lpdwMaxValNameLen, // Longest valuename in this key
|
||
OUT LPDWORD lpdwNumValues, // Number of values in this key
|
||
OUT LPDWORD lpdwMaxValueDataSize // Max. size of value data.
|
||
);
|
||
|
||
DWORD
|
||
AfpRegOpen(
|
||
VOID
|
||
);
|
||
|
||
VOID
|
||
AfpRegClose(
|
||
VOID
|
||
);
|
||
|
||
DWORD
|
||
AfpRegVolumeAdd(
|
||
IN PAFP_VOLUME_INFO pVolumeInfo
|
||
);
|
||
|
||
DWORD
|
||
AfpRegVolumeDelete(
|
||
IN LPWSTR lpwsVolumeName
|
||
);
|
||
|
||
DWORD
|
||
AfpRegVolumeSetInfo(
|
||
IN PAFP_VOLUME_INFO pVolumeInfo
|
||
);
|
||
|
||
DWORD
|
||
AfpRegExtensionEnum(
|
||
VOID
|
||
);
|
||
|
||
DWORD
|
||
AfpRegTypeCreatorEnum(
|
||
VOID
|
||
);
|
||
|
||
DWORD
|
||
AfpRegExtensionAdd(
|
||
IN PAFP_EXTENSION pAfpExtension
|
||
);
|
||
|
||
DWORD
|
||
AfpRegExtensionSetInfo(
|
||
IN PAFP_EXTENSION pAfpExtension
|
||
);
|
||
|
||
DWORD
|
||
AfpRegExtensionDelete(
|
||
IN PAFP_EXTENSION pAfpExtension
|
||
);
|
||
|
||
DWORD
|
||
AfpRegTypeCreatorSetInfo(
|
||
IN PAFP_TYPE_CREATOR pAfpTypeCreator
|
||
);
|
||
|
||
DWORD
|
||
AfpRegTypeCreatorAdd(
|
||
IN PAFP_TYPE_CREATOR pAfpTypeCreator
|
||
);
|
||
|
||
DWORD
|
||
AfpRegTypeCreatorDelete(
|
||
IN PAFP_TYPE_CREATOR pAfpTypeCreator
|
||
);
|
||
|
||
DWORD
|
||
AfpRegServerGetInfo(
|
||
VOID
|
||
);
|
||
|
||
DWORD
|
||
AfpRegServerSetInfo(
|
||
IN PAFP_SERVER_INFO pServerInfo,
|
||
IN DWORD dwParmnum
|
||
);
|
||
|
||
DWORD
|
||
AfpRegServerGetCodePagePath(
|
||
VOID
|
||
);
|
||
|
||
DWORD
|
||
AfpSecObjCreate(
|
||
VOID
|
||
);
|
||
|
||
DWORD
|
||
AfpSecObjDelete(
|
||
VOID
|
||
);
|
||
|
||
DWORD
|
||
AfpSecObjAccessCheck(
|
||
IN DWORD DesiredAccess,
|
||
OUT LPDWORD pfAccessStatus
|
||
);
|
||
|
||
DWORD
|
||
AfpBufMakeFSDRequest(
|
||
IN LPBYTE pBuffer,
|
||
IN DWORD cbReqPktSize,
|
||
IN AFP_STRUCTURE_TYPE dwStructureId,
|
||
OUT LPBYTE *ppSelfRelativeBuf,
|
||
OUT LPDWORD lpdwSelfRelativeBufSize
|
||
);
|
||
|
||
DWORD
|
||
AfpBufMakeFSDETCMappings(
|
||
OUT PSRVETCPKT *ppSrvSetEtc,
|
||
OUT LPDWORD lpdwSrvSetEtcBufSize
|
||
);
|
||
|
||
VOID
|
||
AfpBufOffsetToPointer(
|
||
IN OUT LPBYTE pBuffer,
|
||
IN DWORD dwNumEntries,
|
||
IN AFP_STRUCTURE_TYPE dwStructureType
|
||
);
|
||
|
||
VOID
|
||
AfpBufCopyFSDETCMapInfo(
|
||
IN PAFP_TYPE_CREATOR pAfpTypeCreator,
|
||
IN PAFP_EXTENSION pAfpExtension,
|
||
OUT PETCMAPINFO2 pFSDETCMapInfo
|
||
);
|
||
|
||
VOID
|
||
AfpBufMakeFSDIcon(
|
||
IN PAFP_ICON_INFO pIconInfo,
|
||
OUT LPBYTE lpbFSDIcon,
|
||
OUT LPDWORD lpcbFSDIconSize
|
||
);
|
||
|
||
DWORD
|
||
AfpBufMakeMultiSz(
|
||
IN AFP_STRUCTURE_TYPE dwStructureId,
|
||
IN LPBYTE pbStructure,
|
||
OUT LPBYTE* ppbMultiSz,
|
||
OUT LPDWORD lpdwMultiSzSize
|
||
);
|
||
|
||
DWORD
|
||
AfpBufParseMultiSz(
|
||
IN AFP_STRUCTURE_TYPE dwStructureId,
|
||
IN LPBYTE pbMultiSz,
|
||
OUT LPBYTE pbStructure
|
||
);
|
||
|
||
DWORD
|
||
AfpBufStructureSize(
|
||
IN AFP_STRUCTURE_TYPE dwStructureId,
|
||
IN LPBYTE lpbStructure
|
||
);
|
||
|
||
DWORD
|
||
AfpBufUnicodeToNibble(
|
||
IN OUT LPWSTR lpwsData
|
||
);
|
||
|
||
void *
|
||
AfpBinarySearch(
|
||
IN const void * pKey,
|
||
IN const void * pBase,
|
||
IN size_t num,
|
||
IN size_t width,
|
||
IN int (_cdecl *compare)(const void * pElem1, const void * pElem2 )
|
||
);
|
||
|
||
int
|
||
_cdecl
|
||
AfpBCompareTypeCreator(
|
||
IN const void * pAfpTypeCreator1,
|
||
IN const void * pAfpTypeCreatro2
|
||
);
|
||
|
||
int
|
||
_cdecl
|
||
AfpLCompareTypeCreator(
|
||
IN const void * pAfpTypeCreator1,
|
||
IN const void * pAfpTypeCreatro2
|
||
);
|
||
|
||
int
|
||
_cdecl
|
||
AfpBCompareExtension(
|
||
IN const void * pAfpExtension1,
|
||
IN const void * pAfpExtension2
|
||
);
|
||
|
||
int
|
||
_cdecl
|
||
AfpLCompareExtension(
|
||
IN const void * pAfpExtension1,
|
||
IN const void * pAfpExtension2
|
||
);
|
||
|
||
|
||
DWORD
|
||
AfpFSDOpen(
|
||
OUT PHANDLE pFSD
|
||
);
|
||
|
||
DWORD
|
||
AfpFSDClose(
|
||
IN HANDLE hFSD
|
||
);
|
||
|
||
DWORD
|
||
AfpFSDUnload(
|
||
VOID
|
||
);
|
||
|
||
DWORD
|
||
AfpFSDLoad(
|
||
VOID
|
||
);
|
||
|
||
DWORD
|
||
AfpFSDIOControl(
|
||
IN HANDLE hFSD,
|
||
IN DWORD dwOpCode,
|
||
IN PVOID pInbuf OPTIONAL,
|
||
IN DWORD cbInbufLen,
|
||
OUT PVOID pOutbuf OPTIONAL,
|
||
IN DWORD cbOutbuflen,
|
||
OUT LPDWORD cbBytesTransferred
|
||
);
|
||
|
||
DWORD
|
||
AfpCreateServerHelperThread(
|
||
BOOL fIsFirstThread
|
||
);
|
||
|
||
VOID
|
||
AfpTerminateCurrentThread(
|
||
VOID
|
||
);
|
||
|
||
DWORD
|
||
AfpInitServerHelper(
|
||
VOID
|
||
);
|
||
|
||
DWORD
|
||
AfpServerHelper(
|
||
IN LPVOID Parameter
|
||
);
|
||
|
||
VOID
|
||
AfpLogEvent(
|
||
IN DWORD dwMessageId,
|
||
IN WORD cNumberOfSubStrings,
|
||
IN LPWSTR* plpwsSubStrings,
|
||
IN DWORD dwErrorCode,
|
||
IN WORD wSeverity
|
||
);
|
||
|
||
VOID
|
||
AfpLogServerEvent(
|
||
IN PAFP_FSD_CMD_PKT pAfpFsdCmd
|
||
);
|
||
|
||
VOID
|
||
AfpAddInvalidVolume(
|
||
IN LPWSTR lpwsName,
|
||
IN LPWSTR lpwsPath
|
||
);
|
||
|
||
VOID
|
||
AfpDeleteInvalidVolume(
|
||
IN LPWSTR lpwsVolumeName
|
||
);
|
||
|
||
DWORD
|
||
I_DirectorySetInfo(
|
||
IN PAFP_DIRECTORY_INFO pAfpDirectoryInfo,
|
||
IN DWORD dwParmNum
|
||
);
|
||
|
||
DWORD
|
||
I_DirectoryGetInfo(
|
||
IN LPWSTR lpwsPath,
|
||
OUT PAFP_DIRECTORY_INFO * ppAfpDirectoryInfo
|
||
);
|
||
|
||
#endif // _AFPSVCP_
|
||
|
||
|