wake on pattern match ÆÐÅÏ ¸¶À½´ë·Î ¼öÁ¤Çϱâ.

isaiah   
   Á¶È¸ 12933   Ãßõ 2    


 이걸 적당히 조절하는게 목적인데요.. 


 일단 재목은 따라하면 다 될것 처럼 했지만. 저는 일단 제 환경에서만 겨우 작동할 정도로만 삽질하고 프로젝트를 종료고 이 글에서는 그 과정만 설명합니다.

 수용하시는 분의 환경에 따라서는 심한 삽질이 따를 수 있습니다.

 물론 저처럼 프로그래밍이 까막눈인 분들에게 한한 이야기이긴 합니다만.


  기본적으로 드라이버 설정 창에서 끄고 켜는 정도의 설정만 할 수 있고 구채적인 설정은 모두 자동입니다.

  그 자동이 해 주는 설정은 아래 글에 잘 설명되어 있습니다.

https://technet.microsoft.com/ko-kr/library/ee617165(v=ws.10).aspx

 해당 어뎁터에 할당된 IP를 향한 ARP나 ND 혹은 SYN 패킷을 기본적으로 등록하게 됩니다.

 각각의 프로토콜은 특징이 있으나 일단 IP를 대조해서 반응 한다 정도로 이해하시면 적당 합니다.


 제가 격은 문제는 해당 어뎁터에 할당된 IP에만 반응하는것은 적절하지 못했습니다. 

 매치패턴을 지원하는 포트가 하나 뿐이였는데 지원해야 하는 IP는 VM을 위한것과 호스트를 위한것 2가지 였기 때문인데요.

 

 이 부분을 해결하기 위해서 검색을 한참했습니다만. 유저모드에서 해당 설정을 할 수 있는 어플리캐이션을 못 찾았습니다.

 찾으면 방법이 있을지도 모르죠. 혹시 찾으신 분은 리플로 추가해주시면 감사하겠습니다.

 그러나 커널에서 돌아가는 NDIS 필터 드라이버는 WAKE ON PATTERN의 등록과 삭재 를 조절 할 수 있다는것을 알게 되었습니다.

 MSDN에 적혀 있더라고요...


기본적으로 윈도우즈의 네트워크를 다루는 NDSI 프래임 워크는 대충 아래와 같은 구조를 가집니다.

NDIS 프로토콜 드라이버

(NDIS 필터 드라이버)

NDIS 드라이버

NDIS 미니포트 드라이버

하드웨어 장치

 필터 드라이버는 옵션입니다. 미니포트 드라이버는 장치를 통재하는 드라이버이고 프로토콜 드라이버는 각각의 프로토콜을 다루는 드라이버입니다.

 원래 아무런 수정이 없는 상태에서 프로토콜 드라이버가 등록될 필요가 있는 IP를 적절한게 등록 한다고 합니다.

 

 그래서 저는 중간에 위치하는 필터 드라이버로 제가 원하는 형태로 요구를 가공해서 등록하기로 마음을 먹었습니다.

 준비물이 필요한데요..

 MS 비주얼 스트디오 적당한 버전.... 윈도우즈 10이 타겟이면 2015가 적절합니다. 검색하시면 커뮤니티 버전을 다운로드 받으실 수 있습니다.

 그리고 DDK 드라이버 계발은 위한 도구모음 입니다.

https://msdn.microsoft.com/ru-ru/library/windows/hardware/ff557573

 그리고 드라이버 셈플.

https://msdn.microsoft.com/ko-kr/windows/hardware/dn433227.aspx

  드라이버 셈플에서는 /network/ndis/filter 에 들어 있는 filter 드라이버 셈플을 기본으로 수정을 시작했습니다.

  제 경우에는 컴파일부터 좀 막혀서 삽질을 했습니다 로컬 타임 문제라던가 경고를 오류로 처리라던가 하는 설정떄문에요..

 

