2012-07-16 3 views
1

나는 이것이 완전히 braindead 질문으로 판명되지 않기를 바랍니다.DeviceIoControl이 사용자 제공 입력 버퍼에 12 바이트의 정보를 추가하는 이유는 무엇입니까?

서식이 지정된 데이터를 장치의 대량 출력 파이프 중 하나로 보내려면 WDF Windows USB 장치 템플릿을 편집하고 있습니다. 데이터가 내부 레지스터를 읽도록 장치에 알리기 위해 데이터를 특정 방식으로 설정해야합니다.

문제는 필요한 형식으로 버스를 가로 질러 데이터를 가져올 수 없다는 것입니다. 나는 장치를 열거하고 DeviceIoControl을 입력 버퍼가 사양에 따라 설정된 구조체로 설정되도록 호출하는 작은 테스트 응용 프로그램을 작성했습니다.

작업 케이스에 대한 USB 버스 추적 사본을 가지고 있으며 (드라이버가 소스에 액세스 할 수 없음), 드라이버에서 사용자 정의 IOCTL을 호출 할 때 발생하는 상황에 대한 버스 추적을 캡처했습니다. 내가 버스를 가로 질러가는 것은 내가 12 바이트의 데이터로 시작하는 데이터 구조이다. 데이터 구조는 정확하지만 데이터의 처음 12 바이트가 무엇인지 알고 드라이버가 전송하지 못하도록하고 싶습니다.

드라이버가 제대로 작성되었습니다. 드라이버에 디버그 트레이스를 넣었고 WdfRequestRetrieveInputMemory에 의해 검색된 버퍼가 이미 12 바이트가 앞에 붙어있는 것처럼 보입니다. 따라서 이것이 프리 드라이버라고 생각됩니다.

유용한 정보 인 경우 IOCTL은 METHOD_BUFFEREDFILE_ANY_ACCESS으로 설정됩니다.

이 설정하는 테스트 코드의 관련 부분은 매우 간단하다 : 나는 버스를 통해 이동 참조

const ULONG   ulBufferSize = sizeof(CONTROL_READ_DATA); 
unsigned char  pBuffer[sizeof(CONTROL_READ_DATA)]; 
DWORD    dwBytesReturned; 
CONTROL_READ_DATA* readData = (CONTROL_READ_DATA*)pBuffer; 

readData->field1 = data; 
readData->field2 = moreData; 
// ... all fields filled in... 

// Send IOCTLs into camera 
if(!::DeviceIoControl(hDevice, 
         IOCTL_CUSTOM_000, 
         &readData, 
         ulBufferSize, 
         &readData, 
         ulBufferSize, 
         &dwBytesReturned, 
         NULL)) 
{ 
    dwError = ::GetLastError(); 
    // Clean up here 
    return dwError; 
} 

데이터는 다음과 같습니다 80FD1200 CCCCCCCC CCCCCCCC + (내 데이터).

통찰력이있는 사람이 있습니까?

답변

2

와우, 정말 웃기는 오류. 유의 사항 주소readDataDeviceIoControl인데, 그 자체가 이미 포인터입니다. 나는 이것에 너무 많은 시간을 낭비 했다니 믿을 수 없어.

감사합니다.

1

데이터의 정렬이 원인입니다. http://msdn.microsoft.com/en-us/library/2e70t5y1(v=vs.80).aspx을 확인하여 하나를 설정하십시오.

+0

답변을 주셔서 감사합니다.하지만 불행히도 여전히 작동하지 않습니다. CONTROL_READ_DATA의 struct 정의 앞에 #pragma pack (1)을 시도했는데 같은 문제가 발생했습니다. – 8bitcartridge