structure IO_STACK_LOCATION (wdm.h)
La structure IO_STACK_LOCATION définit un emplacement de pile d’E/S , qui est une entrée dans la pile d’E/S associée à chaque IRP. Chaque emplacement de pile d’E/S d’un IRP contient certains membres courants et certains membres spécifiques au type de requête.
Syntaxe
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;
Membres
MajorFunction
Le code de fonction principal IRP indiquant le type d’opération d’E/S à effectuer.
MinorFunction
Code de sous-fonction pour MajorFunction . Le gestionnaire PnP, le gestionnaire d’alimentation, les pilotes de système de fichiers et les pilotes de classe SCSI définissent ce membre pour certaines demandes.
Flags
Valeurs spécifiques au type de requête utilisées presque exclusivement par les pilotes de système de fichiers. Les pilotes de périphérique de support amovible vérifient si ce membre est défini avec SL_OVERRIDE_VERIFY_VOLUME pour les demandes de lecture afin de déterminer s’il faut poursuivre l’opération de lecture même si les indicateurs de de l’objet de périphérique sont définis avec DO_VERIFY_VOLUME. Les pilotes intermédiaires superposés sur un pilote de périphérique de support amovible doivent copier ce membre dans l’emplacement de la pile d’E/S du pilote inférieur suivant dans toutes les demandes de IRP_MJ_READ entrantes.
Pour obtenir de la documentation sur d’autres indicateurs de
Les valeurs d’indicateur possibles sont les suivantes :
Drapeau | Valeur | Description |
---|---|---|
SL_KEY_SPECIFIED | 0x01 |
Indique que le IO_STACK_LOCATION.Parameters.Read(OrWrite).Key contient la copie d’un secteur donné à lire lorsque la redondance est activée. Aujourd’hui, cet indicateur est utilisé uniquement avec les opérations de IRP_MJ_READ. |
SL_OVERRIDE_VERIFY_VOLUME | 0x02 |
Cet indicateur est utilisé pour déterminer s’il faut poursuivre l’opération de lecture même si les indicateurs de de l’objet appareil sont définis avec DO_VERIFY_VOLUME. |
SL_WRITE_THROUGH | 0x04 |
Cet indicateur informe le pilote de stockage de définir les indicateurs appropriés afin que le disque contourne le cache d’écriture afin de forcer l’écriture du disque dans son support de stockage persistant. Cet indicateur est spécifique à l’appareil ; tous les lecteurs de disque ne prennent pas en charge le contournement du cache de disque. |
SL_FT_SEQUENTIAL_WRITE | 0x08 |
Réservé à l’utilisation du système. |
SL_FORCE_DIRECT_WRITE | 0x10 |
Cet indicateur permet aux pilotes en mode noyau d’écrire dans des zones de volume auxquelles ils ne peuvent normalement pas écrire en raison du blocage de l’écriture directe dans le système de fichiers et la pile des pilotes de stockage. Le blocage d’écriture directe permet d’améliorer la sécurité. Cet indicateur est vérifié à la fois au niveau de la couche système de fichiers et de la couche de pile de stockage. Pour plus d’informations sur le blocage d’écriture directe, consultez Blocage des opérations d’écriture directe sur des volumes et des disques. |
SL_REALTIME_STREAM | 0x20 |
Cet indicateur indique que l’E/S est destinée aux demandes de diffusion en continu en temps réel vers un pilote de classe CD-ROM. Cela indique au pilote d’effectuer des opérations READ/WRITE à une vitesse garantie pour le streaming en temps réel. Cet indicateur est valide uniquement avec un support optique. |
SL_PERSISTENT_MEMORY_FIXED_MAPPING | 0x20 |
Le mappage de mémoire persistante des octets de la demande d’écriture ne peut pas changer lors de la gestion de cette demande d’écriture. Cet indicateur est valide uniquement avec un appareil de mémoire persistante et IRP_MJ_WRITE. |
Pour les périphériques de mémoire persistante, l’une des raisons de la remappation (modification de l’adresse physique d’un LBA donné) sur les appareils de mémoire persistante consiste à fournir une atomicité de niveau secteur efficace. Si l’indicateur n’est pas défini, le remapping est autorisé en particulier s’il aboutit à l’atomicité du secteur. Les systèmes de fichiers (ou le demandeur) préfèrent qu’un pilote de périphérique de mémoire persistante fournit l’atomicité du secteur. Si l’indicateur est défini, un pilote de mémoire persistante ne remappe pas les adresses physiques correspondant aux LBA. Si cela signifie que l’atomicité du secteur ne peut pas être fournie, c’est-à-dire. Toutefois, le pilote est plus que bienvenu pour fournir l’atomicité du secteur tant qu’il n’y a pas de remapping.
Control
Les pilotes peuvent vérifier ce membre pour déterminer s’il est défini avec SL_PENDING_RETURNED et dans quelles conditions la CompletionRoutine est appelée. Les pilotes ont un accès en lecture seule à ce membre. Les pilotes appellent IoSetCompletionRoutine ou IoSetCompletionRoutineEx pour spécifier ces conditions.
Parameters
Union qui dépend des valeurs de code de fonction IRP principales et mineures contenues dans MajorFunction et MinorFunction. Le tableau suivant indique quels irps utilisent les membres individuels des paramètres union.
Pour plus d’informations, consultez codes de fonction principaux IRP.
Parameters.Create
Paramètres de service système pour NtCreateFile .
Parameters.Create.SecurityContext
Parameters.Create.Options
Parameters.Create.FileAttributes
Parameters.Create.ShareAccess
Parameters.Create.EaLength
Parameters.CreatePipe
Paramètres de service système fo NtCreateNamedPipeFile.
Parameters.CreatePipe.SecurityContext
Parameters.CreatePipe.Options
Parameters.CreatePipe.Reserved
Parameters.CreatePipe.ShareAccess
Parameters.CreatePipe.Parameters
Parameters.CreateMailslot
Paramètres de service système pour NtCreateMailslotFile.
Parameters.CreateMailslot.SecurityContext
Parameters.CreateMailslot.Options
Parameters.CreateMailslot.Reserved
Parameters.CreateMailslot.ShareAccess
Parameters.CreateMailslot.Parameters
Parameters.Read
Paramètres de service système pour NtReadFile .
Parameters.Read.Length
Parameters.Read.Key
Parameters.Read.Flags
Parameters.Read.ByteOffset
Parameters.Write
Paramètres de service système pour NtWriteFile .
Parameters.Write.Length
Parameters.Write.Key
Parameters.Write.Flags
Parameters.Write.ByteOffset
Parameters.QueryDirectory
Paramètres de service système pour NtQueryDirectoryFile.
Parameters.QueryDirectory.Length
Parameters.QueryDirectory.FileName
Parameters.QueryDirectory.FileInformationClass
Parameters.QueryDirectory.FileIndex
Parameters.NotifyDirectory
Paramètres de service système pour NtNotifyChangeDirectoryFile.
Parameters.NotifyDirectory.Length
Parameters.NotifyDirectory.CompletionFilter
Parameters.NotifyDirectoryEx
Paramètres de service système pour NtNotifyChangeDirectoryFileEx.
Parameters.NotifyDirectoryEx.Length
Parameters.NotifyDirectoryEx.CompletionFilter
Parameters.NotifyDirectoryEx.DirectoryNotifyInformationClass
Parameters.QueryFile
Paramètres de service système pour NtQueryInformationFile .
Parameters.QueryFile.Length
Parameters.QueryFile.FileInformationClass
Parameters.SetFile
Paramètres de service système pour NtSetInformationFile .
Parameters.SetFile.Length
Parameters.SetFile.FileInformationClass
Parameters.SetFile.FileObject
Parameters.SetFile.ReplaceIfExists
Parameters.SetFile.AdvanceOnly
Parameters.SetFile.ClusterCount
Parameters.SetFile.DeleteHandle
Parameters.QueryEa
Paramètres de service système pour NtQueryEaFile .
Parameters.QueryEa.Length
Parameters.QueryEa.EaList
Parameters.QueryEa.EaListLength
Parameters.QueryEa.EaIndex
Parameters.SetEa
Paramètres de service système pour NtSetEaFile .
Parameters.SetEa.Length
Parameters.QueryVolume
Paramètres de service système pour NtQueryVolumeInformationFile.
Parameters.QueryVolume.Length
Parameters.QueryVolume.FsInformationClass
Parameters.SetVolume
Paramètres de service système pour NtSetVolumeInformationFile.
Parameters.SetVolume.Length
Parameters.SetVolume.FsInformationClass
Parameters.FileSystemControl
Paramètres de service système pour NtFsControlFile .
Parameters.FileSystemControl.OutputBufferLength
Parameters.FileSystemControl.InputBufferLength
Parameters.FileSystemControl.FsControlCode
Parameters.FileSystemControl.Type3InputBuffer
Parameters.LockControl
Paramètres de service système pour LockFile/NtUnlockFile.
Parameters.LockControl.Length
Parameters.LockControl.Key
Parameters.LockControl.ByteOffset
Parameters.DeviceIoControl
Paramètres de service système pour NtDeviceIoControlFile .
Parameters.DeviceIoControl.OutputBufferLength
Parameters.DeviceIoControl.InputBufferLength
Parameters.DeviceIoControl.IoControlCode
Parameters.DeviceIoControl.Type3InputBuffer
Parameters.QuerySecurity
Paramètres de service système pour NtQuerySecurityObject.
Parameters.QuerySecurity.SecurityInformation
Parameters.QuerySecurity.Length
Parameters.SetSecurity
Paramètres de service système pour NtSetSecurityObject.
Parameters.SetSecurity.SecurityInformation
Parameters.SetSecurity.SecurityDescriptor
Parameters.MountVolume
Paramètres de service système pour MountVolume.
Parameters.MountVolume.Vpb
Parameters.MountVolume.DeviceObject
Parameters.MountVolume.OutputBufferLength
Parameters.VerifyVolume
Paramètres de service système pour VerifyVolume.
Parameters.VerifyVolume.Vpb
Parameters.VerifyVolume.DeviceObject
Parameters.Scsi
Paramètres pour Scsi avec contrôle d’appareil interne.
Parameters.Scsi.Srb
Parameters.QueryQuota
Paramètres de service système pour NtQueryQuotaInformationFile.
Parameters.QueryQuota.Length
Parameters.QueryQuota.StartSid
Parameters.QueryQuota.SidList
Parameters.QueryQuota.SidListLength
Parameters.SetQuota
Paramètres de service système pour NtSetQuotaInformationFile.
Parameters.SetQuota.Length
Parameters.QueryDeviceRelations
Paramètres de IRP_MN_QUERY_DEVICE_RELATIONS.
Parameters.QueryDeviceRelations.Type
Parameters.QueryInterface
Paramètres de IRP_MN_QUERY_INTERFACE.
Parameters.QueryInterface.InterfaceType
Parameters.QueryInterface.Size
Parameters.QueryInterface.Version
Parameters.QueryInterface.Interface
Parameters.QueryInterface.InterfaceSpecificData
Parameters.DeviceCapabilities
Paramètres de IRP_MN_QUERY_CAPABILITIES.
Parameters.DeviceCapabilities.Capabilities
Parameters.FilterResourceRequirements
Paramètres de IRP_MN_FILTER_RESOURCE_REQUIREMENTS.
Parameters.FilterResourceRequirements.IoResourceRequirementList
Parameters.ReadWriteConfig
Paramètres de IRP_MN_READ_CONFIG et de IRP_MN_WRITE_CONFIG.
Parameters.ReadWriteConfig.WhichSpace
Parameters.ReadWriteConfig.Buffer
Parameters.ReadWriteConfig.Offset
Parameters.ReadWriteConfig.Length
Parameters.SetLock
Paramètres de IRP_MN_SET_LOCK.
Parameters.SetLock.Lock
Parameters.QueryId
Paramètres de IRP_MN_QUERY_ID.
Parameters.QueryId.IdType
Parameters.QueryDeviceText
Paramètres de IRP_MN_QUERY_DEVICE_TEXT.
Parameters.QueryDeviceText.DeviceTextType
Parameters.QueryDeviceText.LocaleId
Parameters.UsageNotification
Paramètres de IRP_MN_DEVICE_USAGE_NOTIFICATION.
Parameters.UsageNotification.InPath
Parameters.UsageNotification.Reserved[3]
Parameters.UsageNotification.Type
Parameters.WaitWake
Paramètres de IRP_MN_WAIT_WAKE.
Parameters.WaitWake.PowerState
Parameters.PowerSequence
Paramètre pour IRP_MN_POWER_SEQUENCE.
Parameters.PowerSequence.PowerSequence
Parameters.Power
Paramètres de IRP_MN_SET_POWER et de IRP_MN_QUERY_POWER.
Parameters.Power.SystemContext
Parameters.Power.SystemPowerStateContext
Parameters.Power.Type
Parameters.Power.State
Parameters.Power.ShutdownType
Parameters.StartDevice
Paramètres de StartDevice.
Parameters.StartDevice.AllocatedResources
Parameters.StartDevice.AllocatedResourcesTranslated
Parameters.WMI
Paramètres des adresses IP virtuelles WMI.
Parameters.WMI.ProviderId
Parameters.WMI.DataPath
Parameters.WMI.BufferSize
Parameters.WMI.Buffer
Parameters.Others
Paramètres d’autres opérations spécifiques au pilote.
Parameters.Others.Argument1
Parameters.Others.Argument2
Parameters.Others.Argument3
Parameters.Others.Argument4
DeviceObject
Pointeur vers la structure de DEVICE_OBJECT créée par le pilote représentant le périphérique physique, logique ou virtuel cible pour lequel ce pilote doit gérer l’IRP.
FileObject
Pointeur vers une structure FILE_OBJECT qui représente l’objet de fichier, le cas échéant, associé à pointeur DeviceObject.
CompletionRoutine
Routine d’achèvement appelée en fonction des indicateurs dans le champ Control de cette structure.
Context
Contexte défini par le pilote utilisé pour stocker l’adresse du paramètre de contexte passé à l’exécutionRoutine.
Remarques
Pour chaque IRP, il existe une structure IO_STACK_LOCATION pour chaque pilote dans une pile de pilotes . Chaque ensemble d’emplacements de pile d’E/S de chaque IRP est ajouté à l’IRP, en suivant la structure de IRP
Chaque pilote de niveau supérieur est chargé de configurer l’emplacement de la pile d’E/S pour le pilote inférieur suivant dans chaque IRP. Un pilote doit appeler IoGetCurrentIrpStackLocation pour obtenir un pointeur vers son propre emplacement de pile pour chaque IRP. Les pilotes de niveau supérieur peuvent appeler IoGetNextIrpStackLocation pour obtenir un pointeur vers l’emplacement de la pile du pilote inférieur suivant.
Le pilote de niveau supérieur doit configurer le contenu de l’emplacement de la pile avant d’appeler IoCallDriver pour passer un IRP au pilote de niveau inférieur. Si le pilote passe l’IRP d’entrée au pilote de niveau inférieur suivant, la routine de distribution doit appeler IoSkipCurrentIrpStackLocation ou IoCopyCurrentIrpStackLocationToNext pour configurer l’emplacement de la pile d’E/S du pilote inférieur suivant.
L’appel d’un pilote de niveau supérieur à IoCallDriver définit le membre DeviceObject à l’objet périphérique cible du pilote de niveau inférieur suivant, à l’emplacement de la pile d’E/S du pilote inférieur. Le gestionnaire d’E/S passe chaque IoCompletion de niveau supérieur routine un pointeur vers son propre objet d’appareil lorsque la routine IoCompletion est appelée à l’achèvement de l’IRP.
Si un pilote de niveau supérieur alloue des irPs pour effectuer des demandes de lui-même, sa routine
Dans certains cas, un pilote de niveau supérieur en couches sur un pilote de périphérique de stockage en masse est responsable du fractionnement des demandes de transfert volumineuses pour le pilote de périphérique sous-jacent. En particulier, les pilotes de classe SCSI doivent vérifier les Parameters.Read.Length et Parameters.Write.Length, déterminer si la taille du transfert demandé dépasse les fonctionnalités de transfert du HBA sous-jacentes et, le cas échéant, fractionner la longueur de la requête d’origine en une séquence de transferts partiels pour satisfaire les capacités de transfert d’origine.
Exigences
Exigence | Valeur |
---|---|
d’en-tête | wdm.h (include Wdm.h, Ntddk.h, Ntifs.h) |