-
Filter driver에서 데이터 송신etc/Log 2021. 3. 16. 04:47
출처 : msdn (docs.microsoft.com/en-us/windows-hardware/drivers/network/sending-data-from-a-filter-driver)
※생략, 오역, 틀린 내용 있을 가능성 농후
필터 드라이버에서 데이터 보내기
프로토콜 드라이버가 NdisSendNetBufferLists 함수를 호출하면 NDIS는 지정된 NET_BUFFER_LIST 구조를 드라이버 스택의 최상위 필터 모듈에 제출
필터 드라이버에 의해 시작된 전송 요청
- 필터 드라이버는 NdisFSendNetBufferLists 함수를 호출하여 NET_BUFFER_LIST 구조체 목록에 정의된 네트워크 데이터를 보냄
- 필터 드라이버는 각 NET_BUFFER_LIST 구조체의 SourceHandle 멤버를 NdisFSendNetBufferLists의 NdisFilterHandle 매개변수에 전달되는 값과 동일하게 설정해야 함
- NDIS 드라이버는 드라이버가 만들지 않은 NET_BUFFER_LIST 구조체의 SourceHandle 멤버는 수정하면 안 됨
- NdisFSendNetBufferLIsts를 호출하기 이전에, 필터 드라이버는 NET_BUFFER_LIST_INFO macro를 사용하여 전송 요청에 수반되는 정보를 설정할 수 있음
- 필터 드라이버가 NdisFSendNetBufferLists를 호출하는 즉시, NET_BUFFER_LIST 구조체 및 모든 관련 리소스의 소유권을 포기하게 됨
- NDIS는 전송 요청을 다루거나 하위 드라이버로 요청을 보낼 수 있음
- NDIS는 FilterSendNetBufferListsComplete 함수를 호출하여 필터 드라이버에 구조체와 데이터를 반환함
- NDIS는 FilterSendNetBufferListsComplete로 리스트를 보내기 전에 하나의 NET_BUFFER_LIST 구조체의 링크드 리스트에 있는 다양한 전송 요청으로부터 구조와 데이터를 수집할 수 있음
- NDIS가 FilterSendNetBufferLIstsComplete를 호출하는 동안, 전송 요청의 현재 상태는 알 수 없음
- FilterSendNetBufferListsComplete는 전송 작업을 완료하는 데에 필요한 모든 후처리를 수행함
- NDIS가 FilterSendNetBufferListsComplete를 호출하는 경우, 필터 드라이버는 NetBufferLists 파라미터로 인해 지정된 NET_BUFFER_LIST 구조와 연관된 모든 리소스의 소유권을 다시 얻음
- FilterSendNetBufferListsComplete는 이런 리소스들을 해제하거나 NdisFSendNetBufferLists에 대한 다음 호출에서 재사용하기 위해 준비할 수 있음
- NDIS는 항상 필터 제공 네트워크 데이터를 NdisFSendNetBufferLists에 전달된 필터 드라이버 결정 순서대로 하위 드라이버에 제출하나, 지정된 순서로 데이터를 보낸 후 하위 드라이버는 임의의 순서로 버퍼 반환 가능
- 필터 드라이버는 자신이 시작하는 전송 요청에 대해 루프백 요청 가능 (플래그 설정)
- 필터 드라이버는 자신이 발생하는 전송 요청을 추적하고 이러한 요청이 완료될 때 NdisFSendNetBufferListsComplete함수를 호출하지 않도록 해야 함
전송 요청 필터링
- Ndis는 필터 드라이버의 FilterSendNetBufferLists 함수를 호출하여 상위 드라이버의 전송 요청 필터링
- 필터 드라이버는 다른 드라이버에서 받는 NET_BUFFER_LIST 구조체의 SourceHandle멤버 수정하면 안 됨
- 필터 드라이버는 데이터를 필터링하고 필터링 된 데이터를 하위 드라이버로 보낼 수 있음
- FilterSendNetBufferLists에 제출된 각 NET_BUFFER 구조체에 대해 필터 드라이버는 다음과 같은 기능 수행 :
- NdisFSendNetBufferLists 함수를 호출하여 버퍼를 다음 하위 드라이버로 전달
- 필터 드라이버는 NdisFSendNetBufferLists 를 호출하기 전에 버퍼 내용 수정 가능
- 필터링 된 데이터의 처리는 필터 드라이버에 의해 시작된 전송 작업으로 진행
- NdisFSendNetBufferListsComplete 함수를 호출하여 버퍼 삭제
- 나중에 처리할 수 있도록 버퍼를 로컬 데이터 구조의 큐에 넣음.
- 버퍼를 복사하고 복사본과 함께 전송 요청을 시작함
- 이 경우 드라이버는 NdisFSendNetBufferListsComplete 함수를 호출하여 원래 버퍼를 위에 있는 드라이버로 반환해야 함
- 전송 작업은 필터 드라이버에서 시작된 전송 요청과 유사함
- 전송 요청이 완료되면 드라이버 스택이 진행되는데, 미니 포트 드라이버가 NdisMSendNetBufferListsComplete 함수 호출시 NDIS는 최하위 필터 모듈에 대해 FilterSendNetBuffeerListsComplete 함수를 호출함
- 전송 작업이 완료된 후 필터 드라이버는 필터 드라이버가 FilterSendNetBufferLists에서 만든 상위 드라이버의 버퍼 설명자에 대한 수정 사항을 되돌림
- 드라이버는 NdisFSendNetBufferListsComplete 함수를 호출하여 NET_BUFFER_LIST 구조의 링크드리스트를 상위드라이버에 반환하고 전송 요청의 최종 상태를 반환함
- 최상위 필터 모듈이 NdisFSendNetBufferListsComplete를 호출하면 NDIS는 프로토콜 드라이버의 ProtocolSendNetBufferListsComplete 함수를 호출
- 필터 드라이버는 상위 드라이버의 루프백 요청을 전달하거나 필터링할 수 있음. 루프백 요청을 전달하기 위해, 만약 NDIS가 filterSendNetBufferLists의 SendFlag 매개변수에서 NDIS_SEND_FLAGS_CHECK_FOR_LOOPBACK이 설정되어 있는 경우, 필터 드라이버는 NdisFSendNetBufferLIsts를 호출할 때 SendFlags 매개변수에서 NDIS_SEND_FLAGS_CHECK_FOR_LOOPBACK을 설정함
- NDIS는 송신 데이터를 포함한 수신 패킷을 표시함
'etc > Log' 카테고리의 다른 글
마이크로소프트 오픈소스에 기여하다? (0) 2023.02.10 NDIS filter driver (0) 2021.03.16 Network Data Structure (0) 2021.02.16 인턴일지 - NDIS filter driver (0) 2021.02.16