326 lines
6.5 KiB
C
326 lines
6.5 KiB
C
|
//+----------------------------------------------------------------------------
|
|||
|
//
|
|||
|
// File: dfsprocs.h
|
|||
|
//
|
|||
|
// Contents:
|
|||
|
//
|
|||
|
// This module defines all of the globally used procedures in the Dfs server
|
|||
|
// driver
|
|||
|
//
|
|||
|
// Functions:
|
|||
|
//
|
|||
|
//-----------------------------------------------------------------------------
|
|||
|
|
|||
|
|
|||
|
#ifndef _DFSPROCS_
|
|||
|
#define _DFSPROCS_
|
|||
|
|
|||
|
#include <ntos.h>
|
|||
|
#include <string.h>
|
|||
|
#include <fsrtl.h>
|
|||
|
#include <zwapi.h>
|
|||
|
#include <tdi.h>
|
|||
|
#include <ntddnfs.h> // For communicating with
|
|||
|
// the SMB Rdr
|
|||
|
|
|||
|
#include <ntddmup.h> // For UNC registration
|
|||
|
|
|||
|
#include <winnetwk.h> // For NETRESOURCE def'n
|
|||
|
|
|||
|
#include <dfsfsctl.h> // 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_
|