Freigeben über


IO_STACK_LOCATION Struktur (wdm.h)

Die IO_STACK_LOCATION-Struktur definiert eine I/O-Stapelposition, bei der es sich um einen Eintrag im E/A-Stapel handelt, der den einzelnen IRP zugeordnet ist. Jeder I/O-Stapelspeicherort in einem IRP verfügt über einige allgemeine Member und einige anforderungstypspezifische Member.

Syntax

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;

Angehörige

MajorFunction

Der Hauptfunktionscode, der den Typ des auszuführenden E/A-Vorgangs angibt.

MinorFunction

Ein Unterfunktionscode für MajorFunction. Der PnP-Manager, der Power Manager, Dateisystemtreiber und SCSI-Klassentreiber legen diesen Member für einige Anforderungen fest.

Flags

Anforderungstypspezifische Werte, die fast ausschließlich von Dateisystemtreibern verwendet werden. Wechselmedientreiber überprüfen, ob dieses Element mit SL_OVERRIDE_VERIFY_VOLUME für Leseanforderungen festgelegt ist, um festzustellen, ob der Lesevorgang fortgesetzt werden soll, auch wenn die Flags des Geräteobjekts mit DO_VERIFY_VOLUME festgelegt sind. Zwischentreiber, die über einen Wechselmedientreiber gestapelt sind, müssen dieses Element in den I/O-Stapelspeicherort des nächsten niedrigeren Treibers in allen eingehenden IRP_MJ_READ-Anforderungen kopieren.

Dokumentation zu anderen SL_* Flags für IRP_MJ_CREATE finden Sie unter IRP_MJ_CREATE (IFS).

Mögliche Kennzeichenwerte sind:

Flagge Wert Beschreibung
SL_KEY_SPECIFIED 0x01 Gibt an, dass die IO_STACK_LOCATION.Parameters.Read(OrWrite).Key enthält, welche Kopie eines bestimmten Sektors gelesen werden soll, wenn Redundanz aktiviert ist. Dieses Kennzeichen wird heute nur für IRP_MJ_READ Vorgänge verwendet.
SL_OVERRIDE_VERIFY_VOLUME 0x02 Mit dieser Kennzeichnung wird ermittelt, ob der Lesevorgang fortgesetzt werden soll, auch wenn die Flags des Geräteobjekts mit DO_VERIFY_VOLUME festgelegt sind.
SL_WRITE_THROUGH 0x04 Dieses Flag informiert den Speichertreiber, geeignete Flags festzulegen, sodass der Datenträger den Schreibcache umgeht, um zu erzwingen, dass der Datenträger in sein persistentes Speichermedium schreibt. Dieses Kennzeichen ist gerätespezifisch; Nicht alle Datenträgerlaufwerke unterstützen das Umgehen des Datenträgercaches.
SL_FT_SEQUENTIAL_WRITE 0x08 Reserviert für die Systemverwendung.
SL_FORCE_DIRECT_WRITE 0x10 Mit diesem Flag können Kernelmodustreiber in Volumebereiche schreiben, in die sie normalerweise nicht schreiben können, weil direkte Schreibvorgänge im Dateisystem- und Speichertreiberstapel blockiert werden. Das blockieren von direkten Schreibvorgängen trägt zur Verbesserung der Sicherheit bei. Dieses Kennzeichen wird sowohl auf der Dateisystemebene als auch auf der Speicherstapelebene überprüft. Weitere Informationen zum blockieren von direkten Schreibvorgängen finden Sie unter Blockieren von Direkten Schreibvorgängen auf Volumes und Datenträger.
SL_REALTIME_STREAM 0x20 Dieses Kennzeichen weist darauf hin, dass die E/A für Echtzeitstreaminganforderungen an einen CD-ROM Klassentreiber bestimmt ist. Dadurch wird der Treiber aufgefordert, LESE-/SCHREIBZUGRIFFsvorgänge mit einer garantierten Geschwindigkeit für echtzeitbasiertes Streaming auszuführen. Dieses Kennzeichen ist nur für optische Medien gültig.
SL_PERSISTENT_MEMORY_FIXED_MAPPING 0x20 Die beständige Speicherzuordnung der Bytes in der Schreibanforderung kann beim Behandeln dieser Schreibanforderung nicht geändert werden. Dieses Kennzeichen gilt nur für ein dauerhaftes Speichergerät und IRP_MJ_WRITE.

