//+---------------------------------------------------------------------------- // // File: dfsprocs.h // // Contents: // // This module defines all of the globally used procedures in the Dfs server // driver // // Functions: // //----------------------------------------------------------------------------- #ifndef _DFSPROCS_ #define _DFSPROCS_ #include #include #include #include #include #include // For communicating with // the SMB Rdr #include // For UNC registration #include // For NETRESOURCE def'n #include // Dfs FsControl Codes. #include "dfserr.h" #include "dfsstr.h" #include "nodetype.h" #include "dfsmrshl.h" #include "dfsrtl.h" #include "pkt.h" #include "dfslpc.h" #include "dfsstruc.h" #include "dfsdata.h" #include "localvol.h" #include "log.h" #include "lvolinfo.h" #include "fcbsup.h" #include "reset.h" #ifndef i386 #define DFS_UNALIGNED UNALIGNED #else #define DFS_UNALIGNED #endif // i386 // // The FSD Level dispatch routines. These routines are called by the // I/O system via the dispatch table in the Driver Object. // NTSTATUS DfsFsdCleanup ( // implemented in Close.c IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ); NTSTATUS DfsFsdClose ( // implemented in Close.c IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ); NTSTATUS DfsFsdCreate ( // implemented in Create.c IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ); NTSTATUS DfsFsdFileSystemControl ( // implemented in Fsctrl.c IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ); NTSTATUS DfsFsdSetInformation ( // implemented in Fileinfo.c IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ); // // Miscellaneous support routines // NTSTATUS DfspInitSecDesc( PDFS_PKT pkt); NTSTATUS DfsInitializeLogicalRoot ( IN LPCWSTR Name, IN PUNICODE_STRING Prefix OPTIONAL, IN USHORT VcbFlags OPTIONAL ); NTSTATUS DfsInsertProvider( IN PUNICODE_STRING pustrProviderName, IN ULONG fProvCapability, IN ULONG eProviderId); NTSTATUS DfsDeleteLogicalRoot ( IN PWSTR Name, IN BOOLEAN fForce ); NTSTATUS DfspLogRootNameToPath( LPCWSTR Name, PUNICODE_STRING RootName ); BOOLEAN DfsLogicalRootExists( PWSTR pwszName ); PDFS_LOCAL_VOLUME_CONFIG DfsNetInfoToConfigInfo( ULONG EntryType, ULONG ServiceType, LPWSTR pwszStgId, LPWSTR pwszShareName, GUID *pUid, LPWSTR pwszEntryPrefix, LPWSTR pwszShortPrefix, LPNET_DFS_ENTRY_ID_CONTAINER NetInfo); NTSTATUS DfsCreateConnection( IN PDFS_SERVICE pService, IN PPROVIDER_DEF pProvider, OUT PHANDLE handle ); NTSTATUS DfsCloseConnection( IN PDFS_SERVICE pService ); BOOLEAN DfsConcatenateFilePath ( IN PUNICODE_STRING Dest, IN PWSTR RemainingPath, IN USHORT Length ); VOID DfspGetMaxReferrals ( VOID ); // // This macro returns TRUE if a flag in a set of flags is on and FALSE // otherwise // #ifdef FlagOn #undef FlagOn #endif #define FlagOn(Flags,SingleFlag) ( \ (BOOLEAN)(((Flags) & (SingleFlag)) != 0 ? TRUE : FALSE) \ ) #define SetFlag(Flags,SingleFlag) { \ (Flags) |= (SingleFlag); \ } #define ClearFlag(Flags,SingleFlag) { \ (Flags) &= ~(SingleFlag); \ } VOID GuidToString( IN GUID *pGuid, OUT PWSTR pwszGuid); VOID StringToGuid( IN PWSTR pwszGuid, OUT GUID *pGuid); // // The following macro is used to determine if an FSD thread can block // for I/O or wait for a resource. It returns TRUE if the thread can // block and FALSE otherwise. This attribute can then be used to call // the FSD & FSP common work routine with the proper wait value. // #define CanFsdWait(IRP) ((BOOLEAN)( \ IoIsOperationSynchronous(IRP) || \ DfsData.OurProcess == PsGetCurrentProcess()) \ ) // // The following macro is used by the FSP and FSD routines to complete // an IRP. // VOID DfsCompleteRequest_Real ( IN PIRP Irp, IN NTSTATUS Status ); #define DfsCompleteRequest(IRP,STATUS) { \ DfsCompleteRequest_Real(IRP,STATUS); \ } // // The following two macros are used by the Fsd/Fsp exception handlers to // process an exception. The first macro is the exception filter used in // the Fsd/Fsp to decide if an exception should be handled at this level. // The second macro decides if the exception is to be finished off by // completing the IRP, and cleaning up the Irp Context, or if we should // bugcheck. Exception values such as STATUS_FILE_INVALID (raised by // VerfySup.c) cause us to complete the Irp and cleanup, while exceptions // such as accvio cause us to bugcheck. // // The basic structure for fsd/fsp exception handling is as follows: // // DfsFsdXxx(...) // { // try { // // ... // // } except(DfsExceptionFilter("Xxx\n")) { // // DfsProcessException( Irp, &Status ); // } // // Return Status; // } // // LONG // DfsExceptionFilter ( // IN PSZ String // ); // // VOID // DfsProcessException ( // IN PIRP Irp, // IN PNTSTATUS ExceptionCode // ); // LONG DfsExceptionFilter ( IN NTSTATUS ExceptionCode, IN PEXCEPTION_POINTERS ExceptionPointer ); NTSTATUS DfsProcessException ( IN PIRP Irp, IN NTSTATUS ExceptionCode ); // // VOID // DfsRaiseStatus ( // IN NT_STATUS Status // ); // // #define DfsRaiseStatus(STATUS) { \ ExRaiseStatus( (STATUS) ); \ BugCheck( "DfsRaiseStatus " #STATUS ); \ } // // The following macros are used to establish the semantics needed // to do a return from within a try-finally clause. As a rule every // try clause must end with a label call try_exit. For example, // // try { // : // : // // try_exit: NOTHING; // } finally { // // : // : // } // // Every return statement executed inside of a try clause should use the // try_return macro. If the compiler fully supports the try-finally construct // then the macro should be // // #define try_return(S) { return(S); } // // If the compiler does not support the try-finally construct then the macro // should be // // #define try_return(S) { S; goto try_exit; } // #define try_return(S) { S; goto try_exit; } #endif // _DFSPROCS_