IRP_MJ_WRITE(IFS)
보낸 경우
IRP_MJ_WRITE 요청은 I/O 관리자 또는 파일 시스템 드라이버에 의해 전송됩니다. 예를 들어 사용자 모드 애플리케이션이 WriteFile 과 같은 Microsoft Win32 함수를 호출하거나 커널 모드 구성 요소가 ZwWriteFile을 호출한 경우 이 요청을 보낼 수 있습니다.
작업: 파일 시스템 드라이버
파일 시스템 드라이버는 파일 개체를 추출하고 디코딩하여 매개 변수 및 부 함수 코드를 결정해야 합니다.
MDL 쓰기 요청의 경우 파일 시스템은 부 함수 코드를 확인하여 요청되는 작업을 결정해야 합니다. 다음은 캐시된 파일 I/O에만 사용할 수 있는 유효한 부 함수 코드입니다.
IRP_MN_COMPLETE
IRP_MN_COMPLETE_MDL
IRP_MN_COMPLETE_MDL_DPC
IRP_MN_COMPRESSED
IRP_MN_DPC
IRP_MN_MDL
IRP_MN_MDL_DPC
IRP_MN_NORMAL
이 IRP를 처리하는 방법에 대한 자세한 내용은 WDK(Windows Driver Kit)에 포함된 FASTFAT 샘플을 참조하세요.
작업: 파일 시스템 필터 드라이버
필터 드라이버는 필요한 모든 처리를 수행해야 하며 필터의 특성에 따라 IRP를 완료하거나 실패하거나 스택의 다음 하위 드라이버에 전달해야 합니다.
매개 변수
파일 시스템 또는 필터 드라이버는 지정된 IRP를 사용하여 IoGetCurrentIrpStackLocation 을 호출하여 IRP의 자체 스택 위치에 대한 포인터를 가져옵니다. IrpSp로 다음 목록에 나와 있습니다. (IRP는 Irp로 표시됩니다.) 드라이버는 만들기 요청을 처리할 때 IRP 및 IRP 스택 위치의 다음 멤버에 설정된 정보를 사용할 수 있습니다.
대상 디바이스 개체에 대한 포인터입니다.
Irp-AssociatedIrp.SystemBuffer>
DO_BUFFERED_IO 플래그가 DeviceObject-Flags>에 설정된 경우 중간 시스템 버퍼로 사용할 시스템 제공 버퍼에 대한 포인터입니다. 그렇지 않으면 이 멤버가 NULL로 설정됩니다.
요청된 작업에 대한 최종 완료 상태 및 정보를 수신하는 IO_STATUS_BLOCK 구조체에 대한 포인터입니다. IRP_MJ_WRITE 요청이 실패하면 파일 시스템의 쓰기 디스패치 루틴은 오류 NTSTATUS 값을 반환하고 Irp-IoStatus.Information> 값은 정의되지 않으므로 사용하면 안 됩니다.
데이터를 쓸 페이지를 설명하는 MDL(메모리 설명자 목록)의 주소입니다.
DeviceObject와 연결된 파일 개체에 대한 포인터입니다. FO_SYNCHRONOUS_IO 플래그가 IrpSp-FileObject-Flags>>에 설정된 경우 동기 I/O에 대해 파일 개체가 열렸습니다.
IrpSp-FileObject> 매개 변수에는 FILE_OBJECT 구조인 RelatedFileObject 필드에 대한 포인터가 포함되어 있습니다. FILE_OBJECT 구조체의 RelatedFileObject 필드는 IRP_MJ_WRITE 처리하는 동안 유효하지 않으므로 사용하면 안 됩니다.
SL_FORCE_DIRECT_WRITE 플래그가 설정된 경우 커널 모드 드라이버는 직접 쓰기 차단으로 인해 일반적으로 쓸 수 없는 볼륨 영역에 쓸 수 있습니다. 직접 쓰기 차단은 Windows Vista 이상 운영 체제에서 보안상의 이유로 구현되었습니다. 이 플래그는 파일 시스템 계층과 스토리지 스택 계층 모두에서 확인됩니다. 직접 쓰기 차단에 대한 자세한 내용은 볼륨 및 디스크에 대한 직접 쓰기 작업 차단을 참조하세요. SL_FORCE_DIRECT_WRITE 플래그는 Windows Vista 이상 버전의 Windows 사용할 수 있습니다.
IRP_MJ_WRITE 지정합니다.
요청되는 작업을 지정하고 다음 중 하나를 포함합니다.
IRP_MN_COMPLETE
IRP_MN_COMPLETE_MDL
IRP_MN_COMPLETE_MDL_DPC
IRP_MN_COMPRESSED
IRP_MN_DPC
IRP_MN_MDL
IRP_MN_MDL_DPC
IRP_MN_NORMAL
IrpSp-Parameters.Write.ByteOffset>
쓸 데이터의 파일 내에서 시작 바이트 오프셋을 지정하는 LARGE_INTEGER 변수입니다.
특정 상황에서 이 매개 변수에는 특수 값이 포함될 수 있습니다. 예를 들어:
다음 조건이 true이면 명시적 파일 오프셋 값 대신 파일의 현재 끝을 사용해야 했음을 나타냅니다.
IrpSp-> Parameters.Write.ByteOffset.LowPart == FILE_WRITE_TO_END_OF_FILE 및 IrpSp-Parameters.Write.ByteOffset.HighPart> == -1
대상 파일의 바이트 범위 잠금과 연결된 키 값입니다.
IrpSp-Parameters.Write.Length>
쓸 데이터의 길이(바이트)입니다. 쓰기 작업이 성공하면 Irp-IoStatus>가 가리키는 IO_STATUS_BLOCK 구조체의 정보 멤버에 기록된 바이트 수가 반환됩니다.
설명
파일 시스템은 파일 끝에서 쓰기 및 읽기 작업을 기본 파일 스토리지 디바이스의 섹터 크기의 배수까지 반올림합니다. 사전 읽기 또는 사전 쓰기 작업을 처리할 때 할당 및 스왑 버퍼를 사용하는 필터는 할당된 버퍼의 크기를 연결된 디바이스의 섹터 크기의 배수로 반올림해야 합니다. 그렇지 않은 경우 기본 파일 시스템에서 전송되는 데이터의 길이가 버퍼의 할당된 길이를 초과합니다. 버퍼 교환에 대한 자세한 내용은 swapBuffers Minifilter 샘플을 참조하세요.