Don't call DriverEntry more than once. Fix suggested by Filip Navara.

svn path=/trunk/; revision=14594
This commit is contained in:
Hervé Poussineau 2005-04-11 22:29:31 +00:00
parent 9a3b51ea9a
commit 40c9a57fa2
3 changed files with 51 additions and 15 deletions

View file

@ -478,6 +478,7 @@ NTSTATUS FASTCALL
IopCreateDriverObject(
PDRIVER_OBJECT *DriverObject,
PUNICODE_STRING ServiceName,
ULONG CreateAttributes,
BOOLEAN FileSystemDriver,
PVOID DriverImageStart,
ULONG DriverImageSize);

View file

@ -199,6 +199,7 @@ NTSTATUS FASTCALL
IopCreateDriverObject(
PDRIVER_OBJECT *DriverObject,
PUNICODE_STRING ServiceName,
ULONG CreateAttributes,
BOOLEAN FileSystem,
PVOID DriverImageStart,
ULONG DriverImageSize)
@ -240,7 +241,7 @@ IopCreateDriverObject(
InitializeObjectAttributes(
&ObjectAttributes,
&DriverName,
OBJ_PERMANENT,
CreateAttributes | OBJ_PERMANENT,
NULL,
NULL);
@ -265,9 +266,14 @@ IopCreateDriverObject(
Object->DriverSize = DriverImageSize;
if (Buffer)
{
Object->DriverName.Buffer = Buffer;
Object->DriverName.Length = Object->DriverName.MaximumLength = DriverName.Length;
RtlCopyMemory(Object->DriverName.Buffer, DriverName.Buffer, DriverName.Length);
if (!Object->DriverName.Buffer)
{
Object->DriverName.Buffer = Buffer;
Object->DriverName.Length = Object->DriverName.MaximumLength = DriverName.Length;
RtlCopyMemory(Object->DriverName.Buffer, DriverName.Buffer, DriverName.Length);
}
else
ExFreePool(Buffer);
}
*DriverObject = Object;
@ -479,7 +485,7 @@ IopLoadServiceModule(
else
{
DPRINT("Module already loaded\n");
Status = STATUS_SUCCESS;
Status = STATUS_IMAGE_ALREADY_LOADED;
}
RtlFreeUnicodeString(&ServiceImagePath);
@ -538,6 +544,7 @@ IopInitializeDriverModule(
Status = IopCreateDriverObject(
DriverObject,
ServiceName,
0,
FileSystemDriver,
ModuleObject->Base,
ModuleObject->Length);
@ -614,13 +621,29 @@ IopAttachFilterDriversCallback(
/* Load and initialize the filter driver */
Status = IopLoadServiceModule(&ServiceName, &ModuleObject);
if (!NT_SUCCESS(Status))
continue;
if (Status != STATUS_IMAGE_ALREADY_LOADED)
{
if (!NT_SUCCESS(Status))
continue;
Status = IopInitializeDriverModule(DeviceNode, ModuleObject, &ServiceName,
FALSE, &DriverObject);
if (!NT_SUCCESS(Status))
continue;
Status = IopInitializeDriverModule(DeviceNode, ModuleObject, &ServiceName,
FALSE, &DriverObject);
if (!NT_SUCCESS(Status))
continue;
}
else
{
/* get existing DriverObject pointer */
Status = IopCreateDriverObject(
&DriverObject,
&ServiceName,
OBJ_OPENIF,
FALSE,
ModuleObject->Base,
ModuleObject->Length);
if (!NT_SUCCESS(Status))
continue;
}
Status = IopInitializeDevice(DeviceNode, DriverObject);
if (!NT_SUCCESS(Status))

View file

@ -1499,10 +1499,22 @@ IopActionInitChildServices(
PDRIVER_OBJECT DriverObject;
Status = IopLoadServiceModule(&DeviceNode->ServiceName, &ModuleObject);
if (NT_SUCCESS(Status))
if (NT_SUCCESS(Status) || Status == STATUS_IMAGE_ALREADY_LOADED)
{
Status = IopInitializeDriverModule(DeviceNode, ModuleObject,
&DeviceNode->ServiceName, FALSE, &DriverObject);
if (Status != STATUS_IMAGE_ALREADY_LOADED)
Status = IopInitializeDriverModule(DeviceNode, ModuleObject,
&DeviceNode->ServiceName, FALSE, &DriverObject);
else
{
/* get existing DriverObject pointer */
Status = IopCreateDriverObject(
&DriverObject,
&DeviceNode->ServiceName,
OBJ_OPENIF,
FALSE,
ModuleObject->Base,
ModuleObject->Length);
}
if (NT_SUCCESS(Status))
{
/* Attach lower level filter drivers. */
@ -1787,7 +1799,7 @@ PnpInit(VOID)
* Create root device node
*/
Status = IopCreateDriverObject(&IopRootDriverObject, NULL, FALSE, NULL, 0);
Status = IopCreateDriverObject(&IopRootDriverObject, NULL, 0, FALSE, NULL, 0);
if (!NT_SUCCESS(Status))
{
CPRINT("IoCreateDriverObject() failed\n");