파일 시스템 필터 드라이버에서 추가 ECP(만들기 매개 변수)를 사용하여 IRP_MJ_CREATE 작업을 처리할 수 있습니다. 파일 시스템 필터 드라이버는 다음 섹션의 루틴을 호출하여 IRP_MJ_CREATE 작업에 대한 ECP를 검색, 설정(추가), 승인 및 제거할 수 있습니다. ECP가 시작된 운영 체제 공간을 확인할 수도 있습니다.
ECP 검색
IRP_MJ_CREATE 작업에 대한 ECP를 검색하려면 다음을 수행합니다.
FltGetEcpListFromCallbackData(또는 FsRtlGetEcpListFromIrp)를 호출하여 만들기 작업과 연결된 ECP_LIST 대한 포인터를 검색합니다.
다음 작업 중 하나를 수행합니다.
- FltGetNextExtraCreateParameter(또는 FsRtlGetNextExtraCreateParameter)를 호출하여 ECP 목록에서 다음(또는 첫 번째) ECP 컨텍스트 구조에 대한 포인터를 검색합니다.
- FltFindExtraCreateParameter(또는 FsRtlFindExtraCreateParameter)를 호출하여 지정된 형식의 ECP 컨텍스트 구조에 대한 ECP 목록을 검색합니다. 구조체가 발견되면 어느 루틴이든 ECP 컨텍스트 구조에 대한 포인터를 반환합니다.
ECP 설정
IRP_MJ_CREATE 작업에 대한 ECP를 설정하려면 파일 시스템 필터 드라이버가 다음 중 하나를 수행합니다.
기존 ECP_LIST안에 ECP들을 설정합니다.
새로 만든 ECP_LIST에서 ECP를 설정합니다.
기존 ECP_LIST에 ECP 설정하기
기존의 ECP_LIST에 포함된 ECP를 설정하려면 만들기 작업과 연결하여 다음을 수행합니다.
FltGetEcpListFromCallbackData(또는 FsRtlGetEcpListFromIrp)를 호출하여 만들기 작업과 연결된 ECP_LIST 대한 포인터를 검색합니다.
FltAllocateExtraCreateParameter(또는 FsRtlAllocateExtraCreateParameter)를 호출하여 ECP 컨텍스트 구조에 대해 페이징된 메모리 풀을 할당하고 해당 구조에 대한 포인터를 생성합니다.
FltInsertExtraCreateParameter(또는 FsRtlInsertExtraCreateParameter)를 호출하여 ECP 컨텍스트 구조를 ECP_LIST 구조에 삽입합니다.
새로 생성된 ECP_LIST에 ECP 설정하기
ECP_LIST이 현재 생성 작업과 연결되어 있지 않다면, 먼저 ECP_LIST를 생성한 후, 그 안에 ECP를 설정해야 합니다.
FltAllocateExtraCreateParameterList(또는 FsRtlAllocateExtraCreateParameterList)를 호출하여 ECP_LIST 구조에 대한 메모리를 할당합니다.
FltAllocateExtraCreateParameter(또는 FsRtlAllocateExtraCreateParameter)를 호출하여 ECP 컨텍스트 구조에 대해 페이징된 메모리 풀을 할당하고 해당 구조에 대한 포인터를 생성합니다.
FltInsertExtraCreateParameter(또는 FsRtlInsertExtraCreateParameter)를 호출하여 ECP 컨텍스트 구조를 ECP_LIST삽입합니다.
FltSetEcpListIntoCallbackData(또는 FsRtlSetEcpListIntoIrp)를 호출하여 ECP 목록을 만들기 작업에 연결합니다.
ECP 제거
IRP_MJ_CREATE 작업에 대한 ECP를 제거하려면 다음을 수행합니다.
FltRemoveExtraCreateParameter(또는 FsRtlRemoveExtraCreateParameter)를 호출하여 ECP 컨텍스트 구조에 대한 ECP 목록을 검색합니다. ECP 컨텍스트 구조가 발견되면 이 루틴은 ECP 컨텍스트 구조를 ECP 목록에서 분리합니다.
분리된 ECP 컨텍스트 구조에 대한 메모리를 해제하려면 FltFreeExtraCreateParameter(또는 FsRtlFreeExtraCreateParameter)를 호출합니다. 다음 방법 중 하나로 메모리를 할당한 경우 이러한 루틴을 호출하여 ECP 컨텍스트 구조에 대한 메모리를 해제할 수 있습니다.
- FltAllocateExtraCreateParameter(또는 FsRtlAllocateExtraCreateParameter)를 호출하여 페이징된 메모리 풀을 할당했습니다.
- 메모리 풀을 lookaside 목록에서 할당하기 위해 FltAllocateExtraCreateParameterFromLookasideList(또는 FsRtlAllocateExtraCreateParameterFromLookasideList)를 호출했습니다.
ECP를 승인됨으로 표시하거나 승인 상태를 결정합니다.
다음 루틴을 호출하여 ECP를 승인된 것으로 표시하거나 ECP가 승인된 것으로 표시되는지 여부를 확인합니다.
FltAcknowledgeEcp(또는 FsRtlAcknowledgeEcp)를 호출하여 ECP 컨텍스트 구조를 승인된 것으로 표시합니다. ECP는 조회, 사용, 처리 또는 기타 상태로 표시될 수 있습니다.
FltIsEcpAcknowledged(또는 FsRtlIsEcpAcknowledged)를 호출하여 ECP 컨텍스트 구조가 승인된 것으로 표시되는지 여부를 확인합니다.
원본 모드 확인
FltIsEcpFromUserMode(또는 FsRtlIsEcpFromUserMode)를 호출하여 ECP 컨텍스트 구조가 사용자 모드에서 시작되었는지 여부를 확인합니다. 파일 시스템 필터 드라이버는 사용자 모드에서 시작된 ECP 컨텍스트 구조를 허용하지 않을 수 있습니다.
lookaside 리스트를 사용하여 ECP를 할당하기
다음 루틴을 호출하여 루크어사이드 목록에서 ECP를 할당하고, 루크어사이드 목록 및 ECP를 관리합니다.
FltInitExtraCreateParameterLookasideList(또는 FsRtlInitExtraCreateParameterLookasideList)를 호출하여 고정 크기의 하나 이상의 ECP 컨텍스트 구조를 할당하는 데 사용되는 페이징 또는 비페이지 풀 lookaside 목록을 초기화합니다.
FltDeleteExtraCreateParameterLookasideList(또는 FsRtlDeleteExtraCreateParameterLookasideList)를 호출하여 lookaside 목록을 해제합니다.
FltAllocateExtraCreateParameterFromLookasideList(또는 FsRtlAllocateExtraCreateParameterFromLookasideList)를 호출하여 ECP 컨텍스트 구조에 대한 lookaside 목록에서 메모리 풀을 할당하고 해당 구조에 대한 포인터를 생성합니다.
FltFreeExtraCreateParameter(또는 FsRtlFreeExtraCreateParameter)를 호출하여 ECP 컨텍스트 구조에 대한 메모리를 해제합니다.