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
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_CONTROL 및 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 및 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 및 IRP_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.Length 및 Parameters.Write.Length확인해야 하며, 요청된 전송의 크기가 기본 HBA의 전송 기능을 초과하는지 여부를 확인하고, 이 경우 원래 요청의 Length 부분 전송 시퀀스로 분할하여 원래 IRP를 충족해야 합니다.
요구 사항
요구 | 값 |
---|---|
헤더 | wdm.h(Wdm.h, Ntddk.h, Ntifs.h 포함) |
참고 항목
IRP