IO_STACK_LOCATION-Struktur (wdm.h)

Die IO_STACK_LOCATION-Struktur definiert einen E/A-Stapelspeicherort, bei dem es sich um einen Eintrag im E/A-Stapel handelt, der jedem IRP zugeordnet ist. Jeder E/A-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;

Member

MajorFunction

Der IRP-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 dieses Element 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 zu bestimmen, ob der Lesevorgang fortgesetzt werden soll, auch wenn die Flags des Geräteobjekts mit DO_VERIFY_VOLUME festgelegt sind. Zwischentreiber, die über einen Wechselmediengerätetreiber übertragen werden, müssen diesen Member in alle eingehenden IRP_MJ_READ Anforderungen in den E/A-Stapelspeicherort des nächstniedrigen Treibers kopieren.

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

Mögliche Flagwerte sind:

Flag Wert BESCHREIBUNG
SL_KEY_SPECIFIED 0x01 Gibt an, dass enthält IO_STACK_LOCATION.Parameters.Read(OrWrite).Key , welche Kopie eines bestimmten Sektors gelesen werden soll, wenn Redundanz aktiviert ist. Heute wird dieses Flag nur mit IRP_MJ_READ-Vorgängen verwendet.
SL_OVERRIDE_VERIFY_VOLUME 0x02 Dieses Flag wird verwendet, um zu bestimmen, 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 auf seine persistenten Speichermedien schreibt. Dieses Flag ist gerätespezifisch; nicht alle Datenträger unterstützen die Umgehung des Datenträgercaches.
SL_FT_SEQUENTIAL_WRITE 0x08 Ist für das System reserviert.
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. Die direkte Schreibblockierung trägt zur Verbesserung der Sicherheit bei. Dieses Flag wird sowohl auf der Dateisystem- als auch auf der Speicherstapelebene überprüft. Weitere Informationen zur Blockierung von direkten Schreibvorgängen finden Sie unter Blocking Direct Write Operations to Volumes and Disks.For more information about direct write blocking, see Blocking Direct Write Operations to Volumes and Disks.For more information about direct write blocking, see Blocking Direct Write Operations to Volumes and Disk
SL_REALTIME_STREAM 0x20 Dieses Flag weist darauf hin, dass E/A für Echtzeitstreaminganforderungen an einen CD-ROM-Klassentreiber vorgesehen ist. Dies weist den Treiber darauf hin, LESE-/SCHREIBvorgänge mit einer garantierten Geschwindigkeit für das Echtzeitstreaming auszuführen. Dieses Flag ist nur für optische Medien gültig.
SL_PERSISTENT_MEMORY_FIXED_MAPPING 0x20 Die Zuordnung des persistenten Arbeitsspeichers der Bytes in der Schreibanforderung kann sich während der Verarbeitung dieser Schreibanforderung nicht ändern. Dieses Flag ist nur für ein Gerät mit persistentem Speicher und IRP_MJ_WRITE gültig.

Bei Geräten mit beständigem Speicher ist einer der Gründe für die Neuzuordnung (Ändern der physischen Adresse eines bestimmten LBA) auf Geräten mit persistentem Speicher eine effiziente Atomarität auf Sektorebene. Wenn das Flag nicht festgelegt ist, ist die Neuzuordnung zulässig, insbesondere wenn der Treiber die Atomarität des Sektors bereitstellt. Dateisysteme (oder der Anforderer) bevorzugen, dass ein Treiber für beständigen Speicher für sektorspezifische Atomarität sorgt. Wenn das Flag festgelegt ist, darf ein Treiber für beständigen Speicher die physischen Adressen, die den LBAs entsprechen, nicht neu zuordnen. Wenn dies bedeutet, dass sektorspezifische Atomarität nicht bereitgestellt werden kann, sei es also. Der Fahrer ist jedoch mehr als willkommen, sektorale Atomarität bereitzustellen, solange es keine Neuzuordnung gibt.

Control

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

Parameters

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

Membername IRPs, die diesen Member verwenden
Erstellen IRP_MJ_CREATE
Lesen 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
Energie 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-Hauptfunktionscodes.

