Detect devices using the NULL driver, and set the STARTED flag Modified: trunk/reactos/ntoskrnl/io/pnpmgr.c _____
Modified: trunk/reactos/ntoskrnl/io/pnpmgr.c --- trunk/reactos/ntoskrnl/io/pnpmgr.c 2005-11-24 09:11:44 UTC (rev 19519) +++ trunk/reactos/ntoskrnl/io/pnpmgr.c 2005-11-24 09:18:16 UTC (rev 19520) @@ -1922,9 +1922,11 @@
PDEVICE_NODE DeviceNode, PVOID Context) { - RTL_QUERY_REGISTRY_TABLE QueryTable[2]; + RTL_QUERY_REGISTRY_TABLE QueryTable[3]; PDEVICE_NODE ParentDeviceNode; PUNICODE_STRING Service; + UNICODE_STRING ClassGUID; + UNICODE_STRING NullString = RTL_CONSTANT_STRING(L""); NTSTATUS Status;
DPRINT("IopActionConfigureChildServices(%p, %p)\n", DeviceNode, Context); @@ -1969,11 +1971,19 @@
RtlZeroMemory(QueryTable, sizeof(QueryTable)); RtlInitUnicodeString(Service, NULL); + RtlInitUnicodeString(&ClassGUID, NULL);
QueryTable[0].Name = L"Service"; QueryTable[0].Flags = RTL_QUERY_REGISTRY_DIRECT; QueryTable[0].EntryContext = Service;
+ QueryTable[1].Name = L"ClassGUID"; + QueryTable[1].Flags = RTL_QUERY_REGISTRY_DIRECT; + QueryTable[1].EntryContext = &ClassGUID; + QueryTable[1].DefaultType = REG_SZ; + QueryTable[1].DefaultData = &NullString; + QueryTable[1].DefaultLength = 0; + RtlAppendUnicodeToString(&RegKey, L"\Registry\Machine\System\CurrentControlSet\Enum\"); RtlAppendUnicodeStringToString(&RegKey, &DeviceNode->InstancePath);
@@ -1993,6 +2003,15 @@ if (Service->Buffer == NULL) { IopDeviceNodeSetFlag(DeviceNode, DNF_DISABLED); + + if (ClassGUID.Length != 0) + { + /* Device has a ClassGUID value, but no Service value. + * Suppose it is using the NULL driver, so state the + * device is started */ + DPRINT("%wZ is using NULL driver\n", &DeviceNode->InstancePath); + IopDeviceNodeSetFlag(DeviceNode, DNF_STARTED); + } return STATUS_SUCCESS; }