[NPFS-NEW]: Use locking and IRP completion macros from NPFS snippet at "Common Driver Reliability Issues - Microsoft

download.microsoft.com/download/5/7/7/577a5684-8a83.../drvqa.doc". Fix a few incorrect exclusive vs shared lock acquires.

svn path=/trunk/; revision=60034
This commit is contained in:
Alex Ionescu 2013-09-11 17:10:30 +00:00
parent cd1307c71a
commit e25b46f43d
13 changed files with 149 additions and 198 deletions

View file

@ -7,18 +7,16 @@ NpCommonCleanup(IN PDEVICE_OBJECT DeviceObject,
{ {
PIO_STACK_LOCATION IoStack; PIO_STACK_LOCATION IoStack;
NODE_TYPE_CODE NodeTypeCode; NODE_TYPE_CODE NodeTypeCode;
LIST_ENTRY List; LIST_ENTRY DeferredList;
PNP_FCB Fcb; PNP_FCB Fcb;
PNP_CCB Ccb; PNP_CCB Ccb;
ULONG NamedPipeEnd; ULONG NamedPipeEnd;
PLIST_ENTRY ThisEntry, NextEntry;
PIRP LocalIrp;
PAGED_CODE(); PAGED_CODE();
IoStack = IoGetCurrentIrpStackLocation(Irp); IoStack = IoGetCurrentIrpStackLocation(Irp);
InitializeListHead(&List); InitializeListHead(&DeferredList);
ExAcquireResourceExclusiveLite(&NpVcb->Lock, TRUE); NpAcquireExclusiveVcb();
NodeTypeCode = NpDecodeFileObject(IoStack->FileObject, NodeTypeCode = NpDecodeFileObject(IoStack->FileObject,
(PVOID*)&Fcb, (PVOID*)&Fcb,
&Ccb, &Ccb,
@ -31,20 +29,11 @@ NpCommonCleanup(IN PDEVICE_OBJECT DeviceObject,
--Ccb->Fcb->ServerOpenCount; --Ccb->Fcb->ServerOpenCount;
} }
NpSetClosingPipeState(Ccb, Irp, NamedPipeEnd, &List); NpSetClosingPipeState(Ccb, Irp, NamedPipeEnd, &DeferredList);
} }
ExReleaseResourceLite(&NpVcb->Lock); NpReleaseVcb();
NpCompleteDeferredIrps(&DeferredList);
NextEntry = List.Flink;
while (NextEntry != &List)
{
ThisEntry = NextEntry;
NextEntry = NextEntry->Flink;
LocalIrp = CONTAINING_RECORD(ThisEntry, IRP, Tail.Overlay.ListEntry);
IoCompleteRequest(LocalIrp, IO_NAMED_PIPE_INCREMENT);
}
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }

View file

@ -7,18 +7,16 @@ NpCommonClose(IN PDEVICE_OBJECT DeviceObject,
{ {
PIO_STACK_LOCATION IoStack; PIO_STACK_LOCATION IoStack;
NODE_TYPE_CODE NodeTypeCode; NODE_TYPE_CODE NodeTypeCode;
LIST_ENTRY List; LIST_ENTRY DeferredList;
PNP_FCB Fcb; PNP_FCB Fcb;
PNP_CCB Ccb; PNP_CCB Ccb;
ULONG NamedPipeEnd; ULONG NamedPipeEnd;
PLIST_ENTRY ThisEntry, NextEntry;
PIRP LocalIrp;
PAGED_CODE(); PAGED_CODE();
IoStack = IoGetCurrentIrpStackLocation(Irp); IoStack = IoGetCurrentIrpStackLocation(Irp);
InitializeListHead(&List); InitializeListHead(&DeferredList);
ExAcquireResourceExclusiveLite(&NpVcb->Lock, TRUE); NpAcquireExclusiveVcb();
NodeTypeCode = NpDecodeFileObject(IoStack->FileObject, NodeTypeCode = NpDecodeFileObject(IoStack->FileObject,
(PVOID*)&Fcb, (PVOID*)&Fcb,
&Ccb, &Ccb,
@ -26,24 +24,15 @@ NpCommonClose(IN PDEVICE_OBJECT DeviceObject,
if (NodeTypeCode == NPFS_NTC_ROOT_DCB) if (NodeTypeCode == NPFS_NTC_ROOT_DCB)
{ {
--Fcb->CurrentInstances; --Fcb->CurrentInstances;
NpDeleteCcb(Ccb, &List); NpDeleteCcb(Ccb, &DeferredList);
} }
else if (NodeTypeCode == NPFS_NTC_VCB) else if (NodeTypeCode == NPFS_NTC_VCB)
{ {
--NpVcb->ReferenceCount; --NpVcb->ReferenceCount;
} }
ExReleaseResourceLite(&NpVcb->Lock); NpReleaseVcb();
NpCompleteDeferredIrps(&DeferredList);
NextEntry = List.Flink;
while (NextEntry != &List)
{
ThisEntry = NextEntry;
NextEntry = NextEntry->Flink;
LocalIrp = CONTAINING_RECORD(ThisEntry, IRP, Tail.Overlay.ListEntry);
IoCompleteRequest(LocalIrp, IO_NAMED_PIPE_INCREMENT);
}
Irp->IoStatus.Status = STATUS_SUCCESS; Irp->IoStatus.Status = STATUS_SUCCESS;
IoCompleteRequest(Irp, IO_NAMED_PIPE_INCREMENT); IoCompleteRequest(Irp, IO_NAMED_PIPE_INCREMENT);

View file

@ -205,12 +205,10 @@ NpFsdCreate(IN PDEVICE_OBJECT DeviceObject,
PNP_FCB Fcb; PNP_FCB Fcb;
PNP_DCB Dcb; PNP_DCB Dcb;
ACCESS_MASK DesiredAccess; ACCESS_MASK DesiredAccess;
LIST_ENTRY List; LIST_ENTRY DeferredList;
PLIST_ENTRY NextEntry, ThisEntry;
UNICODE_STRING Prefix; UNICODE_STRING Prefix;
PIRP ListIrp;
InitializeListHead(&List); InitializeListHead(&DeferredList);
IoStack = (PEXTENDED_IO_STACK_LOCATION)IoGetCurrentIrpStackLocation(Irp); IoStack = (PEXTENDED_IO_STACK_LOCATION)IoGetCurrentIrpStackLocation(Irp);
FileObject = IoStack->FileObject; FileObject = IoStack->FileObject;
RelatedFileObject = FileObject->RelatedFileObject; RelatedFileObject = FileObject->RelatedFileObject;
@ -240,7 +238,7 @@ NpFsdCreate(IN PDEVICE_OBJECT DeviceObject,
Irp->IoStatus = NpOpenNamedPipeRootDirectory(NpVcb->RootDcb, Irp->IoStatus = NpOpenNamedPipeRootDirectory(NpVcb->RootDcb,
FileObject, FileObject,
DesiredAccess, DesiredAccess,
&List); &DeferredList);
goto Quickie; goto Quickie;
} }
} }
@ -255,7 +253,7 @@ NpFsdCreate(IN PDEVICE_OBJECT DeviceObject,
Irp->IoStatus = NpOpenNamedPipeRootDirectory(NpVcb->RootDcb, Irp->IoStatus = NpOpenNamedPipeRootDirectory(NpVcb->RootDcb,
FileObject, FileObject,
DesiredAccess, DesiredAccess,
&List); &DeferredList);
goto Quickie; goto Quickie;
} }
@ -329,21 +327,11 @@ NpFsdCreate(IN PDEVICE_OBJECT DeviceObject,
SL_FORCE_ACCESS_CHECK ? SL_FORCE_ACCESS_CHECK ?
UserMode : Irp->RequestorMode, UserMode : Irp->RequestorMode,
Irp->Tail.Overlay.Thread, Irp->Tail.Overlay.Thread,
&List); &DeferredList);
Quickie: Quickie:
ExReleaseResourceLite(&NpVcb->Lock); ExReleaseResourceLite(&NpVcb->Lock);
NpCompleteDeferredIrps(&DeferredList);
NextEntry = List.Flink;
while (NextEntry != &List)
{
ThisEntry = NextEntry;
NextEntry = NextEntry->Flink;
ListIrp = CONTAINING_RECORD(ThisEntry, IRP, Tail.Overlay.ListEntry);
IoCompleteRequest(ListIrp, IO_NAMED_PIPE_INCREMENT);
}
FsRtlExitFileSystem(); FsRtlExitFileSystem();
IoCompleteRequest(Irp, IO_NO_INCREMENT); IoCompleteRequest(Irp, IO_NO_INCREMENT);
@ -622,16 +610,14 @@ NpFsdCreateNamedPipe(IN PDEVICE_OBJECT DeviceObject,
PFILE_OBJECT RelatedFileObject; PFILE_OBJECT RelatedFileObject;
USHORT Disposition, ShareAccess; USHORT Disposition, ShareAccess;
PEPROCESS Process; PEPROCESS Process;
LIST_ENTRY LocalList; LIST_ENTRY DeferredList;
PLIST_ENTRY NextEntry, ThisEntry;
UNICODE_STRING FileName; UNICODE_STRING FileName;
PNP_FCB Fcb; PNP_FCB Fcb;
UNICODE_STRING Prefix; UNICODE_STRING Prefix;
PNAMED_PIPE_CREATE_PARAMETERS Parameters; PNAMED_PIPE_CREATE_PARAMETERS Parameters;
IO_STATUS_BLOCK IoStatus; IO_STATUS_BLOCK IoStatus;
PIRP ListIrp;
InitializeListHead(&LocalList); InitializeListHead(&DeferredList);
Process = IoGetRequestorProcess(Irp); Process = IoGetRequestorProcess(Irp);
IoStack = (PEXTENDED_IO_STACK_LOCATION) IoGetCurrentIrpStackLocation(Irp); IoStack = (PEXTENDED_IO_STACK_LOCATION) IoGetCurrentIrpStackLocation(Irp);
@ -650,7 +636,7 @@ NpFsdCreateNamedPipe(IN PDEVICE_OBJECT DeviceObject,
IoStatus.Information = 0; IoStatus.Information = 0;
FsRtlEnterFileSystem(); FsRtlEnterFileSystem();
ExAcquireResourceExclusiveLite(&NpVcb->Lock, TRUE); NpAcquireExclusiveVcb();
if (RelatedFileObject) if (RelatedFileObject)
{ {
@ -701,7 +687,7 @@ NpFsdCreateNamedPipe(IN PDEVICE_OBJECT DeviceObject,
ShareAccess, ShareAccess,
Parameters, Parameters,
Process, Process,
&LocalList, &DeferredList,
&IoStatus); &IoStatus);
goto Quickie; goto Quickie;
} }
@ -731,21 +717,11 @@ NpFsdCreateNamedPipe(IN PDEVICE_OBJECT DeviceObject,
ShareAccess, ShareAccess,
Parameters, Parameters,
Process, Process,
&LocalList); &DeferredList);
Quickie: Quickie:
ExReleaseResourceLite(&NpVcb->Lock); NpReleaseVcb();
NpCompleteDeferredIrps(&DeferredList);
NextEntry = LocalList.Flink;
while (NextEntry != &LocalList)
{
ThisEntry = NextEntry;
NextEntry = NextEntry->Flink;
ListIrp = CONTAINING_RECORD(ThisEntry, IRP, Tail.Overlay.ListEntry);
IoCompleteRequest(ListIrp, IO_NAMED_PIPE_INCREMENT);
}
FsRtlExitFileSystem(); FsRtlExitFileSystem();
Irp->IoStatus = IoStatus; Irp->IoStatus = IoStatus;

View file

@ -129,7 +129,7 @@ NpRemoveDataQueueEntry(IN PNP_DATA_QUEUE DataQueue,
if (Irp && IoSetCancelRoutine(Irp, NULL)) if (Irp && IoSetCancelRoutine(Irp, NULL))
{ {
Irp->Tail.Overlay.DriverContext[3] = 0; Irp->Tail.Overlay.DriverContext[3] = NULL;
} }
ExFreePool(QueueEntry); ExFreePool(QueueEntry);
@ -188,15 +188,13 @@ NpCancelDataQueueIrp(IN PDEVICE_OBJECT DeviceObject,
{ {
PNP_DATA_QUEUE DataQueue; PNP_DATA_QUEUE DataQueue;
PNP_DATA_QUEUE_ENTRY DataEntry; PNP_DATA_QUEUE_ENTRY DataEntry;
LIST_ENTRY List; LIST_ENTRY DeferredList;
PSECURITY_CLIENT_CONTEXT ClientSecurityContext; PSECURITY_CLIENT_CONTEXT ClientSecurityContext;
BOOLEAN CompleteWrites, FirstEntry; BOOLEAN CompleteWrites, FirstEntry;
PLIST_ENTRY NextEntry, ThisEntry;
PIRP LocalIrp;
if (DeviceObject) IoReleaseCancelSpinLock(Irp->CancelIrql); if (DeviceObject) IoReleaseCancelSpinLock(Irp->CancelIrql);
InitializeListHead(&List); InitializeListHead(&DeferredList);
DataQueue = (PNP_DATA_QUEUE)Irp->Tail.Overlay.DriverContext[2]; DataQueue = (PNP_DATA_QUEUE)Irp->Tail.Overlay.DriverContext[2];
ClientSecurityContext = NULL; ClientSecurityContext = NULL;
@ -204,7 +202,7 @@ NpCancelDataQueueIrp(IN PDEVICE_OBJECT DeviceObject,
if (DeviceObject) if (DeviceObject)
{ {
FsRtlEnterFileSystem(); FsRtlEnterFileSystem();
ExAcquireResourceExclusiveLite(&NpVcb->Lock, TRUE); NpAcquireExclusiveVcb();
} }
DataEntry = (PNP_DATA_QUEUE_ENTRY)Irp->Tail.Overlay.DriverContext[3]; DataEntry = (PNP_DATA_QUEUE_ENTRY)Irp->Tail.Overlay.DriverContext[3];
@ -245,18 +243,18 @@ NpCancelDataQueueIrp(IN PDEVICE_OBJECT DeviceObject,
{ {
if (FirstEntry) if (FirstEntry)
{ {
NpGetNextRealDataQueueEntry(DataQueue, &List); NpGetNextRealDataQueueEntry(DataQueue, &DeferredList);
} }
if (CompleteWrites) if (CompleteWrites)
{ {
NpCompleteStalledWrites(DataQueue, &List); NpCompleteStalledWrites(DataQueue, &DeferredList);
} }
} }
} }
if (DeviceObject) if (DeviceObject)
{ {
ExReleaseResourceLite(&NpVcb->Lock); NpReleaseVcb();
FsRtlExitFileSystem(); FsRtlExitFileSystem();
} }
@ -266,15 +264,7 @@ NpCancelDataQueueIrp(IN PDEVICE_OBJECT DeviceObject,
Irp->IoStatus.Status = STATUS_CANCELLED; Irp->IoStatus.Status = STATUS_CANCELLED;
IoCompleteRequest(Irp, IO_NAMED_PIPE_INCREMENT); IoCompleteRequest(Irp, IO_NAMED_PIPE_INCREMENT);
NextEntry = List.Flink; NpCompleteDeferredIrps(&DeferredList);
while (NextEntry != &List)
{
ThisEntry = NextEntry;
NextEntry = NextEntry->Flink;
LocalIrp = CONTAINING_RECORD(ThisEntry, IRP, Tail.Overlay.ListEntry);
IoCompleteRequest(LocalIrp, IO_NAMED_PIPE_INCREMENT);
}
} }
NTSTATUS NTSTATUS

View file

@ -100,30 +100,18 @@ NpFsdSetInformation(IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp) IN PIRP Irp)
{ {
NTSTATUS Status; NTSTATUS Status;
LIST_ENTRY List; LIST_ENTRY DeferredList;
PLIST_ENTRY NextEntry, ThisEntry;
PIRP LocalIrp;
PAGED_CODE(); PAGED_CODE();
InitializeListHead(&List); InitializeListHead(&DeferredList);
FsRtlEnterFileSystem(); FsRtlEnterFileSystem();
ExAcquireResourceSharedLite(&NpVcb->Lock, TRUE); NpAcquireExclusiveVcb();
Status = NpCommonSetInformation(DeviceObject, Irp, &List); Status = NpCommonSetInformation(DeviceObject, Irp, &DeferredList);
ExReleaseResourceLite(&NpVcb->Lock);
NextEntry = List.Flink;
while (NextEntry != &List)
{
ThisEntry = NextEntry;
NextEntry = NextEntry->Flink;
LocalIrp = CONTAINING_RECORD(ThisEntry, IRP, Tail.Overlay.ListEntry);
IoCompleteRequest(LocalIrp, IO_NAMED_PIPE_INCREMENT);
}
NpReleaseVcb();
NpCompleteDeferredIrps(&DeferredList);
FsRtlExitFileSystem(); FsRtlExitFileSystem();
if (Status != STATUS_PENDING) if (Status != STATUS_PENDING)
@ -462,11 +450,11 @@ NpFsdQueryInformation(IN PDEVICE_OBJECT DeviceObject,
PAGED_CODE(); PAGED_CODE();
FsRtlEnterFileSystem(); FsRtlEnterFileSystem();
ExAcquireResourceSharedLite(&NpVcb->Lock, TRUE); NpAcquireSharedVcb();
Status = NpCommonQueryInformation(DeviceObject, Irp); Status = NpCommonQueryInformation(DeviceObject, Irp);
ExReleaseResourceLite(&NpVcb->Lock); NpReleaseVcb();
FsRtlExitFileSystem(); FsRtlExitFileSystem();
if (Status != STATUS_PENDING) if (Status != STATUS_PENDING)

View file

@ -59,11 +59,11 @@ NpFsdFlushBuffers(IN PDEVICE_OBJECT DeviceObject,
PAGED_CODE(); PAGED_CODE();
FsRtlEnterFileSystem(); FsRtlEnterFileSystem();
ExAcquireResourceExclusiveLite(&NpVcb->Lock, TRUE); NpAcquireSharedVcb();
Status = NpCommonFlushBuffers(DeviceObject, Irp); Status = NpCommonFlushBuffers(DeviceObject, Irp);
ExReleaseResourceLite(&NpVcb->Lock); NpReleaseVcb();
FsRtlExitFileSystem(); FsRtlExitFileSystem();
return Status; return Status;

View file

@ -569,35 +569,33 @@ NpCommonFileSystemControl(IN PDEVICE_OBJECT DeviceObject,
{ {
ULONG Fsctl; ULONG Fsctl;
BOOLEAN Overflow = FALSE; BOOLEAN Overflow = FALSE;
LIST_ENTRY List; LIST_ENTRY DeferredList;
PLIST_ENTRY NextEntry, ThisEntry;
NTSTATUS Status; NTSTATUS Status;
PIRP LocalIrp;
PAGED_CODE(); PAGED_CODE();
InitializeListHead(&List); InitializeListHead(&DeferredList);
Fsctl = IoGetCurrentIrpStackLocation(Irp)->Parameters.FileSystemControl.FsControlCode; Fsctl = IoGetCurrentIrpStackLocation(Irp)->Parameters.FileSystemControl.FsControlCode;
switch (Fsctl) switch (Fsctl)
{ {
case FSCTL_PIPE_PEEK: case FSCTL_PIPE_PEEK:
ExAcquireResourceExclusiveLite(&NpVcb->Lock, TRUE); NpAcquireExclusiveVcb();
Status = NpPeek(DeviceObject, Irp, &List); Status = NpPeek(DeviceObject, Irp, &DeferredList);
break; break;
case FSCTL_PIPE_INTERNAL_WRITE: case FSCTL_PIPE_INTERNAL_WRITE:
ExAcquireResourceSharedLite(&NpVcb->Lock, TRUE); NpAcquireSharedVcb();
Status = NpInternalWrite(DeviceObject, Irp, &List); Status = NpInternalWrite(DeviceObject, Irp, &DeferredList);
break; break;
case FSCTL_PIPE_TRANSCEIVE: case FSCTL_PIPE_TRANSCEIVE:
ExAcquireResourceSharedLite(&NpVcb->Lock, TRUE); NpAcquireSharedVcb();
Status = NpTransceive(DeviceObject, Irp, &List); Status = NpTransceive(DeviceObject, Irp, &DeferredList);
break; break;
case FSCTL_PIPE_INTERNAL_TRANSCEIVE: case FSCTL_PIPE_INTERNAL_TRANSCEIVE:
ExAcquireResourceSharedLite(&NpVcb->Lock, TRUE); NpAcquireSharedVcb();
Status = NpInternalTransceive(DeviceObject, Irp, &List); Status = NpInternalTransceive(DeviceObject, Irp, &DeferredList);
break; break;
case FSCTL_PIPE_INTERNAL_READ_OVFLOW: case FSCTL_PIPE_INTERNAL_READ_OVFLOW:
@ -605,54 +603,54 @@ NpCommonFileSystemControl(IN PDEVICE_OBJECT DeviceObject,
// on purpose // on purpose
case FSCTL_PIPE_INTERNAL_READ: case FSCTL_PIPE_INTERNAL_READ:
ExAcquireResourceSharedLite(&NpVcb->Lock, TRUE); NpAcquireSharedVcb();
Status = NpInternalRead(DeviceObject, Irp, Overflow, &List); Status = NpInternalRead(DeviceObject, Irp, Overflow, &DeferredList);
break; break;
case FSCTL_PIPE_QUERY_CLIENT_PROCESS: case FSCTL_PIPE_QUERY_CLIENT_PROCESS:
ExAcquireResourceSharedLite(&NpVcb->Lock, TRUE); NpAcquireSharedVcb();
Status = NpQueryClientProcess(DeviceObject, Irp); Status = NpQueryClientProcess(DeviceObject, Irp);
break; break;
case FSCTL_PIPE_ASSIGN_EVENT: case FSCTL_PIPE_ASSIGN_EVENT:
ExAcquireResourceExclusiveLite(&NpVcb->Lock, TRUE); NpAcquireExclusiveVcb();
Status = NpAssignEvent(DeviceObject, Irp); Status = NpAssignEvent(DeviceObject, Irp);
break; break;
case FSCTL_PIPE_DISCONNECT: case FSCTL_PIPE_DISCONNECT:
ExAcquireResourceExclusiveLite(&NpVcb->Lock, TRUE); NpAcquireExclusiveVcb();
Status = NpDisconnect(DeviceObject, Irp, &List); Status = NpDisconnect(DeviceObject, Irp, &DeferredList);
break; break;
case FSCTL_PIPE_LISTEN: case FSCTL_PIPE_LISTEN:
ExAcquireResourceSharedLite(&NpVcb->Lock, TRUE); NpAcquireSharedVcb();
Status = NpListen(DeviceObject, Irp, &List); Status = NpListen(DeviceObject, Irp, &DeferredList);
break; break;
case FSCTL_PIPE_QUERY_EVENT: case FSCTL_PIPE_QUERY_EVENT:
ExAcquireResourceExclusiveLite(&NpVcb->Lock, TRUE); NpAcquireExclusiveVcb();
Status = NpQueryEvent(DeviceObject, Irp); Status = NpQueryEvent(DeviceObject, Irp);
break; break;
case FSCTL_PIPE_WAIT: case FSCTL_PIPE_WAIT:
ExAcquireResourceExclusiveLite(&NpVcb->Lock, TRUE); NpAcquireExclusiveVcb();
Status = NpWaitForNamedPipe(DeviceObject, Irp); Status = NpWaitForNamedPipe(DeviceObject, Irp);
break; break;
case FSCTL_PIPE_IMPERSONATE: case FSCTL_PIPE_IMPERSONATE:
ExAcquireResourceExclusiveLite(&NpVcb->Lock, TRUE); NpAcquireExclusiveVcb();
Status = NpImpersonate(DeviceObject, Irp); Status = NpImpersonate(DeviceObject, Irp);
break; break;
case FSCTL_PIPE_SET_CLIENT_PROCESS: case FSCTL_PIPE_SET_CLIENT_PROCESS:
ExAcquireResourceExclusiveLite(&NpVcb->Lock, TRUE); NpAcquireExclusiveVcb();
Status = NpSetClientProcess(DeviceObject, Irp); Status = NpSetClientProcess(DeviceObject, Irp);
break; break;
@ -660,17 +658,8 @@ NpCommonFileSystemControl(IN PDEVICE_OBJECT DeviceObject,
return STATUS_NOT_SUPPORTED; return STATUS_NOT_SUPPORTED;
} }
ExReleaseResourceLite(&NpVcb->Lock); NpReleaseVcb();
NpCompleteDeferredIrps(&DeferredList);
NextEntry = List.Flink;
while (NextEntry != &List)
{
ThisEntry = NextEntry;
NextEntry = NextEntry->Flink;
LocalIrp = CONTAINING_RECORD(ThisEntry, IRP, Tail.Overlay.ListEntry);
IoCompleteRequest(LocalIrp, IO_NAMED_PIPE_INCREMENT);
}
return Status; return Status;
} }

View file

@ -40,8 +40,8 @@ DriverEntry(IN PDRIVER_OBJECT DriverObject,
DriverObject->MajorFunction[IRP_MJ_FLUSH_BUFFERS] = NpFsdFlushBuffers; DriverObject->MajorFunction[IRP_MJ_FLUSH_BUFFERS] = NpFsdFlushBuffers;
DriverObject->MajorFunction[IRP_MJ_DIRECTORY_CONTROL] = NpFsdDirectoryControl; DriverObject->MajorFunction[IRP_MJ_DIRECTORY_CONTROL] = NpFsdDirectoryControl;
DriverObject->MajorFunction[IRP_MJ_FILE_SYSTEM_CONTROL] = NpFsdFileSystemControl; DriverObject->MajorFunction[IRP_MJ_FILE_SYSTEM_CONTROL] = NpFsdFileSystemControl;
DriverObject->MajorFunction[IRP_MJ_QUERY_SECURITY] = NpFsdQuerySecurity; DriverObject->MajorFunction[IRP_MJ_QUERY_SECURITY] = NpFsdQuerySecurityInfo;
DriverObject->MajorFunction[IRP_MJ_SET_SECURITY] = NpFsdSetSecurity; DriverObject->MajorFunction[IRP_MJ_SET_SECURITY] = NpFsdSetSecurityInfo;
DriverObject->DriverUnload = NULL; DriverObject->DriverUnload = NULL;

View file

@ -263,6 +263,60 @@ typedef struct _NP_VCB
extern PNP_VCB NpVcb; extern PNP_VCB NpVcb;
//
// Functions to lock/unlock the global VCB lock
//
FORCEINLINE
VOID
NpAcquireSharedVcb(VOID)
{
/* Acquire the lock in shared mode */
ExAcquireResourceSharedLite(&NpVcb->Lock, TRUE);
}
FORCEINLINE
VOID
NpAcquireExclusiveVcb(VOID)
{
/* Acquire the lock in exclusive mode */
ExAcquireResourceExclusiveLite(&NpVcb->Lock, TRUE);
}
FORCEINLINE
VOID
NpReleaseVcb(VOID)
{
/* Release the lock */
ExReleaseResourceLite(&NpVcb->Lock);
}
//
// Function to process deferred IRPs outside the VCB lock but still within the
// critical region
//
VOID
FORCEINLINE
NpCompleteDeferredIrps(IN PLIST_ENTRY DeferredList)
{
PLIST_ENTRY ThisEntry, NextEntry;
PIRP Irp;
/* Loop the list */
ThisEntry = DeferredList->Flink;
while (ThisEntry != DeferredList)
{
/* Remember the next entry, but don't switch to it yet */
NextEntry = ThisEntry->Flink;
/* Complete the IRP for this entry */
Irp = CONTAINING_RECORD(ThisEntry, IRP, Tail.Overlay.ListEntry);
IoCompleteRequest(Irp, IO_NAMED_PIPE_INCREMENT);
/* And now switch to the next one */
ThisEntry = NextEntry;
}
}
BOOLEAN BOOLEAN
NTAPI NTAPI
NpDeleteEventTableEntry(IN PRTL_GENERIC_TABLE Table, NpDeleteEventTableEntry(IN PRTL_GENERIC_TABLE Table,
@ -533,13 +587,13 @@ NpFsdQueryInformation(IN PDEVICE_OBJECT DeviceObject,
NTSTATUS NTSTATUS
NTAPI NTAPI
NpFsdQuerySecurity(IN PDEVICE_OBJECT DeviceObject, NpFsdQuerySecurityInfo(IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp); IN PIRP Irp);
NTSTATUS NTSTATUS
NTAPI NTAPI
NpFsdSetSecurity(IN PDEVICE_OBJECT DeviceObject, NpFsdSetSecurityInfo(IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp); IN PIRP Irp);
NTSTATUS NTSTATUS
NTAPI NTAPI

View file

@ -142,37 +142,25 @@ NpFsdRead(IN PDEVICE_OBJECT DeviceObject,
{ {
PIO_STACK_LOCATION IoStack; PIO_STACK_LOCATION IoStack;
IO_STATUS_BLOCK IoStatus; IO_STATUS_BLOCK IoStatus;
LIST_ENTRY List; LIST_ENTRY DeferredList;
PLIST_ENTRY NextEntry, ThisEntry;
PIRP LocalIrp;
PAGED_CODE(); PAGED_CODE();
NpSlowReadCalls++; NpSlowReadCalls++;
InitializeListHead(&List); InitializeListHead(&DeferredList);
IoStack = IoGetCurrentIrpStackLocation(Irp); IoStack = IoGetCurrentIrpStackLocation(Irp);
FsRtlEnterFileSystem(); FsRtlEnterFileSystem();
ExAcquireResourceSharedLite(&NpVcb->Lock, TRUE); NpAcquireSharedVcb();
NpCommonRead(IoStack->FileObject, NpCommonRead(IoStack->FileObject,
Irp->UserBuffer, Irp->UserBuffer,
IoStack->Parameters.Read.Length, IoStack->Parameters.Read.Length,
&IoStatus, &IoStatus,
Irp, Irp,
&List); &DeferredList);
ExReleaseResourceLite(&NpVcb->Lock);
NextEntry = List.Flink;
while (NextEntry != &List)
{
ThisEntry = NextEntry;
NextEntry = NextEntry->Flink;
LocalIrp = CONTAINING_RECORD(ThisEntry, IRP, Tail.Overlay.ListEntry);
IoCompleteRequest(LocalIrp, IO_NAMED_PIPE_INCREMENT);
}
NpReleaseVcb();
NpCompleteDeferredIrps(&DeferredList);
FsRtlExitFileSystem(); FsRtlExitFileSystem();
if (IoStatus.Status != STATUS_PENDING) if (IoStatus.Status != STATUS_PENDING)

View file

@ -78,18 +78,18 @@ NpCommonSetSecurityInfo(IN PDEVICE_OBJECT DeviceObject,
NTSTATUS NTSTATUS
NTAPI NTAPI
NpFsdQuerySecurity(IN PDEVICE_OBJECT DeviceObject, NpFsdQuerySecurityInfo(IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp) IN PIRP Irp)
{ {
NTSTATUS Status; NTSTATUS Status;
PAGED_CODE(); PAGED_CODE();
FsRtlEnterFileSystem(); FsRtlEnterFileSystem();
ExAcquireResourceSharedLite(&NpVcb->Lock, TRUE); NpAcquireExclusiveVcb();
Status = NpCommonQuerySecurityInfo(DeviceObject, Irp); Status = NpCommonQuerySecurityInfo(DeviceObject, Irp);
ExReleaseResourceLite(&NpVcb->Lock); NpReleaseVcb();
FsRtlExitFileSystem(); FsRtlExitFileSystem();
if (Status != STATUS_PENDING) if (Status != STATUS_PENDING)
@ -103,18 +103,18 @@ NpFsdQuerySecurity(IN PDEVICE_OBJECT DeviceObject,
NTSTATUS NTSTATUS
NTAPI NTAPI
NpFsdSetSecurity(IN PDEVICE_OBJECT DeviceObject, NpFsdSetSecurityInfo(IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp) IN PIRP Irp)
{ {
NTSTATUS Status; NTSTATUS Status;
PAGED_CODE(); PAGED_CODE();
FsRtlEnterFileSystem(); FsRtlEnterFileSystem();
ExAcquireResourceSharedLite(&NpVcb->Lock, TRUE); NpAcquireExclusiveVcb();
Status = NpCommonQuerySecurityInfo(DeviceObject, Irp); Status = NpCommonQuerySecurityInfo(DeviceObject, Irp);
ExReleaseResourceLite(&NpVcb->Lock); NpReleaseVcb();
FsRtlExitFileSystem(); FsRtlExitFileSystem();
if (Status != STATUS_PENDING) if (Status != STATUS_PENDING)

View file

@ -6,12 +6,12 @@ NpCancelListeningQueueIrp(IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp) IN PIRP Irp)
{ {
FsRtlEnterFileSystem(); FsRtlEnterFileSystem();
ExAcquireResourceExclusiveLite(&NpVcb->Lock, TRUE); NpAcquireExclusiveVcb();
RemoveEntryList(&Irp->Tail.Overlay.ListEntry); RemoveEntryList(&Irp->Tail.Overlay.ListEntry);
FsRtlExitFileSystem(); FsRtlExitFileSystem();
ExReleaseResourceLite(&NpVcb->Lock); NpReleaseVcb();
Irp->IoStatus.Status = STATUS_CANCELLED; Irp->IoStatus.Status = STATUS_CANCELLED;
IoCompleteRequest(Irp, IO_NAMED_PIPE_INCREMENT); IoCompleteRequest(Irp, IO_NAMED_PIPE_INCREMENT);

View file

@ -156,17 +156,15 @@ NpFsdWrite(IN PDEVICE_OBJECT DeviceObject,
{ {
PIO_STACK_LOCATION IoStack; PIO_STACK_LOCATION IoStack;
IO_STATUS_BLOCK IoStatus; IO_STATUS_BLOCK IoStatus;
LIST_ENTRY List; LIST_ENTRY DeferredList;
PLIST_ENTRY NextEntry, ThisEntry;
PIRP ListIrp;
PAGED_CODE(); PAGED_CODE();
NpSlowWriteCalls++; NpSlowWriteCalls++;
InitializeListHead(&List); InitializeListHead(&DeferredList);
IoStack = IoGetCurrentIrpStackLocation(Irp); IoStack = IoGetCurrentIrpStackLocation(Irp);
FsRtlEnterFileSystem(); FsRtlEnterFileSystem();
ExAcquireResourceSharedLite(&NpVcb->Lock, TRUE); NpAcquireSharedVcb();
NpCommonWrite(IoStack->FileObject, NpCommonWrite(IoStack->FileObject,
Irp->UserBuffer, Irp->UserBuffer,
@ -174,20 +172,10 @@ NpFsdWrite(IN PDEVICE_OBJECT DeviceObject,
Irp->Tail.Overlay.Thread, Irp->Tail.Overlay.Thread,
&IoStatus, &IoStatus,
Irp, Irp,
&List); &DeferredList);
ExReleaseResourceLite(&NpVcb->Lock);
NextEntry = List.Flink;
while (NextEntry != &List)
{
ThisEntry = NextEntry;
NextEntry = NextEntry->Flink;
ListIrp = CONTAINING_RECORD(ThisEntry, IRP, Tail.Overlay.ListEntry);
IoCompleteRequest(ListIrp, IO_NAMED_PIPE_INCREMENT);
}
NpReleaseVcb();
NpCompleteDeferredIrps(&DeferredList);
FsRtlExitFileSystem(); FsRtlExitFileSystem();
if (IoStatus.Status != STATUS_PENDING) if (IoStatus.Status != STATUS_PENDING)