IO_STACK_LOCATION 구조체(wdm.h)

IO_STACK_LOCATION 구조체는 각 IRP와 연결된 I/O 스택의 항목인 I/O 스택 위치를 정의합니다. IRP의 각 I/O 스택 위치에는 몇 가지 공통 멤버와 일부 요청 유형별 멤버가 있습니다.

구문

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;

멤버

MajorFunction

수행할 I/O 작업의 형식을 나타내는 IRP 주 함수 코드 입니다.

MinorFunction

MajorFunction에 대한 하위 기능 코드입니다. PnP 관리자, 전원 관리자, 파일 시스템 드라이버 및 SCSI 클래스 드라이버는 일부 요청에 대해 이 멤버를 설정합니다.

Flags

요청 유형별 값은 파일 시스템 드라이버에서 거의 독점적으로 사용됩니다. 이동식 미디어 디바이스 드라이버는 이 멤버가 읽기 요청에 대해 SL_OVERRIDE_VERIFY_VOLUME 사용하여 설정되었는지 여부를 검사 디바이스 개체의 Flags가 DO_VERIFY_VOLUME 설정된 경우에도 읽기 작업을 계속할지 여부를 결정합니다. 이동식 미디어 디바이스 드라이버 위에 계층화된 중간 드라이버는 들어오는 모든 IRP_MJ_READ 요청에서 다음 하위 드라이버의 I/O 스택 위치에 이 멤버를 복사해야 합니다.

IRP_MJ_CREATE 다른 플래그에 SL_* 대한 설명서는 IRP_MJ_CREATE(IFS)를 참조하세요.

가능한 플래그 값은 다음과 같습니다.

플래그 Description
SL_KEY_SPECIFIED 0x01 중복성을 IO_STACK_LOCATION.Parameters.Read(OrWrite).Key 사용하도록 설정할 때 지정된 섹터의 복사본을 읽어야 하는 가 포함됨을 나타냅니다. 현재 이 플래그는 IRP_MJ_READ 작업에만 사용됩니다.
SL_OVERRIDE_VERIFY_VOLUME 0x02 이 플래그는 디바이스 개체의 Flags 가 DO_VERIFY_VOLUME 사용하여 설정된 경우에도 읽기 작업을 계속할지 여부를 결정하는 데 사용됩니다.
SL_WRITE_THROUGH 0x04 이 플래그는 디스크가 영구 스토리지 미디어에 쓰기를 강제하기 위해 디스크가 쓰기 캐시를 바이패스하도록 적절한 플래그를 설정하도록 스토리지 드라이버에 알릴 수 있습니다. 이 플래그는 디바이스에 따라 다릅니다. 모든 디스크 드라이브가 디스크 캐시 무시를 지원하지는 않습니다.
SL_FT_SEQUENTIAL_WRITE 0x08 시스템에서 사용하도록 예약되었습니다.
SL_FORCE_DIRECT_WRITE 0x10 이 플래그를 사용하면 커널 모드 드라이버가 파일 시스템 및 스토리지 드라이버 스택에서 직접 쓰기를 차단하여 일반적으로 쓸 수 없는 볼륨 영역에 쓸 수 있습니다. 직접 쓰기 차단은 보안을 개선하는 데 도움이 됩니다. 이 플래그는 파일 시스템 계층과 스토리지 스택 계층 모두에서 확인됩니다. 직접 쓰기 차단에 대한 자세한 내용은 볼륨 및 디스크에 대한 직접 쓰기 작업 차단을 참조하세요.
SL_REALTIME_STREAM 0x20 이 플래그는 IO가 CD-ROM 클래스 드라이버에 대한 실시간 스트리밍 요청을 위한 것임을 암시합니다. 이렇게 하면 드라이버가 실시간 스트리밍을 위해 보장된 속도로 읽기/쓰기 작업을 수행할 수 있음을 암시합니다. 이 플래그는 광학 미디어에서만 유효합니다.
SL_PERSISTENT_MEMORY_FIXED_MAPPING 0x20 쓰기 요청에서 바이트의 영구 메모리 매핑은 이 쓰기 요청을 처리하는 동안 변경할 수 없습니다. 이 플래그는 영구 메모리 디바이스 및 IRP_MJ_WRITE 경우에만 유효합니다.

