다음을 통해 공유


IoSkipCurrentIrpStackLocation 함수(wdm.h)

IoSkipCurrentIrpStackLocation 매크로는 시스템의 IO_STACK_LOCATION 배열 포인터를 수정하므로 현재 드라이버가 다음 하위 드라이버를 호출할 때 해당 드라이버는 현재 드라이버가 받은 것과 동일한 IO_STACK_LOCATION 구조를 받습니다.

구문

void IoSkipCurrentIrpStackLocation(
  [in, out] PIRP Irp
);

매개 변수

[in, out] Irp

IRP에 대한 포인터입니다.

반환 값

없음

설명

드라이버가 IRP를 다음 하위 드라이버로 보내면 IoCompletion 루틴(드라이버의 IO_STACK_LOCATION 구조에 저장된 주소)을 제공하지 않으려는 경우 드라이버가 IoSkipCurrentIrpStackLocation을 호출할 수 있습니다. IoCallDriver를 호출하기 전에 IoSkipCurrentIrpStackLocation을 호출하는 경우 다음 하위 드라이버는 드라이버가 받은 것과 동일한 IO_STACK_LOCATION 받습니다.

IRP에 대한 IoCompletion 루틴을 제공하려는 경우 드라이버는 IoSkipCurrentIrpStackLocation 대신 IoCopyCurrentIrpStackLocationToNext를 호출해야 합니다. 잘못 작성된 드라이버가 IoSkipCurrentIrpStackLocation 을 호출한 다음 완료 루틴을 설정하는 실수를 하는 경우 이 드라이버는 위의 드라이버에서 설정한 완료 루틴을 덮어쓸 수 있습니다.

드라이버가 IRP를 보류한 경우 드라이버는 IRP를 다음 하위 드라이버로 전달하기 전에 IoSkipCurrentIrpStackLocation 을 호출하지 않아야 합니다. 드라이버가 보류 중인 IRP에서 IoSkipCurrentIrpStackLocation 을 호출한 후 다음 하위 드라이버에 전달하면 다음 드라이버에 대한 I/O 스택 위치의 Control 멤버에서 SL_PENDING_RETURNED 플래그가 설정됩니다. 다음 드라이버는 해당 스택 위치를 소유하고 수정할 수 있으므로 보류 중인 플래그를 지울 수 있습니다. 이 경우 운영 체제에서 버그 검사 실행하거나 IRP 처리가 완료되지 않을 수 있습니다.

대신 IRP를 보류한 드라이버는 IoCallDriver를 호출하기 전에 IoCopyCurrentIrpStackLocationToNext를 호출하여 다음 하위 드라이버에 대한 새 스택 위치를 설정해야 합니다.

드라이버가 IoSkipCurrentIrpStackLocation을 호출하는 경우 해당 드라이버와 관련하여 의도치 않게 낮은 드라이버 또는 시스템의 동작에 영향을 줄 수 있는 방식으로 IO_STACK_LOCATION 구조를 수정하지 않도록 주의해야 합니다. 예를 들어 IO_STACK_LOCATION 구조체의 매개 변수 공용 구조체를 수정하거나 IoMarkIrpPending을 호출하는 것이 있습니다.

요구 사항

요구 사항
지원되는 최소 클라이언트 Windows 2000
머리글 wdm.h
IRQL 모든 수준