다음을 통해 공유


IoBuildSynchronousFsdRequest 함수(wdm.h)

IoBuildSynchronousFsdRequest 루틴은 동기적으로 처리된 I/O 요청에 대해 IRP를 할당하고 설정합니다.

통사론

__drv_aliasesMem PIRP IoBuildSynchronousFsdRequest(
  [in]           ULONG            MajorFunction,
  [in]           PDEVICE_OBJECT   DeviceObject,
  [in, out]      PVOID            Buffer,
  [in, optional] ULONG            Length,
  [in, optional] PLARGE_INTEGER   StartingOffset,
  [in]           PKEVENT          Event,
  [out]          PIO_STATUS_BLOCK IoStatusBlock
);

매개 변수

[in] MajorFunction

IRP의 주요 함수 코드입니다. 이 코드는 IRP_MJ_PNP, IRP_MJ_READ, IRP_MJ_WRITE, IRP_MJ_FLUSH_BUFFERS또는 IRP_MJ_SHUTDOWN수 있습니다.

[in] DeviceObject

대상 디바이스를 나타내는 다음 하위 드라이버의 디바이스 개체에 대한 DEVICE_OBJECT 구조체에 대한 포인터입니다.

[in, out] Buffer

데이터 버퍼에 대한 포인터입니다. MajorFunctionIRP_MJ_WRITE경우 버퍼에 기록할 데이터가 포함됩니다. MajorFunctionIRP_MJ_READ경우 버퍼는 데이터를 받습니다. MajorFunctionIRP_MJ_FLUSH_BUFFERS 또는 IRP_MJ_SHUTDOWN경우 이 매개 변수는 NULL 합니다.

[in, optional] Length

버퍼 가리키는 버퍼의 길이(바이트)입니다. 디스크와 같은 디바이스의 경우 이 값은 섹터 크기의 정수 배수여야 합니다. Windows 8부터 섹터 크기는 4,096 또는 512바이트일 수 있습니다. 이전 버전의 Windows에서는 섹터 크기가 항상 512바이트입니다. 이 매개 변수는 읽기 및 쓰기 요청에 필요하지만 플러시 및 종료 요청에는 0이어야 합니다.

[in, optional] StartingOffset

읽기 및 쓰기 요청에 대한 디스크의 오프셋에 대한 포인터입니다. 이 값의 단위와 의미는 드라이버별로 다릅니다. 이 매개 변수는 읽기 및 쓰기 요청에 필요하지만 플러시 및 종료 요청에는 0이어야 합니다.

[in] Event

호출자가 할당하고 초기화된 이벤트 개체에 대한 포인터입니다. I/O 관리자는 하위 수준 드라이버가 요청된 작업을 완료할 때 이벤트를 Signaled 상태로 설정합니다. IoCallDriver호출한 후 드라이버는 이벤트 개체를 기다릴 수 있습니다.

[out] IoStatusBlock

하위 수준 드라이버에서 IRP를 완료할 때 설정되는 I/O 상태 블록을 수신하는 위치에 대한 포인터입니다.

반환 값

작업이 성공하면 IoBuildSynchronousFsdRequest 제공된 매개 변수에서 설정된 다음 하위 드라이버의 I/O 스택 위치를 사용하여 초기화된 IRP 구조에 대한 포인터를 반환합니다. 그렇지 않으면 루틴은 NULL반환합니다.

발언

FSD(파일 시스템 드라이버) 또는 기타 상위 수준 드라이버는 IoBuildSynchronousFsdRequest 호출하여 하위 수준 드라이버에 동기적으로 보내는 IRP를 설정할 수 있습니다.

IoBuildSynchronousFsdRequest 동기 읽기, 쓰기, 플러시 또는 종료 작업을 수행하도록 하위 수준 드라이버를 요청하는 IRP를 할당하고 설정합니다. IRP에는 작업을 시작하기에 충분한 정보가 포함되어 있습니다.

하위 수준 드라이버는 이 루틴에 제공된 매개 변수에 제한을 적용할 수 있습니다. 예를 들어 디스크 드라이버는 LengthStartingOffset에 제공된 값이 디바이스 섹터 크기의 정수 배수여야 수 있습니다.

IoBuildSynchronousFsdRequest 호출하여 요청을 만든 후 드라이버는 IoCallDriver 호출하여 다음 하위 드라이버로 요청을 보내야 합니다. IoCallDriver STATUS_PENDING 반환하는 경우 드라이버는 지정된 이벤트KeWaitForSingleObject 호출하여 IRP가 완료될 때까지 기다려야 합니다. 대부분의 드라이버는 IRP에 대한 IoCompletion 루틴을 설정할 필요가 없습니다.

IoBuildSynchronousFsdRequest 만든 IRP는 드라이버가 IoCompleteRequest 호출하여 완료해야 합니다. IoBuildSynchronousFsdRequest 호출하는 드라이버는 IoCompleteRequest 호출된 후 I/O 관리자가 이러한 동기 IR P를 해제하므로 IoFreeIrp호출해서는 안 됩니다.

IoBuildSynchronousFsdRequest 현재 스레드와 관련된 IRP 큐에 만드는 IRP를 큐에 추가합니다. 스레드가 종료되면 I/O 관리자가 IRP를 취소합니다.

요구 사항

요구
지원되는 최소 클라이언트 Windows 2000부터 사용할 수 있습니다.
대상 플랫폼 보편적
헤더 wdm.h(Wdm.h, Ntddk.h, Ntifs.h 포함)
라이브러리 NtosKrnl.lib
DLL NtosKrnl.exe
IRQL <= APC_LEVEL
DDI 규정 준수 규칙 ForwardedAtBadIrqlFsdSync(wdm), HwStorPortProhibitedDDIs(storport), IoBuildSynchronousFsdRequestNoFree(wdm), IoBuildSynchronousFsdRequestWait(wdm), IoBuildSynchronousFsdRequestWaitTimeout(wdm), PowerIrpDDis(wdm), SignalEventInCompletion(wdm)

참고 항목

IO_STACK_LOCATION

IRP

IoAllocateIrp

IoBuildAsynchronousFsdRequest

IoBuildDeviceIoControlRequest

IoCompleteRequest

KeInitializeEvent

KeWaitForSingleObject