estructura IO_STACK_LOCATION (wdm.h)
La estructura IO_STACK_LOCATION define una ubicación de pila de E/S, que es una entrada de la pila de E/S asociada a cada IRP. Cada ubicación de pila de E/S en un IRP tiene algunos miembros comunes y algunos miembros específicos del tipo de solicitud.
Sintaxis
typedef struct _IO_STACK_LOCATION {
UCHAR MajorFunction;
UCHAR MinorFunction;
UCHAR Flags;
UCHAR Control;
union {
struct {
PIO_SECURITY_CONTEXT SecurityContext;
ULONG Options;
USHORT POINTER_ALIGNMENT FileAttributes;
USHORT ShareAccess;
ULONG POINTER_ALIGNMENT EaLength;
} Create;
struct {
PIO_SECURITY_CONTEXT SecurityContext;
ULONG Options;
USHORT POINTER_ALIGNMENT Reserved;
USHORT ShareAccess;
PNAMED_PIPE_CREATE_PARAMETERS Parameters;
} CreatePipe;
struct {
PIO_SECURITY_CONTEXT SecurityContext;
ULONG Options;
USHORT POINTER_ALIGNMENT Reserved;
USHORT ShareAccess;
PMAILSLOT_CREATE_PARAMETERS Parameters;
} CreateMailslot;
struct {
ULONG Length;
ULONG POINTER_ALIGNMENT Key;
ULONG Flags;
LARGE_INTEGER ByteOffset;
} Read;
struct {
ULONG Length;
ULONG POINTER_ALIGNMENT Key;
ULONG Flags;
LARGE_INTEGER ByteOffset;
} Write;
struct {
ULONG Length;
PUNICODE_STRING FileName;
FILE_INFORMATION_CLASS FileInformationClass;
ULONG POINTER_ALIGNMENT FileIndex;
} QueryDirectory;
struct {
ULONG Length;
ULONG POINTER_ALIGNMENT CompletionFilter;
} NotifyDirectory;
struct {
ULONG Length;
ULONG POINTER_ALIGNMENT CompletionFilter;
DIRECTORY_NOTIFY_INFORMATION_CLASS POINTER_ALIGNMENT DirectoryNotifyInformationClass;
} NotifyDirectoryEx;
struct {
ULONG Length;
FILE_INFORMATION_CLASS POINTER_ALIGNMENT FileInformationClass;
} QueryFile;
struct {
ULONG Length;
FILE_INFORMATION_CLASS POINTER_ALIGNMENT FileInformationClass;
PFILE_OBJECT FileObject;
union {
struct {
BOOLEAN ReplaceIfExists;
BOOLEAN AdvanceOnly;
};
ULONG ClusterCount;
HANDLE DeleteHandle;
};
} SetFile;
struct {
ULONG Length;
PVOID EaList;
ULONG EaListLength;
ULONG POINTER_ALIGNMENT EaIndex;
} QueryEa;
struct {
ULONG Length;
} SetEa;
struct {
ULONG Length;
FS_INFORMATION_CLASS POINTER_ALIGNMENT FsInformationClass;
} QueryVolume;
struct {
ULONG Length;
FS_INFORMATION_CLASS POINTER_ALIGNMENT FsInformationClass;
} SetVolume;
struct {
ULONG OutputBufferLength;
ULONG POINTER_ALIGNMENT InputBufferLength;
ULONG POINTER_ALIGNMENT FsControlCode;
PVOID Type3InputBuffer;
} FileSystemControl;
struct {
PLARGE_INTEGER Length;
ULONG POINTER_ALIGNMENT Key;
LARGE_INTEGER ByteOffset;
} LockControl;
struct {
ULONG OutputBufferLength;
ULONG POINTER_ALIGNMENT InputBufferLength;
ULONG POINTER_ALIGNMENT IoControlCode;
PVOID Type3InputBuffer;
} DeviceIoControl;
struct {
SECURITY_INFORMATION SecurityInformation;
ULONG POINTER_ALIGNMENT Length;
} QuerySecurity;
struct {
SECURITY_INFORMATION SecurityInformation;
PSECURITY_DESCRIPTOR SecurityDescriptor;
} SetSecurity;
struct {
PVPB Vpb;
PDEVICE_OBJECT DeviceObject;
ULONG OutputBufferLength;
} MountVolume;
struct {
PVPB Vpb;
PDEVICE_OBJECT DeviceObject;
} VerifyVolume;
struct {
struct _SCSI_REQUEST_BLOCK *Srb;
} Scsi;
struct {
ULONG Length;
PSID StartSid;
PFILE_GET_QUOTA_INFORMATION SidList;
ULONG SidListLength;
} QueryQuota;
struct {
ULONG Length;
} SetQuota;
struct {
DEVICE_RELATION_TYPE Type;
} QueryDeviceRelations;
struct {
const GUID *InterfaceType;
USHORT Size;
USHORT Version;
PINTERFACE Interface;
PVOID InterfaceSpecificData;
} QueryInterface;
struct {
PDEVICE_CAPABILITIES Capabilities;
} DeviceCapabilities;
struct {
PIO_RESOURCE_REQUIREMENTS_LIST IoResourceRequirementList;
} FilterResourceRequirements;
struct {
ULONG WhichSpace;
PVOID Buffer;
ULONG Offset;
ULONG POINTER_ALIGNMENT Length;
} ReadWriteConfig;
struct {
BOOLEAN Lock;
} SetLock;
struct {
BUS_QUERY_ID_TYPE IdType;
} QueryId;
struct {
DEVICE_TEXT_TYPE DeviceTextType;
LCID POINTER_ALIGNMENT LocaleId;
} QueryDeviceText;
struct {
BOOLEAN InPath;
BOOLEAN Reserved[3];
DEVICE_USAGE_NOTIFICATION_TYPE POINTER_ALIGNMENT Type;
} UsageNotification;
struct {
SYSTEM_POWER_STATE PowerState;
} WaitWake;
struct {
PPOWER_SEQUENCE PowerSequence;
} PowerSequence;
#if ...
struct {
union {
ULONG SystemContext;
SYSTEM_POWER_STATE_CONTEXT SystemPowerStateContext;
};
POWER_STATE_TYPE POINTER_ALIGNMENT Type;
POWER_STATE POINTER_ALIGNMENT State;
POWER_ACTION POINTER_ALIGNMENT ShutdownType;
} Power;
#else
struct {
ULONG SystemContext;
POWER_STATE_TYPE POINTER_ALIGNMENT Type;
POWER_STATE POINTER_ALIGNMENT State;
POWER_ACTION POINTER_ALIGNMENT ShutdownType;
} Power;
#endif
struct {
PCM_RESOURCE_LIST AllocatedResources;
PCM_RESOURCE_LIST AllocatedResourcesTranslated;
} StartDevice;
struct {
ULONG_PTR ProviderId;
PVOID DataPath;
ULONG BufferSize;
PVOID Buffer;
} WMI;
struct {
PVOID Argument1;
PVOID Argument2;
PVOID Argument3;
PVOID Argument4;
} Others;
} Parameters;
PDEVICE_OBJECT DeviceObject;
PFILE_OBJECT FileObject;
PIO_COMPLETION_ROUTINE CompletionRoutine;
PVOID Context;
} IO_STACK_LOCATION, *PIO_STACK_LOCATION;
Miembros
MajorFunction
El código de función principal de IRP que indica el tipo de operación de E/S que se va a realizar.
MinorFunction
Código de subfunción para MajorFunction. El administrador de PnP, el administrador de energía, los controladores del sistema de archivos y los controladores de clase SCSI establecen este miembro para algunas solicitudes.
Flags
Valores específicos del tipo de solicitud utilizados casi exclusivamente por los controladores del sistema de archivos. Los controladores de dispositivos multimedia extraíbles comprueban si este miembro está establecido con SL_OVERRIDE_VERIFY_VOLUME para las solicitudes de lectura para determinar si desea continuar con la operación de lectura aunque el del objeto de dispositivo esté establecido con DO_VERIFY_VOLUME. Los controladores intermedios en capas sobre un controlador de dispositivo multimedia extraíble deben copiar este miembro en la ubicación de la pila de E/S del controlador siguiente inferior en todas las solicitudes de IRP_MJ_READ entrantes.
Para obtener documentación sobre otras marcas de SL_*
para IRP_MJ_CREATE, consulte IRP_MJ_CREATE (IFS).
Entre los valores de marca posibles se incluyen:
Bandera | Valor | Descripción |
---|---|---|
SL_KEY_SPECIFIED | 0x01 |
Indica que el IO_STACK_LOCATION.Parameters.Read(OrWrite).Key contiene qué copia de un sector determinado se debe leer cuando se habilita la redundancia. En la actualidad, esta marca solo se usa con operaciones de IRP_MJ_READ. |
SL_OVERRIDE_VERIFY_VOLUME | 0x02 |
Esta marca se usa para determinar si se va a continuar la operación de lectura incluso si el marcas del objeto de dispositivo se establece con DO_VERIFY_VOLUME. |
SL_WRITE_THROUGH | 0x04 |
Esta marca informa al controlador de almacenamiento para establecer las marcas adecuadas para que el disco omita la caché de escritura para forzar que el disco escriba en su medio de almacenamiento persistente. Esta marca es específica del dispositivo; no todas las unidades de disco admiten la omisión de la memoria caché de disco. |
SL_FT_SEQUENTIAL_WRITE | 0x08 |
Reservado para uso del sistema. |
SL_FORCE_DIRECT_WRITE | 0x10 |
Esta marca permite que los controladores en modo kernel escriban en áreas de volumen en las que normalmente no pueden escribir debido al bloqueo de escritura directa en el sistema de archivos y en la pila del controlador de almacenamiento. El bloqueo directo de escritura ayuda a mejorar la seguridad. Esta marca se comprueba tanto en la capa del sistema de archivos como en la capa de pila de almacenamiento. Para obtener más información sobre el bloqueo directo de escritura, consulte Operaciones de escritura directa en volúmenes y discos. |
SL_REALTIME_STREAM | 0x20 |
Esta marca indica que la E/S es para las solicitudes de streaming en tiempo real a un controlador de clase CD-ROM. Esto indica al controlador que realice operaciones de lectura y escritura a una velocidad garantizada para el streaming en tiempo real. Esta marca solo es válida con medios ópticos. |
SL_PERSISTENT_MEMORY_FIXED_MAPPING | 0x20 |
La asignación de memoria persistente de los bytes de la solicitud de escritura no puede cambiar al controlar esta solicitud de escritura. Esta marca solo es válida con un dispositivo de memoria persistente y IRP_MJ_WRITE. |
En el caso de los dispositivos de memoria persistente, una de las razones para reasignar (modificar la dirección física de un LBA determinado) en dispositivos de memoria persistente es proporcionar una atomicidad eficiente de nivel de sector. Si no se establece la marca, se permite la reasignación especialmente si da como resultado que el controlador proporcione atomicidad del sector. Los sistemas de archivos (o el solicitante) prefieren que un controlador de dispositivo de memoria persistente proporcione atomicidad del sector. Si se establece la marca, un controlador de memoria persistente no reasignará las direcciones físicas correspondientes a los LBA. Si eso significa que no se puede proporcionar atomicidad del sector, así que sea. Sin embargo, el impulsor es más que bienvenido a proporcionar atomicidad del sector siempre que no haya ninguna reasignación.
Control
Los controladores pueden comprobar este miembro para determinar si se establece con SL_PENDING_RETURNED y en qué condiciones se llama a la CompletionRoutine. Los controladores tienen acceso de solo lectura a este miembro. Los controladores llaman a ioSetCompletionRoutine o IoSetCompletionRoutineEx para especificar estas condiciones.
Parameters
Unión que depende de los valores de código de función IRP principal y secundario contenidos en MajorFunction y MinorFunction. En la tabla siguiente se muestra qué IRP usan los miembros individuales de la unión parámetros de
Nombre de miembro | IRP que usan este miembro |
---|---|
Crear | IRP_MJ_CREATE |
de lectura | IRP_MJ_READ |
escritura | IRP_MJ_WRITE |
QueryFile | IRP_MJ_QUERY_INFORMATION |
SetFile | IRP_MJ_SET_INFORMATION |
QueryVolume | IRP_MJ_QUERY_VOLUME_INFORMATION |
DeviceIoControl | IRP_MJ_DEVICE_CONTROL y IRP_MJ_INTERNAL_DEVICE_CONTROL |
mountVolume | IRP_MN_MOUNT_VOLUME |
VerifyVolume | IRP_MN_VERIFY_VOLUME |
Scsi | IRP_MJ_INTERNAL_DEVICE_CONTROL (SCSI) |
QueryDeviceRelations | IRP_MN_QUERY_DEVICE_RELATIONS |
QueryInterface | IRP_MN_QUERY_INTERFACE |
DeviceCapabilities | IRP_MN_QUERY_CAPABILITIES |
FilterResourceRequirements | IRP_MN_FILTER_RESOURCE_REQUIREMENTS |
ReadWriteConfig | IRP_MN_READ_CONFIG y IRP_MN_WRITE_CONFIG |
SetLock | IRP_MN_SET_LOCK |
QueryId | IRP_MN_QUERY_ID |
QueryDeviceText | IRP_MN_QUERY_DEVICE_TEXT |
usageNotification | IRP_MN_DEVICE_USAGE_NOTIFICATION |
WaitWake | IRP_MN_WAIT_WAKE |
powerSequence | IRP_MN_POWER_SEQUENCE |
Power | IRP_MN_SET_POWER y IRP_MN_QUERY_POWER |
StartDevice | IRP_MN_START_DEVICE |
WMI | IRP secundarias de WMI |
otros | IRP específicos del controlador |
Para obtener más información, consulte códigos de función principales de IRP.
Parameters.Create
Parámetros de servicio del sistema para ntCreateFile.
Parameters.Create.SecurityContext
Parameters.Create.Options
Parameters.Create.FileAttributes
Parameters.Create.ShareAccess
Parameters.Create.EaLength
Parameters.CreatePipe
Parámetros de servicio del sistema fo NtCreateNamedPipeFile.
Parameters.CreatePipe.SecurityContext
Parameters.CreatePipe.Options
Parameters.CreatePipe.Reserved
Parameters.CreatePipe.ShareAccess
Parameters.CreatePipe.Parameters
Parameters.CreateMailslot
Parámetros de servicio del sistema para NtCreateMailslotFile.
Parameters.CreateMailslot.SecurityContext
Parameters.CreateMailslot.Options
Parameters.CreateMailslot.Reserved
Parameters.CreateMailslot.ShareAccess
Parameters.CreateMailslot.Parameters
Parameters.Read
Parámetros de servicio del sistema para ntReadFile.
Parameters.Read.Length
Parameters.Read.Key
Parameters.Read.Flags
Parameters.Read.ByteOffset
Parameters.Write
Parámetros de servicio del sistema para ntWriteFile.
Parameters.Write.Length
Parameters.Write.Key
Parameters.Write.Flags
Parameters.Write.ByteOffset
Parameters.QueryDirectory
Parámetros de servicio del sistema para NtQueryDirectoryFile.
Parameters.QueryDirectory.Length
Parameters.QueryDirectory.FileName
Parameters.QueryDirectory.FileInformationClass
Parameters.QueryDirectory.FileIndex
Parameters.NotifyDirectory
Parámetros de servicio del sistema para NtNotifyChangeDirectoryFile.
Parameters.NotifyDirectory.Length
Parameters.NotifyDirectory.CompletionFilter
Parameters.NotifyDirectoryEx
Parámetros de servicio del sistema para NtNotifyChangeDirectoryFileEx.
Parameters.NotifyDirectoryEx.Length
Parameters.NotifyDirectoryEx.CompletionFilter
Parameters.NotifyDirectoryEx.DirectoryNotifyInformationClass
Parameters.QueryFile
Parámetros de servicio del sistema para NtQueryInformationFile.
Parameters.QueryFile.Length
Parameters.QueryFile.FileInformationClass
Parameters.SetFile
Parámetros de servicio del sistema para NtSetInformationFile .
Parameters.SetFile.Length
Parameters.SetFile.FileInformationClass
Parameters.SetFile.FileObject
Parameters.SetFile.ReplaceIfExists
Parameters.SetFile.AdvanceOnly
Parameters.SetFile.ClusterCount
Parameters.SetFile.DeleteHandle
Parameters.QueryEa
Parámetros de servicio del sistema para ntQueryEaFile.
Parameters.QueryEa.Length
Parameters.QueryEa.EaList
Parameters.QueryEa.EaListLength
Parameters.QueryEa.EaIndex
Parameters.SetEa
Parámetros de servicio del sistema para NtSetEaFile .
Parameters.SetEa.Length
Parameters.QueryVolume
Parámetros de servicio del sistema para NtQueryVolumeInformationFile.
Parameters.QueryVolume.Length
Parameters.QueryVolume.FsInformationClass
Parameters.SetVolume
Parámetros de servicio del sistema para ntSetVolumeInformationFile.
Parameters.SetVolume.Length
Parameters.SetVolume.FsInformationClass
Parameters.FileSystemControl
Parámetros de servicio del sistema para ntFsControlFile.
Parameters.FileSystemControl.OutputBufferLength
Parameters.FileSystemControl.InputBufferLength
Parameters.FileSystemControl.FsControlCode
Parameters.FileSystemControl.Type3InputBuffer
Parameters.LockControl
Parámetros de servicio del sistema para LockFile/NtUnlockFile.
Parameters.LockControl.Length
Parameters.LockControl.Key
Parameters.LockControl.ByteOffset
Parameters.DeviceIoControl
Parámetros de servicio del sistema para NtDeviceIoControlFile.
Parameters.DeviceIoControl.OutputBufferLength
Parameters.DeviceIoControl.InputBufferLength
Parameters.DeviceIoControl.IoControlCode
Parameters.DeviceIoControl.Type3InputBuffer
Parameters.QuerySecurity
Parámetros de servicio del sistema para NtQuerySecurityObject.
Parameters.QuerySecurity.SecurityInformation
Parameters.QuerySecurity.Length
Parameters.SetSecurity
Parámetros de servicio del sistema para NtSetSecurityObject.
Parameters.SetSecurity.SecurityInformation
Parameters.SetSecurity.SecurityDescriptor
Parameters.MountVolume
Parámetros de servicio del sistema para MountVolume.
Parameters.MountVolume.Vpb
Parameters.MountVolume.DeviceObject
Parameters.MountVolume.OutputBufferLength
Parameters.VerifyVolume
Parámetros de servicio del sistema para VerifyVolume.
Parameters.VerifyVolume.Vpb
Parameters.VerifyVolume.DeviceObject
Parameters.Scsi
Parámetros para Scsi con control de dispositivo interno.
Parameters.Scsi.Srb
Parameters.QueryQuota
Parámetros de servicio del sistema para NtQueryQuotaInformationFile.
Parameters.QueryQuota.Length
Parameters.QueryQuota.StartSid
Parameters.QueryQuota.SidList
Parameters.QueryQuota.SidListLength
Parameters.SetQuota
Parámetros de servicio del sistema para NtSetQuotaInformationFile.
Parameters.SetQuota.Length
Parameters.QueryDeviceRelations
Parámetros para IRP_MN_QUERY_DEVICE_RELATIONS.
Parameters.QueryDeviceRelations.Type
Parameters.QueryInterface
Parámetros para IRP_MN_QUERY_INTERFACE.
Parameters.QueryInterface.InterfaceType
Parameters.QueryInterface.Size
Parameters.QueryInterface.Version
Parameters.QueryInterface.Interface
Parameters.QueryInterface.InterfaceSpecificData
Parameters.DeviceCapabilities
Parámetros para IRP_MN_QUERY_CAPABILITIES.
Parameters.DeviceCapabilities.Capabilities
Parameters.FilterResourceRequirements
Parámetros para IRP_MN_FILTER_RESOURCE_REQUIREMENTS.
Parameters.FilterResourceRequirements.IoResourceRequirementList
Parameters.ReadWriteConfig
Parámetros para IRP_MN_READ_CONFIG y IRP_MN_WRITE_CONFIG.
Parameters.ReadWriteConfig.WhichSpace
Parameters.ReadWriteConfig.Buffer
Parameters.ReadWriteConfig.Offset
Parameters.ReadWriteConfig.Length
Parameters.SetLock
Parámetros para IRP_MN_SET_LOCK.
Parameters.SetLock.Lock
Parameters.QueryId
Parámetros para IRP_MN_QUERY_ID.
Parameters.QueryId.IdType
Parameters.QueryDeviceText
Parámetros para IRP_MN_QUERY_DEVICE_TEXT.
Parameters.QueryDeviceText.DeviceTextType
Parameters.QueryDeviceText.LocaleId
Parameters.UsageNotification
Parámetros para IRP_MN_DEVICE_USAGE_NOTIFICATION.
Parameters.UsageNotification.InPath
Parameters.UsageNotification.Reserved[3]
Parameters.UsageNotification.Type
Parameters.WaitWake
Parámetros para IRP_MN_WAIT_WAKE.
Parameters.WaitWake.PowerState
Parameters.PowerSequence
Parámetro para IRP_MN_POWER_SEQUENCE.
Parameters.PowerSequence.PowerSequence
Parameters.Power
Parámetros para IRP_MN_SET_POWER y IRP_MN_QUERY_POWER.
Parameters.Power.SystemContext
Parameters.Power.SystemPowerStateContext
Parameters.Power.Type
Parameters.Power.State
Parameters.Power.ShutdownType
Parameters.StartDevice
Parámetros para StartDevice.
Parameters.StartDevice.AllocatedResources
Parameters.StartDevice.AllocatedResourcesTranslated
Parameters.WMI
Parámetros para IRP de WMI.
Parameters.WMI.ProviderId
Parameters.WMI.DataPath
Parameters.WMI.BufferSize
Parameters.WMI.Buffer
Parameters.Others
Parámetros para otras operaciones específicas del controlador.
Parameters.Others.Argument1
Parameters.Others.Argument2
Parameters.Others.Argument3
Parameters.Others.Argument4
DeviceObject
Puntero a la estructura de DEVICE_OBJECT creada por el controlador que representa el dispositivo físico, lógico o virtual de destino para el que este controlador va a controlar el IRP.
FileObject
Puntero a una estructura de FILE_OBJECT que representa el objeto de archivo, si existe, asociado a puntero DeviceObject.
CompletionRoutine
La rutina de finalización que se invoca en función de las marcas del campo control de de esta estructura.
Context
Contexto definido por el controlador que se usa para almacenar la dirección del parámetro de contexto que se pasa a CompletionRoutine.
Observaciones
Para cada IRP, hay una estructura IO_STACK_LOCATION para cada controlador en una pila de controladores de . El conjunto de ubicaciones de pila de E/S de cada IRP se anexa al IRP, siguiendo la estructura de IRP.
Cada controlador de nivel superior es responsable de configurar la ubicación de la pila de E/S para el controlador inferior siguiente en cada IRP. Un controlador debe llamar a ioGetCurrentIrpStackLocation para obtener un puntero a su propia ubicación de pila para cada IRP. Los controladores de nivel superior pueden llamar a ioGetNextIrpStackLocation para obtener un puntero a la ubicación de pila del controlador siguiente inferior.
El controlador de nivel superior debe configurar el contenido de la ubicación de la pila antes de llamar a IoCallDriver para pasar un IRP al controlador de nivel inferior. Si el controlador pasará el IRP de entrada al siguiente controlador de nivel inferior, la rutina de distribución debe llamar a IoSkipCurrentIrpStackLocation o IoCopyCurrentIrpStackLocationToNext para configurar la ubicación de pila de E/S del controlador siguiente inferior.
Una llamada de controlador de nivel superior a IoCallDriver establece el miembro DeviceObject al objeto de dispositivo de destino del controlador de nivel inferior, en la ubicación de pila de E/S del controlador inferior del controlador inferior. El administrador de E/S pasa cada controlador de nivel superior
Si un controlador de nivel superior asigna IRP para realizar solicitudes propias, su rutina de IoCompletion se pasa un puntero NULLDeviceObject si ese controlador no asigna una ubicación de pila para sí misma ni configura el puntero DeviceObject en su propia ubicación de pila del IRP recién asignado.
En algunos casos, un controlador de nivel superior en capas sobre un controlador de dispositivo de almacenamiento masivo es responsable de dividir solicitudes de transferencia grandes para el controlador de dispositivo subyacente. En concreto, los controladores de clase SCSI deben comprobar el Parameters.Read.Length y Parameters.Write.Length, determinar si el tamaño de la transferencia solicitada supera las capacidades de transferencia del HBA subyacente y, si es así, dividir el Longitud de la solicitud original en una secuencia de transferencias parciales para satisfacer el IRP original.
Requisitos
Requisito | Valor |
---|---|
encabezado de |
wdm.h (include Wdm.h, Ntddk.h, Ntifs.h) |
Consulte también
IoCopyCurrentIrpStackLocationToNext