return STATUS_SUCCESS;
}
+
+WORKER_THREAD_ROUTINE InitRootHub;
+
+VOID
+NTAPI
+InitRootHub(IN PVOID Context)
+{
+ PINIT_ROOT_HUB_CONTEXT WorkItem;
+
+ //
+ // get context
+ //
+ WorkItem = (PINIT_ROOT_HUB_CONTEXT)Context;
+
+ //
+ // perform callback
+ //
+ WorkItem->CallbackRoutine(WorkItem->CallbackContext);
+
+ //
+ // free contextg
+ //
+ ExFreePoolWithTag(Context, TAG_USBLIB);
+}
+
NTSTATUS
USB_BUSIFFN
USBHI_RootHubInitNotification(
PRH_INIT_CALLBACK CallbackRoutine)
{
CHubController * Controller;
+ PINIT_ROOT_HUB_CONTEXT WorkItem;
DPRINT("USBHI_RootHubInitNotification %p \n", CallbackContext);
Controller->SetNotification(CallbackContext, CallbackRoutine);
//
- // FIXME: determine when to perform callback
+ // Create and initialize work item data
+ //
+ WorkItem = (PINIT_ROOT_HUB_CONTEXT)ExAllocatePoolWithTag(NonPagedPool, sizeof(INIT_ROOT_HUB_CONTEXT), TAG_USBLIB);
+ if (!WorkItem)
+ {
+ DPRINT1("Failed to allocate memory!n");
+ return STATUS_INSUFFICIENT_RESOURCES;
+ }
+
+ //
+ // init context
+ //
+ WorkItem->CallbackRoutine = CallbackRoutine;
+ WorkItem->CallbackContext = CallbackContext;
+
+ //
+ // Queue the work item to handle initializing the device
//
- CallbackRoutine(CallbackContext);
+ ExInitializeWorkItem(&WorkItem->WorkItem, InitRootHub, (PVOID)WorkItem);
+ ExQueueWorkItem(&WorkItem->WorkItem, DelayedWorkQueue);
//
// done
PDISPATCHIRP Dispatcher; // dispatches the code
}COMMON_DEVICE_EXTENSION, *PCOMMON_DEVICE_EXTENSION;
+
+typedef struct _WORK_ITEM_DATA
+{
+ WORK_QUEUE_ITEM WorkItem; // work item
+ PVOID CallbackContext; // callback context
+ PRH_INIT_CALLBACK CallbackRoutine; // callback routine
+} INIT_ROOT_HUB_CONTEXT, *PINIT_ROOT_HUB_CONTEXT;
+
//
// tag for allocations
//