estrutura IO_STACK_LOCATION (wdm.h)
A estrutura de IO_STACK_LOCATION define um de local de pilha de E/S, que é uma entrada na pilha de E/S associada a cada IRP. Cada local de pilha de E/S em um IRP tem alguns membros comuns e alguns membros específicos do tipo de solicitação.
Sintaxe
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;
Membros
MajorFunction
O código de função principal IRP indicando o tipo de operação de E/S a ser executada.
MinorFunction
Um código de subfunção para MajorFunction. O gerenciador PnP, o power manager, os drivers do sistema de arquivos e os drivers de classe SCSI definem esse membro para algumas solicitações.
Flags
Valores específicos do tipo de solicitação usados quase exclusivamente por drivers do sistema de arquivos. Os drivers de dispositivo de mídia removível verificam se esse membro está definido com SL_OVERRIDE_VERIFY_VOLUME para solicitações de leitura para determinar se a operação de leitura deve continuar mesmo se o Flags do objeto do dispositivo estiver definido com DO_VERIFY_VOLUME. Os drivers intermediários colocados em camadas sobre um driver de dispositivo de mídia removível devem copiar esse membro para o local da pilha de E/S do driver mais baixo em todas as solicitações de IRP_MJ_READ de entrada.
Para obter a documentação de outros sinalizadores de SL_*
para IRP_MJ_CREATE, consulte IRP_MJ_CREATE (IFS).
Os valores de sinalizador possíveis incluem:
Bandeira | Valor | Descrição |
---|---|---|
SL_KEY_SPECIFIED | 0x01 |
Indica que o IO_STACK_LOCATION.Parameters.Read(OrWrite).Key contém qual cópia de um determinado setor deve ser lida quando a redundância está habilitada. Hoje esse sinalizador é usado apenas com operações de IRP_MJ_READ. |
SL_OVERRIDE_VERIFY_VOLUME | 0x02 |
Esse sinalizador é usado para determinar se a operação de leitura deve continuar mesmo se o Flags do objeto do dispositivo estiver definido com DO_VERIFY_VOLUME. |
SL_WRITE_THROUGH | 0x04 |
Esse sinalizador informa ao driver de armazenamento para definir sinalizadores apropriados para que o disco ignore o cache de gravação para forçar o disco a gravar em sua mídia de armazenamento persistente. Esse sinalizador é específico do dispositivo; nem todas as unidades de disco dão suporte a ignorar o cache de disco. |
SL_FT_SEQUENTIAL_WRITE | 0x08 |
Reservado para uso do sistema. |
SL_FORCE_DIRECT_WRITE | 0x10 |
Esse sinalizador permite que os drivers no modo kernel escrevam em áreas de volume que normalmente não podem gravar devido ao bloqueio de gravação direta no sistema de arquivos e na pilha do driver de armazenamento. O bloqueio direto de gravação ajuda a melhorar a segurança. Esse sinalizador é verificado tanto na camada do sistema de arquivos quanto na camada de pilha de armazenamento. Para obter mais informações sobre o bloqueio de gravação direta, consulte Bloquear operações de gravação direta em volumes e discos. |
SL_REALTIME_STREAM | 0x20 |
Esse sinalizador indica que a E/S é para solicitações de streaming em tempo real para um driver de classe CD-ROM. Isso sugere que o driver execute operações de LEITURA/GRAVAÇÃO em uma velocidade garantida para streaming em tempo real. Esse sinalizador é válido apenas com mídia óptica. |
SL_PERSISTENT_MEMORY_FIXED_MAPPING | 0x20 |
O mapeamento de memória persistente dos bytes na solicitação de gravação não pode ser alterado durante o tratamento dessa solicitação de gravação. Esse sinalizador é válido apenas com um dispositivo de memória persistente e IRP_MJ_WRITE. |
Para dispositivos de memória persistente, um dos motivos para remapear (modificar o endereço físico de um determinado LBA) em dispositivos de memória persistente é fornecer atomicidade eficiente no nível do setor. Se o sinalizador não estiver definido, o remapeamento será permitido especialmente se resultar no driver que fornece atomicidade do setor. Os sistemas de arquivos (ou o solicitante) preferem que um driver de dispositivo de memória persistente forneça atomicidade do setor. Se o sinalizador estiver definido, um driver de memória persistente não deverá remapear os endereços físicos correspondentes aos LBAs. Se isso significa que a atomicidade do setor não pode ser fornecida, que assim seja. No entanto, o driver é mais do que bem-vindo para fornecer atomicidade do setor, desde que não haja remapeamento.
Control
Os drivers podem verificar esse membro para determinar se ele está definido com SL_PENDING_RETURNED e em quais condições o
Parameters
Uma união que depende dos valores principais e menores de código de função IRP contidos em MajorFunction e MinorFunction. A tabela a seguir mostra quais IRPs usam os membros individuais da união parâmetros
Nome do membro | IRPs que usam este membro |
---|---|
Criar | IRP_MJ_CREATE |
de leitura |
IRP_MJ_READ |
de gravação |
IRP_MJ_WRITE |
queryFile | IRP_MJ_QUERY_INFORMATION |
SetFile | IRP_MJ_SET_INFORMATION |
QueryVolume | IRP_MJ_QUERY_VOLUME_INFORMATION |
DeviceIoControl | IRP_MJ_DEVICE_CONTROL e 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 |
|
IRP_MN_FILTER_RESOURCE_REQUIREMENTS |
ReadWriteConfig | IRP_MN_READ_CONFIG e 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 |
do PowerSequence | IRP_MN_POWER_SEQUENCE |
Power | IRP_MN_SET_POWER e IRP_MN_QUERY_POWER |
StartDevice | IRP_MN_START_DEVICE |
WMI | de IRPs menores do WMI |
outros | IRPs específicos do driver |
Para obter mais informações, consulte códigos de função principais do IRP.
Parameters.Create
Parâmetros de serviço do sistema para NtCreateFile.
Parameters.Create.SecurityContext
Parameters.Create.Options
Parameters.Create.FileAttributes
Parameters.Create.ShareAccess
Parameters.Create.EaLength
Parameters.CreatePipe
Parâmetros de serviço do sistema fo NtCreateNamedPipeFile.
Parameters.CreatePipe.SecurityContext
Parameters.CreatePipe.Options
Parameters.CreatePipe.Reserved
Parameters.CreatePipe.ShareAccess
Parameters.CreatePipe.Parameters
Parameters.CreateMailslot
Parâmetros de serviço do sistema para NtCreateMailslotFile.
Parameters.CreateMailslot.SecurityContext
Parameters.CreateMailslot.Options
Parameters.CreateMailslot.Reserved
Parameters.CreateMailslot.ShareAccess
Parameters.CreateMailslot.Parameters
Parameters.Read
Parâmetros de serviço do sistema para NtReadFile.
Parameters.Read.Length
Parameters.Read.Key
Parameters.Read.Flags
Parameters.Read.ByteOffset
Parameters.Write
Parâmetros de serviço do sistema para NtWriteFile.
Parameters.Write.Length
Parameters.Write.Key
Parameters.Write.Flags
Parameters.Write.ByteOffset
Parameters.QueryDirectory
Parâmetros de serviço do sistema para NtQueryDirectoryFile.
Parameters.QueryDirectory.Length
Parameters.QueryDirectory.FileName
Parameters.QueryDirectory.FileInformationClass
Parameters.QueryDirectory.FileIndex
Parameters.NotifyDirectory
Parâmetros de serviço do sistema para NtNotifyChangeDirectoryFile.
Parameters.NotifyDirectory.Length
Parameters.NotifyDirectory.CompletionFilter
Parameters.NotifyDirectoryEx
Parâmetros de serviço do sistema para NtNotifyChangeDirectoryFileEx.
Parameters.NotifyDirectoryEx.Length
Parameters.NotifyDirectoryEx.CompletionFilter
Parameters.NotifyDirectoryEx.DirectoryNotifyInformationClass
Parameters.QueryFile
Parâmetros de serviço do sistema para NtQueryInformationFile.
Parameters.QueryFile.Length
Parameters.QueryFile.FileInformationClass
Parameters.SetFile
Parâmetros de serviço do 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 serviço do sistema para NtQueryEaFile.
Parameters.QueryEa.Length
Parameters.QueryEa.EaList
Parameters.QueryEa.EaListLength
Parameters.QueryEa.EaIndex
Parameters.SetEa
Parâmetros de serviço do sistema para NtSetEaFile.
Parameters.SetEa.Length
Parameters.QueryVolume
Parâmetros de serviço do sistema para NtQueryVolumeInformationFile.
Parameters.QueryVolume.Length
Parameters.QueryVolume.FsInformationClass
Parameters.SetVolume
Parâmetros de serviço do sistema para NtSetVolumeInformationFile.
Parameters.SetVolume.Length
Parameters.SetVolume.FsInformationClass
Parameters.FileSystemControl
Parâmetros de serviço do sistema para NtFsControlFile.
Parameters.FileSystemControl.OutputBufferLength
Parameters.FileSystemControl.InputBufferLength
Parameters.FileSystemControl.FsControlCode
Parameters.FileSystemControl.Type3InputBuffer
Parameters.LockControl
Parâmetros de serviço do sistema para LockFile/NtUnlockFile.
Parameters.LockControl.Length
Parameters.LockControl.Key
Parameters.LockControl.ByteOffset
Parameters.DeviceIoControl
Parâmetros de serviço do sistema para NtDeviceIoControlFile.
Parameters.DeviceIoControl.OutputBufferLength
Parameters.DeviceIoControl.InputBufferLength
Parameters.DeviceIoControl.IoControlCode
Parameters.DeviceIoControl.Type3InputBuffer
Parameters.QuerySecurity
Parâmetros de serviço do sistema para NtQuerySecurityObject.
Parameters.QuerySecurity.SecurityInformation
Parameters.QuerySecurity.Length
Parameters.SetSecurity
Parâmetros de serviço do sistema para NtSetSecurityObject.
Parameters.SetSecurity.SecurityInformation
Parameters.SetSecurity.SecurityDescriptor
Parameters.MountVolume
Parâmetros de serviço do sistema para MountVolume.
Parameters.MountVolume.Vpb
Parameters.MountVolume.DeviceObject
Parameters.MountVolume.OutputBufferLength
Parameters.VerifyVolume
Parâmetros de serviço do sistema para VerifyVolume .
Parameters.VerifyVolume.Vpb
Parameters.VerifyVolume.DeviceObject
Parameters.Scsi
Parâmetros para Scsi com controle de dispositivo interno.
Parameters.Scsi.Srb
Parameters.QueryQuota
Parâmetros de serviço do sistema para NtQueryQuotaInformationFile.
Parameters.QueryQuota.Length
Parameters.QueryQuota.StartSid
Parameters.QueryQuota.SidList
Parameters.QueryQuota.SidListLength
Parameters.SetQuota
Parâmetros de serviço do 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 e 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 e 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 IRPs WMI.
Parameters.WMI.ProviderId
Parameters.WMI.DataPath
Parameters.WMI.BufferSize
Parameters.WMI.Buffer
Parameters.Others
Parâmetros para outras operações específicas do driver.
Parameters.Others.Argument1
Parameters.Others.Argument2
Parameters.Others.Argument3
Parameters.Others.Argument4
DeviceObject
Um ponteiro para a estrutura de DEVICE_OBJECT criada pelo driver que representa o dispositivo físico, lógico ou virtual de destino para o qual esse driver deve lidar com o IRP.
FileObject
Um ponteiro para uma estrutura FILE_OBJECT que representa o objeto de arquivo, se houver, associado a deviceObject ponteiro.
CompletionRoutine
A rotina de conclusão que é invocada dependendo dos sinalizadores no campo controle dessa estrutura.
Context
Contexto definido pelo driver que é usado para armazenar o endereço do parâmetro de contexto que é passado para a CompletionRoutine.
Observações
Para cada IRP, há uma estrutura IO_STACK_LOCATION para cada driver em uma pilha de driver . Cada conjunto de locais de pilha de E/S do IRP é acrescentado ao IRP, seguindo a estrutura
Cada driver de nível superior é responsável por configurar o local da pilha de E/S para o driver mais baixo em cada IRP. Um driver deve chamar IoGetCurrentIrpStackLocation para obter um ponteiro para seu próprio local de pilha para cada IRP. Drivers de nível superior podem chamar IoGetNextIrpStackLocation para obter um ponteiro para o local da pilha do próximo driver inferior.
O driver de nível superior deve configurar o conteúdo do local da pilha antes de chamar IoCallDriver para passar um IRP para o driver de nível inferior. Se o driver passar o IRP de entrada para o próximo driver de nível inferior, a rotina de expedição deverá chamar IoSkipCurrentIrpStackLocation ou IoCopyCurrentIrpStackLocationToNext para configurar o local da pilha de E/S do driver mais baixo.
Uma chamada de driver de nível superior para
Se um driver de nível superior alocar IRPs para fazer solicitações próprias, sua rotina de
Em alguns casos, um driver de nível superior sobre um driver de dispositivo de armazenamento em massa é responsável por dividir grandes solicitações de transferência para o driver de dispositivo subjacente. Em particular, os drivers de classe SCSI devem verificar o Parameters.Read.Length e Parameters.Write.Length, determinar se o tamanho da transferência solicitada excede os recursos de transferência do HBA subjacente e, nesse caso, dividir o Length da solicitação original em uma sequência de transferências parciais para satisfazer o IRP original.
Requisitos
Requisito | Valor |
---|---|
cabeçalho | wdm.h (include Wdm.h, Ntddk.h, Ntifs.h) |