sys: request work item refactoring

This commit is contained in:
Bill Zissimopoulos 2016-11-08 13:53:11 -08:00
parent 9d176643c3
commit 5a83c68f56
2 changed files with 19 additions and 19 deletions

View File

@ -699,6 +699,9 @@ enum
#define FspIopCompleteIrp(I, R) FspIopCompleteIrpEx(I, R, TRUE)
#define REQ_ALIGN_SIZE 16
typedef VOID FSP_IOP_REQUEST_FINI(FSP_FSCTL_TRANSACT_REQ *Request, PVOID Context[4]);
typedef NTSTATUS FSP_IOP_REQUEST_WORK(
PDEVICE_OBJECT DeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp,
BOOLEAN CanWait);
typedef struct
{
FSP_IOP_REQUEST_FINI *RequestFini;
@ -745,11 +748,8 @@ enum
{
FspWqRequestWorkRoutine = 3,
};
typedef NTSTATUS FSP_WQ_REQUEST_WORK(
PDEVICE_OBJECT DeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp,
BOOLEAN CanWait);
NTSTATUS FspWqCreateAndPostIrpWorkItem(PIRP Irp,
FSP_WQ_REQUEST_WORK *WorkRoutine, FSP_IOP_REQUEST_FINI *RequestFini,
FSP_IOP_REQUEST_WORK *WorkRoutine, FSP_IOP_REQUEST_FINI *RequestFini,
BOOLEAN CreateAndPost);
VOID FspWqPostIrpWorkItem(PIRP Irp);
#define FspWqCreateIrpWorkItem(I, RW, RF)\

View File

@ -20,12 +20,12 @@
static VOID FspWqWorkRoutine(PVOID Context);
NTSTATUS FspWqCreateAndPostIrpWorkItem(PIRP Irp,
FSP_WQ_REQUEST_WORK *WorkRoutine, FSP_IOP_REQUEST_FINI *RequestFini,
FSP_IOP_REQUEST_WORK *WorkRoutine, FSP_IOP_REQUEST_FINI *RequestFini,
BOOLEAN CreateAndPost)
{
FSP_FSCTL_TRANSACT_REQ *RequestWorkItem = FspIrpRequest(Irp);
FSP_FSCTL_TRANSACT_REQ *Request = FspIrpRequest(Irp);
if (0 == RequestWorkItem)
if (0 == Request)
{
NTSTATUS Result;
PIO_STACK_LOCATION IrpSp = IoGetCurrentIrpStackLocation(Irp);
@ -43,15 +43,15 @@ NTSTATUS FspWqCreateAndPostIrpWorkItem(PIRP Irp,
}
Result = FspIopCreateRequestWorkItem(Irp, sizeof(WORK_QUEUE_ITEM),
RequestFini, &RequestWorkItem);
RequestFini, &Request);
if (!NT_SUCCESS(Result))
return Result;
ASSERT(sizeof(FSP_WQ_REQUEST_WORK *) == sizeof(PVOID));
ASSERT(sizeof(FSP_IOP_REQUEST_WORK *) == sizeof(PVOID));
FspIopRequestContext(RequestWorkItem, FspWqRequestWorkRoutine) =
FspIopRequestContext(Request, FspWqRequestWorkRoutine) =
(PVOID)(UINT_PTR)WorkRoutine;
ExInitializeWorkItem((PWORK_QUEUE_ITEM)&RequestWorkItem->Buffer, FspWqWorkRoutine, Irp);
ExInitializeWorkItem((PWORK_QUEUE_ITEM)&Request->Buffer, FspWqWorkRoutine, Irp);
}
if (!CreateAndPost)
@ -63,14 +63,14 @@ NTSTATUS FspWqCreateAndPostIrpWorkItem(PIRP Irp,
VOID FspWqPostIrpWorkItem(PIRP Irp)
{
FSP_FSCTL_TRANSACT_REQ *RequestWorkItem = FspIrpRequest(Irp);
FSP_FSCTL_TRANSACT_REQ *Request = FspIrpRequest(Irp);
ASSERT(RequestWorkItem->Kind == FspFsctlTransactReservedKind);
ASSERT(RequestWorkItem->Size == sizeof *RequestWorkItem + sizeof(WORK_QUEUE_ITEM));
ASSERT(RequestWorkItem->Hint == (UINT_PTR)Irp);
ASSERT(Request->Kind == FspFsctlTransactReservedKind);
ASSERT(Request->Size == sizeof *Request + sizeof(WORK_QUEUE_ITEM));
ASSERT(Request->Hint == (UINT_PTR)Irp);
IoMarkIrpPending(Irp);
ExQueueWorkItem((PWORK_QUEUE_ITEM)&RequestWorkItem->Buffer, CriticalWorkQueue);
ExQueueWorkItem((PWORK_QUEUE_ITEM)&Request->Buffer, CriticalWorkQueue);
}
static VOID FspWqWorkRoutine(PVOID Context)
@ -78,9 +78,9 @@ static VOID FspWqWorkRoutine(PVOID Context)
PIRP Irp = Context;
PIO_STACK_LOCATION IrpSp = IoGetCurrentIrpStackLocation(Irp);
PDEVICE_OBJECT DeviceObject = IrpSp->DeviceObject;
FSP_FSCTL_TRANSACT_REQ *RequestWorkItem = FspIrpRequest(Irp);
FSP_WQ_REQUEST_WORK *WorkRoutine = (FSP_WQ_REQUEST_WORK *)(UINT_PTR)
FspIopRequestContext(RequestWorkItem, FspWqRequestWorkRoutine);
FSP_FSCTL_TRANSACT_REQ *Request = FspIrpRequest(Irp);
FSP_IOP_REQUEST_WORK *WorkRoutine = (FSP_IOP_REQUEST_WORK *)(UINT_PTR)
FspIopRequestContext(Request, FspWqRequestWorkRoutine);
NTSTATUS Result;
IoSetTopLevelIrp(Irp);