프로그래밍 질문 드려요...(C++) 메모리 할당을 어떻게 해야 할까요. 무개념 주의

isaiah   
   조회 4727   추천 0    

 

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 이 들어갈 용량을 할당해 두고 중간중간을 포인터로 잡아서 써야 할까요?

 

짧은글 일수록 신중하게.
malloc 을 따로따로 하지 말고...한번에 3배수로 잡아서...구조체 3개를 나란히 넣어보세요.
직접 해본게 아니라 확답은 못 드리겠습니다만...느낌상으로는 그냥 배열 형태로 어딘가에 잡아서 쓰면 될 것 같습니다.
     
isaiah 2016-06
음 NDIS_OID_REQUST + OID_PM_ADD_WOL_PATTERN 3개 분량을 몽땅 넣을 공간을 할당하고.
 본래 필터 드라이버 셈플이 사용하던 NDIS_OID_REQUST 복사해서 넣고 그 위치를 포인터로 내려 보넸더니 커널패닉 나네요.
 쩝...  필터 드라이버 자체도 위에서 내려온 리퀘스트를 받아서
        Status = NdisAllocateCloneOidRequest(pFilter->FilterHandle,
                                            Request,
                                            FILTER_TAG,
                                            &ClonedRequest);
요걸로 다른 메모리 공간에 복사해 두고 쓰길래 그냥 쓱 복사 해버려도 되지 않을까 했는데 그렇게 단순치는 않은 모양입니다.. 쩝..
무아 2016-06
말씀하신대로 해보면 알겠지요? 한번 해보세요. 잘되면 되는거죠..

>처음에 그냥 malloc으로 OID_PM_ADD_WOL_PATTERN 3개 만들어서 오프셋 계산을 해버렸는데요.  문제는 음수가 나왔다 양수가 나왔다 합니다.

항상 양수가 나올 수 있게 패턴 3개의 순서를 잘 잡아주면 되지 않을까요?
     
isaiah 2016-06
리퀘스트를 복사하는 작업은 따로 함수를 써서 하도록 되어 있더라고요..
        Status = NdisAllocateCloneOidRequest(pFilter->FilterHandle,
                                            Request,
                                            FILTER_TAG,
                                            &ClonedRequest);
 요런식으로요.
 
 이게 패턴위치를 기준으로 다음 패턴의 오프셋을 구하던지 하는거면 적당하게 맞출 수 있겠는데.
 리퀘스트 구조체의 변수의 주소를 기준으로 오프셋을 구해야 하니 제 짧은 지식으로는 깔끔하게 답이 안나오네요...
isaiah 2016-06
뭘 모르는지 모르니 질문도 재대로 못했네요..
 알고 보니 소스를 올리고 질문을 했어야 답을 구할 수 있는 부분이였습니다.
NdisAllocateCloneOidRequest 요걸로 할당한 메모리를 해제하는 함수를 포함한 콜백함수를
필터 드라이버의 하위에 존재하는 ndis 드라이버에서 호출하는게 되는 구조여서..
아래로 내려 보네는 포인터를 콜백으로 다시 받아서 해제 하면서 생기는 문제 였네요.


QnA
제목Page 3400/5710
2014-05   5155772   정은준1
2015-12   1690161   백메가
2013-01   4707   우앙뿌앙
2019-06   4706   이라달
2016-08   4706   눈부신아침
2018-01   4706   MPerformance
2017-06   4706   NiteFlite9
2014-09   4706   DOOWON
2017-02   4706   가람이당1
2007-04   4706   한창수
2017-08   4706   아싸조쿠나
2015-01   4706   방o효o문
2014-02   4706   티키
2018-05   4706   의롭게살리라
2018-01   4706   코퍼마인SP
2016-07   4706   룰루랄라
2020-09   4706   언타이틀
2021-02   4706   VSPress
2020-03   4706   negativete
2008-10   4706   장현모
2006-09   4706   최창현
2008-08   4706   김승현