IRP_MJ_LOCK_CONTROL(FS 및 필터 드라이버)

보낸 경우

I/O 관리자, 기타 운영 체제 구성 요소 및 기타 커널 모드 드라이버는 IRP_MJ_LOCK_CONTROL 요청을 보냅니다.

작업: 파일 시스템 드라이버

파일 시스템 드라이버는 파일 개체를 추출하고 디코딩하여 대상 디바이스 개체가 파일 시스템의 제어 디바이스 개체인지 여부를 확인해야 합니다. 이 경우 파일 시스템 드라이버는 잠금 요청을 처리하지 않고 IRP를 적절하게 완료해야 합니다.

그렇지 않으면 열려 있는 사용자 파일을 나타내는 핸들에서 요청이 실행된 경우 파일 시스템 드라이버는 부 함수 코드로 표시된 작업을 수행하고 IRP를 완료해야 합니다. 그렇지 않은 경우 드라이버는 IRP에 실패해야 합니다.

다음은 유효한 부 함수 코드입니다.

코드 Description
IRP_MN_LOCK Win32 LockFile 함수를 호출한 사용자 모드 애플리케이션을 대신하여 바이트 범위 잠금 요청을 나타냅니다.
IRP_MN_UNLOCK_ALL 파일 개체에 대한 마지막 미해결 핸들이 닫혀 있기 때문에 파일에 대한 모든 바이트 범위 잠금을 해제하라는 요청을 나타냅니다.
IRP_MN_UNLOCK_ALL_BY_KEY 지정된 키 값으로 모든 바이트 범위 잠금을 해제하라는 요청을 나타냅니다.
IRP_MN_UNLOCK_SINGLE Win32 UnlockFile 함수를 호출한 사용자 모드 애플리케이션을 대신하여 단일 바이트 범위 잠금을 해제하라는 요청을 나타냅니다.

작업: 레거시 파일 시스템 필터 드라이버

파일 시스템 필터 드라이버는 필요한 처리를 수행한 후 스택의 다음 하위 드라이버로 IRP를 전달해야 합니다.

매개 변수

파일 시스템 또는 필터 드라이버는 지정된 IRP를 사용하여 IoGetCurrentIrpStackLocation을 호출하여 다음 목록에 IrpSp로 표시된 IRP의 자체 스택 위치에 대한 포인터를 가져옵니다. (IRP는 Irp로 표시됩니다.) 드라이버는 잠금 제어 요청을 처리하는 데 IRP 및 IRP 스택 위치의 다음 멤버에 설정된 정보를 사용할 수 있습니다.

  • DeviceObject 는 대상 디바이스 개체에 대한 포인터입니다.

  • Irp->IoStatus는 최종 완료 상태 수신하는 IO_STATUS_BLOCK 구조와 요청된 작업에 대한 정보를 가리킵니다.

  • IrpSp->FileObjectDeviceObject와 연결된 파일 개체를 가리킵니다.

    IrpSp-FileObject> 매개 변수에는 relatedFileObject 필드에 대한 포인터가 포함되어 있으며 이는 FILE_OBJECT 구조체이기도 합니다. FILE_OBJECT 구조체의 RelatedFileObject 필드는 IRP_MJ_LOCK_CONTROL 처리하는 동안 유효하지 않으므로 사용하면 안 됩니다.

  • IrpSp->플래그 는 다음 값 중 하나 이상일 수 있습니다.

플래그 의미
SL_EXCLUSIVE_LOCK 이 플래그를 설정하면 전용 바이트 범위 잠금이 요청됩니다. 그렇지 않으면 공유 잠금이 요청됩니다.
SL_FAIL_IMMEDIATELY 이 플래그가 설정되면 잠금 요청을 즉시 부여할 수 없는 경우 실패해야 합니다.
  • IrpSp->MajorFunction 은 IRP_MJ_LOCK_CONTROL 설정됩니다.

  • IrpSp->MinorFunction 은 다음 값 중 하나로 설정됩니다.

    • IRP_MN_LOCK
    • IRP_MN_UNLOCK_ALL
    • IRP_MN_UNLOCK_ALL_BY_KEY
    • IRP_MN_UNLOCK_SINGLE
  • IrpSp->Parameters.LockControl.ByteOffset 은 잠기거나 잠금 해제할 바이트 범위의 파일 내에서 시작 바이트 오프셋입니다.

  • IrpSp->Parameters.LockControl.Key 는 바이트 범위 잠금의 키입니다.

  • IrpSp->Parameters.LockControl.Length 는 잠기거나 잠금 해제할 바이트 범위의 길이(바이트)입니다.

추가 정보

FltProcessFileLock

FsRtlProcessFileLock

IO_STACK_LOCATION

IO_STATUS_BLOCK

IoGetCurrentIrpStackLocation

IRP