Für persistente Speichergeräte ist einer der Gründe für das Neumapping (Ändern der physischen Adresse eines bestimmten LBA) auf persistenten Speichergeräten die effiziente Atomität auf Sektorebene. Wenn die Kennzeichnung nicht festgelegt ist, ist das Neumapping insbesondere dann zulässig, wenn dies dazu führt, dass der Faktor Sektoratomität bereitstellt. Dateisysteme (oder der Anforderer) bevorzugen, dass ein beständiger Speichergerätetreiber Sektoratomität bereitstellt. Wenn das Flag festgelegt ist, muss ein persistenter Speichertreiber die physischen Adressen, die den LBAs entsprechen, nicht neu zuordnen. Wenn das bedeutet, dass sektorspezifische Atomität nicht bereitgestellt werden kann, also sei es. Der Fahrer ist jedoch mehr als willkommen, sektorspezifische Atomität bereitzustellen, solange es keine Neuzuordnung gibt.

Control

Treiber können dieses Element überprüfen, um festzustellen, ob es mit SL_PENDING_RETURNED festgelegt ist und unter welchen Bedingungen die CompletionRoutine- aufgerufen wird. Treiber haben schreibgeschützten Zugriff auf dieses Mitglied. Treiber rufen IoSetCompletionRoutine oder IoSetCompletionRoutineEx- auf, um diese Bedingungen anzugeben.

Parameters

Eine Vereinigung, die von den Haupt- und Neben-IRP-Funktionscodewerten in MajorFunction und MinorFunction-abhängt. Die folgende Tabelle zeigt, welche IRPs die einzelnen Member der Parameters Union verwenden.

Membername IRPs, die dieses Mitglied verwenden
Erstellen von IRP_MJ_CREATE
Lese- IRP_MJ_READ
Schreiben IRP_MJ_WRITE
QueryFile- IRP_MJ_QUERY_INFORMATION
SetFile- IRP_MJ_SET_INFORMATION
QueryVolume- IRP_MJ_QUERY_VOLUME_INFORMATION
DeviceIoControl- IRP_MJ_DEVICE_CONTROL und 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 und 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 und IRP_MN_QUERY_POWER
StartDevice- IRP_MN_START_DEVICE
WMI- WMI-Neben-IRPs
andere Treiberspezifische IRPs

Weitere Informationen finden Sie unter IRP Major Function Codes.

Parameters.Create

Systemdienstparameter für NtCreateFile.

Parameters.Create.SecurityContext

Parameters.Create.Options

Parameters.Create.FileAttributes

Parameters.Create.ShareAccess

Parameters.Create.EaLength

Parameters.CreatePipe

Systemdienstparameter fo NtCreateNamedPipeFile.

Parameters.CreatePipe.SecurityContext

Parameters.CreatePipe.Options

Parameters.CreatePipe.Reserved

Parameters.CreatePipe.ShareAccess

Parameters.CreatePipe.Parameters

Parameters.CreateMailslot

Systemdienstparameter für NtCreateMailslotFile.

Parameters.CreateMailslot.SecurityContext

Parameters.CreateMailslot.Options

Parameters.CreateMailslot.Reserved

Parameters.CreateMailslot.ShareAccess

Parameters.CreateMailslot.Parameters

Parameters.Read

Systemdienstparameter für NtReadFile-.

Parameters.Read.Length

Parameters.Read.Key

Parameters.Read.Flags

Parameters.Read.ByteOffset

Parameters.Write

Systemdienstparameter für NtWriteFile.

Parameters.Write.Length

Parameters.Write.Key

Parameters.Write.Flags

Parameters.Write.ByteOffset

Parameters.QueryDirectory

Systemdienstparameter für NtQueryDirectoryFile.

Parameters.QueryDirectory.Length

Parameters.QueryDirectory.FileName

Parameters.QueryDirectory.FileInformationClass

Parameters.QueryDirectory.FileIndex

Parameters.NotifyDirectory

Systemdienstparameter für NtNotifyChangeDirectoryFile.

Parameters.NotifyDirectory.Length

Parameters.NotifyDirectory.CompletionFilter

Parameters.NotifyDirectoryEx

Systemdienstparameter für NtNotifyChangeDirectoryFileEx.

Parameters.NotifyDirectoryEx.Length

Parameters.NotifyDirectoryEx.CompletionFilter

Parameters.NotifyDirectoryEx.DirectoryNotifyInformationClass

Parameters.QueryFile

Systemdienstparameter für NtQueryInformationFile.

Parameters.QueryFile.Length

Parameters.QueryFile.FileInformationClass

Parameters.SetFile

Systemdienstparameter für NtSetInformationFile.

Parameters.SetFile.Length

Parameters.SetFile.FileInformationClass

Parameters.SetFile.FileObject

Parameters.SetFile.ReplaceIfExists

Parameters.SetFile.AdvanceOnly

Parameters.SetFile.ClusterCount

Parameters.SetFile.DeleteHandle

Parameters.QueryEa

Systemdienstparameter für NtQueryEaFile.

Parameters.QueryEa.Length

Parameters.QueryEa.EaList

Parameters.QueryEa.EaListLength

Parameters.QueryEa.EaIndex

