mirror of
https://github.com/reactos/reactos.git
synced 2025-06-20 07:36:05 +00:00
- IopUnloadDriver: Only add the DOE_UNLOAD_PENDING to the Device's DeviceExtensions Flags and check for attached devices and reference counts if the DriverObject->DriverUnload is valid. Verified on XP.
- IopLoadUnloadDriver: Add a check to verify that ImagePath.Buffer is non null before freeing it. svn path=/trunk/; revision=41314
This commit is contained in:
parent
1163e01722
commit
fddbec411f
1 changed files with 30 additions and 30 deletions
|
@ -1083,6 +1083,13 @@ IopUnloadDriver(PUNICODE_STRING DriverServiceName, BOOLEAN UnloadPnpDrivers)
|
||||||
|
|
||||||
ExFreePool(ImagePath.Buffer);
|
ExFreePool(ImagePath.Buffer);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Unload the module and release the references to the device object
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Call the load/unload routine, depending on current process */
|
||||||
|
if (DriverObject->DriverUnload && DriverObject->DriverSection)
|
||||||
|
{
|
||||||
/* Loop through each device object of the driver
|
/* Loop through each device object of the driver
|
||||||
and set DOE_UNLOAD_PENDING flag */
|
and set DOE_UNLOAD_PENDING flag */
|
||||||
DeviceObject = DriverObject->DeviceObject;
|
DeviceObject = DriverObject->DeviceObject;
|
||||||
|
@ -1111,14 +1118,6 @@ IopUnloadDriver(PUNICODE_STRING DriverServiceName, BOOLEAN UnloadPnpDrivers)
|
||||||
return STATUS_SUCCESS;
|
return STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Unload the module and release the references to the device object
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Call the load/unload routine, depending on current process */
|
|
||||||
if (DriverObject->DriverUnload && DriverObject->DriverSection)
|
|
||||||
{
|
|
||||||
/* Set the unload invoked flag */
|
/* Set the unload invoked flag */
|
||||||
DriverObject->Flags |= DRVO_UNLOAD_INVOKED;
|
DriverObject->Flags |= DRVO_UNLOAD_INVOKED;
|
||||||
|
|
||||||
|
@ -1681,6 +1680,7 @@ IopLoadUnloadDriver(PLOAD_UNLOAD_PARAMS LoadParams)
|
||||||
if (!NT_SUCCESS(Status))
|
if (!NT_SUCCESS(Status))
|
||||||
{
|
{
|
||||||
DPRINT("RtlQueryRegistryValues() failed (Status %lx)\n", Status);
|
DPRINT("RtlQueryRegistryValues() failed (Status %lx)\n", Status);
|
||||||
|
if (ImagePath.Buffer)
|
||||||
ExFreePool(ImagePath.Buffer);
|
ExFreePool(ImagePath.Buffer);
|
||||||
LoadParams->Status = Status;
|
LoadParams->Status = Status;
|
||||||
(VOID)KeSetEvent(&LoadParams->Event, 0, FALSE);
|
(VOID)KeSetEvent(&LoadParams->Event, 0, FALSE);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue