2010-06-24 16 views
17

मेरे पास एक यूएसबी जॉयस्टिक है, और मैं इसके लिए अपना खुद का छुपा ड्राइवर लिखना चाहता हूं। विशेष रूप से मैं विंडोज़ द्वारा जॉयस्टिक इनपुट प्राप्त करने के दौरान देरी इंजेक्ट करना चाहता हूं और जब मेरे आवेदन को उस इनपुट ईवेंट के बारे में अधिसूचित किया जाता है। मैं अपने आवेदन से प्राप्त जॉयस्टिक की पहचान भी बदलना चाहूंगा। मैंने कभी ड्राइवर नहीं लिखा है, विंडोज के लिए अकेले एक छिपे हुए ड्राइवर को छोड़ दें। क्या कोई मुझे सलाह देने के बारे में सलाह या पॉइंटर्स प्रदान कर सकता है?रोल मेरा खुद का विंडोज जॉयस्टिक छुपा चालक?

उत्तर

12

जब आप जॉयस्टिक पर knobs दबाते हैं तो इलेक्ट्रिक सिग्नल ऑपरेटिंग सिस्टम (और गेम पर) IRP's के रूप में ड्राइवर श्रृंखला के माध्यम से पहुंचते हैं। कुछ बिंदुओं पर इन आईआरपी को रोकना और अगली चालक को अग्रेषण में देरी से जॉयस्टिक इनपुट में देरी हो सकती है। यह driver filters के साथ हासिल किया जा सकता है।

विंडोज ड्राइवरों को लिखने के लिए आपको WinDDK का उपयोग करने की आवश्यकता है।

विंडोज चालक का प्रवेश बिंदु DriverEntry function है। इस फ़ंक्शन में आप आईआरपी को अवरुद्ध करना चाहते हैं और कॉलबैक फ़ंक्शंस जो उनके साथ सौदा करते हैं, हमारे मामले में, कॉलबैक फ़ंक्शंस जो अग्रेषण में देरी करते हैं।

उदाहरण के लिए, हमारे IRP देरी हो करने के लिए IRP_MJ_READ है और हमारे कॉलबैक फ़ंक्शन CallbackDelayForwarding कहा जाता है:

// 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 अंदर अग्रेषण में देरी करने के लिए आपको किसी प्रकार का अनुकरण करने के लिए KeInitializeTimer परिवार से कार्यों का उपयोग करना चाहिए नींद (शायद ताले के साथ संयोजन में), केडेलए एक्सेक्यूशन थ्रेड इत्यादि

जॉयस्टिक ड्राइवर श्रृंखला में अपने फ़िल्टर ड्राइवर को स्थापित करने के लिए, आप .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://msdn.microsoft.com/en-us/library/ff545890.aspx

मुझे लगता है कि WDK नमूने आप यहाँ से विंडोज ड्राइवर किट डाउनलोड करने के लिए है ould शामिल हैं: http://www.microsoft.com/whdc/DevTools/WDK/WDKpkg.mspx

WDK शायद एक फिल्टर बनाने के लिए एक नमूना कोड शामिल हैं।

वहाँ भी माइक्रोसॉफ्ट की साइट पर निम्नलिखित डाउनलोड है: http://support.microsoft.com/kb/176417

यह शायद एक छोटे से पुरानी के बाद से यूएसबी समर्थित नहीं किया गया था पूर्व NT5.0 सा है, लेकिन शायद यह अभी भी प्रासंगिक है।

+0

मुझे स्पैम फ़िल्टर को ट्रिक करने के लिए टाइपो को दूसरे और तीसरे लिंक में रखना पड़ा क्योंकि मैं एक नया उपयोगकर्ता हूं। :( – David

+0

मैंने आपके लिए लिंक संपादित किए हैं :)। –

1

मैं यह धारणा थी कि आप इस्तेमाल कर सकते हैं <dinput.h>

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

तो जॉयस्टिक घटनाओं WM_JOYMOVE घटनाओं, से निकाल देते थे, हालांकि क्या wParam और lParam संदेश के लिए मुझे नहीं पता होगा।

फिर जब अपने कार्यक्रम बंद कर देता है या अब आप नहीं चाहते joyReleaseCapture(JOYSTICKID1) आदि
यह सिर्फ खाली पैरामीटर जो तब joyGetPos या joyGetPosEx कार्यों उपयोग करने के लिए यूएसबी डिवाइस से खुद के लिए डेटा खोजने के लिए आपको बता हो सकता है।

2

आप Autohotkey का उपयोग करना चाह सकते हैं। यह विंडोज़ के लिए एक स्क्रिप्ट भाषा है जो माउस/कीबोर्ड/जॉयस्टिक के हर कुंजी को रीमेप कर सकती है। यदि आप एक स्क्रिप्ट के माध्यम से कुंजी को कैप्चर करते हैं और सक्रिय एप्लिकेशन पर सही कुंजी/मैक्रो भेजने से पहले देरी डालते हैं, तो आपके पास आपकी समस्या के समाधान का एक हिस्सा हो सकता है।

संबंधित मुद्दे