2010-06-24 7 views
17

나는 USB 조이스틱을 가지고 있으며, 그것을 위해 내 자신의 HID 드라이버를 작성하고 싶다. 특히 조이스틱 입력이 Windows에서 수신 될 때와 응용 프로그램에 해당 입력 이벤트가 통보 될 때 사이에 지연을 주입하려고합니다. 또한 응용 프로그램에서 조이스틱의 신원을 변경하고 싶습니다. Windows 용 HID 드라이버는 말할 것도없고, 필자는 드라이버를 작성한 적이 없습니다. 누구든지이 일을 수행하는 방법에 대한 조언이나 조언을 제게 제공 할 수 있습니까?나만의 Windows 조이스틱 HID 드라이버 롤?

답변

12

조이스틱의 손잡이를 누르면 전기 신호가 드라이버 체인을 통해 IRP's 형태로 운영 체제 (및 게임)에 도달합니다. 어느 시점에서 이러한 IRP를 가로 채고 다음 드라이버로 전달을 지연 시키면 조이스틱 입력이 지연 될 수 있습니다. 이것은 driver filters으로 얻을 수 있습니다.

Windows 드라이버를 작성하려면 WinDDK을 사용해야합니다.

Windows 드라이버의 진입 점은 DriverEntry function입니다. 이 함수에서는 인터셉트하고자하는 IRP와 우리를 처리하는 콜백 함수 (이 경우에는 전달을 지연시키는 콜백 함수)를 연결합니다. 당신은 어떤 종류의를 시뮬레이션 할 KeInitializeTimer 가족 기능을 사용해야합니다

// the function that delays the IRP 
NTSTATUS CallbackDelayForwarding(
    IN PDEVICE_OBJECT pDeviceObject, 
    IN PIRP pIrp 
){ 
    // delay the forwarding 
} 

// this is the driver entrypoint, similar to "main" in user-mode executables 
NTSTATUS DriverEntry(
    IN PDRIVER_OBJECT pDriverObject, 
    IN PUNICODE_STRING RegistryPath 
){ 
    pDriverObject->MajorFunction[IRP_MJ_READ] = CallbackDelayForwarding; 
    ... 
} 

CallbackDelayForwarding 내부의 전달을 지연하려면 예를 들어

는, 우리의 IRP이 지연 될 말을하는 것은 IRP_MJ_READ이며, 우리의 콜백 함수는 CallbackDelayForwarding라고 잠을 자거나 (자물쇠와 함께) KeDelayExecutionThread 등.

조이스틱 드라이버 체인에 필터 드라이버를 설치하려면 .inf files을 사용할 수 있습니다.

WinDDK에서 toaster filter driver sample을 확인하십시오. INSTALL_DIR/src/general/toaster/에서도 찾을 수 있습니다. here도 참조하십시오.

관련 링크 :
http://www.rootkit.com/newsread.php?newsid=187
http://www.techtalkz.com/microsoft-device-drivers/269654-toaster-filter-driver.html

3

은 무엇 당신이하려고하는 것은 필터 드라이버입니다.

필터 드라이버는 장치 동작에 가치를 추가하거나 장치 동작을 수정하는 선택적 드라이버입니다. 필터 드라이버는 하나 이상의 장치를 서비스 할 수 있습니다. 출처 : http://www.microsoft.com/whdc/DevTools/WDK/WDKpkg.mspx

WDK 아마 필터를 만들 수있는 샘플 코드를 포함 http://msdn.microsoft.com/en-us/library/ff545890.aspx

은 내가 WDK 당신은 여기에서 Windows 드라이버 키트를 다운로드해야 울드 샘플이 포함되어 생각합니다.

가 마이크로 소프트의 사이트에서 다음 다운로드도 : http://support.microsoft.com/kb/176417

그것은 아마 USB가 사전 NT5.0 지원되지 이후 오래된 조금이다,하지만 어쩌면 그것은 여전히 ​​관련이있다.

+0

필자는 새로운 사용자이기 때문에 스팸 필터를 속일 두 번째 및 세 번째 링크에 오타를 넣어야했습니다. : ( – David

+0

나는 당신을 위해 링크를 다시 편집했습니다 :). –

1

난 당신이 사용할 수있는 인상이었다 <dinput.h>

joySetCapture(wnd, JOYSTICKID1) or joySetCapture(wnd,JOYSTICKID2) 

다음 조이스틱 이벤트는 WM_JOYMOVE 이벤트를 해고 메시지에 대한 어떤 wParamlParam하지만 나는 잘 모른다.

는 그런 다음 프로그램을 닫을 때 또는 더 이상 등 joyReleaseCapture(JOYSTICKID1)
은 그냥 다음 USB 장치에서 자신의 데이터를 찾을 수 joyGetPos 또는 joyGetPosEx 기능 를 사용하는 당신에게 빈 PARAMS 수 싶지 않습니다.

2

Autohotkey을 사용할 수 있습니다. 이것은 마우스/키보드/조이스틱의 모든 키를 다시 매핑 할 수있는 윈도우 용 스크립트 언어입니다. 스크립트를 통해 키를 캡쳐하고 올바른 키/매크로를 활성 응용 프로그램에 전송하기 전에 지연을 삽입하면 문제의 해결책이 될 수도 있습니다.