영구 메모리 디바이스의 경우 영구 메모리 디바이스에서 다시 매핑(지정된 LBA의 실제 주소 수정)하는 이유 중 하나는 효율적인 섹터 수준 원자성을 제공하기 위해서입니다. 플래그가 설정되지 않은 경우 특히 드라이버가 섹터 원자성을 제공하는 경우 다시 매핑이 허용됩니다. 파일 시스템(또는 요청자)은 영구 메모리 디바이스 드라이버가 섹터 원자성을 제공하는 것을 선호합니다. 플래그가 설정된 경우 영구 메모리 드라이버는 LBA에 해당하는 실제 주소를 다시 매핑하지 않습니다. 즉, 섹터 원자성을 제공 할 수 없다는 것을 의미한다면 그렇게하십시오. 그러나 드라이버는 다시 매핑이 없는 한 섹터 원자성을 제공하는 것을 환영합니다.

Control

드라이버는 이 멤버를 검사 SL_PENDING_RETURNED 설정되었는지 여부와 CompletionRoutine이 호출되는 조건에서 설정할 수 있습니다. 드라이버는 이 멤버에 대한 읽기 전용 액세스 권한을 갖습니다. 드라이버는 IoSetCompletionRoutine 또는 IoSetCompletionRoutineEx 를 호출하여 이러한 조건을 지정합니다.

Parameters

MajorFunction 및 MinorFunction에 포함된 주 및 부 IRP 함수 코드 값에 의존하는 공용 구조체입니다. 다음 표에서는 매개 변수 공용 구조체의 개별 멤버를 사용하는 IRP를 보여줍니다.

멤버 이름 이 멤버를 사용하는 IRP
만들기 IRP_MJ_CREATE
읽기 IRP_MJ_READ
쓰기 IRP_MJ_WRITE
QueryFile IRP_MJ_QUERY_INFORMATION
SetFile IRP_MJ_SET_INFORMATION
QueryVolume IRP_MJ_QUERY_VOLUME_INFORMATION
DeviceIoControl IRP_MJ_DEVICE_CONTROLIRP_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_CONFIGIRP_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_POWERIRP_MN_QUERY_POWER
StartDevice IRP_MN_START_DEVICE
WMI WMI 부 IRP
기타 드라이버별 IRP

자세한 내용은 IRP 주요 함수 코드를 참조하세요.

Parameters.Create

NtCreateFile에 대한 시스템 서비스 매개 변수입니다.

Parameters.Create.SecurityContext

Parameters.Create.Options

Parameters.Create.FileAttributes

Parameters.Create.ShareAccess

Parameters.Create.EaLength

Parameters.CreatePipe

NtCreateNamedPipeFile에 대한 시스템 서비스 매개 변수입니다.

Parameters.CreatePipe.SecurityContext

Parameters.CreatePipe.Options

Parameters.CreatePipe.Reserved

Parameters.CreatePipe.ShareAccess

Parameters.CreatePipe.Parameters

Parameters.CreateMailslot

NtCreateMailslotFile에 대한 시스템 서비스 매개 변수입니다.

Parameters.CreateMailslot.SecurityContext

Parameters.CreateMailslot.Options

Parameters.CreateMailslot.Reserved

Parameters.CreateMailslot.ShareAccess

Parameters.CreateMailslot.Parameters

Parameters.Read

NtReadFile에 대한 시스템 서비스 매개 변수입니다.

Parameters.Read.Length

Parameters.Read.Key

Parameters.Read.Flags

Parameters.Read.ByteOffset

Parameters.Write

NtWriteFile에 대한 시스템 서비스 매개 변수입니다.

