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