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 드라이버에서 호출하는게 되는 구조여서..
아래로 내려 보네는 포인터를 콜백으로 다시 받아서 해제 하면서 생기는 문제 였네요.