Parameters.Write.Length

Parameters.Write.Key

Parameters.Write.Flags

Parameters.Write.ByteOffset

Parameters.QueryDirectory

NtQueryDirectoryFile에 대한 시스템 서비스 매개 변수입니다.

Parameters.QueryDirectory.Length

Parameters.QueryDirectory.FileName

Parameters.QueryDirectory.FileInformationClass

Parameters.QueryDirectory.FileIndex

Parameters.NotifyDirectory

NtNotifyChangeDirectoryFile에 대한 시스템 서비스 매개 변수입니다.

Parameters.NotifyDirectory.Length

Parameters.NotifyDirectory.CompletionFilter

Parameters.NotifyDirectoryEx

NtNotifyChangeDirectoryFileEx에 대한 시스템 서비스 매개 변수입니다.

Parameters.NotifyDirectoryEx.Length

Parameters.NotifyDirectoryEx.CompletionFilter

Parameters.NotifyDirectoryEx.DirectoryNotifyInformationClass

Parameters.QueryFile

NtQueryInformationFile에 대한 시스템 서비스 매개 변수입니다.

Parameters.QueryFile.Length

Parameters.QueryFile.FileInformationClass

Parameters.SetFile

NtSetInformationFile에 대한 시스템 서비스 매개 변수입니다.

Parameters.SetFile.Length

Parameters.SetFile.FileInformationClass

Parameters.SetFile.FileObject

Parameters.SetFile.ReplaceIfExists

Parameters.SetFile.AdvanceOnly

Parameters.SetFile.ClusterCount

Parameters.SetFile.DeleteHandle

Parameters.QueryEa

NtQueryEaFile에 대한 시스템 서비스 매개 변수입니다.

Parameters.QueryEa.Length

Parameters.QueryEa.EaList

Parameters.QueryEa.EaListLength

Parameters.QueryEa.EaIndex

Parameters.SetEa

NtSetEaFile에 대한 시스템 서비스 매개 변수입니다.

Parameters.SetEa.Length

Parameters.QueryVolume

NtQueryVolumeInformationFile에 대한 시스템 서비스 매개 변수입니다.

Parameters.QueryVolume.Length

Parameters.QueryVolume.FsInformationClass

Parameters.SetVolume

NtSetVolumeInformationFile에 대한 시스템 서비스 매개 변수입니다.

Parameters.SetVolume.Length

Parameters.SetVolume.FsInformationClass

Parameters.FileSystemControl

NtFsControlFile에 대한 시스템 서비스 매개 변수입니다.

Parameters.FileSystemControl.OutputBufferLength

Parameters.FileSystemControl.InputBufferLength

Parameters.FileSystemControl.FsControlCode

Parameters.FileSystemControl.Type3InputBuffer

Parameters.LockControl

LockFile/NtUnlockFile에 대한 시스템 서비스 매개 변수입니다.

Parameters.LockControl.Length

Parameters.LockControl.Key

Parameters.LockControl.ByteOffset

Parameters.DeviceIoControl

NtDeviceIoControlFile에 대한 시스템 서비스 매개 변수입니다.

Parameters.DeviceIoControl.OutputBufferLength

Parameters.DeviceIoControl.InputBufferLength

Parameters.DeviceIoControl.IoControlCode

Parameters.DeviceIoControl.Type3InputBuffer

Parameters.QuerySecurity

NtQuerySecurityObject에 대한 시스템 서비스 매개 변수입니다.

Parameters.QuerySecurity.SecurityInformation

Parameters.QuerySecurity.Length

Parameters.SetSecurity

NtSetSecurityObject에 대한 시스템 서비스 매개 변수입니다.

Parameters.SetSecurity.SecurityInformation

Parameters.SetSecurity.SecurityDescriptor

Parameters.MountVolume

MountVolume에 대한 시스템 서비스 매개 변수입니다.

Parameters.MountVolume.Vpb

Parameters.MountVolume.DeviceObject

