Index: lib/drivers/libusb/hcd_controller.cpp =================================================================== --- lib/drivers/libusb/hcd_controller.cpp (revision 70555) +++ lib/drivers/libusb/hcd_controller.cpp (working copy) @@ -10,7 +10,7 @@ #include "libusb.h" -#define NDEBUG +//#define NDEBUG #include class CHCDController : public IHCDController, @@ -415,12 +415,19 @@ // start the hardware // Status = m_Hardware->PnpStart(RawResourceList, TranslatedResourceList); + + if (NT_SUCCESS(Status)) + { + // + // enable symbolic link + // + Status = SetSymbolicLink(TRUE); + } } - - // - // enable symbolic link - // - Status = SetSymbolicLink(TRUE); + else + { + Status = STATUS_UNSUCCESSFUL; + } } DPRINT("[%s] HandlePnp IRP_MN_START FDO: Status %x\n", m_USBType ,Status); Index: ntoskrnl/io/iomgr/iomgr.c =================================================================== --- ntoskrnl/io/iomgr/iomgr.c (revision 70555) +++ ntoskrnl/io/iomgr/iomgr.c (working copy) @@ -474,6 +474,8 @@ CHAR Buffer[256]; ANSI_STRING NtBootPath, RootString; + DPRINT1("IoInitSystem: LoaderBlock 0x%p\n", LoaderBlock); + /* Initialize empty NT Boot Path */ RtlInitEmptyAnsiString(&NtBootPath, Buffer, sizeof(Buffer)); @@ -530,6 +532,7 @@ /* Initialize PnP manager */ IopInitializePlugPlayServices(); + DPRINT1("IopInitializePlugPlayServices: end\n"); /* Initialize SHIM engine */ ApphelpCacheInitialize(); @@ -539,16 +542,29 @@ /* Initialize HAL Root Bus Driver */ HalInitPnpDriver(); + DPRINT1("HalInitPnpDriver: end\n"); /* Make loader block available for the whole kernel */ IopLoaderBlock = LoaderBlock; /* Load boot start drivers */ + DPRINT1("IopInitializeBootDrivers\n"); IopInitializeBootDrivers(); + DPRINT1("IopInitializeBootDrivers: end\n"); /* Call back drivers that asked for */ + DPRINT1("IopReinitializeBootDrivers\n"); IopReinitializeBootDrivers(); + DPRINT1("IopReinitializeBootDrivers: end\n"); + { + LARGE_INTEGER Timeout; + Timeout.QuadPart = 5000; + DPRINT1("Waiting %lu milliseconds for port reset\n", Timeout.LowPart); + Timeout.QuadPart *= -10000; // convert to 100 ns units (absolute) + KeDelayExecutionThread(KernelMode, FALSE, &Timeout); // perform the wait + } + /* Check if this was a ramdisk boot */ if (!_strnicmp(LoaderBlock->ArcBootDeviceName, "ramdisk(0)", 10)) { @@ -575,7 +591,9 @@ } /* Initialize PnP root relations */ + DPRINT1("IopEnumerateDevice\n"); IopEnumerateDevice(IopRootDeviceNode->PhysicalDeviceObject); + DPRINT1("IopEnumerateDevice: end\n"); #ifndef _WINKD_ /* Read KDB Data */ @@ -586,14 +604,20 @@ #endif /* Load services for devices found by PnP manager */ + DPRINT1("IopInitializePnpServices\n"); IopInitializePnpServices(IopRootDeviceNode); + DPRINT1("IopInitializePnpServices: end\n"); /* Load system start drivers */ + DPRINT1("IopInitializeSystemDrivers\n"); IopInitializeSystemDrivers(); PnpSystemInit = TRUE; + DPRINT1("IopInitializeSystemDrivers: end\n"); /* Reinitialize drivers that requested it */ + DPRINT1("IopReinitializeDrivers\n"); IopReinitializeDrivers(); + DPRINT1("IopReinitializeDrivers: end\n"); /* Convert SystemRoot from ARC to NT path */ Status = IopReassignSystemRoot(LoaderBlock, &NtBootPath); @@ -640,6 +664,8 @@ return FALSE; } + DPRINT1("IoInitSystem: Return success\n"); + /* Return success */ return TRUE; } Index: ntoskrnl/io/pnpmgr/pnpmgr.c =================================================================== --- ntoskrnl/io/pnpmgr/pnpmgr.c (revision 70555) +++ ntoskrnl/io/pnpmgr/pnpmgr.c (working copy) @@ -904,6 +904,8 @@ PINVALIDATE_DEVICE_RELATION_DATA Data; KIRQL OldIrql; + DPRINT1("IopDeviceRelationsWorker: Context - %x \n", Context); + KeAcquireSpinLock(&IopDeviceRelationsSpinLock, &OldIrql); while (!IsListEmpty(&IopDeviceRelationsRequestList)) { @@ -913,6 +915,8 @@ INVALIDATE_DEVICE_RELATION_DATA, RequestListEntry); + DPRINT1("IopDeviceRelationsWorker: Data->DeviceObject - %x \n", Data->DeviceObject); + IoSynchronousInvalidateDeviceRelations(Data->DeviceObject, Data->Type); @@ -922,6 +926,8 @@ } IopDeviceRelationsRequestInProgress = FALSE; KeReleaseSpinLock(&IopDeviceRelationsSpinLock, OldIrql); + + DPRINT1("IopDeviceRelationsWorker end\n"); } NTSTATUS @@ -2282,18 +2288,18 @@ NTSTATUS Status; ULONG i; - DPRINT("DeviceObject 0x%p\n", DeviceObject); + DPRINT1("IopEnumerateDevice: DeviceObject 0x%p\n", DeviceObject); if (DeviceNode->Flags & DNF_NEED_ENUMERATION_ONLY) { DeviceNode->Flags &= ~DNF_NEED_ENUMERATION_ONLY; - DPRINT("Sending GUID_DEVICE_ARRIVAL\n"); + DPRINT1("Sending GUID_DEVICE_ARRIVAL\n"); IopQueueTargetDeviceEvent(&GUID_DEVICE_ARRIVAL, &DeviceNode->InstancePath); } - DPRINT("Sending IRP_MN_QUERY_DEVICE_RELATIONS to device stack\n"); + DPRINT1("Sending IRP_MN_QUERY_DEVICE_RELATIONS to device stack\n"); Stack.Parameters.QueryDeviceRelations.Type = BusRelations; @@ -2304,7 +2310,7 @@ &Stack); if (!NT_SUCCESS(Status) || Status == STATUS_PENDING) { - DPRINT("IopInitiatePnpIrp() failed with status 0x%08lx\n", Status); + DPRINT1("IopInitiatePnpIrp() failed with status 0x%08lx\n", Status); return Status; } @@ -2320,11 +2326,11 @@ if (!DeviceRelations) { /* We're all done */ - DPRINT("No PDOs\n"); + DPRINT1("No PDOs\n"); return STATUS_SUCCESS; } - DPRINT("Got %u PDOs\n", DeviceRelations->Count); + DPRINT1("Got %u PDOs\n", DeviceRelations->Count); /* * Create device nodes for all discovered devices @@ -2379,7 +2385,7 @@ Status = IopTraverseDeviceTree(&Context); if (!NT_SUCCESS(Status)) { - DPRINT("IopTraverseDeviceTree() failed with status 0x%08lx\n", Status); + DPRINT1("IopTraverseDeviceTree() failed with status 0x%08lx\n", Status); return Status; } @@ -2395,7 +2401,7 @@ Status = IopTraverseDeviceTree(&Context); if (!NT_SUCCESS(Status)) { - DPRINT("IopTraverseDeviceTree() failed with status 0x%08lx\n", Status); + DPRINT1("IopTraverseDeviceTree() failed with status 0x%08lx\n", Status); return Status; } @@ -2405,11 +2411,11 @@ Status = IopInitializePnpServices(DeviceNode); if (!NT_SUCCESS(Status)) { - DPRINT("IopInitializePnpServices() failed with status 0x%08lx\n", Status); + DPRINT1("IopInitializePnpServices() failed with status 0x%08lx\n", Status); return Status; } - DPRINT("IopEnumerateDevice() finished\n"); + DPRINT1("IopEnumerateDevice() finished\n"); return STATUS_SUCCESS; } @@ -4696,6 +4702,8 @@ PINVALIDATE_DEVICE_RELATION_DATA Data; KIRQL OldIrql; + DPRINT1("IoInvalidateDeviceRelations: DeviceObject - %x \n", DeviceObject); + Data = ExAllocatePool(NonPagedPool, sizeof(INVALIDATE_DEVICE_RELATION_DATA)); if (!Data) return; @@ -4708,6 +4716,7 @@ InsertTailList(&IopDeviceRelationsRequestList, &Data->RequestListEntry); if (IopDeviceRelationsRequestInProgress) { + DPRINT1("IoInvalidateDeviceRelations: IopDeviceRelationsRequestInProgress is TRUE\n"); KeReleaseSpinLock(&IopDeviceRelationsSpinLock, OldIrql); return; } @@ -4719,6 +4728,8 @@ NULL); ExQueueWorkItem(&IopDeviceRelationsWorkItem, DelayedWorkQueue); + + DPRINT1("IoInvalidateDeviceRelations: to end\n"); } /* @@ -4730,21 +4741,33 @@ IN PDEVICE_OBJECT DeviceObject, IN DEVICE_RELATION_TYPE Type) { + NTSTATUS Status=0; + PAGED_CODE(); + DPRINT1("IoSynchronousInvalidateDeviceRelations: DeviceObject - %x, Type - %x \n", DeviceObject, Type); + switch (Type) { case BusRelations: /* Enumerate the device */ + Status = IopEnumerateDevice(DeviceObject); + DPRINT1("IoSynchronousInvalidateDeviceRelations: IopEnumerateDevice return Status - %x \n", Status); return IopEnumerateDevice(DeviceObject); + case PowerRelations: /* Not handled yet */ + DPRINT1("IoSynchronousInvalidateDeviceRelations: PowerRelations Not handled yet\n"); return STATUS_NOT_IMPLEMENTED; + case TargetDeviceRelation: /* Nothing to do */ - return STATUS_SUCCESS; + DPRINT1("IoSynchronousInvalidateDeviceRelations: TargetDeviceRelation Nothing to do\n"); + return STATUS_SUCCESS; + default: /* Ejection relations are not supported */ + DPRINT1("IoSynchronousInvalidateDeviceRelations: Ejection relations are not supported\n"); return STATUS_NOT_SUPPORTED; } }