Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

1237 lines
26 KiB

/*++
Copyright (c) 1989 Microsoft Corporation
Module Name:
NpProcs.h
Abstract:
This module defines all of the globally used procedures in the Named
Pipe file system.
Author:
Gary Kimura [GaryKi] 20-Aug-1990
Revision History:
--*/
#ifndef _NPPROCS_
#define _NPPROCS_
#define _NTSRV_
#define _NTDDK_
#include <Ntos.h>
#include <FsRtl.h>
#include <String.h>
//
// This macro returns TRUE if a flag in a set of flags is on and FALSE
// otherwise
//
#define FlagOn(Flags,SingleFlag) ((Flags) & (SingleFlag))
#include "NodeType.h"
#include "NpStruc.h"
#include "NpData.h"
//
// Tag all of our allocations if tagging is turned on
//
#undef FsRtlAllocatePool
#undef FsRtlAllocatePoolWithQuota
#define FsRtlAllocatePool(a,b) FsRtlAllocatePoolWithTag(a,b,'sfpN')
#define FsRtlAllocatePoolWithQuota(a,b) FsRtlAllocatePoolWithQuotaTag(a,b,'sfpN')
//
// Data queue support routines, implemented in DataSup.c
//
NTSTATUS
NpInitializeDataQueue (
IN PDATA_QUEUE DataQueue,
IN ULONG Quota
);
VOID
NpUninitializeDataQueue (
IN PDATA_QUEUE DataQueue
);
NTSTATUS
NpAddDataQueueEntry (
IN NAMED_PIPE_END NamedPipeEnd,
IN PCCB Ccb,
IN PDATA_QUEUE DataQueue,
IN QUEUE_STATE Who,
IN DATA_ENTRY_TYPE Type,
IN ULONG DataSize,
IN PIRP Irp OPTIONAL,
IN PVOID DataPointer OPTIONAL,
IN ULONG ByteOffset
);
PIRP
NpRemoveDataQueueEntry (
IN PDATA_QUEUE DataQueue,
IN BOOLEAN CompletedFlushes,
IN PLIST_ENTRY DeferredList
);
VOID
NpCompleteStalledWrites (
IN PDATA_QUEUE DataQueue,
IN PLIST_ENTRY DeferredList
);
//PDATA_ENTRY
//NpGetNextDataQueueEntry (
// IN PDATA_QUEUE DataQueue,
// IN PDATA_ENTRY PreviousDataEntry OPTIONAL
// );
#define NpGetNextDataQueueEntry(_dq,_pde) \
((_pde) != NULL ? (PDATA_ENTRY)(((PDATA_ENTRY)(_pde))->Queue.Flink) : \
(PDATA_ENTRY)(((PDATA_QUEUE)(_dq))->Queue.Flink))
PDATA_ENTRY
NpGetNextRealDataQueueEntry (
IN PDATA_QUEUE DataQueue,
IN PLIST_ENTRY DeferredList
);
//BOOLEAN
//NpIsDataQueueEmpty (
// IN PDATA_QUEUE DataQueue
// );
#define NpIsDataQueueEmpty(_dq) ((_dq)->QueueState == Empty)
//BOOLEAN
//NpIsDataQueueReaders (
// IN PDATA_QUEUE DataQueue
// );
#define NpIsDataQueueReaders(_dq) ((_dq)->QueueState == ReadEntries)
//BOOLEAN
//NpIsDataQueueWriters (
// IN PDATA_QUEUE DataQueue
// );
#define NpIsDataQueueWriters(_dq) ((_dq)->QueueState == WriteEntries)
//
// The following routines are used to manipulate the input buffers and are
// implemented in DevioSup.c
//
//PVOID
//NpMapUserBuffer (
// IN OUT PIRP Irp
// );
#define NpMapUserBuffer(_irp) \
(Irp->MdlAddress == NULL ? Irp->UserBuffer : \
MmGetSystemAddressForMdl( Irp->MdlAddress ))
VOID
NpLockUserBuffer (
IN OUT PIRP Irp,
IN LOCK_OPERATION Operation,
IN ULONG BufferLength
);
//
// The event support routines, implemented in EventSup.c
//
RTL_GENERIC_COMPARE_RESULTS
NpEventTableCompareRoutine (
IN PRTL_GENERIC_TABLE EventTable,
IN PVOID FirstStruct,
IN PVOID SecondStruct
);
PVOID
NpEventTableAllocate (
IN PRTL_GENERIC_TABLE EventTable,
IN CLONG ByteSize
);
VOID
NpEventTableDeallocate (
IN PRTL_GENERIC_TABLE EventTable,
IN PVOID Buffer
);
//
// VOID
// NpInitializeEventTable (
// IN PEVENT_TABLE EventTable
// );
//
#define NpInitializeEventTable(_et) { \
RtlInitializeGenericTable( &(_et)->Table, \
NpEventTableCompareRoutine, \
NpEventTableAllocate, \
NpEventTableDeallocate, \
NULL ); \
}
//VOID
//NpUninitializeEventTable (
// IN PEVENT_TABLE EventTable
// );
#define NpUninitializeEventTable(_et) NOTHING
NTSTATUS
NpAddEventTableEntry (
IN PEVENT_TABLE EventTable,
IN PCCB Ccb,
IN NAMED_PIPE_END NamedPipeEnd,
IN HANDLE EventHandle,
IN ULONG KeyValue,
IN PEPROCESS Process,
IN KPROCESSOR_MODE PreviousMode,
OUT PEVENT_TABLE_ENTRY *ppEventTableEntry
);
VOID
NpDeleteEventTableEntry (
IN PEVENT_TABLE EventTable,
IN PEVENT_TABLE_ENTRY Template
);
// VOID
// NpSignalEventTableEntry (
// IN PEVENT_TABLE_ENTRY EventTableEntry OPTIONAL
// );
#define NpSignalEventTableEntry(_ete) \
if (ARGUMENT_PRESENT(_ete)) { \
KeSetEvent((PKEVENT)(_ete)->Event, 0, FALSE); \
}
PEVENT_TABLE_ENTRY
NpGetNextEventTableEntry (
IN PEVENT_TABLE EventTable,
IN PVOID *RestartKey
);
//
// The following routines are used to manipulate the fscontext fields of
// a file object, implemented in FilObSup.c
//
VOID
NpSetFileObject (
IN PFILE_OBJECT FileObject OPTIONAL,
IN PVOID FsContext,
IN PVOID FsContext2,
IN NAMED_PIPE_END NamedPipeEnd
);
NODE_TYPE_CODE
NpDecodeFileObject (
IN PFILE_OBJECT FileObject,
OUT PFCB *Fcb OPTIONAL,
OUT PCCB *Ccb,
OUT PNAMED_PIPE_END NamedPipeEnd OPTIONAL
);
//
// Largest matching prefix searching routines, implemented in PrefxSup.c
//
PFCB
NpFindPrefix (
IN PUNICODE_STRING String,
IN BOOLEAN CaseInsensitive,
OUT PUNICODE_STRING RemainingPart
);
NTSTATUS
NpFindRelativePrefix (
IN PDCB Dcb,
IN PUNICODE_STRING String,
IN BOOLEAN CaseInsensitive,
OUT PUNICODE_STRING RemainingPart,
OUT PFCB *ppFcb
);
//
// Pipe name aliases, implemented in AliasSup.c
//
NTSTATUS
NpInitializeAliases (
VOID
);
VOID
NpUninitializeAliases (
VOID
);
NTSTATUS
NpTranslateAlias (
IN OUT PUNICODE_STRING String
);
//
// The follow routine provides common read data queue support
// for buffered read, unbuffered read, peek, and transceive
//
IO_STATUS_BLOCK
NpReadDataQueue (
IN PDATA_QUEUE ReadQueue,
IN BOOLEAN PeekOperation,
IN BOOLEAN ReadOverflowOperation,
IN PUCHAR ReadBuffer,
IN ULONG ReadLength,
IN READ_MODE ReadMode,
IN PCCB Ccb,
IN PLIST_ENTRY DeferredList
);
//
// The following routines are used for setting and manipulating the
// security fields in the data entry, and nonpaged ccb, implemented in
// SecurSup.c
//
NTSTATUS
NpInitializeSecurity (
IN PCCB Ccb,
IN PSECURITY_QUALITY_OF_SERVICE SecurityQos,
IN PETHREAD UserThread
);
VOID
NpUninitializeSecurity (
IN PCCB Ccb
);
NTSTATUS
NpGetClientSecurityContext (
IN NAMED_PIPE_END NamedPipeEnd,
IN PCCB Ccb,
IN PETHREAD UserThread,
OUT PSECURITY_CLIENT_CONTEXT *ppSecurityContext
);
VOID
NpFreeClientSecurityContext (
IN PSECURITY_CLIENT_CONTEXT SecurityContext
);
VOID
NpCopyClientContext (
IN PCCB Ccb,
IN PDATA_ENTRY DataEntry
);
NTSTATUS
NpImpersonateClientContext (
IN PCCB Ccb
);
//
// The following routines are used to manipulate the named pipe state
// implemented in StateSup.c
//
VOID
NpInitializePipeState (
IN PCCB Ccb,
IN PFILE_OBJECT ServerFileObject
);
VOID
NpUninitializePipeState (
IN PCCB Ccb
);
NTSTATUS
NpSetListeningPipeState (
IN PCCB Ccb,
IN PIRP Irp,
IN PLIST_ENTRY DeferredList
);
NTSTATUS
NpSetConnectedPipeState (
IN PCCB Ccb,
IN PFILE_OBJECT ClientFileObject,
IN PLIST_ENTRY DeferredList
);
NTSTATUS
NpSetClosingPipeState (
IN PCCB Ccb,
IN PIRP Irp,
IN NAMED_PIPE_END NamedPipeEnd,
IN PLIST_ENTRY DeferredList
);
NTSTATUS
NpSetDisconnectedPipeState (
IN PCCB Ccb,
IN PLIST_ENTRY DeferredList
);
//
// Internal Named Pipe data Structure Routines, implemented in StrucSup.c.
//
// These routines maniuplate the in memory data structures.
//
VOID
NpInitializeVcb (
VOID
);
VOID
NpDeleteVcb (
IN PLIST_ENTRY DeferredList
);
NTSTATUS
NpCreateRootDcb (
VOID
);
VOID
NpDeleteRootDcb (
IN PROOT_DCB Dcb,
IN PLIST_ENTRY DeferredList
);
NTSTATUS
NpCreateFcb (
IN PDCB ParentDcb,
IN PUNICODE_STRING FileName,
IN ULONG MaximumInstances,
IN LARGE_INTEGER DefaultTimeOut,
IN NAMED_PIPE_CONFIGURATION NamedPipeConfiguration,
IN NAMED_PIPE_TYPE NamedPipeType,
OUT PFCB *ppFcb
);
VOID
NpDeleteFcb (
IN PFCB Fcb,
IN PLIST_ENTRY DeferredList
);
NTSTATUS
NpCreateCcb (
IN PFCB Fcb,
IN PFILE_OBJECT ServerFileObject,
IN NAMED_PIPE_STATE NamedPipeState,
IN READ_MODE ServerReadMode,
IN COMPLETION_MODE ServerCompletionMode,
IN ULONG InBoundQuota,
IN ULONG OutBoundQuota,
OUT PCCB *ppCcb
);
NTSTATUS
NpCreateRootDcbCcb (
OUT PROOT_DCB_CCB *ppCcb
);
VOID
NpDeleteCcb (
IN PCCB Ccb,
IN PLIST_ENTRY DeferredList
);
//
// Waiting for a named pipe support routines, implemented in WaitSup.c
//
VOID
NpInitializeWaitQueue (
IN PWAIT_QUEUE WaitQueue
);
VOID
NpUninitializeWaitQueue (
IN PWAIT_QUEUE WaitQueue
);
NTSTATUS
NpAddWaiter (
IN PWAIT_QUEUE WaitQueue,
IN LARGE_INTEGER DefaultTimeOut,
IN PIRP Irp,
IN PUNICODE_STRING TranslatedString
);
NTSTATUS
NpCancelWaiter (
IN PWAIT_QUEUE WaitQueue,
IN PUNICODE_STRING NameOfPipe,
IN NTSTATUS CompletionStatus,
IN PLIST_ENTRY DeferredList
);
//
// The follow routine provides common write data queue support
// for buffered write, unbuffered write, peek, and transceive
//
NTSTATUS
NpWriteDataQueue ( // implemented in WriteSup.c
IN PDATA_QUEUE WriteQueue,
IN READ_MODE ReadMode,
IN PUCHAR WriteBuffer,
IN ULONG WriteLength,
IN NAMED_PIPE_TYPE PipeType,
OUT PULONG WriteRemaining,
IN PCCB Ccb,
IN NAMED_PIPE_END NamedPipeEnd,
IN PETHREAD UserThread,
IN PLIST_ENTRY DeferredList
);
//
// Miscellaneous support routines
//
#define BooleanFlagOn(F,SF) ( \
(BOOLEAN)(((F) & (SF)) != 0) \
)
//
// This macro takes a pointer (or ulong) and returns its rounded up word
// value
//
#define WordAlign(Ptr) ( \
((((ULONG)(Ptr)) + 1) & 0xfffffffe) \
)
//
// This macro takes a pointer (or ulong) and returns its rounded up longword
// value
//
#define LongAlign(Ptr) ( \
((((ULONG)(Ptr)) + 3) & 0xfffffffc) \
)
//
// This macro takes a pointer (or ulong) and returns its rounded up quadword
// value
//
#define QuadAlign(Ptr) ( \
((((ULONG)(Ptr)) + 7) & 0xfffffff8) \
)
//
// The following types and macros are used to help unpack the packed and
// misaligned fields found in the Bios parameter block
//
typedef union _UCHAR1 {
UCHAR Uchar[1];
UCHAR ForceAlignment;
} UCHAR1, *PUCHAR1;
typedef union _UCHAR2 {
UCHAR Uchar[2];
USHORT ForceAlignment;
} UCHAR2, *PUCHAR2;
typedef union _UCHAR4 {
UCHAR Uchar[4];
ULONG ForceAlignment;
} UCHAR4, *PUCHAR4;
//
// This macro copies an unaligned src byte to an aligned dst byte
//
#define CopyUchar1(Dst,Src) { \
*((UCHAR1 *)(Dst)) = *((UNALIGNED UCHAR1 *)(Src)); \
}
//
// This macro copies an unaligned src word to an aligned dst word
//
#define CopyUchar2(Dst,Src) { \
*((UCHAR2 *)(Dst)) = *((UNALIGNED UCHAR2 *)(Src)); \
}
//
// This macro copies an unaligned src longword to an aligned dsr longword
//
#define CopyUchar4(Dst,Src) { \
*((UCHAR4 *)(Dst)) = *((UNALIGNED UCHAR4 *)(Src)); \
}
//
// VOID
// NpAcquireExclusiveVcb (
// );
//
// VOID
// NpAcquireSharedVcb (
// );
//
// VOID
// NpReleaseVcb (
// );
//
#define NpAcquireExclusiveVcb() (VOID)ExAcquireResourceExclusiveLite( &NpVcb->Resource, TRUE )
#define NpAcquireSharedVcb() (VOID)ExAcquireResourceSharedLite( &NpVcb->Resource, TRUE )
#define NpReleaseVcb() ExReleaseResourceLite( &NpVcb->Resource )
#define NpAcquireExclusiveCcb(Ccb) ExAcquireResourceExclusiveLite(&Ccb->NonpagedCcb->Resource,TRUE);
#define NpReleaseCcb(Ccb) ExReleaseResourceLite(&Ccb->NonpagedCcb->Resource);
#define NpIsAcquiredExclusiveVcb(VCB) ExIsResourceAcquiredExclusiveLite( &(VCB)->Resource )
//
// The FSD Level dispatch routines. These routines are called by the
// I/O system via the dispatch table in the Driver Object.
//
// They each accept as input a pointer to a device object (actually most
// expect an npfs device object), and a pointer to the IRP.
//
NTSTATUS
NpFsdCreate ( // implemented in Create.c
IN PNPFS_DEVICE_OBJECT NpfsDeviceObject,
IN PIRP Irp
);
NTSTATUS
NpFsdCreateNamedPipe ( // implemented in CreateNp.c
IN PNPFS_DEVICE_OBJECT NpfsDeviceObject,
IN PIRP Irp
);
NTSTATUS
NpFsdClose ( // implemented in Close.c
IN PNPFS_DEVICE_OBJECT NpfsDeviceObject,
IN PIRP Irp
);
NTSTATUS
NpFsdRead ( // implemented in Read.c
IN PNPFS_DEVICE_OBJECT NpfsDeviceObject,
IN PIRP Irp
);
NTSTATUS
NpFsdWrite ( // implemented in Write.c
IN PNPFS_DEVICE_OBJECT NpfsDeviceObject,
IN PIRP Irp
);
NTSTATUS
NpFsdQueryInformation ( // implemented in FileInfo.c
IN PNPFS_DEVICE_OBJECT NpfsDeviceObject,
IN PIRP Irp
);
NTSTATUS
NpFsdSetInformation ( // implemented in FileInfo.c
IN PNPFS_DEVICE_OBJECT NpfsDeviceObject,
IN PIRP Irp
);
NTSTATUS
NpFsdCleanup ( // implemented in Cleanup.c
IN PNPFS_DEVICE_OBJECT NpfsDeviceObject,
IN PIRP Irp
);
NTSTATUS
NpFsdFlushBuffers ( // implemented in Flush.c
IN PNPFS_DEVICE_OBJECT NpfsDeviceObject,
IN PIRP Irp
);
NTSTATUS
NpFsdDirectoryControl ( // implemented in Dir.c
IN PNPFS_DEVICE_OBJECT NpfsDeviceObject,
IN PIRP Irp
);
NTSTATUS
NpFsdFileSystemControl ( // implemented in FsContrl.c
IN PNPFS_DEVICE_OBJECT NpfsDeviceObject,
IN PIRP Irp
);
NTSTATUS
NpFsdSetSecurityInfo ( // implemented in SeInfo.c
IN PNPFS_DEVICE_OBJECT NpfsDeviceObject,
IN PIRP Irp
);
NTSTATUS
NpFsdQuerySecurityInfo ( // implemented in SeInfo.c
IN PNPFS_DEVICE_OBJECT NpfsDeviceObject,
IN PIRP Irp
);
NTSTATUS
NpFsdQueryVolumeInformation ( // implemented in VolInfo.c
IN PNPFS_DEVICE_OBJECT NpfsDeviceObject,
IN PIRP Irp
);
NTSTATUS
NpCommonFileSystemControl (
IN PNPFS_DEVICE_OBJECT NpfsDeviceObject,
IN PIRP Irp
);
NTSTATUS
NpAssignEvent (
IN PNPFS_DEVICE_OBJECT NpfsDeviceObject,
IN PIRP Irp
);
NTSTATUS
NpDisconnect (
IN PNPFS_DEVICE_OBJECT NpfsDeviceObject,
IN PIRP Irp,
IN PLIST_ENTRY DeferredList
);
NTSTATUS
NpListen (
IN PNPFS_DEVICE_OBJECT NpfsDeviceObject,
IN PIRP Irp,
IN PLIST_ENTRY DeferredList
);
NTSTATUS
NpPeek (
IN PNPFS_DEVICE_OBJECT NpfsDeviceObject,
IN PIRP Irp,
IN PLIST_ENTRY DeferredList
);
NTSTATUS
NpQueryEvent (
IN PNPFS_DEVICE_OBJECT NpfsDeviceObject,
IN PIRP Irp
);
NTSTATUS
NpTransceive (
IN PNPFS_DEVICE_OBJECT NpfsDeviceObject,
IN PIRP Irp,
IN PLIST_ENTRY DeferredList
);
NTSTATUS
NpWaitForNamedPipe (
IN PNPFS_DEVICE_OBJECT NpfsDeviceObject,
IN PIRP Irp
);
NTSTATUS
NpImpersonate (
IN PNPFS_DEVICE_OBJECT NpfsDeviceObject,
IN PIRP Irp
);
NTSTATUS
NpInternalRead (
IN PNPFS_DEVICE_OBJECT NpfsDeviceObject,
IN PIRP Irp,
IN BOOLEAN ReadOverflowOperation,
IN PLIST_ENTRY DeferredList
);
NTSTATUS
NpInternalWrite (
IN PNPFS_DEVICE_OBJECT NpfsDeviceObject,
IN PIRP Irp,
IN PLIST_ENTRY DeferredList
);
NTSTATUS
NpInternalTransceive (
IN PNPFS_DEVICE_OBJECT NpfsDeviceObject,
IN PIRP Irp,
IN PLIST_ENTRY DeferredList
);
NTSTATUS
NpQueryClientProcess (
IN PNPFS_DEVICE_OBJECT NpfsDeviceObject,
IN PIRP Irp
);
NTSTATUS
NpSetClientProcess (
IN PNPFS_DEVICE_OBJECT NpfsDeviceObject,
IN PIRP Irp
);
NTSTATUS
NpCompleteTransceiveIrp (
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp,
IN PVOID Context
);
//
// The following procedures are callbacks used to do fast I/O
//
BOOLEAN
NpFastRead (
IN PFILE_OBJECT FileObject,
IN PLARGE_INTEGER FileOffset,
IN ULONG Length,
IN BOOLEAN Wait,
IN ULONG LockKey,
OUT PVOID Buffer,
OUT PIO_STATUS_BLOCK IoStatus,
IN PDEVICE_OBJECT DeviceObject
);
BOOLEAN
NpFastWrite (
IN PFILE_OBJECT FileObject,
IN PLARGE_INTEGER FileOffset,
IN ULONG Length,
IN BOOLEAN Wait,
IN ULONG LockKey,
IN PVOID Buffer,
OUT PIO_STATUS_BLOCK IoStatus,
IN PDEVICE_OBJECT DeviceObject
);
BOOLEAN
NpCommonWrite (
IN PFILE_OBJECT FileObject,
IN PVOID WriteBuffer,
IN ULONG WriteLength,
IN PETHREAD UserThread,
OUT PIO_STATUS_BLOCK Iosb,
IN PIRP Irp OPTIONAL,
IN PLIST_ENTRY DeferredList
);
//
// Miscellaneous routines.
//
VOID
NpCheckForNotify ( // implemented in Dir.c
IN PDCB Dcb,
IN BOOLEAN CheckAllOutstandingIrps,
IN PLIST_ENTRY DeferredList
);
NTSTATUS
NpCommonQueryInformation (
IN PNPFS_DEVICE_OBJECT NpfsDeviceObject,
IN PIRP Irp
);
NTSTATUS
NpCommonSetInformation (
IN PNPFS_DEVICE_OBJECT NpfsDeviceObject,
IN PIRP Irp,
IN PLIST_ENTRY DeferredList
);
NTSTATUS
NpQueryBasicInfo (
IN PCCB Ccb,
IN PFILE_BASIC_INFORMATION Buffer,
IN OUT PULONG Length
);
NTSTATUS
NpQueryStandardInfo (
IN PCCB Ccb,
IN PFILE_STANDARD_INFORMATION Buffer,
IN OUT PULONG Length,
IN NAMED_PIPE_END NamedPipeEnd
);
NTSTATUS
NpQueryInternalInfo (
IN PCCB Ccb,
IN PFILE_INTERNAL_INFORMATION Buffer,
IN OUT PULONG Length
);
NTSTATUS
NpQueryEaInfo (
IN PCCB Ccb,
IN PFILE_EA_INFORMATION Buffer,
IN OUT PULONG Length
);
NTSTATUS
NpQueryNameInfo (
IN PCCB Ccb,
IN PFILE_NAME_INFORMATION Buffer,
IN OUT PULONG Length
);
NTSTATUS
NpQueryPositionInfo (
IN PCCB Ccb,
IN PFILE_POSITION_INFORMATION Buffer,
IN OUT PULONG Length,
IN NAMED_PIPE_END NamedPipeEnd
);
NTSTATUS
NpQueryPipeInfo (
IN PFCB Fcb,
IN PCCB Ccb,
IN PFILE_PIPE_INFORMATION Buffer,
IN OUT PULONG Length,
IN NAMED_PIPE_END NamedPipeEnd
);
NTSTATUS
NpQueryPipeLocalInfo (
IN PFCB Fcb,
IN PCCB Ccb,
IN PFILE_PIPE_LOCAL_INFORMATION Buffer,
IN OUT PULONG Length,
IN NAMED_PIPE_END NamedPipeEnd
);
NTSTATUS
NpSetBasicInfo (
IN PCCB Ccb,
IN PFILE_BASIC_INFORMATION Buffer
);
NTSTATUS
NpSetPipeInfo (
IN PFCB Fcb,
IN PCCB Ccb,
IN PFILE_PIPE_INFORMATION Buffer,
IN NAMED_PIPE_END NamedPipeEnd,
IN PLIST_ENTRY DeferredList
);
IO_STATUS_BLOCK
NpCreateClientEnd(
IN PFCB Fcb,
IN PFILE_OBJECT FileObject,
IN ACCESS_MASK DesiredAccess,
IN PSECURITY_QUALITY_OF_SERVICE SecurityQos,
IN PACCESS_STATE AccessState,
IN KPROCESSOR_MODE RequestorMode,
IN PETHREAD UserThread,
IN PLIST_ENTRY DeferredList
);
IO_STATUS_BLOCK
NpOpenNamedPipeFileSystem (
IN PFILE_OBJECT FileObject,
IN ACCESS_MASK DesiredAccess
);
IO_STATUS_BLOCK
NpOpenNamedPipeRootDirectory (
IN PROOT_DCB RootDcb,
IN PFILE_OBJECT FileObject,
IN ACCESS_MASK DesiredAccess,
IN PLIST_ENTRY DeferredList
);
NTSTATUS
NpCreateNewNamedPipe (
IN PROOT_DCB RootDcb,
IN PFILE_OBJECT FileObject,
IN UNICODE_STRING FileName,
IN ACCESS_MASK DesiredAccess,
IN PACCESS_STATE AccessState,
IN ULONG CreateDisposition,
IN USHORT ShareAccess,
IN PNAMED_PIPE_CREATE_PARAMETERS Parameters,
IN PEPROCESS CreatorProcess,
IN PLIST_ENTRY DeferredList,
OUT PIO_STATUS_BLOCK Iosb
);
IO_STATUS_BLOCK
NpCreateExistingNamedPipe (
IN PFCB Fcb,
IN PFILE_OBJECT FileObject,
IN ACCESS_MASK DesiredAccess,
IN PACCESS_STATE AccessState,
IN KPROCESSOR_MODE RequestorMode,
IN ULONG CreateDisposition,
IN USHORT ShareAccess,
IN PNAMED_PIPE_CREATE_PARAMETERS Parameters,
IN PEPROCESS CreatorProcess,
IN PLIST_ENTRY DeferredList
);
NTSTATUS
NpCommonDirectoryControl (
IN PNPFS_DEVICE_OBJECT NpfsDeviceObject,
IN PIRP Irp
);
NTSTATUS
NpQueryDirectory (
IN PROOT_DCB RootDcb,
IN PROOT_DCB_CCB Ccb,
IN PIRP Irp
);
NTSTATUS
NpNotifyChangeDirectory (
IN PROOT_DCB RootDcb,
IN PROOT_DCB_CCB Ccb,
IN PIRP Irp
);
VOID
NpCancelChangeNotifyIrp (
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
VOID
NpTimerDispatch(
IN PKDPC Dpc,
IN PVOID Contxt,
IN PVOID SystemArgument1,
IN PVOID SystemArgument2
);
VOID
NpCancelWaitQueueIrp(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
//
// The following macro is used by the FSD routines to complete
// an IRP.
//
#define NpCompleteRequest(IRP,STATUS) FsRtlCompleteRequest( (IRP), (STATUS) );
#define NpDeferredCompleteRequest(IRP,STATUS,LIST) { \
(IRP)->IoStatus.Status = STATUS; \
InsertTailList ((LIST), &(IRP)->Tail.Overlay.ListEntry); \
}
VOID
FORCEINLINE
NpCompleteDeferredIrps (
IN PLIST_ENTRY DeferredList
)
{
PIRP Irp;
PLIST_ENTRY Entry, NextEntry;
Entry = DeferredList->Flink;
while (Entry != DeferredList) {
Irp = CONTAINING_RECORD (Entry, IRP, Tail.Overlay.ListEntry);
NextEntry = Entry->Flink;
NpCompleteRequest (Irp, Irp->IoStatus.Status);
Entry = NextEntry;
}
}
//
// 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; }
//
// PVOID
// NpAllocatePagedPool (
// IN ULONG Size,
// IN ULONG Tag)
// Routine Description:
//
// This routine will return a pointer to paged pool or NULL if no memory exists.
//
// Arguments:
//
// Size - Size of memory to allocate
// Tag - Tag to use for the pool allocation
//
// Return Value:
//
// PVOID - pointer to allocated memory or null
//
#define NpAllocatePagedPool( Size, Tag) \
ExAllocatePoolWithTag( PagedPool, Size, Tag )
//
// PVOID
// NpAllocateNonPagedPool (
// IN ULONG Size,
// IN ULONG Tag)
// Routine Description:
//
// This routine will return a pointer to paged pool or NULL if no memory exists.
//
// Arguments:
//
// Size - Size of memory to allocate
// Tag - Tag to use for the pool allocation
//
// Return Value:
//
// PVOID - pointer to allocated memory or null
//
#define NpAllocateNonPagedPool( Size, Tag) \
ExAllocatePoolWithTag( NonPagedPool, Size, Tag )
//
// PVOID
// NpAllocatePagedPoolWithQuota (
// IN ULONG Size,
// IN ULONG Tag)
// Routine Description:
//
// This routine will return a pointer to charged paged pool or NULL if no memory exists.
//
// Arguments:
//
// Size - Size of memory to allocate
// Tag - Tag to use for the pool allocation
//
// Return Value:
//
// PVOID - pointer to allocated memory or null
//
#define NpAllocatePagedPoolWithQuota( Size, Tag) \
ExAllocatePoolWithQuotaTag( PagedPool|POOL_QUOTA_FAIL_INSTEAD_OF_RAISE, Size, Tag )
#define NpAllocatePagedPoolWithQuotaCold( Size, Tag) \
ExAllocatePoolWithQuotaTag( PagedPool|POOL_QUOTA_FAIL_INSTEAD_OF_RAISE|POOL_COLD_ALLOCATION, Size, Tag )
//
// PVOID
// NpAllocateNonPagedPoolWithQuota (
// IN ULONG Size,
// IN ULONG Tag)
// Routine Description:
//
// This routine will return a charged pointer to non-paged pool or NULL if no memory exists.
//
// Arguments:
//
// Size - Size of memory to allocate
// Tag - Tag to use for the pool allocation
//
// Return Value:
//
// PVOID - pointer to allocated memory or null
//
#define NpAllocateNonPagedPoolWithQuota( Size, Tag) \
ExAllocatePoolWithQuotaTag( NonPagedPool|POOL_QUOTA_FAIL_INSTEAD_OF_RAISE, Size, Tag )
#define NpAllocateNonPagedPoolWithQuotaCold( Size, Tag) \
ExAllocatePoolWithQuotaTag( NonPagedPool|POOL_QUOTA_FAIL_INSTEAD_OF_RAISE|POOL_COLD_ALLOCATION, Size, Tag )
//
// VOID
// NpFreePool (
// IN PVOID Mem)
//
// Routine Description:
//
//
//
// Arguments:
//
// Mem - Memory to be freed
//
// Return Value:
//
// None
//
#define NpFreePool(Mem) ExFreePool (Mem)
#define NpIrpWaitQueue(Irp) (Irp->Tail.Overlay.DriverContext[0])
#define NpIrpWaitContext(Irp) (Irp->Tail.Overlay.DriverContext[1])
#define NpIrpDataQueue(Irp) (Irp->Tail.Overlay.DriverContext[2])
#define NpIrpDataEntry(Irp) (Irp->Tail.Overlay.DriverContext[3])
#define NpConvertFsctlToWrite(Irp) (Irp->Flags &= ~IRP_INPUT_OPERATION)
#endif // _NPPROCS_