/* * PROJECT: ReactOS Kernel * LICENSE: GPL - See COPYING in the top level directory * FILE: ntoskrnl/io/iomgr/iowork.c * PURPOSE: I/O Wrappers for the Executive Work Item Functions * PROGRAMMERS: Alex Ionescu (alex.ionescu@reactos.org) * Robert Dickenson (odin@pnc.com.au) */ /* INCLUDES ******************************************************************/ #include #define NDEBUG #include /* PRIVATE FUNCTIONS *********************************************************/ VOID NTAPI IopWorkItemCallback(IN PVOID Parameter) { PIO_WORKITEM IoWorkItem = (PIO_WORKITEM)Parameter; PDEVICE_OBJECT DeviceObject = IoWorkItem->DeviceObject; PAGED_CODE(); /* Call the work routine */ IoWorkItem->WorkerRoutine(DeviceObject, IoWorkItem->Context); /* Dereference the device object */ ObDereferenceObject(DeviceObject); } /* PUBLIC FUNCTIONS **********************************************************/ /* * @implemented */ VOID NTAPI IoQueueWorkItem(IN PIO_WORKITEM IoWorkItem, IN PIO_WORKITEM_ROUTINE WorkerRoutine, IN WORK_QUEUE_TYPE QueueType, IN PVOID Context) { /* Make sure we're called at DISPATCH or lower */ ASSERT_IRQL_LESS_OR_EQUAL(DISPATCH_LEVEL); /* Reference the device object */ ObReferenceObject(IoWorkItem->DeviceObject); /* Setup the work item */ IoWorkItem->WorkerRoutine = WorkerRoutine; IoWorkItem->Context = Context; /* Queue the work item */ ExQueueWorkItem(&IoWorkItem->Item, QueueType); } /* * @implemented */ VOID NTAPI IoFreeWorkItem(IN PIO_WORKITEM IoWorkItem) { /* Free the work item */ ExFreePool(IoWorkItem); } /* * @implemented */ PIO_WORKITEM NTAPI IoAllocateWorkItem(IN PDEVICE_OBJECT DeviceObject) { PIO_WORKITEM IoWorkItem; /* Allocate the work item */ IoWorkItem = ExAllocatePoolWithTag(NonPagedPool, sizeof(IO_WORKITEM), TAG_IOWI); if (!IoWorkItem) return NULL; /* Initialize it */ IoWorkItem->DeviceObject = DeviceObject; ExInitializeWorkItem(&IoWorkItem->Item, IopWorkItemCallback, IoWorkItem); /* Return it */ return IoWorkItem; } /* EOF */