From 72dd7eefe0d23e8e51600ad0bf5427a95a115320 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herv=C3=A9=20Poussineau?= Date: Fri, 14 Oct 2005 18:24:19 +0000 Subject: [PATCH] Big Plug-and-Play patch for ReactOS: - Install drivers for devices at first boot - Remove now useless entries in hivesys.inf At the moment, driver installation only uses .inf files in ReactOS\Inf directory, and the needed files have to be in ReactOS\Inf or their final location (ReactOS\system32 or ReactOS\system32\drivers) + the user can't provide a custom driver Plug-and-Plays devices are only USB controllers (OHCI and UHCI) and serial ports now. svn path=/trunk/; revision=18448 --- reactos/bootdata/hivesys.inf | 62 ---------------------------- reactos/ntoskrnl/io/driver.c | 3 ++ reactos/services/umpnpmgr/umpnpmgr.c | 47 +++++++++++++++++++++ 3 files changed, 50 insertions(+), 62 deletions(-) diff --git a/reactos/bootdata/hivesys.inf b/reactos/bootdata/hivesys.inf index f6a1aa2660a..67075c5128c 100644 --- a/reactos/bootdata/hivesys.inf +++ b/reactos/bootdata/hivesys.inf @@ -594,47 +594,6 @@ HKLM,"SYSTEM\CurrentControlSet\Enum\Root\PCI\0000","Class",0x00000000,"Computer" HKLM,"SYSTEM\CurrentControlSet\Enum\Root\PCI\0000","ClassGUID",0x00000000,"{4D36E966-E325-11CE-BFC1-08002BE10318}" HKLM,"SYSTEM\CurrentControlSet\Enum\Root\PCI\0000","ParentIdPrefix",0x0000000,"0000" -;USB UHCI Driver -HKLM,"SYSTEM\CurrentControlSet\Services\usbuhci","Type",0x00010001,0x00000001 -HKLM,"SYSTEM\CurrentControlSet\Services\usbuhci","ErrorControl",0x00010001,0x00000001 -HKLM,"SYSTEM\CurrentControlSet\Services\usbuhci","Start",0x00010001,0x00000003 -HKLM,"SYSTEM\CurrentControlSet\Services\usbuhci","Group",0x00000000,"Base" -HKLM,"SYSTEM\CurrentControlSet\Services\usbuhci","ImagePath",0x00020000,"System32\DRIVERS\usbuhci.sys" -HKLM,"SYSTEM\CurrentControlSet\Services\usbuhci","Tag",0x00010001,0x0000000f -HKLM,"SYSTEM\CurrentControlSet\Services\usbuhci","DisplayName",0x00000000,"ReactOS USB UHCI controller miniport driver" -;hard coded values for VMWARE -HKLM,"SYSTEM\CurrentControlSet\Services\usbuhci\Enum","0",0x00000000,"PCI\VEN_8086&DEV_7112&SUBSYS_197615AD&REV_00\0000" -HKLM,"SYSTEM\CurrentControlSet\Services\usbuhci\Enum","Count",0x00010001,0x00000001 -HKLM,"SYSTEM\CurrentControlSet\Services\usbuhci\Enum","NextInstance",0x00010001,0x00000001 -HKLM,"SYSTEM\CurrentControlSet\Enum\PCI\VEN_8086&DEV_7112&SUBSYS_197615AD&REV_00\0000","Service",0x0000000,"usbuhci" -HKLM,"SYSTEM\CurrentControlSet\Enum\PCI\VEN_8086&DEV_7112&SUBSYS_197615AD&REV_00\0000","ParentIdPrefix",0x0000000,"0000" - -;USB OHCI Driver (Cromwell), especially the same name as windows OHCI miniport -HKLM,"SYSTEM\CurrentControlSet\Services\usbohci","Type",0x00010001,0x00000001 -HKLM,"SYSTEM\CurrentControlSet\Services\usbohci","ErrorControl",0x00010001,0x00000001 -HKLM,"SYSTEM\CurrentControlSet\Services\usbohci","Start",0x00010001,0x00000003 -HKLM,"SYSTEM\CurrentControlSet\Services\usbohci","Group",0x00000000,"Base" -HKLM,"SYSTEM\CurrentControlSet\Services\usbohci","ImagePath",0x00020000,"System32\drivers\usbohci.sys" -HKLM,"SYSTEM\CurrentControlSet\Services\usbohci","Tag",0x00010001,0x0000000f -HKLM,"SYSTEM\CurrentControlSet\Services\usbohci","DisplayName",0x00000000,"ReactOS USB OHCI cromwell-type driver" -;hard coded values for Virtual PC 6/7 (Mac) -HKLM,"SYSTEM\CurrentControlSet\Services\usbohci\Enum","0",0x00000000,"PCI\VEN_2955&DEV_6E61&SUBSYS_6E612955&REV_11\0000" -HKLM,"SYSTEM\CurrentControlSet\Services\usbohci\Enum","Count",0x00010001,0x00000001 -HKLM,"SYSTEM\CurrentControlSet\Services\usbohci\Enum","NextInstance",0x00010001,0x00000001 -HKLM,"SYSTEM\CurrentControlSet\Enum\PCI\VEN_2955&DEV_6E61&SUBSYS_6E612955&REV_11\0000","Service",0x0000000,"usbohci" - -;USB Hub driver -HKLM,"SYSTEM\CurrentControlSet\Services\usbhub","Type",0x00010001,0x00000001 -HKLM,"SYSTEM\CurrentControlSet\Services\usbhub","ErrorControl",0x00010001,0x00000001 -HKLM,"SYSTEM\CurrentControlSet\Services\usbhub","Start",0x00010001,0x00000003 -HKLM,"SYSTEM\CurrentControlSet\Services\usbhub","Group",0x00000000,"Base" -HKLM,"SYSTEM\CurrentControlSet\Services\usbhub","ImagePath",0x00020000,"System32\drivers\usbhub.sys" -HKLM,"SYSTEM\CurrentControlSet\Services\usbhub","Tag",0x00010001,0x00000011 -HKLM,"SYSTEM\CurrentControlSet\Services\usbhub","DisplayName",0x00000000,"ReactOS USB HUB cromwell-type driver" -;hard coded values -HKLM,"SYSTEM\CurrentControlSet\Enum\USB\ROOT_HUB\0000","Service",0x0000000,"usbhub" -HKLM,"SYSTEM\CurrentControlSet\Enum\USB\ROOT_HUB20\0000","Service",0x0000000,"usbhub" - ; ReactOS PCNet NIC driver ; To use the AMD supplied driver change the driver name to pcntn5m.sys ; @@ -699,23 +658,12 @@ HKLM,"SYSTEM\CurrentControlSet\Services\Null","ImagePath",0x00020000,"system32\d HKLM,"SYSTEM\CurrentControlSet\Services\Null","Start",0x00010001,0x00000001 HKLM,"SYSTEM\CurrentControlSet\Services\Null","Type",0x00010001,0x00000001 -; Serial device driver -HKLM,"SYSTEM\CurrentControlSet\Enum\ACPI\PNP0501\1","ClassGUID",0x00000000,"{4D36E978-E325-11CE-BFC1-08002BE10318}" -HKLM,"SYSTEM\CurrentControlSet\Enum\ACPI\PNP0501\1","Service",0x00000000,"serial" -HKLM,"SYSTEM\CurrentControlSet\Enum\ACPI\PNP0501\1","UpperFilters",0x00010000,"serenum" -HKLM,"SYSTEM\CurrentControlSet\Enum\ACPI\PNP0501\2","ClassGUID",0x00000000,"{4D36E978-E325-11CE-BFC1-08002BE10318}" -HKLM,"SYSTEM\CurrentControlSet\Enum\ACPI\PNP0501\2","Service",0x00000000,"serial" -HKLM,"SYSTEM\CurrentControlSet\Enum\ACPI\PNP0501\2","UpperFilters",0x00010000,"serenum" - ; Packet driver HKLM,"SYSTEM\CurrentControlSet\Services\Packet","ErrorControl",0x00010001,0x00000001 HKLM,"SYSTEM\CurrentControlSet\Services\Packet","Group",0x00000000,"PNP_TDI" HKLM,"SYSTEM\CurrentControlSet\Services\Packet","ImagePath",0x00020000,"system32\drivers\packet.sys" HKLM,"SYSTEM\CurrentControlSet\Services\Packet","Start",0x00010001,0x00000004 HKLM,"SYSTEM\CurrentControlSet\Services\Packet","Type",0x00010001,0x00000001 -; NOTE: These settings should be added by the network setup -HKLM,"SYSTEM\CurrentControlSet\Services\Packet\Linkage","Bind",0x00010000,"\Device\Ne20001" -HKLM,"SYSTEM\CurrentControlSet\Services\Packet\Linkage","Export",0x00010000,"\Device\packet" ; Plug and Play manager HKLM,"SYSTEM\CurrentControlSet\Services\PlugPlay","ErrorControl",0x00010001,0x00000000 @@ -737,16 +685,6 @@ HKLM,"SYSTEM\CurrentControlSet\Services\Scsiport","ImagePath",0x00020000,"system HKLM,"SYSTEM\CurrentControlSet\Services\Scsiport","Start",0x00010001,0x00000000 HKLM,"SYSTEM\CurrentControlSet\Services\Scsiport","Type",0x00010001,0x00000001 -; Serial mouse driver -HKLM,"SYSTEM\CurrentControlSet\Services\Sermouse","ErrorControl",0x00010001,0x00000000 -HKLM,"SYSTEM\CurrentControlSet\Services\Sermouse","Group",0x00000000,"Pointer Port" -HKLM,"SYSTEM\CurrentControlSet\Services\Sermouse","ImagePath",0x00020000,"system32\drivers\sermouse.sys" -HKLM,"SYSTEM\CurrentControlSet\Services\Sermouse","Start",0x00010001,0x00000003 -HKLM,"SYSTEM\CurrentControlSet\Services\Sermouse","Type",0x00010001,0x00000001 -;hard coded values for some serial mice -HKLM,"SYSTEM\CurrentControlSet\Enum\Serenum\Mouse\0000","Service",0x0000000,"sermouse" -HKLM,"SYSTEM\CurrentControlSet\Enum\Serenum\Mouse\0000","ClassGUID",0x0000000,"{4D36E96F-E325-11CE-BFC1-08002BE10318}" - ; TCP/IP driver HKLM,"SYSTEM\CurrentControlSet\Services\Tcpip","ErrorControl",0x00010001,0x00000001 HKLM,"SYSTEM\CurrentControlSet\Services\Tcpip","Group",0x00000000,"PNP_TDI" diff --git a/reactos/ntoskrnl/io/driver.c b/reactos/ntoskrnl/io/driver.c index c9b6b424f65..8892446cdb1 100644 --- a/reactos/ntoskrnl/io/driver.c +++ b/reactos/ntoskrnl/io/driver.c @@ -529,6 +529,9 @@ IopLoadServiceModule( break; } } + if (!NT_SUCCESS(Status)) + /* Try to load it. It may just have been installed by PnP manager */ + Status = LdrLoadModule(&ServiceImagePath, ModuleObject); } /* diff --git a/reactos/services/umpnpmgr/umpnpmgr.c b/reactos/services/umpnpmgr/umpnpmgr.c index 416eb928ca0..c243c7e5fa1 100644 --- a/reactos/services/umpnpmgr/umpnpmgr.c +++ b/reactos/services/umpnpmgr/umpnpmgr.c @@ -22,6 +22,7 @@ * FILE: services/umpnpmgr/umpnpmgr.c * PURPOSE: User-mode Plug and Play manager * PROGRAMMER: Eric Kohl + * Hervé Poussineau (hpoussin@reactos.org) */ /* INCLUDES *****************************************************************/ @@ -874,6 +875,51 @@ PNP_RequestEjectPC(handle_t BindingHandle) return ret; } +typedef BOOL (*PDEV_INSTALL_W)(HWND, HINSTANCE, LPCWSTR, INT); + +static BOOL +InstallDevice(PCWSTR DeviceInstance) +{ + PLUGPLAY_CONTROL_STATUS_DATA PlugPlayData; + HMODULE hNewDev = NULL; + PDEV_INSTALL_W DevInstallW; + NTSTATUS Status; + BOOL DeviceInstalled = FALSE; + + RtlInitUnicodeString(&PlugPlayData.DeviceInstance, + DeviceInstance); + PlugPlayData.Operation = 0; /* Get status */ + + /* Get device status */ + Status = NtPlugPlayControl(PlugPlayControlDeviceStatus, + (PVOID)&PlugPlayData, + sizeof(PLUGPLAY_CONTROL_STATUS_DATA)); + if (!NT_SUCCESS(Status)) + return FALSE; + + if (PlugPlayData.DeviceStatus & DNF_STARTED || PlugPlayData.DeviceStatus & DNF_START_FAILED) + /* Device is already started, or disabled due to some problem. Don't install it */ + return TRUE; + + /* Install device */ + SetEnvironmentVariable(L"USERPROFILE", L"."); /* FIXME: why is it needed? */ + hNewDev = LoadLibraryW(L"newdev.dll"); + if (!hNewDev) + goto cleanup; + DevInstallW = (PDEV_INSTALL_W)GetProcAddress(hNewDev, (LPCSTR)"DevInstallW"); + if (!DevInstallW) + goto cleanup; + if (!DevInstallW(NULL, NULL, DeviceInstance, SW_SHOWNOACTIVATE)) + goto cleanup; + + DeviceInstalled = TRUE; + +cleanup: + if (hNewDev != NULL) + FreeLibrary(hNewDev); + + return DeviceInstalled; +} static DWORD WINAPI PnpEventThread(LPVOID lpParameter) @@ -915,6 +961,7 @@ PnpEventThread(LPVOID lpParameter) if (UuidEqual(&PnpEvent->EventGuid, (UUID*)&GUID_DEVICE_ARRIVAL, &RpcStatus)) { DPRINT("Device arrival event: %S\n", PnpEvent->TargetDevice.DeviceIds); + InstallDevice(PnpEvent->TargetDevice.DeviceIds); } else {