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
Feedback
https://aka.ms/ContentUserFeedback.
Bald verfügbar: Im Laufe des Jahres 2024 werden wir GitHub-Issues stufenweise als Feedbackmechanismus für Inhalte abbauen und durch ein neues Feedbacksystem ersetzen. Weitere Informationen finden Sie unterFeedback senden und anzeigen für