Parameters.SetEa

Systemdienstparameter für NtSetEaFile.

Parameters.SetEa.Length

Parameters.QueryVolume

Systemdienstparameter für NtQueryVolumeInformationFile.

Parameters.QueryVolume.Length

Parameters.QueryVolume.FsInformationClass

Parameters.SetVolume

Systemdienstparameter für NtSetVolumeInformationFile.

Parameters.SetVolume.Length

Parameters.SetVolume.FsInformationClass

Parameters.FileSystemControl

Systemdienstparameter für NtFsControlFile.

Parameters.FileSystemControl.OutputBufferLength

Parameters.FileSystemControl.InputBufferLength

Parameters.FileSystemControl.FsControlCode

Parameters.FileSystemControl.Type3InputBuffer

Parameters.LockControl

Systemdienstparameter für LockFile/NtUnlockFile.

Parameters.LockControl.Length

Parameters.LockControl.Key

Parameters.LockControl.ByteOffset

Parameters.DeviceIoControl

Systemdienstparameter für NtDeviceIoControlFile.

Parameters.DeviceIoControl.OutputBufferLength

Parameters.DeviceIoControl.InputBufferLength

Parameters.DeviceIoControl.IoControlCode

Parameters.DeviceIoControl.Type3InputBuffer

Parameters.QuerySecurity

Systemdienstparameter für NtQuerySecurityObject.

Parameters.QuerySecurity.SecurityInformation

Parameters.QuerySecurity.Length

Parameters.SetSecurity

Systemdienstparameter für NtSetSecurityObject.

Parameters.SetSecurity.SecurityInformation

Parameters.SetSecurity.SecurityDescriptor

Parameters.MountVolume

Systemdienstparameter für MountVolume.

Parameters.MountVolume.Vpb

Parameters.MountVolume.DeviceObject

Parameters.MountVolume.OutputBufferLength

Parameters.VerifyVolume

Systemdienstparameter für VerifyVolume.

Parameters.VerifyVolume.Vpb

Parameters.VerifyVolume.DeviceObject

Parameters.Scsi

Parameter für Scsi mit interner Gerätesteuerung.

Parameters.Scsi.Srb

Parameters.QueryQuota

Systemdienstparameter für NtQueryQuotaInformationFile.

Parameters.QueryQuota.Length

Parameters.QueryQuota.StartSid

Parameters.QueryQuota.SidList

Parameters.QueryQuota.SidListLength

Parameters.SetQuota

Systemdienstparameter für NtSetQuotaInformationFile.

Parameters.SetQuota.Length

Parameters.QueryDeviceRelations

Parameter für IRP_MN_QUERY_DEVICE_RELATIONS.

Parameters.QueryDeviceRelations.Type

Parameters.QueryInterface

Parameter für IRP_MN_QUERY_INTERFACE.

Parameters.QueryInterface.InterfaceType

Parameters.QueryInterface.Size

Parameters.QueryInterface.Version

Parameters.QueryInterface.Interface

Parameters.QueryInterface.InterfaceSpecificData

Parameters.DeviceCapabilities

Parameter für IRP_MN_QUERY_CAPABILITIES.

Parameters.DeviceCapabilities.Capabilities

Parameters.FilterResourceRequirements

Parameter für IRP_MN_FILTER_RESOURCE_REQUIREMENTS.

Parameters.FilterResourceRequirements.IoResourceRequirementList

Parameters.ReadWriteConfig

Parameter für IRP_MN_READ_CONFIG und IRP_MN_WRITE_CONFIG.

Parameters.ReadWriteConfig.WhichSpace

Parameters.ReadWriteConfig.Buffer

Parameters.ReadWriteConfig.Offset

Parameters.ReadWriteConfig.Length

Parameters.SetLock

Parameter für IRP_MN_SET_LOCK.

Parameters.SetLock.Lock

Parameters.QueryId

Parameter für IRP_MN_QUERY_ID.

Parameters.QueryId.IdType

Parameters.QueryDeviceText

Parameter für IRP_MN_QUERY_DEVICE_TEXT.

Parameters.QueryDeviceText.DeviceTextType

Parameters.QueryDeviceText.LocaleId

Parameters.UsageNotification

Parameter für IRP_MN_DEVICE_USAGE_NOTIFICATION.

Parameters.UsageNotification.InPath

Parameters.UsageNotification.Reserved[3]

Parameters.UsageNotification.Type

Parameters.WaitWake

Parameter für IRP_MN_WAIT_WAKE.

Parameters.WaitWake.PowerState

Parameters.PowerSequence

Parameter für IRP_MN_POWER_SEQUENCE.

Parameters.PowerSequence.PowerSequence

Parameters.Power

Parameter für IRP_MN_SET_POWER und IRP_MN_QUERY_POWER.

