diff --git a/reactos/drivers/usb/nt4compat/usbdriver/devmgr.c b/reactos/drivers/usb/nt4compat/usbdriver/devmgr.c index ca32c7a26f5..5c307e64e91 100644 --- a/reactos/drivers/usb/nt4compat/usbdriver/devmgr.c +++ b/reactos/drivers/usb/nt4compat/usbdriver/devmgr.c @@ -202,6 +202,7 @@ dev_mgr_strobe(PUSB_DEV_MANAGER dev_mgr) pevent->context = (ULONG) dev_mgr; KeInitializeEvent(&dev_mgr->wake_up_event, SynchronizationEvent, FALSE); + KeInitializeEvent(&dev_mgr->drivers_inited, NotificationEvent, FALSE); InsertTailList(&dev_mgr->event_list, &pevent->event_link); @@ -273,6 +274,9 @@ dev_mgr_event_init(PUSB_DEV pdev, //always null. we do not use this param KeSetTimerEx(&dev_mgr->dev_mgr_timer, due_time, DEV_MGR_TIMER_INTERVAL_MS, &dev_mgr->dev_mgr_timer_dpc); + /* Signal we're done initing */ + KeSetEvent(&dev_mgr->drivers_inited, 0, FALSE); + return TRUE; } @@ -286,6 +290,7 @@ dev_mgr_event_init(PUSB_DEV pdev, //always null. we do not use this param KeCancelTimer(&dev_mgr->dev_mgr_timer); KeRemoveQueueDpc(&dev_mgr->dev_mgr_timer_dpc); + KeSetEvent(&dev_mgr->drivers_inited, 0, FALSE); return FALSE; } diff --git a/reactos/drivers/usb/nt4compat/usbdriver/devmgr.h b/reactos/drivers/usb/nt4compat/usbdriver/devmgr.h index d66e30352d0..42e0afe2468 100644 --- a/reactos/drivers/usb/nt4compat/usbdriver/devmgr.h +++ b/reactos/drivers/usb/nt4compat/usbdriver/devmgr.h @@ -98,6 +98,7 @@ typedef struct _USB_DEV_MANAGER LIST_HEAD event_list; USB_EVENT_POOL event_pool; + KEVENT drivers_inited; KTIMER dev_mgr_timer; KDPC dev_mgr_timer_dpc; KSPIN_LOCK timer_svc_list_lock; diff --git a/reactos/drivers/usb/nt4compat/usbdriver/uhci.c b/reactos/drivers/usb/nt4compat/usbdriver/uhci.c index 2dc5d6153c9..b0ef91ffd75 100644 --- a/reactos/drivers/usb/nt4compat/usbdriver/uhci.c +++ b/reactos/drivers/usb/nt4compat/usbdriver/uhci.c @@ -3752,7 +3752,6 @@ uhci_init_hcd_interface(PUHCI_DEV uhci) uhci->hcd_interf.flags = HCD_TYPE_UHCI; //hcd types | hcd id } - NTSTATUS NTAPI generic_dispatch_irp(IN PDEVICE_OBJECT dev_obj, IN PIRP irp) { @@ -3807,9 +3806,9 @@ NTSTATUS NTAPI DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath) { -#if DBG NTSTATUS ntStatus = STATUS_SUCCESS; +#if DBG // should be done before any debug output is done. // read our debug verbosity level from the registry //NetacOD_GetRegistryDword( NetacOD_REGISTRY_PARAMETERS_PATH, //absolute registry path @@ -3867,6 +3866,9 @@ DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath) dev_mgr_start_hcd(&g_dev_mgr); + /* Wait till all drivers are initialized */ + ntStatus = KeWaitForSingleObject(&g_dev_mgr.drivers_inited, Executive, KernelMode, TRUE, NULL); + uhci_dbg_print_cond(DBGLVL_DEFAULT, DEBUG_UHCI, ("DriverEntry(): exiting... (%x)\n", ntStatus)); return STATUS_SUCCESS; }