Parameters.MountVolume.OutputBufferLength

Parameters.VerifyVolume

VerifyVolume에 대한 시스템 서비스 매개 변수입니다.

Parameters.VerifyVolume.Vpb

Parameters.VerifyVolume.DeviceObject

Parameters.Scsi

내부 디바이스 제어를 사용하는 Scsi에 대한 매개 변수입니다.

Parameters.Scsi.Srb

Parameters.QueryQuota

NtQueryQuotaInformationFile에 대한 시스템 서비스 매개 변수입니다.

Parameters.QueryQuota.Length

Parameters.QueryQuota.StartSid

Parameters.QueryQuota.SidList

Parameters.QueryQuota.SidListLength

Parameters.SetQuota

NtSetQuotaInformationFile에 대한 시스템 서비스 매개 변수입니다.

Parameters.SetQuota.Length

Parameters.QueryDeviceRelations

IRP_MN_QUERY_DEVICE_RELATIONS 대한 매개 변수입니다.

Parameters.QueryDeviceRelations.Type

Parameters.QueryInterface

IRP_MN_QUERY_INTERFACE 대한 매개 변수입니다.

Parameters.QueryInterface.InterfaceType

Parameters.QueryInterface.Size

Parameters.QueryInterface.Version

Parameters.QueryInterface.Interface

Parameters.QueryInterface.InterfaceSpecificData

Parameters.DeviceCapabilities

IRP_MN_QUERY_CAPABILITIES 대한 매개 변수입니다.

Parameters.DeviceCapabilities.Capabilities

Parameters.FilterResourceRequirements

IRP_MN_FILTER_RESOURCE_REQUIREMENTS 매개 변수입니다.

Parameters.FilterResourceRequirements.IoResourceRequirementList

Parameters.ReadWriteConfig

IRP_MN_READ_CONFIG 및 IRP_MN_WRITE_CONFIG 대한 매개 변수입니다.

Parameters.ReadWriteConfig.WhichSpace

Parameters.ReadWriteConfig.Buffer

Parameters.ReadWriteConfig.Offset

Parameters.ReadWriteConfig.Length

Parameters.SetLock

IRP_MN_SET_LOCK 대한 매개 변수입니다.

Parameters.SetLock.Lock

Parameters.QueryId

IRP_MN_QUERY_ID 매개 변수입니다.

Parameters.QueryId.IdType

Parameters.QueryDeviceText

IRP_MN_QUERY_DEVICE_TEXT 매개 변수입니다.

Parameters.QueryDeviceText.DeviceTextType

Parameters.QueryDeviceText.LocaleId

Parameters.UsageNotification

IRP_MN_DEVICE_USAGE_NOTIFICATION 대한 매개 변수입니다.

Parameters.UsageNotification.InPath

Parameters.UsageNotification.Reserved[3]

Parameters.UsageNotification.Type

Parameters.WaitWake

IRP_MN_WAIT_WAKE 대한 매개 변수입니다.

Parameters.WaitWake.PowerState

Parameters.PowerSequence

IRP_MN_POWER_SEQUENCE 매개 변수입니다.

Parameters.PowerSequence.PowerSequence

Parameters.Power

IRP_MN_SET_POWER 및 IRP_MN_QUERY_POWER 대한 매개 변수입니다.

Parameters.Power.SystemContext

Parameters.Power.SystemPowerStateContext

Parameters.Power.Type

Parameters.Power.State

Parameters.Power.ShutdownType

Parameters.StartDevice

StartDevice에 대한 매개 변수입니다.

Parameters.StartDevice.AllocatedResources

Parameters.StartDevice.AllocatedResourcesTranslated

Parameters.WMI

WMI IRP에 대한 매개 변수입니다.

Parameters.WMI.ProviderId

Parameters.WMI.DataPath

Parameters.WMI.BufferSize

Parameters.WMI.Buffer

Parameters.Others

다른 드라이버 관련 작업에 대한 매개 변수입니다.

Parameters.Others.Argument1

