كيف بدأ كل شيء
لنبدأ من خلال طرح المشكلة. الممنوحة: كمبيوتر محمول واحد. كمبيوتر محمول جديد ، والألعاب. مع RGB الخلفية. إليك جهاز كمبيوتر محمول مثل هذا:
الصورة مأخوذة من lenovo.comهناك أيضا برنامج لهذا الكمبيوتر المحمول. يتحكم البرنامج فقط في هذه الخلفية.
المشكلة الوحيدة هي برنامج Windows ، لكنني أريد أن يعمل كل شيء على نظام Linux المفضل لديك. والمصابيح الكهربائية للتألق ، وحتى الألوان الجميلة تومض. نعم ، هذا هو مجرد كيفية القيام بذلك ، بحيث بدون هندسة عكسية ودون كتابة برامج التشغيل الخاصة بك؟ وجاء الجواب البسيط بسرعة - بأي حال من الأحوال. حسنا ، دعنا نذهب كتابة سائق.
الخطوة 1 - الخوض في الكود
لدينا ثلاثة أماكن يمكنك من خلالها رؤية كيف تومض الإضاءة الخلفية. من أجل زيادة الصعوبة:
1. برنامج ألعاب كبير ومضخّم Lenovo Nerve Center - حيث توجد وظيفة لتهيئة كل هذه الإضاءة الخلفية.
2. مزيج من مفاتيح الاختصار Fn + Space ممكن. تتم معالجتها بواسطة نفس البرنامج.
3. BIOS. أثناء تحميل الكمبيوتر المحمول ، تومض الإضاءة الخلفية أيضًا - ولكن باللون الأحمر فقط وفقط لثانية واحدة.
في المستقبل ، سأقول إن عليّ تجربة الثلاثة ، لكنني أحرزت بعض النجاح فقط في الأول. سنتحدث عنها.
حسنًا ، افتح مجلد البرنامج:

نلاحظ على الفور أن هناك DLL مع اسم مثير للاهتمام - LedSettingsPlugin.dll. هل لنا ...؟ دعنا نفتح في IDA Pro ونلقي نظرة.

انتبه إلى النصف الأيمن من الشاشة. هناك الكثير من المعلومات المتبقية من المبرمجين - سنستخدمها. نرى أنه لسبب ما هناك العديد من الأسطر المشابهة لأسماء الطريقة. لماذا؟

وهذه هي أسماء الطرق. كيف مريحة! دعنا نقول ما يمكننا بأسمائنا ، وننظر إلى قائمة الوظائف مرة أخرى. للتسمية في IDA ، يمكنك استخدام مفتاح الاختصار N ، أو انقر بزر الماوس الأيمن على ما نريد الاتصال به.

نحن ننظر إلى وظائف ... Y720LedSetHelper :: SetLEDStatusEx. يبدو أننا بحاجة إلى! نلاحظ أن شيئًا ما يشبه السلسلة يتم تشكيله هنا ثم يتم تمريره إلى CHidDevHelper :: HidRequestsByPath معين. مهتم على وجه التحديد بـ var_38 ، جميع التحولات التي خصصت لها المؤسسة الدولية للتنمية.
Var_34 هي أيضا مثيرة للاهتمام بالنسبة لنا. يذهب مباشرة بعد var_38 - في تقليد التجميع ، يتم تخزين المتغيرات بترتيب عكسي تحت RSP. Var_34 هنا هو مجرد اسم الثابت - -34 h.
نحصل على ذلك بدءًا من var_38 ، يضع البرنامج الصفر ، ثم النمط واللون والرقم الثالث والكتلة هي جزء من لوحة المفاتيح التي سينطبق عليها هذا اللون. (بالنظر إلى المستقبل ، سأقول أن الثلاثة هي قيمة السطوع هنا. وبعد أن جعلتها قابلة للإدارة ، نحصل على برنامج التشغيل أكثر برودة من الأصل!)
دعنا ندخل في HidRequestsByPath وأخيراً اكتشف كيف تسير الأمور.

