windows-nt/Source/XPSP1/NT/base/fs/dfs/driver/dfsprocs.h
2020-09-26 16:20:57 +08:00

326 lines
6.5 KiB
C
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//+----------------------------------------------------------------------------
//
// 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_