ÇÁ·Î±×·¡¹Ö Áú¹® µå·Á¿ä...(C++) ¸Þ¸ð¸® ÇÒ´çÀ» ¾î¶»°Ô ÇØ¾ß ÇÒ±î¿ä. ¹«°³³ä ÁÖÀÇ
http://www.2cpu.co.kr/QnA/530713 여기서 이어지는 글인데요..
간단한 기능 하나 구현하려고 한참 삽질을 하네요.
이번에도 역시나 기초 가 없어서 막혔습니다.
ndis 프로토콜 드라이버가 WOL PATTERN을 등록할때 OID_PM_ADD_WOL_PATTERN 을 사용하고 이 때 아래쪽 드라이버로 내려가는 정보는
구조체 NDIS_OID_REQUST 에 담겨서 내려갑니다.
이 NDIS_OID_REQUST 구조체 내부에는 PVIOD informationBuffer 값이 있는데요 이게 등록되어야 할 패킷 정보를 가진 NDIS_PM_WOL_PATTERN 구조체의 포인터를 담고 있습니다.
저는 그래서 ndis 필터 드라이버 셈플을 수정해서 원하는 중간에서 원래 프로토콜 드라이버가 내려 보내는 패턴을 수정해서 제가 원하는
패턴을 등록하려고 하고 있습니다.
windows 10에서 제가 원하는 대로 작동을 안해서요.
기본 상태에서 전달 되는 패턴은 NETBIOS name qurry 에 반응 하는 패턴 하나 뿐 이였습니다.
저는 이걸 수정해서 netbios name qurry, ARP(IP:192.168.1.30),ARP(IP:192.168.1.31) 이렇개 반응하도록 수정하려고 합니다 ARP(IP:192.168.1.31)는 가상 머신에 할당할 IP 입니다.
패턴 개수가 3개로 늘어나는 건데요. 문제는 OID_PM_ADD_WOL_PATTERN 요청에서 복수의 패턴을 등록하는 방식에 있습니다.
NDIS_OID_REQUST내부의 PVIOD informationBuffer 이 첫번째 OID_PM_ADD_WOL_PATTERN의 포인트를 담고 있고
첫번째 OID_PM_ADD_WOL_PATTERN 구조체 내부에 있는 ULONG NextWoLPatternOffset 값이 다음 패턴 데이터를 담고 있는 OID_PM_ADD_WOL_PATTERN 를 오프셋으로 알려 줍니다. 오프셋의 시작 위치는 위에 언급된 NDIS_OID_REQUST 내부의 PVIOD informationBuffer의 주소값 입니다.
처음에 그냥 malloc으로 OID_PM_ADD_WOL_PATTERN 3개 만들어서 오프셋 계산을 해버렸는데요.
문제는 음수가 나왔다 양수가 나왔다 합니다. 그런데 오프셋 값을 ULONG을 받으니 음수는 전달을 할 수가 없고요...
NDIS_OID_REQUST + OID_PM_ADD_WOL_PATTERN 이 들어갈 용량을 할당해 두고 중간중간을 포인터로 잡아서 써야 할까요?
Á÷Á¢ Çغ»°Ô ¾Æ´Ï¶ó È®´äÀº ¸ø µå¸®°Ú½À´Ï´Ù¸¸...´À³¦»óÀ¸·Î´Â ±×³É ¹è¿ ÇüÅ·Π¾îµò°¡¿¡ Àâ¾Æ¼ ¾²¸é µÉ °Í °°½À´Ï´Ù.
º»·¡ ÇÊÅÍ µå¶óÀ̹ö ¼ÀÇÃÀÌ »ç¿ëÇÏ´ø NDIS_OID_REQUST º¹»çÇؼ ³Ö°í ±× À§Ä¡¸¦ Æ÷ÀÎÅÍ·Î ³»·Á º¸³Þ´õ´Ï Ä¿³ÎÆдР³ª³×¿ä.
ÂÁ... ÇÊÅÍ µå¶óÀ̹ö ÀÚüµµ À§¿¡¼ ³»·Á¿Â ¸®Äù½ºÆ®¸¦ ¹Þ¾Æ¼
Status = NdisAllocateCloneOidRequest(pFilter->FilterHandle,
Request,
FILTER_TAG,
&ClonedRequest);
¿ä°É·Î ´Ù¸¥ ¸Þ¸ð¸® °ø°£¿¡ º¹»çÇØ µÎ°í ¾²±æ·¡ ±×³É ¾³ º¹»ç Çعö·Áµµ µÇÁö ¾ÊÀ»±î Çߴµ¥ ±×·¸°Ô ´Ü¼øÄ¡´Â ¾ÊÀº ¸ð¾çÀÔ´Ï´Ù.. ÂÁ..
>óÀ½¿¡ ±×³É mallocÀ¸·Î OID_PM_ADD_WOL_PATTERN 3°³ ¸¸µé¾î¼ ¿ÀÇÁ¼Â °è»êÀ» Çعö·È´Âµ¥¿ä. ¹®Á¦´Â À½¼ö°¡ ³ª¿Ô´Ù ¾ç¼ö°¡ ³ª¿Ô´Ù ÇÕ´Ï´Ù.
Ç×»ó ¾ç¼ö°¡ ³ª¿Ã ¼ö ÀÖ°Ô ÆÐÅÏ 3°³ÀÇ ¼ø¼¸¦ Àß Àâ¾ÆÁÖ¸é µÇÁö ¾ÊÀ»±î¿ä?
Status = NdisAllocateCloneOidRequest(pFilter->FilterHandle,
Request,
FILTER_TAG,
&ClonedRequest);
¿ä·±½ÄÀ¸·Î¿ä.
ÀÌ°Ô ÆÐÅÏÀ§Ä¡¸¦ ±âÁØÀ¸·Î ´ÙÀ½ ÆÐÅÏÀÇ ¿ÀÇÁ¼ÂÀ» ±¸ÇÏ´øÁö Çϴ°Ÿé Àû´çÇÏ°Ô ¸ÂÃâ ¼ö Àְڴµ¥.
¸®Äù½ºÆ® ±¸Á¶Ã¼ÀÇ º¯¼öÀÇ ÁÖ¼Ò¸¦ ±âÁØÀ¸·Î ¿ÀÇÁ¼ÂÀ» ±¸ÇØ¾ß ÇÏ´Ï Á¦ ªÀº Áö½ÄÀ¸·Î´Â ±ò²ûÇÏ°Ô ´äÀÌ ¾È³ª¿À³×¿ä...
¾Ë°í º¸´Ï ¼Ò½º¸¦ ¿Ã¸®°í Áú¹®À» Çß¾î¾ß ´äÀ» ±¸ÇÒ ¼ö ÀÖ´Â ºÎºÐÀÌ¿´½À´Ï´Ù.
NdisAllocateCloneOidRequest ¿ä°É·Î ÇÒ´çÇÑ ¸Þ¸ð¸®¸¦ ÇØÁ¦ÇÏ´Â ÇÔ¼ö¸¦ Æ÷ÇÔÇÑ ÄݹéÇÔ¼ö¸¦
ÇÊÅÍ µå¶óÀ̹öÀÇ ÇÏÀ§¿¡ Á¸ÀçÇÏ´Â ndis µå¶óÀ̹ö¿¡¼ È£ÃâÇÏ´Â°Ô µÇ´Â ±¸Á¶¿©¼..
¾Æ·¡·Î ³»·Á º¸³×´Â Æ÷ÀÎÅ͸¦ ÄݹéÀ¸·Î ´Ù½Ã ¹Þ¾Æ¼ ÇØÁ¦ ÇÏ¸é¼ »ý±â´Â ¹®Á¦ ¿´³×¿ä.