330 lines
5.7 KiB
C
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_
|
|
|