Parameters.Power.SystemContext

Parameters.Power.SystemPowerStateContext

Parameters.Power.Type

Parameters.Power.State

Parameters.Power.ShutdownType

Parameters.StartDevice

Parameter für StartDevice.

Parameters.StartDevice.AllocatedResources

Parameters.StartDevice.AllocatedResourcesTranslated

Parameters.WMI

Parameter für WMI-IRPs.

Parameters.WMI.ProviderId

Parameters.WMI.DataPath

Parameters.WMI.BufferSize

Parameters.WMI.Buffer

Parameters.Others

Parameter für andere treiberspezifische Vorgänge.

Parameters.Others.Argument1

Parameters.Others.Argument2

Parameters.Others.Argument3

Parameters.Others.Argument4

DeviceObject

Ein Zeiger auf die vom Treiber erstellte DEVICE_OBJECT Struktur, die das zielbasierte, logische oder virtuelle Gerät darstellt, für das dieser Treiber das IRP verarbeiten soll.

FileObject

Ein Zeiger auf eine FILE_OBJECT Struktur, die ggf. das Dateiobjekt darstellt, das DeviceObject Zeiger zugeordnet ist.

CompletionRoutine

Die Abschlussroutine, die abhängig von den Flags im Control Feld dieser Struktur aufgerufen wird.

Context

Treiberdefinierter Kontext, der zum Speichern der Adresse des Kontextparameters verwendet wird, der an die CompletionRoutine übergeben wird.

Bemerkungen

Für jedes IRP gibt es eine IO_STACK_LOCATION Struktur für jeden Treiber in einem Treiberstapel. Jeder IRP-Satz von I/O-Stapelspeicherorten wird an das IRP angefügt und folgt der IRP--Struktur.

Jeder Treiber auf höherer Ebene ist für die Einrichtung des I/O-Stapelstandorts für den nächsten niedrigeren Treiber in jedem IRP verantwortlich. Ein Treiber muss IoGetCurrentIrpStackLocation- aufrufen, um einen Zeiger auf seine eigene Stapelposition für jedes IRP abzurufen. Treiber auf höherer Ebene können IoGetNextIrpStackLocation- aufrufen, um einen Zeiger auf den Stapelspeicherort des nächsten niedrigeren Treibers zu erhalten.

Der Treiber auf höherer Ebene muss den Stapelspeicherortinhalt einrichten, bevor IoCallDriver- aufgerufen wird, um einen IRP an den Niedrigeren Treiber zu übergeben. Wenn der Treiber die Eingabe-IRP an den nächsten niedrigeren Treiber weitergibt, sollte die Dispatch-Routine IoSkipCurrentIrpStackLocation oder IoCopyCurrentIrpStackLocationToNext aufrufen, um die I/O-Stapelposition des nächsten unteren Treibers einzurichten.

Ein Aufruf des Treibers auf höherer Ebene an IoCallDriver legt das DeviceObject Mitglied auf das Zielgerätobjekt des nächsten niedrigeren Treibers im I/O-Stapel des unteren Treibers fest. Der I/O-Manager übergibt die IoCompletion jedes höheren Treibers routine einen Zeiger auf sein eigenes Geräteobjekt, wenn die IoCompletion- Routine nach Abschluss des IRP aufgerufen wird.

Wenn ein höherer Treiber IRPs zuweist, um Eigene Anforderungen zu stellen, wird seine IoCompletion- Routine an einen NULL-DeviceObject Zeiger übergeben, wenn dieser Treiber weder eine Stapelposition für sich selbst zuweist noch den DeviceObject Zeiger an seiner eigenen Stapelposition des neu zugewiesenen IRP einrichtet.

In einigen Fällen ist ein höherer Treiber, der über einen Massenspeichergerätetreiber angeordnet ist, verantwortlich für das Aufteilen großer Übertragungsanforderungen für den zugrunde liegenden Gerätetreiber. Insbesondere müssen SCSI-Klassentreiber die Parameters.Read.Length und Parameters.Write.Lengthüberprüfen, bestimmen, ob die Größe der angeforderten Übertragung die Übertragungsfunktionen der zugrunde liegenden HBA überschreitet und in diesem Falls dies der Length der ursprünglichen Anforderung in eine Sequenz von teilbasierten Übertragungen zur Erfüllung der ursprünglichen IRP entspricht.

Anforderungen

Anforderung Wert
Header- wdm.h (include Wdm.h, Ntddk.h, Ntifs.h)

Siehe auch

IO_STATUS_BLOCK

IRP-

IoCallDriver-

IoCopyCurrentIrpStackLocationToNext

IoGetCurrentIrpStackLocation

IoGetNextIrpStackLocation

IoSetCompletionRoutine

IoSetNextIrpStackLocation-

IoSkipCurrentIrpStackLocation