mirror of
https://github.com/reactos/reactos.git
synced 2024-09-30 14:37:45 +00:00
[NTOS:IO] Improve the device action worker
- Improve the device action worker to support more than just a single action - Move the action queue code from IoInvalidateDeviceRelations to a new function IopQueueDeviceAction.
This commit is contained in:
parent
74eda39118
commit
9a07cde37f
|
@ -538,6 +538,29 @@ typedef enum _SECURITY_DESCRIPTOR_TYPE
|
||||||
SystemDefault,
|
SystemDefault,
|
||||||
} SECURITY_DESCRIPTOR_TYPE, *PSECURITY_DESCRIPTOR_TYPE;
|
} SECURITY_DESCRIPTOR_TYPE, *PSECURITY_DESCRIPTOR_TYPE;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Action types and data for IopQueueDeviceAction()
|
||||||
|
//
|
||||||
|
typedef enum _DEVICE_ACTION
|
||||||
|
{
|
||||||
|
DeviceActionInvalidateDeviceRelations,
|
||||||
|
MaxDeviceAction
|
||||||
|
} DEVICE_ACTION;
|
||||||
|
|
||||||
|
typedef struct _DEVICE_ACTION_DATA
|
||||||
|
{
|
||||||
|
LIST_ENTRY RequestListEntry;
|
||||||
|
PDEVICE_OBJECT DeviceObject;
|
||||||
|
DEVICE_ACTION Action;
|
||||||
|
union
|
||||||
|
{
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
DEVICE_RELATION_TYPE Type;
|
||||||
|
} InvalidateDeviceRelations;
|
||||||
|
};
|
||||||
|
} DEVICE_ACTION_DATA, *PDEVICE_ACTION_DATA;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Resource code
|
// Resource code
|
||||||
//
|
//
|
||||||
|
@ -1398,6 +1421,14 @@ IopStoreSystemPartitionInformation(IN PUNICODE_STRING NtSystemPartitionDeviceNam
|
||||||
IN PUNICODE_STRING OsLoaderPathName
|
IN PUNICODE_STRING OsLoaderPathName
|
||||||
);
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Device action
|
||||||
|
//
|
||||||
|
VOID
|
||||||
|
IopQueueDeviceAction(
|
||||||
|
_In_ PDEVICE_ACTION_DATA ActionData
|
||||||
|
);
|
||||||
|
|
||||||
//
|
//
|
||||||
// Global I/O Data
|
// Global I/O Data
|
||||||
//
|
//
|
||||||
|
|
|
@ -38,14 +38,8 @@ WORK_QUEUE_ITEM IopDeviceActionWorkItem;
|
||||||
BOOLEAN IopDeviceActionInProgress;
|
BOOLEAN IopDeviceActionInProgress;
|
||||||
KSPIN_LOCK IopDeviceActionLock;
|
KSPIN_LOCK IopDeviceActionLock;
|
||||||
|
|
||||||
typedef struct _DEVICE_ACTION_DATA
|
|
||||||
{
|
|
||||||
LIST_ENTRY RequestListEntry;
|
|
||||||
PDEVICE_OBJECT DeviceObject;
|
|
||||||
DEVICE_RELATION_TYPE Type;
|
|
||||||
} DEVICE_ACTION_DATA, *PDEVICE_ACTION_DATA;
|
|
||||||
|
|
||||||
/* FUNCTIONS *****************************************************************/
|
/* FUNCTIONS *****************************************************************/
|
||||||
|
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
NTAPI
|
NTAPI
|
||||||
IopCreateDeviceKeyPath(IN PCUNICODE_STRING RegistryPath,
|
IopCreateDeviceKeyPath(IN PCUNICODE_STRING RegistryPath,
|
||||||
|
@ -1073,8 +1067,17 @@ IopDeviceActionWorker(
|
||||||
DEVICE_ACTION_DATA,
|
DEVICE_ACTION_DATA,
|
||||||
RequestListEntry);
|
RequestListEntry);
|
||||||
|
|
||||||
|
switch (Data->Action)
|
||||||
|
{
|
||||||
|
case DeviceActionInvalidateDeviceRelations:
|
||||||
IoSynchronousInvalidateDeviceRelations(Data->DeviceObject,
|
IoSynchronousInvalidateDeviceRelations(Data->DeviceObject,
|
||||||
Data->Type);
|
Data->InvalidateDeviceRelations.Type);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
DPRINT1("Unimplemented device action %u\n", Data->Action);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
ObDereferenceObject(Data->DeviceObject);
|
ObDereferenceObject(Data->DeviceObject);
|
||||||
ExFreePoolWithTag(Data, TAG_IO);
|
ExFreePoolWithTag(Data, TAG_IO);
|
||||||
|
@ -1084,6 +1087,43 @@ IopDeviceActionWorker(
|
||||||
KeReleaseSpinLock(&IopDeviceActionLock, OldIrql);
|
KeReleaseSpinLock(&IopDeviceActionLock, OldIrql);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
VOID
|
||||||
|
IopQueueDeviceAction(
|
||||||
|
_In_ PDEVICE_ACTION_DATA ActionData)
|
||||||
|
{
|
||||||
|
PDEVICE_ACTION_DATA Data;
|
||||||
|
KIRQL OldIrql;
|
||||||
|
|
||||||
|
DPRINT("IopQueueDeviceAction(%p)\n", ActionData);
|
||||||
|
|
||||||
|
Data = ExAllocatePoolWithTag(NonPagedPool,
|
||||||
|
sizeof(DEVICE_ACTION_DATA),
|
||||||
|
TAG_IO);
|
||||||
|
if (!Data)
|
||||||
|
return;
|
||||||
|
|
||||||
|
ObReferenceObject(ActionData->DeviceObject);
|
||||||
|
RtlCopyMemory(Data, ActionData, sizeof(DEVICE_ACTION_DATA));
|
||||||
|
|
||||||
|
DPRINT("Action %u\n", Data->Action);
|
||||||
|
|
||||||
|
KeAcquireSpinLock(&IopDeviceActionLock, &OldIrql);
|
||||||
|
InsertTailList(&IopDeviceActionRequestList, &Data->RequestListEntry);
|
||||||
|
if (IopDeviceActionInProgress)
|
||||||
|
{
|
||||||
|
KeReleaseSpinLock(&IopDeviceActionLock, OldIrql);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
IopDeviceActionInProgress = TRUE;
|
||||||
|
KeReleaseSpinLock(&IopDeviceActionLock, OldIrql);
|
||||||
|
|
||||||
|
ExInitializeWorkItem(&IopDeviceActionWorkItem,
|
||||||
|
IopDeviceActionWorker,
|
||||||
|
NULL);
|
||||||
|
ExQueueWorkItem(&IopDeviceActionWorkItem,
|
||||||
|
DelayedWorkQueue);
|
||||||
|
}
|
||||||
|
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
IopGetSystemPowerDeviceObject(PDEVICE_OBJECT *DeviceObject)
|
IopGetSystemPowerDeviceObject(PDEVICE_OBJECT *DeviceObject)
|
||||||
{
|
{
|
||||||
|
@ -5112,34 +5152,13 @@ IoInvalidateDeviceRelations(
|
||||||
IN PDEVICE_OBJECT DeviceObject,
|
IN PDEVICE_OBJECT DeviceObject,
|
||||||
IN DEVICE_RELATION_TYPE Type)
|
IN DEVICE_RELATION_TYPE Type)
|
||||||
{
|
{
|
||||||
PDEVICE_ACTION_DATA Data;
|
DEVICE_ACTION_DATA ActionData;
|
||||||
KIRQL OldIrql;
|
|
||||||
|
|
||||||
Data = ExAllocatePoolWithTag(NonPagedPool,
|
ActionData.DeviceObject = DeviceObject;
|
||||||
sizeof(DEVICE_ACTION_DATA),
|
ActionData.Action = DeviceActionInvalidateDeviceRelations;
|
||||||
TAG_IO);
|
ActionData.InvalidateDeviceRelations.Type = Type;
|
||||||
if (!Data)
|
|
||||||
return;
|
|
||||||
|
|
||||||
ObReferenceObject(DeviceObject);
|
IopQueueDeviceAction(&ActionData);
|
||||||
Data->DeviceObject = DeviceObject;
|
|
||||||
Data->Type = Type;
|
|
||||||
|
|
||||||
KeAcquireSpinLock(&IopDeviceActionLock, &OldIrql);
|
|
||||||
InsertTailList(&IopDeviceActionRequestList, &Data->RequestListEntry);
|
|
||||||
if (IopDeviceActionInProgress)
|
|
||||||
{
|
|
||||||
KeReleaseSpinLock(&IopDeviceActionLock, OldIrql);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
IopDeviceActionInProgress = TRUE;
|
|
||||||
KeReleaseSpinLock(&IopDeviceActionLock, OldIrql);
|
|
||||||
|
|
||||||
ExInitializeWorkItem(&IopDeviceActionWorkItem,
|
|
||||||
IopDeviceActionWorker,
|
|
||||||
NULL);
|
|
||||||
ExQueueWorkItem(&IopDeviceActionWorkItem,
|
|
||||||
DelayedWorkQueue);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Reference in a new issue