/*++ 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 #include #include // // 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 ); NTSTATUS NpCommonCreate ( IN PNPFS_DEVICE_OBJECT NpfsDeviceObject, IN PIRP Irp ); IO_STATUS_BLOCK NpCreateClientEnd( IN PFCB Fcb, IN PFILE_OBJECT FileObject, IN ACCESS_MASK DesiredAccess, IN USHORT ShareAccess, 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, IN USHORT ShareAccess ); IO_STATUS_BLOCK NpOpenNamedPipeRootDirectory ( IN PROOT_DCB RootDcb, IN PFILE_OBJECT FileObject, IN ACCESS_MASK DesiredAccess, IN USHORT ShareAccess, IN PLIST_ENTRY DeferredList ); NTSTATUS NpCommonCreateNamedPipe ( IN PNPFS_DEVICE_OBJECT NpfsDeviceObject, IN PIRP Irp ); IO_STATUS_BLOCK 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 NAMED_PIPE_TYPE NamedPipeType, IN READ_MODE ServerReadMode, IN COMPLETION_MODE ServerCompletionMode, IN ULONG MaximumInstances, IN ULONG InboundQuota, IN ULONG OutboundQuota, IN LARGE_INTEGER DefaultTimeout, IN BOOLEAN TimeoutSpecified, IN PEPROCESS CreatorProcess, IN PLIST_ENTRY DeferredList ); 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 READ_MODE ServerReadMode, IN COMPLETION_MODE ServerCompletionMode, IN ULONG InboundQuota, IN ULONG OutboundQuota, 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 ) // // 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_