driver-online
  log-inmypagesitemap
top
   자유게시판
   로그북
    견우일지
    시스템팀 개발일지
    Beginning Driver
   유용한 팁&강좌
   CrashDump분석(beta)
   개발QnA
    WDM 입문
    USB
    NDIS
    File System
    Debugging 관련
    그 외
 
개발Q&A > NDIS
TDI 필터 드라이버 개발중인데 블루 스크린이 뜹니다.
 ·작성일 2012.08.27:14.30 (월)  · 작성자 자유로운영혼  · 조 회 2,764


안녕하세요~

 

초보 개발자 입니다. 이번에 입사해서 드라이버 분야를 처음 코딩하게 되었습니다.

 

제가 개발하고 있는 드라이버는 접속을 시도한 목적지 주소가 필터에 등록된 주소라면 필터

 

데이터를 얻어와 IP/PORT를 포워딩 해주는 프로그램입니다.

 

헌데 접속시도한 프로그램을 포트 번호를 알아올때 버그가 발생하는거 같습니다.

 

WinDbg로 확인 했을때 BugCheck : 0xA로 나옴니다.

 

문제가 생기는 함수는 IRP가 TDI_CONNECT, TDI_DISCONNECT 일때 밑에 함수를 호출하게 되었

 

있습니다. 고수님들 도와주세요~

 

USHORT GetPortFromAddressInfo(PDEVICE_OBJECT pDeviceObject, PFILE_OBJECT

pAddressObject)

{

   NTSTATUS status ;

   PIRP pIrp = NULL ;

   PMDL pMDL = NULL ;

   TDI_ADDRESS_INFO *pAddrInfo = NULL ;

   TDI_ADDRESS_IP  TDI_IP ;

   USHORT usPort ;

   IO_STATUS_BLOCK IoStatusBlock ;

   KEVENT                CompEvent;

 

   LARGE_INTEGER dueTime;

   IRPLOCK lock;

 

   ASSERT(KeGetCurrentIrql() <= DISPATCH_LEVEL);

   KeInitializeEvent(&CompEvent, NotificationEvent, FALSE);

 

   pIrp  =  TdiBuildInternalDeviceControlIrp (TDI_QUERY_INFORMATION,

       pDeviceObject,

       pAddressObject,

       &CompEvent,

       &IoStatusBlock

      );

 

   if(!pIrp)

    {

      DBGPRINTF("pIrp not allocated") ;

      return 0 ;

   }

 

   if(!pAddrInfo)  //not yet allocated

      pAddrInfo = (TDI_ADDRESS_INFO*) ExAllocatePoolWithTag(NonPagedPool , 2048, 0) ;

  

   if(!pAddrInfo) //not allocated

   {

      return 0 ;

   }

 

   {

pMDL = IoAllocateMdl( pAddrInfo, 2048, FALSE, TRUE, pIrp     );

   }

 

   if(!pMDL)

   {

      DBGPRINTF("MDL not allocated") ;

      goto CLEANUP ;

   }

 

   //__try

   {

      MmProbeAndLockPages(pMDL, KernelMode, IoWriteAccess) ;

 

   }

  TdiBuildQueryInformation (

       pIrp,

       pDeviceObject,

       pAddressObject,

       NULL, //QUERY_COMPLETION_ROUTINE,

       NULL,

       TDI_QUERY_ADDRESS_INFO,

       pMDL );

 

 

  status = IoCallDriver(pDeviceObject, pIrp);

 

 if (status == STATUS_PENDING)

  {

   dueTime.QuadPart = -2000;

 

   status = KeWaitForSingleObject(&CompEvent, Executive, KernelMode, FALSE,

&dueTime);

 

if (status == STATUS_TIMEOUT)

{

 ASSERT(KeGetCurrentIrql() == PASSIVE_LEVEL);

 

if (InterlockedExchange((PVOID)&lock, IRPLOCK_CANCEL_STARTED)

== IRPLOCK_CANCELABLE)

{

IoCancelIrp(pIrp);

 

if (InterlockedExchange(&lock,

IRPLOCK_CANCEL_COMPLETE) == IRPLOCK_COMPLETED)

                    IoCompleteRequest(pIrp, IO_NO_INCREMENT);

 

 KeWaitForSingleObject(&CompEvent, Executive,

KernelMode, FALSE, NULL);

 

}

}

 

  }

 /*else*/ if( status == STATUS_SUCCESS )

 {

 in_addr *p_inetAddr ;

 // DBGPRINTF("Connection State [%u]", pAddrInfo->ActivityCount) ;

 TRANSPORT_ADDRESS  *pTAddress = &pAddrInfo->Address ;

 TA_ADDRESS  *pTA = &pTAddress->Address[0] ;

 

 RtlCopyMemory(&TDI_IP, (TDI_ADDRESS_IP*)pTA->Address, TDI_ADDRESS_LENGTH_IP)

;

 p_inetAddr = (in_addr*)&TDI_IP.in_addr ;

 

 usPort = TDI_IP.sin_port ;

 

 

 DBGPRINTF("Connection State SUCCESS!!!!!!!!!!!!!\n");

 }

  else

  {

     DBGPRINTF("Connection State - CallDriver failed %d", status) ;

 usPort = -1;

  }

 

CLEANUP:

  if(pAddrInfo)

     ExFreePool(pAddrInfo) ;

  return usPort ;

 

}

*답변을 받은 후 감사의 글을 남기는 것은 꼭 지켜야할 네티켓입니다.
 
  

이 전 : [MDL 버퍼 해제 문제] TDI 필터 드라이버에서..

다 음 : passthru에서 promiscuous mode 설정하는 방법

 
quick-menu
event
study
QnA
pds
family-site concert used used2 intro
address
address