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를 호출하여 완료해야 합니다. I/O 관리자는 IoCompleteRequest가 호출된 후 이러한 동기 IRP를 해제하므로 IoBuildSynchronousFsdRequest를 호출하는 드라이버는 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