نرى وظيفتين ، HidD_GetFeature و HidD_SetFeature. كلاهما في الملف لا يتم تتبعهما ... لكن يتم تتبعهما جيدًا في وثائق Microsoft الرسمية -
هنا وهنا .
يمكنك تهنئة نفسك بهذا الأمر - لقد وصلنا إلى هناك. هذا هو الجزء السفلي ، لا حاجة للحفر أعمق. في Linux ، هناك مثل هذه الوظائف - تحتاج فقط إلى الاتصال بها بنفس الحجج ، وكل شيء يجب أن ينجح ... هل هذا صحيح؟
الخطوة 2 - إطلاق النموذج الأولي ...؟
ليس حقا دعنا نبدأ بسيطة وتشغيل lsusb. لذلك نجد لوحة المفاتيح ، وإرسال شيء ما إليها.

Integrated Technology Express، Inc. يبدو الأكثر إثارة للاهتمام هنا. سوف نستخدم الأداة الشهيرة / dev / hidraw. نجد الحل الصحيح ... ويتم ذلك عن طريق البحث البسيط في الملفات / sys / class / hidraw / hidraw * / device / uevent.

هنا واحد. الأرقام هي نفسها - وهذا يعني أن هذا الجهاز هو hidraw0. لكننا نحاول إرسال البيانات ، ولا يحدث شيء! نوع من الهراء. في هذه المرحلة ، تبدأ الأيدي بالهبوط ... ربما ، ليس للبشر فقط ، هل هذه الهندسة العكسية؟
لكن دعنا نستمر. سنحاول. إذا كان المؤلف يفهم كل هذا ، فسوف يعيد البحث عن سائقنا من مركز Nerve نفسه ... لكن ليس لدينا عقل. دعنا نعود إلى Windows ، هناك فكرة واحدة.
هناك شيء من هذا القبيل في ويندوز - إدارة الأجهزة. يتيح لك القيام بالكثير - نحن مهتمون بحقيقة أنه يسمح لك بقطع الأجهزة. بسيطة ولا هوادة فيها.
فلنقطع الأجهزة واحدًا تلو الآخر حتى تتوقف حالة المصابيح.

تم تقطيع هذا واحد. لذلك ، إذا نظرت إلى معرف الجهاز ، فسوف نرى ما هو اسمه وماذا يأكل.

ننظر - إنه هو.

جهاز أفيض منذ عدة سنوات في dmesg.
[لماذا لم يظهر في لسوسب؟ وليس USB على الإطلاق. يستخدم بروتوكول I2C HID ، والذي يسمح لك
بإخفاء الأجهزة عن الأيادي الفضولية للحرفيين لتثبيت أدوات HID على ناقل الكمبيوتر نفسه.]
استطراد غنائي - دعنا نلتزم
بحثًا عن الجهاز الصحيح ، حملت التثبيت الخاص بي تقريبًا إلى kernel. أيضًا ، لم يعجبني حقًا ما عرضته على ورقة dmesg هذه قبل كل قفل. بما أنني هنا ، لماذا لا تكتب التزامًا قصيرًا؟ أيدي حكة على أي حال.
ما نحتاج إلى رؤيته هو المكان الذي توجد فيه الأجهزة على I2C HID ، وأين نكتب الأشياء الغريبة الكامنة فيها.
هنا. دون مزيد من اللغط ، دعونا نستمع إلى الخطأ - طول الإدخال غير صحيح. لنجعلها صحيحة.

أضف طلبًا جديدًا ، دعنا نسميه I2C_HID_QUIRK_BAD_INPUT_SIZE. عن طريق القياس مع القائمة.

أضف جهازنا إلى قائمة quirkut. ما قمنا به حتى الآن:
1. ابحث في الإنترنت عن "i2c hid linux kernel". النقر على الاستجابة الرابعة ل DuckDuckGo.
2. كتب ثلاث كلمات (!) باللغة الإنجليزية - BAD_INPUT_SIZE
3. أضيف واحد إلى BIT (4). اتضح BIT (5).
4. أضفنا رقمًا واحدًا في hid-ids.h - معرف جهازنا (لا يظهر في الرسم التوضيحي ، ولكن يوجد أيضًا تقريبًا).
دعنا البرنامج الآن.
نرى السطر - `ret_size = ihid-> inbuf [0] | ihid-> inbuf [1] << 8 ؛ `
ثم تشكو من أن إعادة الحجم لا تساوي ما تريد.
واسمحوا إذا كان queer متورط ، تفعل الشيء نفسه ، عكس ذلك تماما.

