svn path=/trunk/; revision=14594
IopCreateDriverObject(
PDRIVER_OBJECT *DriverObject,
PUNICODE_STRING ServiceName,
IopCreateDriverObject(
PDRIVER_OBJECT *DriverObject,
PUNICODE_STRING ServiceName,
+ ULONG CreateAttributes,
BOOLEAN FileSystemDriver,
PVOID DriverImageStart,
ULONG DriverImageSize);
BOOLEAN FileSystemDriver,
PVOID DriverImageStart,
ULONG DriverImageSize);
IopCreateDriverObject(
PDRIVER_OBJECT *DriverObject,
PUNICODE_STRING ServiceName,
IopCreateDriverObject(
PDRIVER_OBJECT *DriverObject,
PUNICODE_STRING ServiceName,
+ ULONG CreateAttributes,
BOOLEAN FileSystem,
PVOID DriverImageStart,
ULONG DriverImageSize)
BOOLEAN FileSystem,
PVOID DriverImageStart,
ULONG DriverImageSize)
InitializeObjectAttributes(
&ObjectAttributes,
&DriverName,
InitializeObjectAttributes(
&ObjectAttributes,
&DriverName,
+ CreateAttributes | OBJ_PERMANENT,
Object->DriverSize = DriverImageSize;
if (Buffer)
{
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;
}
*DriverObject = Object;
else
{
DPRINT("Module already loaded\n");
else
{
DPRINT("Module already loaded\n");
- Status = STATUS_SUCCESS;
+ Status = STATUS_IMAGE_ALREADY_LOADED;
}
RtlFreeUnicodeString(&ServiceImagePath);
}
RtlFreeUnicodeString(&ServiceImagePath);
Status = IopCreateDriverObject(
DriverObject,
ServiceName,
Status = IopCreateDriverObject(
DriverObject,
ServiceName,
FileSystemDriver,
ModuleObject->Base,
ModuleObject->Length);
FileSystemDriver,
ModuleObject->Base,
ModuleObject->Length);
/* Load and initialize the filter driver */
Status = IopLoadServiceModule(&ServiceName, &ModuleObject);
/* 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))
Status = IopInitializeDevice(DeviceNode, DriverObject);
if (!NT_SUCCESS(Status))
PDRIVER_OBJECT DriverObject;
Status = IopLoadServiceModule(&DeviceNode->ServiceName, &ModuleObject);
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. */
if (NT_SUCCESS(Status))
{
/* Attach lower level filter drivers. */
* Create root device node
*/
* 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");
if (!NT_SUCCESS(Status))
{
CPRINT("IoCreateDriverObject() failed\n");