다음을 통해 공유


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

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

MinorFunction

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

Flags

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

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

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

묘사
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

MajorFunctionMinorFunction포함된 주 및 부 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

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

Context

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

발언

각 IRP에 대해 드라이버 스택각 드라이버에 대해 하나의 IO_STACK_LOCATION 구조가 있습니다. 각 IRP의 I/O 스택 위치 집합은 IRP 구조에 따라 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의 전송 기능을 초과하는지 여부를 확인하고, 이 경우 원래 요청의 Length 부분 전송 시퀀스로 분할하여 원래 IRP를 충족해야 합니다.

요구 사항

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

참고 항목

IO_STATUS_BLOCK

IRP

IoCallDriver

IoCopyCurrentIrpStackLocationToNext

IoGetCurrentIrpStackLocation

IoGetNextIrpStackLocation

IoSetCompletionRoutine

IoSetNextIrpStackLocation

IoSkipCurrentIrpStackLocation