2012-07-24 4 views
2

저는 드라이버 개발에 새로운 내용이 있습니다. 나는 몇몇 USB 장치 유형을 사용자에게서 숨기기 위하여 Windows7를위한 usb 필터 운전사를 개발하는 것을 시작했다. USB 허브에 드라이버를 연결하고 IRP_MN_QUERY_DEVICE_RELATIONS를 가로 챌 수 있습니다. 내가 PDO를 포인터를 보유해야 구조체의 객체 배열을 이해 DEVICE_RELATIONS struct이 .as에 대한 포인터를 수신 (QueryDeviceRelations.Type이 BusRelations입니다) IRP_MN_QUERY_DEVICE_RELATIONS에 -USB 필터 드라이버에서 IRP_MN_QUERY_DEVICE_RELATIONS를 처리하는 방법

1 : 제가 몇 가지 질문이 있습니다. 그러나 DO_BUS_ENUMERATED_DEVICE 플래그를 테스트 할 때 (msdn : 에서 운영 체제가 각 물리적 장치 개체 (PDO)에이 플래그를 설정하면 드라이버에서이 플래그를 수정하면 안됩니다.) 때때로이 플래그가 켜져 있고 일부 시간에 플래그가 표시됩니다 꺼져 있습니다. 언젠가는 PDO를보고 언젠가 FDO를 보게된다는 것을 의미합니까? 또는이 문제에 대한 또 다른 설명이 있습니까? PDEVICE_OBJECT이 생겼을 때 PDO인지 FDO인지 어떻게 알 수 있습니까?

2 - 사용자가 USB 장치를 연결하고 필터 드라이버가 IRP_MN_QUERY_DEVICE_RELATIONS을 처리해야하는 경우 Object 배열의 어떤 장치가 이제 막 장치에 연결되었는지, 어느 장치가 이전에 연결되었는지, 어떤 장치가 연결되었는지를 어떻게 확인할 수 있습니까? 비활성으로 표시 되었습니까?

미리 감사드립니다. 펠릭스.

+0

Felix, 소스 코드를 게시하여 필터 드라이버 구현 방법을 알 수 있습니까? 마티 –

답변

2

DEVOBJ_EXTENSION에 문서화되지 않은 구성원 DeviceNode이 있습니다. WDM.h 및 NTDDK.h의 일부가 아니기 때문에 DEVOBJ_EXTENSION에 있습니다. 따라서 IO 또는 PnP 관리자에게 비공개입니다. 어떤 경우 든 PDO가 아닌 경우 NULL이되므로 "지원되지 않는 방법"은

if (DeviceObject->DeviceObjectExtension->DeviceNode) { 
     // PDO! 
    } else { 
     // non-PDO! 
    } 

나는 사용하지 않는 것이 좋습니다. 대신에 IoGetDeviceObjectPointer을 통해 또는 PDRIVER_OBJECT에서 시작하는 devobj 목록을 통해 실제 장치 개체를 찾을 수 있습니다. devobj가 PDO인지 여부를 결정하려면 QDR/TargetDeviceRelation을 보내십시오 (완료시 목록에 unref PDEVICE_OBJECT). 성공하면 QDR의 결과 devobj가 장치의 PDO가됩니다. Here is 좋은 설명. 또 다른 옵션은 DO_BUS_ENUMERATED_DEVICE입니다. 또한이 플래그는 이 초기화됨을 의미하지 않습니다. PDO. 초기화 전과 구조 할당시 설정됩니다.

0

FDO가 BusRelations 업데이트에 도착한 것을 본 적이 없지만 다른 필터 드라이버가 설치되어있을 가능성이 있습니까? 어쨌든, Tamir 그 질문에 그냥 잘 대답했다 :)

내가 아는 유일한 방법은 이전에받은 개체 배열의 복사본을 유지하고 비교하는 것입니다. 버전간에 변경 될 수 있으므로 특정 주문에 의존하지 마십시오.

관련 문제