Parameters.Others.Argument2

Parameters.Others.Argument3

Parameters.Others.Argument4

DeviceObject

이 드라이버가 IRP를 처리할 대상 물리적, 논리적 또는 가상 디바이스를 나타내는 드라이버에서 만든 DEVICE_OBJECT 구조체에 대한 포인터입니다.

FileObject

DeviceObject 포인터와 연결된 파일 개체(있는 경우)를 나타내는 FILE_OBJECT 구조체에 대한 포인터입니다.

CompletionRoutine

이 구조체의 제어 필드에 있는 플래그에 따라 호출되는 완료 루틴입니다.

Context

CompletionRoutine에 전달되는 컨텍스트 매개 변수의 주소를 저장하는 데 사용되는 드라이버 정의 컨텍스트입니다.

설명

각 IRP에 대해 드라이버 스택의 각 드라이버에 대해 하나의 IO_STACK_LOCATION 구조가 있습니다. IRP 구조에 따라 각 IRP의 I/O 스택 위치 집합이 IRP 에 추가됩니다.

모든 상위 수준 드라이버는 각 IRP에서 다음 하위 드라이버에 대한 I/O 스택 위치를 설정하는 역할을 담당합니다. 드라이버는 IoGetCurrentIrpStackLocation 을 호출하여 각 IRP에 대한 자체 스택 위치에 대한 포인터를 가져와야 합니다. 상위 수준 드라이버는 IoGetNextIrpStackLocation 을 호출하여 다음으로 낮은 드라이버의 스택 위치에 대한 포인터를 가져올 수 있습니다.

상위 수준 드라이버는 IRP를 하위 수준 드라이버에 전달하기 위해 IoCallDriver 를 호출하기 전에 스택 위치 콘텐츠를 설정해야 합니다. 드라이버가 입력 IRP를 다음 하위 수준 드라이버에 전달하는 경우 디스패치 루틴은 IoSkipCurrentIrpStackLocation 또는 IoCopyCurrentIrpStackLocationToNext 를 호출하여 다음 하위 드라이버의 I/O 스택 위치를 설정해야 합니다.

IoCallDriver에 대한 상위 수준 드라이버 호출은 DeviceObject 멤버를 하위 드라이버의 I/O 스택 위치에 있는 다음 하위 수준 드라이버의 대상 디바이스 개체로 설정합니다. I/O 관리자는 IRP 완료 시 IoCompletion 루틴이 호출될 때 각 상위 수준 드라이버의 IoCompletion 루틴을 자체 디바이스 개체에 대한 포인터로 전달합니다.

상위 수준 드라이버가 자체 요청을 위해 IRP를 할당하는 경우 해당 드라이버가 자체적으로 스택 위치를 할당하거나 새로 할당된 IRP의 자체 스택 위치에 DeviceObject 포인터를 설정하지 않으면 해당 IoCompletion 루틴이 NULLDeviceObject 포인터로 전달됩니다.

경우에 따라 대용량 스토리지 디바이스 드라이버를 통해 계층화된 상위 수준 드라이버는 기본 디바이스 드라이버에 대한 대규모 전송 요청을 분할해야 합니다. 특히 SCSI 클래스 드라이버는 Parameters.Read.LengthParameters.Write.Length를 검사 요청된 전송 크기가 기본 HBA의 전송 기능을 초과하는지 여부를 확인하고, 이 경우 원래 요청의 길이를 부분 전송 시퀀스로 분할하여 원래 IRP를 충족해야 합니다.

요구 사항

요구 사항
헤더 wdm.h(Wdm.h, Ntddk.h, Ntifs.h 포함)

추가 정보

IO_STATUS_BLOCK

IRP

IoCallDriver

IoCopyCurrentIrpStackLocationToNext

IoGetCurrentIrpStackLocation

IoGetNextIrpStackLocation

IoSetCompletionRoutine

IoSetNextIrpStackLocation

IoSkipCurrentIrpStackLocation