여튼 기본 드라이버는 몇가지 루틴으로 되어 있는데요.. 일부는  일부는 상위에 위치한 드라이버의 요구 의해서 시작되고 일부는 하위에 위치한 드라이버에 의해서 시작되며 나머지는 드라이버가 로드될때 혹은 정지될때 언로드 될때 실행되게 됩니다.
 주석이 꼼꼼하게 붙어 있으므로 자세히 설명하지는 않겠습니다.

필터 드라이버는 기본적으로 성위 드라이버가 보내는 OID 요청을 그대로 복사해서 아래로 내려 보내 주고 또 결과를 받아서 상위로 반환 합니다.


 아래 함수는 내부에서 OID 요청을 내려 보내고 내부에 결과를 반환하고 끝나는 함수입니다.

 filterDoInternalRequest(
 _In_ PMS_FILTER                   FilterModuleContext,
 _In_ NDIS_REQUEST_TYPE            RequestType,
 _In_ NDIS_OID                     Oid,
 _Inout_updates_bytes_to_(InformationBufferLength, *pBytesProcessed)
 PVOID                        InformationBuffer,
 _In_ ULONG                        InformationBufferLength,
 _In_opt_ ULONG                    OutputBufferLength,
 _In_ ULONG                        MethodId,
 _Out_ PULONG                      pBytesProcessed
)
패턴을 등록하는 요청도 OID_요청 의 형태로 내려 보내게 되고
현재 등록된 패턴인지 혹은 내 장치가 어떤어떤 WOL 기능을 어디까지 지원하는지를 확인하기 위한 요청.
그리고 지금 어떤어떤 패턴이 등록되어 있는지를 확인하는 요청도 이 함수를 통해서 하게 됩니다.



OID_PM_ADD_WOL_PATTERN 이라던가 하는 식으로 미리 정의된 형태가 있고 정의는 ntddndis.h 내부에 있습니다.
각각의 OID에 대한 구조는MSDN에 자세히 설명 되어 있고요.

주로 쓰게되는것은
OID_PM_ADD_WOL_PATTERN
NDIS_PM_CAPABILITIES
OID_PM_REMOVE_WOL_PATTERN
OID_PNP_WAKE_UP_PATTERN_LIST

등등 입니다 각각의 Oid는 각각 필요한 내용을 담을 구조체를 가지고 있고 이것을 인포메이션 버퍼에 대한 포인터의 형태로 전달하게 되는데
그게 위에 있는 PVOID InformationBuffer 인자로 전달됩니다. 미리 공간은 할당해 두어야 합니다. 패이지 되지 않는 메모리 공간에요..



 다음장은 내일 쓰겠습니다.. 랄까.. 이정도만 써도 코딩좀 하시는 분들은 원하는걸 할 수 있으실 것 같은데요.

혹 추가 정보가 필요하면 다음장을 쓰도록 하겠습니다.



Á¦¸ñPage 19/28
2016-08   25652   ¹Ì³ª¸®³ª¹°
2016-08   19348   ±èȲÁß
2016-07   17971   ¹é¸¸½º¹°Çϳª
2016-07   21167   ¹é¸¸½º¹°Çϳª
2016-07   25821   ¹é¸¸½º¹°Çϳª
2016-07   93844   ¹é¸¸½º¹°Çϳª
2016-07   17711   inquisitive
2016-07   27910   ¹«¾Æ
2016-07   16814   NeOpLE
2016-07   14105   ÀÌÁöÆ÷Åä
2016-07   12934   isaiah
2016-07   12856   ȲÁø¿ì
2016-07   15067   ȲÁø¿ì
2016-07   29525   µÎÆ÷¸®
2016-06   24699   ¹éµÎ¼º
2016-06   17335   ¹«¾Æ
2016-06   13690   ¹«¾Æ
2016-06   14319   ¹«¾Æ
2016-06   13510   ¹«¾Æ
2016-06   11120   ¹«¾Æ