Parameters.Create

Systemdienstparameter für NtCreateFile.

Parameters.Create.SecurityContext

Parameters.Create.Options

Parameters.Create.FileAttributes

Parameters.Create.ShareAccess

Parameters.Create.EaLength

Parameters.CreatePipe

Systemdienstparameter für 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 physische, logische oder virtuelle Zielgerät darstellt, für das dieser Treiber die IRP verarbeiten soll.

FileObject

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

CompletionRoutine

Die Vervollständigungsroutine, die abhängig von den Flags im Steuerelementfeld dieser Struktur aufgerufen wird.

Context

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

Hinweise

Für jeden IRP gibt es eine IO_STACK_LOCATION-Struktur für jeden Treiber in einem Treiberstapel. Jeder IRP-Satz von E/A-Stapelspeicherorten wird gemäß der IRP-Struktur an den IRP angefügt.

Jeder Treiber auf höherer Ebene ist für die Einrichtung des E/A-Stapelspeicherorts für den nächstniedrigen Treiber in jedem IRP verantwortlich. Ein Treiber muss IoGetCurrentIrpStackLocation aufrufen, um einen Zeiger auf seinen eigenen Stapelspeicherort für jedes IRP abzurufen. Treiber auf höherer Ebene können IoGetNextIrpStackLocation aufrufen, um einen Zeiger auf den Stapelspeicherort des nächstniedrigen Treibers zu erhalten.

Der Treiber auf höherer Ebene muss den Inhalt des Stapelspeicherorts einrichten, bevor IoCallDriver aufgerufen wird, um ein IRP an den Treiber der niedrigeren Ebene zu übergeben. Wenn der Treiber die Eingabe-IRP an den nächsten Treiber auf niedrigerer Ebene weiterleitet, sollte die Dispatchroutine IoSkipCurrentIrpStackLocation oder IoCopyCurrentIrpStackLocationToNext aufrufen, um den E/A-Stapelspeicherort des nächstniedrigen Treibers einzurichten.

Der Aufruf eines Treibers auf höherer Ebene an IoCallDriver legt das DeviceObject-Element auf das Zielgerätobjekt des Treibers der nächsten niedrigeren Ebene in der E/A-Stapelposition des unteren Treibers fest. Der E/A-Manager übergibt die IoCompletion-Routine jedes übergeordneten Treibers einen Zeiger auf sein eigenes Geräteobjekt, wenn die IoCompletion-Routine nach Abschluss des IRP aufgerufen wird.

Wenn ein Treiber auf höherer Ebene IRPs zuweist, um eigene Anforderungen zu stellen, wird seiner IoCompletion-Routine ein Null-DeviceObject-Zeiger übergeben, wenn dieser Treiber weder einen Stapelspeicherort für sich selbst zuordnet noch den DeviceObject-Zeiger in seinem eigenen Stapelspeicherort des neu zugeordneten IRP einrichtet.

In einigen Fällen ist ein treiber höherer Ebene, der über einen Massenspeichergerätetreiber überlagert ist, für die Aufteilung großer Übertragungsanforderungen für den zugrunde liegenden Gerätetreiber verantwortlich. Insbesondere müssen SCSI-Klassentreiber die Parameter.Read.Length und Parameters.Write.Length überprüfen, bestimmen, ob die Größe der angeforderten Übertragung die übertragungsfunktionen des zugrunde liegenden HBA überschreitet, und, falls ja, die Länge der ursprünglichen Anforderung in eine Sequenz von Teilübertragungen aufteilen, um die ursprüngliche IRP zu erfüllen.

Anforderungen

Anforderung Wert
Header wdm.h (einschließlich Wdm.h, Ntddk.h, Ntifs.h)

Weitere Informationen

IO_STATUS_BLOCK

IRP

IoCallDriver

IoCopyCurrentIrpStackLocationToNext

IoGetCurrentIrpStackLocation

IoGetNextIrpStackLocation

IoSetCompletionRoutine

IoSetNextIrpStackLocation

IoSkipCurrentIrpStackLocation