mirror of https://github.com/tongzx/nt5src
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.
1259 lines
25 KiB
1259 lines
25 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
|
|
);
|
|
|
|
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_
|