نرسل التصحيح إلى النشرة الإخبارية ، ولا ننسى اختبار ... (بصراحة ، استغرق الأمر أكثر من مجرد إضافة إلى النشرة الإخبارية للمخ. إنه ليس بالأمر السهل.)

وهذا كل شيء.
الخطوة 3 - السائق!
ثم تذكرت - نعم ، لا يزال يتعين عليك كتابة برنامج تشغيل. قررت عدم الالتزام بالنواة حتى الآن (بدأت الأسئلة تثار هناك ، كان عليّ التفكير حقًا. إذا كان بإمكان أي مواطن من هابروفسك مساعدتي في النصح والكتابة لي - سأكون سعيدًا!)
افتح الثعبان. (في البداية ، كان bash ، لكنني غيرت رأيي بسرعة كبيرة.) سنستخدم الأداة المعروفة / dev / hidraw.
/ dev / hidraw0 ، / dev / hidraw1 - كيف تعمل هذه الملفات على الإطلاق؟ بالنسبة للإدخال / الإخراج البسيط ، يمكن استخدامها مثل أي ملف عادي ، وسيعمل. ولكن GetFeature و SetFeature تضطر إلى العبث ...
اقترح StackOverflow (أو أي شخص آخر ، لا أتذكره بالفعل) أنه يحتاج إلى بعض ioctl. هذه طريقة خاصة للتعامل مع الملفات غير المعتادة مثل أجهزة HID والأجهزة الطرفية وما شابه ذلك.
يعمل Ioctl مثل هذا. أنت تعطيه واصف ملف مفتوح (من يهتم بما هو عليه ،
هناك رابط إلى ويكيبيديا ) ، وبعض الأرقام ومخزن مؤقت - وبعد ذلك يقوم بشيء مع هذا المخزن المؤقت ويعيده مرة أخرى. لن أبالغ ، فهناك الكثير من الأشياء التي تعتمد على التنفيذ. اسمح لي بتقديم مثال: 0xC0114806 ، أو بالفعل مألوف لنا SetFeature. إنه كذلك
(6 << 29) | (ord('H') << 8) | (0x06 << 0) | (0x11 << 16).
أول 6 هنا يعني أن الملف سيكون مفتوحًا للكتابة والقراءة. لماذا القراءة ليست واضحة للغاية - ولكنها مكتوبة للقيام بذلك ، وربما ينبغي أن يكون كذلك. Ord ('H') هنا - اختصار HID. ربما يعني أشياء أخرى ، وهذا يتوقف على الملف. في هذه الحالة ، فإن HID.
0x06 - الفريق نفسه. الفريق السادس مع HID هو SetFeature. الجزء الأخير هو طول المخزن المؤقت.
يبقى فقط استدعاء ioctl بهذه القيم - والإخراج هو برنامج التشغيل.
هو يعمل .
خاتمة
آمل أن يكون من الممتع قراءته. حتى مفيدة ، ربما. تم حذف بعض أو اختصار - ربما سيكتشف القارئ ذو الرؤية الحادة قراءة الحالة في برنامج التشغيل ، وبعض SetFeature الثاني ، والذي لم يتم ذكره مطلقًا في النص. يعد تطوير برامج التشغيل و Linux kernel من الأشياء الكبيرة ، ولا يمكن إتقانها تمامًا في دراجة واحدة. من غير المرجح أن يكون المقال حول هذا الموضوع ، ولكن عن حقيقة أن صنع شيء صغير وممتع ، مفتوح المصدر أو لنفسك ، ليس بالأمر الصعب على الإطلاق. تحتاج فقط إلى العثور على أسبوع من الأمسيات مع الشاي والرغبة في الخوض في الكود.