2010-04-21 2 views
0

MFC에서 작성된 무선 관리자 드라이버가있는 WinCE 장치로 작업하고 있습니다. Radio GUI 용 코드에서 특정 IOCTL이 호출 된 Deviceiocontrol 기능을 볼 수 있습니다. 그러나이 함수가 호출하는 특정 코드 조각을 추적 할 수 없습니다. 누군가가 Deviceiocontrol의 작동 방식을 말해 줄 수 있습니까?DeviceioControl에 의해 구현 된 기능 추적

답변

3

DeviceIoControl은 파일 핸들을 사용하여 장치 드라이버를 호출합니다. 장치 드라이버 자체에 들어가려면 커널 디버거를 사용해야합니다.

파일 핸들은 함수 테이블을 포함하는 DEVICE_OBJECT 구조로 구성된 커널 오브젝트를 나타냅니다. IRP_MJ_DEVICE_CONTROL의 인덱스에있는이 테이블에서 드라이버는 핸들 함수를 설정합니다. 함수는 IRP에 패키지 된 io 제어 매개 변수로 호출됩니다.

+0

고마워요! 커널 디버거 사용법을 모르겠습니다. 나는 라디오 매니저를위한 코드를 볼 수 있고 RadioManager_IOControl (Rmgr * context, IOCTL _..., BYTE * pInBuffer, DWORD inSize, BYTE * pOutBuffer, DWORD outSize, DWORD * pOutSize) 함수가 (라디오 드라이버에서) deviceiocontrol에 의해 호출됩니다. 내 문제는 장치 드라이버의 RadioManager_IOControl이 인수 목록에 Rmgr 구조체에 대한 포인터를 가지고있는 동안 deviceiocontrol이 인수 목록에서 Rmgr에 대한 핸들을 가지고 있다는 것입니다. 이 구조체가 어떻게 채워지는지 추적 할 수 없습니다. – ame

+0

'Rmgr *'은'DeviceIoControl'에 전달한 장치 핸들입니다. 이 핸들은'CreateFile'을 호출 할 때 채워집니다. 인구의 정확한 방식은 운전자/구현에 따라 다릅니다. 드라이버의 XXX_Open이 호출 될 때마다 채워질 수 있으며 드라이버의 XXX_Init 중에 채워질 수 있으며 드라이버가 반환하는 더미 핸들 일 수 있습니다. 드라이버 관련. – Shaihi

0

IOCTL이 전송되는 드라이버의 소스 코드가 있습니까?
DeviceIoControl에 대한 핸들을 전달합니다. CreateFile(L"XXX#:",...)에 대한 호출을 사용하여 핸들이 열립니다. XXX는 레지스트리에 설정된 드라이버의 접두사입니다. #은로드 타임에 드라이버가 제공하는 인덱스입니다 (레지스트리에서도 설정할 수 있습니다).
수행되는 기능을 보려면 드라이버의 소스 코드에서 DeviceIoControl으로 보내는 IOCTL을 검색하십시오. 당신은 XXX_IoControl의 운전자 구현에서 그것을 발견 할 것이다.

관련 문제