Windows-Server-2003/base/fs/mup/mupfunc.h

330 lines
5.7 KiB
C

/*++
Copyright (c) 1991 Microsoft Corporation
Module Name:
mupfunc.h
Abstract:
This module defines all the function prototypes and macros for the MUP.
Author:
Manny Weiser (mannyw) 17-Dec-1991
Revision History:
--*/
#ifndef _MUPFUNC_
#define _MUPFUNC_
NTSTATUS
MupCreate (
IN PMUP_DEVICE_OBJECT MupDeviceObject,
IN PIRP Irp
);
NTSTATUS
MupFsControl (
IN PMUP_DEVICE_OBJECT MupDeviceObject,
IN PIRP Irp
);
NTSTATUS
MupCleanup (
IN PMUP_DEVICE_OBJECT MupDeviceObject,
IN PIRP Irp
);
NTSTATUS
MupClose (
IN PMUP_DEVICE_OBJECT MupDeviceObject,
IN PIRP Irp
);
NTSTATUS
MupForwardIoRequest (
IN PMUP_DEVICE_OBJECT MupDeviceObject,
IN PIRP Irp
);
//
// Internal support functions
//
NTSTATUS
MupInitializeData(
);
VOID
MupUninitializeData(
VOID
);
PIRP
MupBuildIoControlRequest (
IN OUT PIRP Irp OPTIONAL,
IN PFILE_OBJECT FileObject OPTIONAL,
IN PVOID Context,
IN UCHAR MajorFunction,
IN ULONG IoControlCode,
IN PVOID MainBuffer,
IN ULONG InputBufferLength,
IN PVOID AuxiliaryBuffer OPTIONAL,
IN ULONG OutputBufferLength,
IN PIO_COMPLETION_ROUTINE CompletionRoutine
);
NTSTATUS
MupRerouteOpen (
IN PFILE_OBJECT FileObject,
IN PUNC_PROVIDER UncProvider
);
VOID
MupCalculateTimeout(
PLARGE_INTEGER Time
);
//
// Block Management functions.
//
VOID
MupInitializeVcb(
IN PVCB Vcb
);
VOID
MupDereferenceVcb(
PVCB Vcb
);
PFCB
MupCreateFcb(
VOID
);
VOID
MupDereferenceFcb(
PFCB Fcb
);
VOID
MupFreeFcb(
PFCB Fcb
);
PCCB
MupCreateCcb(
VOID
);
VOID
MupDereferenceCcb(
PCCB Ccb
);
VOID
MupFreeCcb(
PCCB Ccb
);
PUNC_PROVIDER
MupAllocateUncProvider(
ULONG DataLength
);
VOID
MupDereferenceUncProvider(
PUNC_PROVIDER UncProvider
);
VOID
MupCloseUncProvider(
PUNC_PROVIDER UncProvider
);
PKNOWN_PREFIX
MupAllocatePrefixEntry(
ULONG DataLength
);
VOID
MupDereferenceKnownPrefix(
PKNOWN_PREFIX KnownPrefix
);
VOID
MupFreeKnownPrefix(
PKNOWN_PREFIX KnownPrefix
);
PMASTER_FORWARDED_IO_CONTEXT
MupAllocateMasterIoContext(
VOID
);
NTSTATUS
MupDereferenceMasterIoContext(
PMASTER_FORWARDED_IO_CONTEXT MasterContext,
PNTSTATUS Status
);
VOID
MupFreeMasterIoContext(
PMASTER_FORWARDED_IO_CONTEXT MasterContext
);
PMASTER_QUERY_PATH_CONTEXT
MupAllocateMasterQueryContext(
VOID
);
NTSTATUS
MupDereferenceMasterQueryContext(
PMASTER_QUERY_PATH_CONTEXT MasterContext
);
VOID
MupFreeMasterQueryContext(
PMASTER_QUERY_PATH_CONTEXT MasterContext
);
//
// File object support functions.
//
VOID
MupSetFileObject (
IN PFILE_OBJECT FileObject OPTIONAL,
IN PVOID FsContext,
IN PVOID FsContext2
);
BLOCK_TYPE
MupDecodeFileObject (
IN PFILE_OBJECT FileObject,
OUT PVOID *FsContext,
OUT PVOID *FsContext2
);
//
// Registry Functions
//
VOID
MupGetProviderInformation (
VOID
);
PUNC_PROVIDER
MupCheckForUnregisteredProvider(
PUNICODE_STRING DeviceName
);
VOID
MupRemoveKnownPrefixEntry(
PKNOWN_PREFIX KnownPrefix
);
//
// Acquiring and releasing MUP locks.
//
#define MupAcquireGlobalLock() ACQUIRE_LOCK( &MupGlobalLock )
#define MupReleaseGlobalLock() RELEASE_LOCK( &MupGlobalLock )
#define BlockType( Block ) ((PBLOCK_HEADER)(Block))->BlockType
#define MupCompleteRequest( Irp, Status ) FsRtlCompleteRequest( Irp, Status )
#define MupReferenceBlock( Block ) ++((PBLOCK_HEADER)(Block))->ReferenceCount
#define MupVerifyBlock( Block, Type) \
\
if ( ((PBLOCK_HEADER)(Block))->BlockState != BlockStateActive \
|| \
((PBLOCK_HEADER)(Block))->BlockType != Type) { \
\
ExRaiseStatus( STATUS_INVALID_HANDLE ); \
\
}
//
// Memory allocation and free
//
#if !MUPDBG
#define ALLOCATE_PAGED_POOL( size, type ) FsRtlAllocatePoolWithTag( PagedPool, (size), ' puM' )
#define ALLOCATE_NONPAGED_POOL( size, type ) FsRtlAllocatePoolWithTag( NonPagedPool, (size), ' puM' )
#define FREE_POOL( buffer ) ExFreePool( buffer )
#else
PVOID
MupAllocatePoolDebug (
IN POOL_TYPE PoolType,
IN CLONG BlockSize,
IN BLOCK_TYPE BlockType
);
VOID
MupFreePoolDebug (
IN PVOID P
);
#define ALLOCATE_PAGED_POOL( size, type ) MupAllocatePoolDebug( PagedPool, (size), (type) )
#define ALLOCATE_NONPAGED_POOL( size, type ) MupAllocatePoolDebug( NonPagedPool, (size), (type) )
#define FREE_POOL( buffer ) MupFreePoolDebug( buffer )
#endif
//
// 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; }
//
// General purpose
//
#define MIN(a,b) (((a) < (b)) ? (a) : (b))
//
// Terminal Server Macro.
//
#define IsTerminalServer() (BOOLEAN)(SharedUserData->SuiteMask & (1 << TerminalServer))
#endif // _MUPFUNC_