- Rewritten some driver loading functions to get higher control of the driver loading and initialization process (Fixes bug #263).

- Added support for lower level filter drivers.

svn path=/trunk/; revision=8891
This commit is contained in:
Filip Navara 2004-03-27 19:41:32 +00:00
parent bf1b24c1fb
commit 014d8e9588
7 changed files with 1260 additions and 1179 deletions

View file

@ -16,7 +16,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
/* $Id: io.h,v 1.40 2004/03/21 18:58:52 navaraf Exp $
/* $Id: io.h,v 1.41 2004/03/27 19:41:31 navaraf Exp $
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
@ -32,6 +32,7 @@
#include <ddk/ntddk.h>
#include <internal/ob.h>
#include <internal/module.h>
#ifndef __USE_W32API
@ -62,7 +63,6 @@ typedef struct _DEVICE_NODE
struct _DEVICE_NODE *PrevSibling;
struct _DEVICE_NODE *NextSibling;
struct _DEVICE_NODE *Child;
PDRIVER_OBJECT DriverObject;
PDEVICE_OBJECT Pdo;
UNICODE_STRING InstancePath;
UNICODE_STRING ServiceName;
@ -266,19 +266,6 @@ IopCreateDeviceNode(PDEVICE_NODE ParentNode,
NTSTATUS
IopFreeDeviceNode(PDEVICE_NODE DeviceNode);
NTSTATUS
IopCreateDriverObject(PDRIVER_OBJECT *DriverObject,
PUNICODE_STRING ServiceName,
BOOLEAN FileSystemDriver,
PVOID DriverImageStart,
ULONG DriverImageSize);
NTSTATUS
IopInitializeDriver(PDRIVER_INITIALIZE DriverEntry,
PDEVICE_NODE DeviceNode,
BOOLEAN FileSystemDriver,
PVOID DriverImageStart,
ULONG DriverImageSize,
BOOLEAN BootDriver);
VOID
IoInitCancelHandling(VOID);
VOID
@ -388,37 +375,48 @@ PnpRootCreateDevice(
/* device.c */
NTSTATUS
IopAttachFilterDrivers(
PDEVICE_NODE DeviceNode,
BOOLEAN Lower);
NTSTATUS
IopInitializeService(
PDEVICE_NODE DeviceNode,
PUNICODE_STRING ServiceName,
PUNICODE_STRING ImagePath);
NTSTATUS FASTCALL
IopInitializeDevice(
PDEVICE_NODE DeviceNode,
PDRIVER_OBJECT DriverObject);
/* driver.c */
VOID
IopInitializeBootDrivers(
VOID);
VOID FASTCALL
IopInitializeBootDrivers(VOID);
VOID
IopInitializeSystemDrivers(
VOID);
VOID FASTCALL
IopInitializeSystemDrivers(VOID);
NTSTATUS
IopInitializeDeviceNodeService(
PDEVICE_NODE DeviceNode,
PUNICODE_STRING ServiceName,
BOOLEAN BootDriverOnly);
NTSTATUS FASTCALL
IopCreateDriverObject(
PDRIVER_OBJECT *DriverObject,
PUNICODE_STRING ServiceName,
BOOLEAN FileSystemDriver,
PVOID DriverImageStart,
ULONG DriverImageSize);
VOID
NTSTATUS FASTCALL
IopLoadServiceModule(
IN PUNICODE_STRING ServiceName,
OUT PMODULE_OBJECT *ModuleObject);
NTSTATUS FASTCALL
IopInitializeDriverModule(
IN PDEVICE_NODE DeviceNode,
IN PMODULE_OBJECT ModuleObject,
IN BOOLEAN FileSystemDriver,
OUT PDRIVER_OBJECT *DriverObject);
NTSTATUS FASTCALL
IopAttachFilterDrivers(
PDEVICE_NODE DeviceNode,
BOOLEAN Lower);
VOID FASTCALL
IopMarkLastReinitializeDriver(VOID);
VOID
VOID FASTCALL
IopReinitializeDrivers(VOID);
/* pnpmgr.c */
@ -431,7 +429,6 @@ IopInitializePnpServices(
NTSTATUS
IopInvalidateDeviceRelations(
IN PDEVICE_NODE DeviceNode,
IN DEVICE_RELATION_TYPE Type,
IN BOOLEAN BootDriver);
IN DEVICE_RELATION_TYPE Type);
#endif

View file

@ -34,11 +34,6 @@ LdrInitModuleManagement (
VOID
);
NTSTATUS
LdrInitializeBootStartDriver(IN PVOID ModuleLoadBase,
IN PCHAR FileName,
IN ULONG ModuleLength);
NTSTATUS
LdrpMapSystemDll (
HANDLE ProcessHandle,

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -1,4 +1,4 @@
/* $Id: iomgr.c,v 1.45 2003/12/31 14:20:26 hbirr Exp $
/* $Id: iomgr.c,v 1.46 2004/03/27 19:41:32 navaraf Exp $
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
@ -16,6 +16,7 @@
#include <internal/ob.h>
#include <internal/io.h>
#include <internal/pool.h>
#include <internal/module.h>
#include <rosrtl/string.h>
#define NDEBUG
@ -367,6 +368,8 @@ VOID INIT_FUNCTION
IoInit2(VOID)
{
PDEVICE_NODE DeviceNode;
PDRIVER_OBJECT DriverObject;
MODULE_OBJECT ModuleObject;
NTSTATUS Status;
KeInitializeSpinLock (&IoStatisticsLock);
@ -383,12 +386,15 @@ IoInit2(VOID)
return;
}
Status = IopInitializeDriver(RawFsDriverEntry,
ModuleObject.Base = NULL;
ModuleObject.Length = 0;
ModuleObject.EntryPoint = RawFsDriverEntry;
Status = IopInitializeDriverModule(
DeviceNode,
&ModuleObject,
TRUE,
NULL,
0,
FALSE);
&DriverObject);
if (!NT_SUCCESS(Status))
{
IopFreeDeviceNode(DeviceNode);
@ -396,13 +402,20 @@ IoInit2(VOID)
return;
}
Status = IopInitializeDevice(DeviceNode, DriverObject);
if (!NT_SUCCESS(Status))
{
IopFreeDeviceNode(DeviceNode);
CPRINT("IopInitializeDevice() failed with status (%x)\n", Status);
return;
}
/*
* Initialize PnP root releations
*/
IopInvalidateDeviceRelations(
IopRootDeviceNode,
BusRelations,
TRUE);
BusRelations);
}
/*

View file

@ -1,4 +1,4 @@
/* $Id: pnpmgr.c,v 1.27 2004/03/21 18:58:53 navaraf Exp $
/* $Id: pnpmgr.c,v 1.28 2004/03/27 19:41:32 navaraf Exp $
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
@ -1068,15 +1068,28 @@ IopActionInitChildServices(
!IopDeviceNodeHasFlag(DeviceNode, DNF_ADDED) &&
!IopDeviceNodeHasFlag(DeviceNode, DNF_STARTED))
{
Status = IopInitializeDeviceNodeService(
DeviceNode,
&DeviceNode->ServiceName,
BootDrivers);
PMODULE_OBJECT ModuleObject;
PDRIVER_OBJECT DriverObject;
Status = IopLoadServiceModule(&DeviceNode->ServiceName, &ModuleObject);
if (NT_SUCCESS(Status))
{
IopAttachFilterDrivers(DeviceNode, FALSE);
IopDeviceNodeSetFlag(DeviceNode, DNF_STARTED);
} else
Status = IopInitializeDriverModule(DeviceNode, ModuleObject, FALSE, &DriverObject);
if (NT_SUCCESS(Status))
{
/* Attach lower level filter drivers. */
IopAttachFilterDrivers(DeviceNode, TRUE);
/* Initialize the function driver for the device node */
Status = IopInitializeDevice(DeviceNode, DriverObject);
if (NT_SUCCESS(Status))
{
IopDeviceNodeSetFlag(DeviceNode, DNF_STARTED);
/* Attach upper level filter drivers. */
IopAttachFilterDrivers(DeviceNode, FALSE);
}
}
}
else
{
/*
* Don't disable when trying to load only boot drivers
@ -1138,6 +1151,7 @@ IopActionInitBootServices(
* Parameters
* DeviceNode
* Top device node to start initializing services.
*
* BootDrivers
* When set to TRUE, only drivers marked as boot start will
* be loaded. Otherwise, all drivers will be loaded.
@ -1177,15 +1191,18 @@ IopInitializePnpServices(
NTSTATUS
IopInvalidateDeviceRelations(
IN PDEVICE_NODE DeviceNode,
IN DEVICE_RELATION_TYPE Type,
IN BOOLEAN BootDriver)
IN PDEVICE_NODE DeviceNode,
IN DEVICE_RELATION_TYPE Type)
{
DEVICETREE_TRAVERSE_CONTEXT Context;
PDEVICE_RELATIONS DeviceRelations;
IO_STATUS_BLOCK IoStatusBlock;
PDEVICE_NODE ChildDeviceNode;
IO_STACK_LOCATION Stack;
BOOL BootDrivers;
OBJECT_ATTRIBUTES ObjectAttributes;
UNICODE_STRING LinkName;
HANDLE Handle;
NTSTATUS Status;
ULONG i;
@ -1276,12 +1293,39 @@ IopInvalidateDeviceRelations(
return Status;
}
/*
* Get the state of the system boot. If the \\SystemRoot link isn't
* created yet, we will assume that it's possible to load only boot
* drivers.
*/
RtlInitUnicodeString(&LinkName, L"\\SystemRoot");
InitializeObjectAttributes(
&ObjectAttributes,
&LinkName,
0,
NULL,
NULL);
Status = NtOpenFile(
&Handle,
FILE_ALL_ACCESS,
&ObjectAttributes,
&IoStatusBlock,
0,
0);
BootDrivers = NT_SUCCESS(Status) ? FALSE : TRUE;
NtClose(Handle);
/*
* Initialize services for discovered children. Only boot drivers will
* be loaded from boot driver!
*/
Status = IopInitializePnpServices(DeviceNode, BootDriver);
Status = IopInitializePnpServices(DeviceNode, BootDrivers);
if (!NT_SUCCESS(Status))
{
DPRINT("IopInitializePnpServices() failed with status (%x)\n", Status);
@ -1326,8 +1370,8 @@ PnpInit(VOID)
CPRINT("Insufficient resources\n");
KEBUGCHECK(PHASE1_INITIALIZATION_FAILED);
}
IopRootDeviceNode->Pdo->Flags |= DO_BUS_ENUMERATED_DEVICE;
IopRootDeviceNode->DriverObject = IopRootDriverObject;
PnpRootDriverEntry(IopRootDriverObject, NULL);
IopRootDriverObject->DriverExtension->AddDevice(
IopRootDriverObject,

View file

@ -1,4 +1,4 @@
/* $Id: loader.c,v 1.140 2004/03/07 11:59:10 navaraf Exp $
/* $Id: loader.c,v 1.141 2004/03/27 19:41:32 navaraf Exp $
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
@ -449,107 +449,6 @@ LdrUnloadModule(PMODULE_OBJECT ModuleObject)
}
NTSTATUS INIT_FUNCTION
LdrInitializeBootStartDriver(PVOID ModuleLoadBase,
PCHAR FileName,
ULONG ModuleLength)
{
PMODULE_OBJECT ModuleObject;
UNICODE_STRING ModuleName;
PDEVICE_NODE DeviceNode;
NTSTATUS Status;
WCHAR Buffer[MAX_PATH];
ULONG Length;
LPWSTR Start;
LPWSTR Ext;
PCHAR FileExt;
CHAR TextBuffer [256];
ULONG x, y, cx, cy;
HalQueryDisplayParameters(&x, &y, &cx, &cy);
RtlFillMemory(TextBuffer, x, ' ');
TextBuffer[x] = '\0';
HalSetDisplayParameters(0, y-1);
HalDisplayString(TextBuffer);
sprintf(TextBuffer, "Initializing %s...\n", FileName);
HalSetDisplayParameters(0, y-1);
HalDisplayString(TextBuffer);
HalSetDisplayParameters(cx, cy);
/* Split the filename into base name and extension */
FileExt = strrchr(FileName, '.');
if (FileExt != NULL)
Length = FileExt - FileName;
else
Length = strlen(FileName);
if ((FileExt != NULL) && (strcmp(FileExt, ".sym") == 0))
{
KDB_SYMBOLFILE_HOOK(ModuleLoadBase, FileName, Length);
return(STATUS_SUCCESS);
}
else if ((FileExt != NULL) && !(strcmp(FileExt, ".sys") == 0))
{
CPRINT("Ignoring non-driver file %s\n", FileName);
return STATUS_SUCCESS;
}
/* Use IopRootDeviceNode for now */
Status = IopCreateDeviceNode(IopRootDeviceNode, NULL, &DeviceNode);
if (!NT_SUCCESS(Status))
{
CPRINT("Driver load failed, status (%x)\n", Status);
return(Status);
}
RtlCreateUnicodeStringFromAsciiz(&ModuleName,
FileName);
Status = LdrProcessModule(ModuleLoadBase,
&ModuleName,
&ModuleObject);
RtlFreeUnicodeString(&ModuleName);
if (ModuleObject == NULL)
{
IopFreeDeviceNode(DeviceNode);
CPRINT("Driver load failed, status (%x)\n", Status);
return(STATUS_UNSUCCESSFUL);
}
/* Get the service name from the module name */
Start = wcsrchr(ModuleObject->BaseName.Buffer, L'\\');
if (Start == NULL)
Start = ModuleObject->BaseName.Buffer;
else
Start++;
Ext = wcsrchr(ModuleObject->BaseName.Buffer, L'.');
if (Ext != NULL)
Length = Ext - Start;
else
Length = wcslen(Start);
wcsncpy(Buffer, Start, Length);
Buffer[Length] = 0;
RtlCreateUnicodeString(&DeviceNode->ServiceName, Buffer);
Status = IopInitializeDriver(ModuleObject->EntryPoint,
DeviceNode, FALSE,
ModuleObject->Base,
ModuleObject->Length,
TRUE);
if (!NT_SUCCESS(Status))
{
IopFreeDeviceNode(DeviceNode);
CPRINT("Driver load failed, status (%x)\n", Status);
}
return(Status);
}
NTSTATUS
LdrProcessModule(PVOID ModuleLoadBase,
PUNICODE_STRING ModuleName,