Author: ion
Date: Sun Jul 9 04:01:31 2006
New Revision: 22962
URL:
http://svn.reactos.org/svn/reactos?rev=22962&view=rev
Log:
- Allocate Re-Init entries with a tag
- Fix IoAllocateDriverObjectExtension and IoGetDriverObjectExtension:
- They were using the wrong structure (a made up one).
- They were saving the extension where the Driver Object's base address should be.
- Memory leaks.
- Sometimes holding the lock too long.
- Created EXTENDED_DRIVER_OBJECT structure in NDK, since parts of the documented one are
hidden (much like EXTENDED_DEVICE_OBJECT).
- Fixed IopDeleteDriver to free what it should.
- Fixed IoCreateDriver to handle more failure cases.
Modified:
trunk/reactos/include/ddk/ntifs.h
trunk/reactos/include/ndk/iotypes.h
trunk/reactos/ntoskrnl/include/internal/io.h
trunk/reactos/ntoskrnl/include/internal/tag.h
trunk/reactos/ntoskrnl/io/iomgr/driver.c
Modified: trunk/reactos/include/ddk/ntifs.h
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/include/ddk/ntifs.h?rev=22…
==============================================================================
--- trunk/reactos/include/ddk/ntifs.h (original)
+++ trunk/reactos/include/ddk/ntifs.h Sun Jul 9 04:01:31 2006
@@ -1267,11 +1267,6 @@
MAPPING_PAIR Pair[1];
} GET_RETRIEVAL_DESCRIPTOR, *PGET_RETRIEVAL_DESCRIPTOR;
-typedef struct _IO_CLIENT_EXTENSION {
- struct _IO_CLIENT_EXTENSION *NextExtension;
- PVOID ClientIdentificationAddress;
-} IO_CLIENT_EXTENSION, *PIO_CLIENT_EXTENSION;
-
typedef struct _IO_COMPLETION_BASIC_INFORMATION {
LONG Depth;
} IO_COMPLETION_BASIC_INFORMATION, *PIO_COMPLETION_BASIC_INFORMATION;
Modified: trunk/reactos/include/ndk/iotypes.h
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/include/ndk/iotypes.h?rev=…
==============================================================================
--- trunk/reactos/include/ndk/iotypes.h (original)
+++ trunk/reactos/include/ndk/iotypes.h Sun Jul 9 04:01:31 2006
@@ -683,6 +683,15 @@
PVOID Context;
PDEVICE_OBJECT DeviceObject;
} IO_TIMER, *PIO_TIMER;
+
+//
+// Driver Extension
+//
+typedef struct _IO_CLIENT_EXTENSION
+{
+ struct _IO_CLIENT_EXTENSION *NextExtension;
+ PVOID ClientIdentificationAddress;
+} IO_CLIENT_EXTENSION, *PIO_CLIENT_EXTENSION;
//
// Device Node
@@ -787,14 +796,17 @@
} EXTENDED_DEVOBJ_EXTENSION, *PEXTENDED_DEVOBJ_EXTENSION;
//
-// Private Driver Extension Descriptor
-//
-typedef struct _PRIVATE_DRIVER_EXTENSIONS
-{
- struct _PRIVATE_DRIVER_EXTENSIONS *Link;
- PVOID ClientIdentificationAddress;
- CHAR Extension[1];
-} PRIVATE_DRIVER_EXTENSIONS, *PPRIVATE_DRIVER_EXTENSIONS;
+// Extended Driver Object Extension Structure
+//
+typedef struct _EXTENDED_DRIVER_EXTENSION
+{
+ struct _DRIVER_OBJECT *DriverObject;
+ PDRIVER_ADD_DEVICE AddDevice;
+ ULONG Count;
+ UNICODE_STRING ServiceKeyName;
+ PIO_CLIENT_EXTENSION ClientDriverExtension;
+ PFS_FILTER_CALLBACKS FsFilterCallbacks;
+} EXTENDED_DRIVER_EXTENSION, *PEXTENDED_DRIVER_EXTENSION;
//
// Extended I/O Stack Location Structure
Modified: trunk/reactos/ntoskrnl/include/internal/io.h
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/include/internal/…
==============================================================================
--- trunk/reactos/ntoskrnl/include/internal/io.h (original)
+++ trunk/reactos/ntoskrnl/include/internal/io.h Sun Jul 9 04:01:31 2006
@@ -85,6 +85,13 @@
#define IoGetDevObjExtension(DeviceObject) \
((PEXTENDED_DEVOBJ_EXTENSION) \
(DeviceObject->DeviceObjectExtension)) \
+
+//
+// Returns the internal Driver Object Extension
+//
+#define IoGetDrvObjExtension(DriverObject) \
+ ((PEXTENDED_DRIVER_EXTENSION) \
+ (DriverObject->DriverExtension)) \
/*
* VOID
@@ -353,6 +360,17 @@
} FS_CHANGE_NOTIFY_ENTRY, *PFS_CHANGE_NOTIFY_ENTRY;
//
+// Driver (Boot) Re-Initialization Entry
+//
+typedef struct _DRIVER_REINIT_ITEM
+{
+ LIST_ENTRY ItemEntry;
+ PDRIVER_OBJECT DriverObject;
+ PDRIVER_REINITIALIZE ReinitRoutine;
+ PVOID Context;
+} DRIVER_REINIT_ITEM, *PDRIVER_REINIT_ITEM;
+
+//
// Called on every visit of a node during a preorder-traversal of the device
// node tree.
// If the routine returns STATUS_UNSUCCESSFUL the traversal will stop and
Modified: trunk/reactos/ntoskrnl/include/internal/tag.h
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/include/internal/…
==============================================================================
--- trunk/reactos/ntoskrnl/include/internal/tag.h (original)
+++ trunk/reactos/ntoskrnl/include/internal/tag.h Sun Jul 9 04:01:31 2006
@@ -54,6 +54,7 @@
#define TAG_ERROR_LOG TAG('I', 'o', 'E', 'r')
#define TAG_EA TAG('I', 'o', 'E', 'a')
#define TAG_IO_NAME TAG('I', 'o', 'N', 'm')
+#define TAG_REINIT TAG('I', 'o', 'R', 'i')
/* formerly located in io/work.c */
#define TAG_IOWI TAG('I', 'O', 'W', 'I')
Modified: trunk/reactos/ntoskrnl/io/iomgr/driver.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/io/iomgr/driver.c…
==============================================================================
--- trunk/reactos/ntoskrnl/io/iomgr/driver.c (original)
+++ trunk/reactos/ntoskrnl/io/iomgr/driver.c Sun Jul 9 04:01:31 2006
@@ -1,11 +1,11 @@
/*
- * COPYRIGHT: See COPYING in the top level directory
- * PROJECT: ReactOS kernel
+ * PROJECT: ReactOS Kernel
+ * LICENSE: GPL - See COPYING in the top level directory
* FILE: ntoskrnl/io/driver.c
- * PURPOSE: Loading and unloading of drivers
- *
- * PROGRAMMERS: David Welch (welch(a)cwcom.net)
- * Filip Navara (xnavara(a)volny.cz)
+ * PURPOSE: Driver Object Management
+ * PROGRAMMERS: Alex Ionescu (alex.ionescu(a)reactos.org)
+ * Filip Navara (navaraf(a)reactos.org)
+ * Hervé Poussineau (hpoussin(a)reactos.org)
*/
/* INCLUDES *******************************************************************/
@@ -42,14 +42,6 @@
/* BOOLEAN ServiceRunning;*/ // needed ??
} SERVICE, *PSERVICE;
-
-typedef struct _DRIVER_REINIT_ITEM
-{
- LIST_ENTRY ItemEntry;
- PDRIVER_OBJECT DriverObject;
- PDRIVER_REINITIALIZE ReinitRoutine;
- PVOID Context;
-} DRIVER_REINIT_ITEM, *PDRIVER_REINIT_ITEM;
/* GLOBALS ********************************************************************/
@@ -135,29 +127,47 @@
return STATUS_INVALID_DEVICE_REQUEST;
}
-VOID STDCALL
-IopDeleteDriver(PVOID ObjectBody)
-{
- PDRIVER_OBJECT Object = ObjectBody;
- KIRQL OldIrql;
- PPRIVATE_DRIVER_EXTENSIONS DriverExtension, NextDriverExtension;
-
- DPRINT("IopDeleteDriver(ObjectBody 0x%p)\n", ObjectBody);
-
- ExFreePool(Object->DriverExtension);
- ExFreePool(Object->DriverName.Buffer);
-
- OldIrql = KeRaiseIrqlToDpcLevel();
-
- for (DriverExtension = Object->DriverSection;
- DriverExtension != NULL;
- DriverExtension = NextDriverExtension)
- {
- NextDriverExtension = DriverExtension->Link;
- ExFreePoolWithTag(DriverExtension, TAG_DRIVER_EXTENSION);
- }
-
- KfLowerIrql(OldIrql);
+VOID
+NTAPI
+IopDeleteDriver(IN PVOID ObjectBody)
+{
+ PDRIVER_OBJECT DriverObject = ObjectBody;
+ PIO_CLIENT_EXTENSION DriverExtension, NextDriverExtension;
+ PAGED_CODE();
+
+ /* Get the extension and loop them */
+ DriverExtension = IoGetDrvObjExtension(DriverObject)->
+ ClientDriverExtension;
+ while (DriverExtension)
+ {
+ /* Get the next one */
+ NextDriverExtension = DriverExtension->NextExtension;
+ ExFreePoolWithTag(DriverExtension, TAG_DRIVER_EXTENSION);
+
+ /* Move on */
+ DriverExtension = NextDriverExtension;
+ }
+
+ /* Check if the driver image is still loaded */
+ if (DriverObject->DriverSection)
+ {
+ /* Unload it */
+ LdrpUnloadImage(DriverObject->DriverSection);
+ }
+
+ /* Check if it has a name */
+ if (DriverObject->DriverName.Buffer)
+ {
+ /* Free it */
+ ExFreePool(DriverObject->DriverName.Buffer);
+ }
+
+ /* Check if it has a service key name */
+ if (DriverObject->DriverExtension->ServiceKeyName.Buffer)
+ {
+ /* Free it */
+ ExFreePool(DriverObject->DriverExtension->ServiceKeyName.Buffer);
+ }
}
NTSTATUS FASTCALL
@@ -289,22 +299,11 @@
return Status;
}
- Status = ObInsertObject(Object,
- NULL,
- FILE_ALL_ACCESS,
- 0,
- NULL,
- NULL);
- if (!NT_SUCCESS(Status))
- {
- return Status;
- }
-
/* Create driver extension */
Object->DriverExtension = (PDRIVER_EXTENSION)
ExAllocatePoolWithTag(
NonPagedPool,
- sizeof(DRIVER_EXTENSION),
+ sizeof(EXTENDED_DRIVER_EXTENSION),
TAG_DRIVER_EXTENSION);
if (Object->DriverExtension == NULL)
@@ -312,7 +311,7 @@
return STATUS_NO_MEMORY;
}
- RtlZeroMemory(Object->DriverExtension, sizeof(DRIVER_EXTENSION));
+ RtlZeroMemory(Object->DriverExtension, sizeof(EXTENDED_DRIVER_EXTENSION));
Object->Type = IO_TYPE_DRIVER;
@@ -336,6 +335,18 @@
else
ExFreePool(Buffer);
}
+
+
+ Status = ObInsertObject(Object,
+ NULL,
+ FILE_ALL_ACCESS,
+ 0,
+ NULL,
+ NULL);
+ if (!NT_SUCCESS(Status))
+ {
+ return Status;
+ }
*DriverObject = Object;
@@ -1730,20 +1741,17 @@
/* PUBLIC FUNCTIONS ***********************************************************/
-
/*
* @implemented
*/
NTSTATUS
-STDCALL
-IoCreateDriver (
- IN PUNICODE_STRING DriverName, OPTIONAL
- IN PDRIVER_INITIALIZE InitializationFunction
- )
+NTAPI
+IoCreateDriver(IN PUNICODE_STRING DriverName OPTIONAL,
+ IN PDRIVER_INITIALIZE InitializationFunction)
{
WCHAR NameBuffer[100];
USHORT NameLength;
- UNICODE_STRING LocalDriverName; /* To reduce code if no name given */
+ UNICODE_STRING LocalDriverName;
NTSTATUS Status;
OBJECT_ATTRIBUTES ObjectAttributes;
ULONG ObjectSize;
@@ -1753,22 +1761,22 @@
ULONG i;
/* First, create a unique name for the driver if we don't have one */
- if (!DriverName) {
-
+ if (!DriverName)
+ {
/* Create a random name and set up the string*/
NameLength = swprintf(NameBuffer, L"\\Driver\\%08u", KeTickCount);
LocalDriverName.Length = NameLength * sizeof(WCHAR);
LocalDriverName.MaximumLength = LocalDriverName.Length + sizeof(UNICODE_NULL);
LocalDriverName.Buffer = NameBuffer;
-
- } else {
-
+ }
+ else
+ {
/* So we can avoid another code path, use a local var */
LocalDriverName = *DriverName;
}
/* Initialize the Attributes */
- ObjectSize = sizeof(DRIVER_OBJECT) + sizeof(DRIVER_EXTENSION);
+ ObjectSize = sizeof(DRIVER_OBJECT) + sizeof(EXTENDED_DRIVER_EXTENSION);
InitializeObjectAttributes(&ObjectAttributes,
&LocalDriverName,
OBJ_PERMANENT | OBJ_CASE_INSENSITIVE,
@@ -1785,8 +1793,6 @@
0,
0,
(PVOID*)&DriverObject);
-
- /* Return on failure */
if (!NT_SUCCESS(Status)) return Status;
/* Set up the Object */
@@ -1798,22 +1804,41 @@
DriverObject->DriverExtension->DriverObject = DriverObject;
DriverObject->DriverInit = InitializationFunction;
- /* Invalidate all Major Functions */
+ /* Loop all Major Functions */
for (i = 0; i <= IRP_MJ_MAXIMUM_FUNCTION; i++)
{
+ /* Invalidate each function */
DriverObject->MajorFunction[i] = IopInvalidDeviceRequest;
}
- /* Set up the Service Key Name */
- ServiceKeyName.Buffer = ExAllocatePool(PagedPool, LocalDriverName.Length +
sizeof(WCHAR));
+ /* Set up the service key name buffer */
+ ServiceKeyName.Buffer = ExAllocatePoolWithTag(PagedPool,
+ LocalDriverName.Length +
+ sizeof(WCHAR),
+ TAG_IO);
+ if (!ServiceKeyName.Buffer)
+ {
+ /* Fail */
+ ObMakeTemporaryObject(DriverObject);
+ ObDereferenceObject(DriverObject);
+ return STATUS_INSUFFICIENT_RESOURCES;
+ }
+
+ /* Fill out the key data and copy the buffer */
ServiceKeyName.Length = LocalDriverName.Length;
ServiceKeyName.MaximumLength = LocalDriverName.MaximumLength;
- RtlMoveMemory(ServiceKeyName.Buffer, LocalDriverName.Buffer,
LocalDriverName.Length);
- ServiceKeyName.Buffer[ServiceKeyName.Length / sizeof(WCHAR)] = L'\0';
+ RtlMoveMemory(ServiceKeyName.Buffer,
+ LocalDriverName.Buffer,
+ LocalDriverName.Length);
+
+ /* Null-terminate it and set it */
+ ServiceKeyName.Buffer[ServiceKeyName.Length / sizeof(WCHAR)] = UNICODE_NULL;
DriverObject->DriverExtension->ServiceKeyName = ServiceKeyName;
/* Also store it in the Driver Object. This is a bit of a hack. */
- RtlMoveMemory(&DriverObject->DriverName, &ServiceKeyName,
sizeof(UNICODE_STRING));
+ RtlMoveMemory(&DriverObject->DriverName,
+ &ServiceKeyName,
+ sizeof(UNICODE_STRING));
/* Add the Object and get its handle */
Status = ObInsertObject(DriverObject,
@@ -1822,8 +1847,6 @@
0,
NULL,
&hDriver);
-
- /* Return on Failure */
if (!NT_SUCCESS(Status)) return Status;
/* Now reference it */
@@ -1833,12 +1856,21 @@
KernelMode,
(PVOID*)&DriverObject,
NULL);
+ if (!NT_SUCCESS(Status))
+ {
+ /* Fail */
+ ObMakeTemporaryObject(DriverObject);
+ ObDereferenceObject(DriverObject);
+ return Status;
+ }
+
+ /* Close the extra handle */
ZwClose(hDriver);
/* Finally, call its init function */
Status = (*InitializationFunction)(DriverObject, NULL);
-
- if (!NT_SUCCESS(Status)) {
+ if (!NT_SUCCESS(Status))
+ {
/* If it didn't work, then kill the object */
ObMakeTemporaryObject(DriverObject);
ObDereferenceObject(DriverObject);
@@ -1852,15 +1884,186 @@
* @implemented
*/
VOID
-STDCALL
-IoDeleteDriver (
- IN PDRIVER_OBJECT DriverObject
- )
-{
- /* Simply derefence the Object */
+NTAPI
+IoDeleteDriver(IN PDRIVER_OBJECT DriverObject)
+{
+ /* Simply derefence the Object */
ObDereferenceObject(DriverObject);
}
+/*
+ * @implemented
+ */
+VOID
+NTAPI
+IoRegisterBootDriverReinitialization(IN PDRIVER_OBJECT DriverObject,
+ IN PDRIVER_REINITIALIZE ReinitRoutine,
+ IN PVOID Context)
+{
+ PDRIVER_REINIT_ITEM ReinitItem;
+
+ /* Allocate the entry */
+ ReinitItem = ExAllocatePoolWithTag(NonPagedPool,
+ sizeof(DRIVER_REINIT_ITEM),
+ TAG_REINIT);
+ if (!ReinitItem) return;
+
+ /* Fill it out */
+ ReinitItem->DriverObject = DriverObject;
+ ReinitItem->ReinitRoutine = ReinitRoutine;
+ ReinitItem->Context = Context;
+
+ /* Set the Driver Object flag and insert the entry into the list */
+ DriverObject->Flags |= DRVO_BOOTREINIT_REGISTERED;
+ ExInterlockedInsertTailList(&DriverBootReinitListHead,
+ &ReinitItem->ItemEntry,
+ &DriverBootReinitListLock);
+}
+
+/*
+ * @implemented
+ */
+VOID
+NTAPI
+IoRegisterDriverReinitialization(IN PDRIVER_OBJECT DriverObject,
+ IN PDRIVER_REINITIALIZE ReinitRoutine,
+ IN PVOID Context)
+{
+ PDRIVER_REINIT_ITEM ReinitItem;
+
+ /* Allocate the entry */
+ ReinitItem = ExAllocatePoolWithTag(NonPagedPool,
+ sizeof(DRIVER_REINIT_ITEM),
+ TAG_REINIT);
+ if (!ReinitItem) return;
+
+ /* Fill it out */
+ ReinitItem->DriverObject = DriverObject;
+ ReinitItem->ReinitRoutine = ReinitRoutine;
+ ReinitItem->Context = Context;
+
+ /* Set the Driver Object flag and insert the entry into the list */
+ DriverObject->Flags |= DRVO_REINIT_REGISTERED;
+ ExInterlockedInsertTailList(&DriverReinitListHead,
+ &ReinitItem->ItemEntry,
+ &DriverReinitListLock);
+}
+
+/*
+ * @implemented
+ */
+NTSTATUS
+NTAPI
+IoAllocateDriverObjectExtension(IN PDRIVER_OBJECT DriverObject,
+ IN PVOID ClientIdentificationAddress,
+ IN ULONG DriverObjectExtensionSize,
+ OUT PVOID *DriverObjectExtension)
+{
+ KIRQL OldIrql;
+ PIO_CLIENT_EXTENSION DriverExtensions, NewDriverExtension;
+ BOOLEAN Inserted = FALSE;
+
+ /* Assume failure */
+ *DriverObjectExtension = NULL;
+
+ /* Allocate the extension */
+ NewDriverExtension = ExAllocatePoolWithTag(NonPagedPool,
+ sizeof(IO_CLIENT_EXTENSION) +
+ DriverObjectExtensionSize,
+ TAG_DRIVER_EXTENSION);
+ if (!NewDriverExtension) return STATUS_INSUFFICIENT_RESOURCES;
+
+ /* Clear the extension for teh caller */
+ RtlZeroMemory(NewDriverExtension,
+ sizeof(IO_CLIENT_EXTENSION) + DriverObjectExtensionSize);
+
+ /* Acqure lock */
+ OldIrql = KeRaiseIrqlToDpcLevel();
+
+ /* Fill out the extension */
+ NewDriverExtension->ClientIdentificationAddress = ClientIdentificationAddress;
+
+ /* Loop the current extensions */
+ DriverExtensions = IoGetDrvObjExtension(DriverObject)->
+ ClientDriverExtension;
+ while (DriverExtensions)
+ {
+ /* Check if the identifier matches */
+ if (DriverExtensions->ClientIdentificationAddress ==
+ ClientIdentificationAddress)
+ {
+ /* We have a collision, break out */
+ break;
+ }
+
+ /* Go to the next one */
+ DriverExtensions = DriverExtensions->NextExtension;
+ }
+
+ /* Check if we didn't collide */
+ if (!DriverExtensions)
+ {
+ /* Link this one in */
+ NewDriverExtension->NextExtension =
+ IoGetDrvObjExtension(DriverObject)->ClientDriverExtension;
+ IoGetDrvObjExtension(DriverObject)->ClientDriverExtension =
+ NewDriverExtension;
+ Inserted = TRUE;
+ }
+
+ /* Release the lock */
+ KfLowerIrql(OldIrql);
+
+ /* Check if insertion failed */
+ if (!Inserted)
+ {
+ /* Free the entry and fail */
+ ExFreePool(NewDriverExtension);
+ return STATUS_OBJECT_NAME_COLLISION;
+ }
+
+ /* Otherwise, return the pointer */
+ *DriverObjectExtension = NewDriverExtension + 1;
+ return STATUS_SUCCESS;
+}
+
+/*
+ * @implemented
+ */
+PVOID
+NTAPI
+IoGetDriverObjectExtension(IN PDRIVER_OBJECT DriverObject,
+ IN PVOID ClientIdentificationAddress)
+{
+ KIRQL OldIrql;
+ PIO_CLIENT_EXTENSION DriverExtensions;
+
+ /* Acquire lock */
+ OldIrql = KeRaiseIrqlToDpcLevel();
+
+ /* Loop the list until we find the right one */
+ DriverExtensions = IoGetDrvObjExtension(DriverObject)->ClientDriverExtension;
+ while (DriverExtensions)
+ {
+ /* Check for a match */
+ if (DriverExtensions->ClientIdentificationAddress ==
+ ClientIdentificationAddress)
+ {
+ /* Break out */
+ break;
+ }
+
+ /* Keep looping */
+ DriverExtensions = DriverExtensions->NextExtension;
+ }
+
+ /* Release lock */
+ KfLowerIrql(OldIrql);
+
+ /* Return nothing or the extension */
+ if (!DriverExtensions) return NULL;
+ return DriverExtensions + 1;
+}
/*
* NtLoadDriver
@@ -1877,7 +2080,6 @@
* Status
* implemented
*/
-
NTSTATUS STDCALL
NtLoadDriver(IN PUNICODE_STRING DriverServiceName)
{
@@ -2079,151 +2281,4 @@
return IopUnloadDriver(DriverServiceName, FALSE);
}
-/*
- * IoRegisterDriverReinitialization
- *
- * Status
- * @implemented
- */
-
-VOID STDCALL
-IoRegisterDriverReinitialization(
- PDRIVER_OBJECT DriverObject,
- PDRIVER_REINITIALIZE ReinitRoutine,
- PVOID Context)
-{
- PDRIVER_REINIT_ITEM ReinitItem;
-
- ReinitItem = ExAllocatePool(NonPagedPool, sizeof(DRIVER_REINIT_ITEM));
- if (ReinitItem == NULL)
- return;
-
- ReinitItem->DriverObject = DriverObject;
- ReinitItem->ReinitRoutine = ReinitRoutine;
- ReinitItem->Context = Context;
-
- DriverObject->Flags |= DRVO_REINIT_REGISTERED;
-
- ExInterlockedInsertTailList(
- &DriverReinitListHead,
- &ReinitItem->ItemEntry,
- &DriverReinitListLock);
-}
-
-/*
- * @implemented
- */
-VOID
-STDCALL
-IoRegisterBootDriverReinitialization(
- IN PDRIVER_OBJECT DriverObject,
- IN PDRIVER_REINITIALIZE DriverReinitializationRoutine,
- IN PVOID Context
- )
-{
- PDRIVER_REINIT_ITEM ReinitItem;
-
- ReinitItem = ExAllocatePool(NonPagedPool, sizeof(DRIVER_REINIT_ITEM));
- if (ReinitItem == NULL)
- return;
-
- ReinitItem->DriverObject = DriverObject;
- ReinitItem->ReinitRoutine = DriverReinitializationRoutine;
- ReinitItem->Context = Context;
-
- DriverObject->Flags |= DRVO_BOOTREINIT_REGISTERED;
-
- ExInterlockedInsertTailList(
- &DriverBootReinitListHead,
- &ReinitItem->ItemEntry,
- &DriverBootReinitListLock);
-}
-
-/*
- * IoAllocateDriverObjectExtension
- *
- * Status
- * @implemented
- */
-
-NTSTATUS STDCALL
-IoAllocateDriverObjectExtension(
- PDRIVER_OBJECT DriverObject,
- PVOID ClientIdentificationAddress,
- ULONG DriverObjectExtensionSize,
- PVOID *DriverObjectExtension)
-{
- KIRQL OldIrql;
- PPRIVATE_DRIVER_EXTENSIONS DriverExtensions;
- PPRIVATE_DRIVER_EXTENSIONS NewDriverExtension;
-
- NewDriverExtension = ExAllocatePoolWithTag(
- NonPagedPool,
- sizeof(PRIVATE_DRIVER_EXTENSIONS) - sizeof(CHAR) +
- DriverObjectExtensionSize,
- TAG_DRIVER_EXTENSION);
-
- if (NewDriverExtension == NULL)
- {
- return STATUS_INSUFFICIENT_RESOURCES;
- }
-
- OldIrql = KeRaiseIrqlToDpcLevel();
-
- NewDriverExtension->Link = DriverObject->DriverSection;
- NewDriverExtension->ClientIdentificationAddress = ClientIdentificationAddress;
-
- for (DriverExtensions = DriverObject->DriverSection;
- DriverExtensions != NULL;
- DriverExtensions = DriverExtensions->Link)
- {
- if (DriverExtensions->ClientIdentificationAddress ==
- ClientIdentificationAddress)
- {
- KfLowerIrql(OldIrql);
- return STATUS_OBJECT_NAME_COLLISION;
- }
- }
-
- DriverObject->DriverSection = NewDriverExtension;
-
- KfLowerIrql(OldIrql);
-
- *DriverObjectExtension = &NewDriverExtension->Extension;
-
- return STATUS_SUCCESS;
-}
-
-/*
- * IoGetDriverObjectExtension
- *
- * Status
- * @implemented
- */
-
-PVOID STDCALL
-IoGetDriverObjectExtension(
- PDRIVER_OBJECT DriverObject,
- PVOID ClientIdentificationAddress)
-{
- KIRQL OldIrql;
- PPRIVATE_DRIVER_EXTENSIONS DriverExtensions;
-
- OldIrql = KeRaiseIrqlToDpcLevel();
-
- for (DriverExtensions = DriverObject->DriverSection;
- DriverExtensions != NULL &&
- DriverExtensions->ClientIdentificationAddress !=
- ClientIdentificationAddress;
- DriverExtensions = DriverExtensions->Link)
- ;
-
- KfLowerIrql(OldIrql);
-
- if (DriverExtensions == NULL)
- return NULL;
-
- return &DriverExtensions->Extension;
-}
-
/* EOF */