/* GLOBALS ******************************************************************/
-static KSPIN_LOCK FileSystemListLock;
+static ERESOURCE FileSystemListLock;
static LIST_ENTRY FileSystemListHead;
static KSPIN_LOCK FsChangeNotifyListLock;
IoInitFileSystemImplementation(VOID)
{
InitializeListHead(&FileSystemListHead);
- KeInitializeSpinLock(&FileSystemListLock);
+ ExInitializeResourceLite(&FileSystemListLock);
InitializeListHead(&FsChangeNotifyListHead);
KeInitializeSpinLock(&FsChangeNotifyListLock);
VOID
IoShutdownRegisteredFileSystems(VOID)
{
- KIRQL oldlvl;
- PLIST_ENTRY current_entry;
- FILE_SYSTEM_OBJECT* current;
- PIRP Irp;
- KEVENT Event;
- IO_STATUS_BLOCK IoStatusBlock;
- NTSTATUS Status;
+ PLIST_ENTRY current_entry;
+ FILE_SYSTEM_OBJECT* current;
+ PIRP Irp;
+ KEVENT Event;
+ IO_STATUS_BLOCK IoStatusBlock;
+ NTSTATUS Status;
- DPRINT("IoShutdownRegisteredFileSystems()\n");
+ DPRINT("IoShutdownRegisteredFileSystems()\n");
- KeAcquireSpinLock(&FileSystemListLock,&oldlvl);
- KeInitializeEvent(&Event,NotificationEvent,FALSE);
+ ExAcquireResourceSharedLite(&FileSystemListLock,TRUE);
+ KeInitializeEvent(&Event,
+ NotificationEvent,
+ FALSE);
- current_entry = FileSystemListHead.Flink;
- while (current_entry!=(&FileSystemListHead))
- {
- current = CONTAINING_RECORD(current_entry,FILE_SYSTEM_OBJECT,Entry);
-
- /* send IRP_MJ_SHUTDOWN */
- Irp = IoBuildSynchronousFsdRequest(IRP_MJ_SHUTDOWN,
- current->DeviceObject,
- NULL,
- 0,
- 0,
- &Event,
- &IoStatusBlock);
-
- Status = IoCallDriver(current->DeviceObject,Irp);
- if (Status==STATUS_PENDING)
- {
- KeWaitForSingleObject(&Event,Executive,KernelMode,FALSE,NULL);
- }
-
- current_entry = current_entry->Flink;
- }
+ current_entry = FileSystemListHead.Flink;
+ while (current_entry!=(&FileSystemListHead))
+ {
+ current = CONTAINING_RECORD(current_entry,FILE_SYSTEM_OBJECT,Entry);
+
+ /* send IRP_MJ_SHUTDOWN */
+ Irp = IoBuildSynchronousFsdRequest(IRP_MJ_SHUTDOWN,
+ current->DeviceObject,
+ NULL,
+ 0,
+ 0,
+ &Event,
+ &IoStatusBlock);
+
+ Status = IoCallDriver(current->DeviceObject,Irp);
+ if (Status == STATUS_PENDING)
+ {
+ KeWaitForSingleObject(&Event,
+ Executive,
+ KernelMode,
+ FALSE,
+ NULL);
+ }
- KeReleaseSpinLock(&FileSystemListLock,oldlvl);
+ current_entry = current_entry->Flink;
+ }
+
+ ExReleaseResourceLite(&FileSystemListLock);
}
{
IO_STATUS_BLOCK IoStatusBlock;
PIO_STACK_LOCATION StackPtr;
- PKEVENT Event;
+ KEVENT Event;
PIRP Irp;
NTSTATUS Status;
DeviceObject,DeviceToMount);
assert_irql(PASSIVE_LEVEL);
- Event = ExAllocatePool(NonPagedPool, sizeof(KEVENT));
- if (Event == NULL)
- {
- return(STATUS_INSUFFICIENT_RESOURCES);
- }
- KeInitializeEvent(Event, NotificationEvent, FALSE);
+ KeInitializeEvent(&Event, NotificationEvent, FALSE);
Irp = IoAllocateIrp(DeviceObject->StackSize, TRUE);
if (Irp==NULL)
{
- ExFreePool(Event);
return(STATUS_INSUFFICIENT_RESOURCES);
}
Irp->UserIosb = &IoStatusBlock;
DPRINT("Irp->UserIosb %x\n", Irp->UserIosb);
- Irp->UserEvent = Event;
+ Irp->UserEvent = &Event;
Irp->Tail.Overlay.Thread = PsGetCurrentThread();
StackPtr = IoGetNextIrpStackLocation(Irp);
Status = IoCallDriver(DeviceObject,Irp);
if (Status==STATUS_PENDING)
{
- KeWaitForSingleObject(Event,Executive,KernelMode,FALSE,NULL);
+ KeWaitForSingleObject(&Event,Executive,KernelMode,FALSE,NULL);
Status = IoStatusBlock.Status;
}
- ExFreePool(Event);
-
return(Status);
}
{
IO_STATUS_BLOCK IoStatusBlock;
PIO_STACK_LOCATION StackPtr;
- PKEVENT Event;
+ KEVENT Event;
PIRP Irp;
NTSTATUS Status;
DPRINT("IopLoadFileSystem(DeviceObject %x)\n", DeviceObject);
assert_irql(PASSIVE_LEVEL);
- Event = ExAllocatePool(NonPagedPool, sizeof(KEVENT));
- if (Event == NULL)
- {
- return(STATUS_INSUFFICIENT_RESOURCES);
- }
- KeInitializeEvent(Event, NotificationEvent, FALSE);
+ KeInitializeEvent(&Event, NotificationEvent, FALSE);
Irp = IoAllocateIrp(DeviceObject->StackSize, TRUE);
if (Irp==NULL)
{
- ExFreePool(Event);
return(STATUS_INSUFFICIENT_RESOURCES);
}
Irp->UserIosb = &IoStatusBlock;
DPRINT("Irp->UserIosb %x\n", Irp->UserIosb);
- Irp->UserEvent = Event;
+ Irp->UserEvent = &Event;
Irp->Tail.Overlay.Thread = PsGetCurrentThread();
StackPtr = IoGetNextIrpStackLocation(Irp);
Status = IoCallDriver(DeviceObject,Irp);
if (Status==STATUS_PENDING)
{
- KeWaitForSingleObject(Event,Executive,KernelMode,FALSE,NULL);
+ KeWaitForSingleObject(&Event,Executive,KernelMode,FALSE,NULL);
Status = IoStatusBlock.Status;
}
- ExFreePool(Event);
-
return(Status);
}
* RETURNS: Status
*/
{
- KIRQL oldlvl;
PLIST_ENTRY current_entry;
FILE_SYSTEM_OBJECT* current;
NTSTATUS Status;
DEVICE_TYPE MatchingDeviceType;
+ PDEVICE_OBJECT DevObject;
assert_irql(PASSIVE_LEVEL);
return(STATUS_UNRECOGNIZED_VOLUME);
}
- KeAcquireSpinLock(&FileSystemListLock,&oldlvl);
+ ExAcquireResourceSharedLite(&FileSystemListLock,TRUE);
current_entry = FileSystemListHead.Flink;
while (current_entry!=(&FileSystemListHead))
{
current_entry = current_entry->Flink;
continue;
}
- KeReleaseSpinLock(&FileSystemListLock,oldlvl);
Status = IopMountFileSystem(current->DeviceObject,
DeviceObject);
- KeAcquireSpinLock(&FileSystemListLock,&oldlvl);
switch (Status)
{
case STATUS_FS_DRIVER_REQUIRED:
- KeReleaseSpinLock(&FileSystemListLock,oldlvl);
- Status = IopLoadFileSystem(current->DeviceObject);
+ DevObject = current->DeviceObject;
+ ExReleaseResourceLite(&FileSystemListLock);
+ Status = IopLoadFileSystem(DevObject);
if (!NT_SUCCESS(Status))
{
- return(Status);
+ return(Status);
}
- KeAcquireSpinLock(&FileSystemListLock,&oldlvl);
+ ExAcquireResourceSharedLite(&FileSystemListLock,TRUE);
current_entry = FileSystemListHead.Flink;
continue;
case STATUS_SUCCESS:
DeviceObject->Vpb->Flags = DeviceObject->Vpb->Flags |
VPB_MOUNTED;
- KeReleaseSpinLock(&FileSystemListLock,oldlvl);
+ ExReleaseResourceLite(&FileSystemListLock);
return(STATUS_SUCCESS);
case STATUS_UNRECOGNIZED_VOLUME:
current_entry = current_entry->Flink;
}
}
- KeReleaseSpinLock(&FileSystemListLock,oldlvl);
+ ExReleaseResourceLite(&FileSystemListLock);
return(STATUS_UNRECOGNIZED_VOLUME);
}
{
IO_STATUS_BLOCK IoStatusBlock;
PIO_STACK_LOCATION StackPtr;
- PKEVENT Event;
+ KEVENT Event;
PIRP Irp;
NTSTATUS Status;
if (DeviceObject->Vpb->Flags & VPB_MOUNTED)
{
/* Issue verify request to the FSD */
- Event = ExAllocatePool(NonPagedPool,
- sizeof(KEVENT));
- if (Event == NULL)
- return(STATUS_INSUFFICIENT_RESOURCES);
- KeInitializeEvent(Event,
+ KeInitializeEvent(&Event,
NotificationEvent,
FALSE);
Irp = IoAllocateIrp(DeviceObject->StackSize, TRUE);
if (Irp==NULL)
{
- ExFreePool(Event);
return(STATUS_INSUFFICIENT_RESOURCES);
}
Irp->UserIosb = &IoStatusBlock;
- Irp->UserEvent = Event;
+ Irp->UserEvent = &Event;
Irp->Tail.Overlay.Thread = PsGetCurrentThread();
StackPtr = IoGetNextIrpStackLocation(Irp);
Irp);
if (Status==STATUS_PENDING)
{
- KeWaitForSingleObject(Event,Executive,KernelMode,FALSE,NULL);
+ KeWaitForSingleObject(&Event,Executive,KernelMode,FALSE,NULL);
Status = IoStatusBlock.Status;
}
- ExFreePool(Event);
if (NT_SUCCESS(Status))
{
assert(Fs!=NULL);
Fs->DeviceObject = DeviceObject;
- ExInterlockedInsertTailList(&FileSystemListHead,
- &Fs->Entry,
- &FileSystemListLock);
+ ExAcquireResourceExclusiveLite(&FileSystemListLock, TRUE);
+
+ InsertTailList(&FileSystemListHead,
+ &Fs->Entry);
+
+ ExReleaseResourceLite(&FileSystemListLock);
+
IopNotifyFileSystemChange(DeviceObject,
TRUE);
}
VOID STDCALL
IoUnregisterFileSystem(IN PDEVICE_OBJECT DeviceObject)
{
- KIRQL oldlvl;
PLIST_ENTRY current_entry;
PFILE_SYSTEM_OBJECT current;
DPRINT("IoUnregisterFileSystem(DeviceObject %x)\n",DeviceObject);
- KeAcquireSpinLock(&FileSystemListLock,&oldlvl);
+ ExAcquireResourceExclusiveLite(&FileSystemListLock, TRUE);
current_entry = FileSystemListHead.Flink;
while (current_entry!=(&FileSystemListHead))
{
{
RemoveEntryList(current_entry);
ExFreePool(current);
- KeReleaseSpinLock(&FileSystemListLock,oldlvl);
+ ExReleaseResourceLite(&FileSystemListLock);
IopNotifyFileSystemChange(DeviceObject, FALSE);
return;
}
current_entry = current_entry->Flink;
}
- KeReleaseSpinLock(&FileSystemListLock,oldlvl);
+ ExReleaseResourceLite(&FileSystemListLock);
}