파일 시스템 개체 I/O 루틴
파일 시스템 개체 I/O 루틴은 읽기, 쓰기 및 기타 파일 작업에 대한 기존 파일 I/O 호출을 나타냅니다. 이러한 루틴은 종종 네트워크 미니 리렉터에서 "낮은 I/O 루틴"이라고 합니다. RDBSS는 특정 IRP 수신에 대한 응답으로 이러한 루틴을 호출합니다.
낮은 I/O 루틴은 시작 시(DriverEntry 루틴에서) 네트워크 미니 리디렉터를 등록하는 데 사용되는 RxRegisterMinirdr 루틴에 전달되는 MINIRDR_DISPATCH 구조의 일부로 루틴 포인터 배열로 전달됩니다. 배열 항목의 값은 수행할 낮은 I/O 작업입니다.
이러한 낮은 I/O 또는 파일 시스템 개체 I/O 루틴은 일반적으로 RDBSS에서 비동기적으로 호출됩니다. 따라서 네트워크 미니 리디렉터에서는 구현된 낮은 I/O 루틴을 비동기적으로 안전하게 호출할 수 있는지 확인해야 합니다. 또한 네트워크 미니 리디렉터에서 비동기 호출에 대한 요청을 무시하고 동기적으로만 작동하는 루틴을 구현할 수도 있습니다. 그러나 완료하는 데 시간이 걸릴 수 있는 특정 호출(예: 읽기 및 쓰기)의 경우 동기 작업으로 구현하면 전체 운영 체제의 I/O 성능이 크게 저하될 수 있습니다.
모든 파일 시스템 개체 I/O 루틴에는 RX_CONTEXT 구조체에 대한 포인터가 매개 변수로 전달되어야 합니다. 이러한 루틴을 호출하기 전에 RDBSS는 RX_CONTEXT LowIoContext 구조에 있는 여러 멤버의 값을 설정합니다. LowIoContext 구조의 일부 멤버는 모든 루틴에 대해 설정되지만 일부 멤버는 특정 루틴에 대해서만 설정됩니다. RX_CONTEXT 데이터 구조에는 처리 중인 IRP가 포함되며 수행할 낮은 I/O 작업을 지정하는 LowIoContext.Operation 멤버가 있습니다. 이 LowIoContext.Operation 멤버를 사용하여 요청된 낮은 I/O 작업을 구분할 수 있으므로 네트워크 미니 리다이렉터에서 여러 개의 낮은 I/O 루틴이 동일한 루틴을 가리킬 수 있습니다. 예를 들어 파일 잠금과 관련된 모든 I/O 호출은 LowIoContext.Operation 멤버를 사용하여 요청된 잠금 또는 잠금 해제 작업을 구분하는 네트워크 미니 리다이렉터에서 동일한 낮은 I/O 루틴을 호출할 수 있습니다.
낮은 I/O 루틴 이외의 다른 파일 I/O 루틴은 동기 호출을 기반으로 하지만 Windows 운영 체제의 향후 릴리스에서 변경될 수 있습니다.
LowIo 경로에 있는 동안 RX_CONTEXT LowIoContext.ResourceThreadId 멤버는 RDBSS에서 작업을 시작한 소유 스레드를 나타내도록 보장됩니다. LowIoContext.ResourceThreadId 멤버를 사용하여 다른 스레드를 대신하여 FCB 리소스를 해제할 수 있습니다. 비동기 루틴이 완료되면 초기 스레드에서 가져온 FCB 리소스를 해제할 수 있습니다.
MrxLowIoSubmit[LOWIO_OP_XXX] 루틴을 완료하는 데 시간이 오래 걸릴 수 있는 경우 네트워크 미니 리트리버 드라이버는 네트워크 통신을 시작하기 전에 FCB 리소스를 해제해야 합니다. RxReleaseFcbResourceForThreadInMRx를 호출하여 FCB 리소스를 해제할 수 있습니다.
다음 표에서는 파일 시스템 개체 I/O(낮은 I/O) 작업에 대해 네트워크 미니 리렉터에서 구현할 수 있는 루틴을 나열합니다.
| 루틴에서 반환된 값 | Description |
|---|---|
| MRxLowIOSubmit[LOWIO_OP_EXCLUSIVELOCK] | RDBSS는 이 루틴을 호출하여 네트워크 미니 리다이렉터에서 파일 개체에 대한 배타적 잠금을 열도록 요청합니다. RDBSS는 IRP_MN_LOCK 부 코드가 있는 IRP_MJ_LOCK_CONTROL 수신에 대한 응답으로 이 호출을 실행하며 IrpSp-Flags>에는 SL_EXCLUSIVE_LOCK 비트 집합이 있습니다. |
| MRxLowIOSubmit[LOWIO_OP_FSCTL] | RDBSS는 이 루틴을 호출하여 파일 시스템 제어 요청을 네트워크 미니 리다이렉터에 전달합니다. RDBSS는 IRP_MJ_FILE_SYSTEM_CONTROL 수신에 대한 응답으로 이 호출을 실행합니다. |
| MRxLowIOSubmit[LOWIO_OP_IOCTL] | RDBSS는 이 루틴을 호출하여 I/O 시스템 제어 요청을 네트워크 미니 리렉터에 전달합니다. RDBSS는 IRP_MJ_DEVICE_CONTROL 또는 IRP_MJ_INTERNAL_DEVICE_CONTROL 수신에 대한 응답으로 이 호출을 실행합니다. |
| MRxLowIOSubmit[LOWIO_OP_NOTIFY_CHANGE_DIRECTORY] | RDBSS는 이 루틴을 호출하여 디렉터리 변경 알림 작업에 대한 네트워크 미니 리디렉터에 요청을 실행합니다. RDBSS는 IRP_MJ_DIRECTORY_CONTROL 수신에 대한 응답으로 이 호출을 실행합니다. |
| MRxLowIOSubmit[LOWIO_OP_READ] | RDBSS는 이 루틴을 호출하여 네트워크 미니 리다이렉터에 대한 읽기 요청을 실행합니다. RDBSS는 IRP_MJ_READ 수신에 대한 응답으로 이 호출을 실행합니다. |
| MRxLowIOSubmit[LOWIO_OP_SHAREDLOCK] | RDBSS는 이 루틴을 호출하여 네트워크 리디렉션자가 파일 개체에 대한 공유 잠금을 열도록 요청합니다. RDBSS는 IRP_MN_LOCK 부 코드가 있는 IRP_MJ_LOCK_CONTROL 수신에 대한 응답으로 이 호출을 실행하며 IrpSp-Flags>에는 SL_EXCLUSIVE_LOCK 비트 집합이 없습니다. |
| MRxLowIOSubmit[LOWIO_OP_UNLOCK] | RDBSS는 이 루틴을 호출하여 네트워크 미니 리다이렉터에서 파일 개체에 대한 단일 잠금을 제거하도록 요청합니다. RDBSS는 IRP_MN_UNLOCK_SINGLE 부 코드가 포함된 IRP_MJ_LOCK_CONTROL 수신에 대한 응답으로 이 호출을 실행합니다. |
| MRxLowIOSubmit[LOWIO_OP_UNLOCK_MULTIPLE] | RDBSS는 이 루틴을 호출하여 네트워크 미니 리다이렉터에서 파일 개체에 보관된 여러 잠금을 제거하도록 요청합니다. RDBSS는 IRP_MN_UNLOCK_ALL 또는 IRP_MN_UNLOCK_ALL_BY_KEY 부 코드가 포함된 IRP_MJ_LOCK_CONTROL 수신에 대한 응답으로 이 호출을 실행합니다. 잠금 해제할 바이트 범위는 RX_CONTEXT LowIoContext.ParamsFor.Locks.LockList 멤버에 지정됩니다. |
| MRxLowIOSubmit[LOWIO_OP_WRITE] | RDBSS는 이 루틴을 호출하여 네트워크 미니 리다이렉터에 쓰기 요청을 실행합니다. RDBSS는 IRP_MJ_WRITE 수신에 대한 응답으로 이 호출을 실행합니다. |