سؤال

أنا جديد على برامج تشغيل NDIS LWF ولكن كان علي الانتقال إليها بعد أن قررت أن برنامج WFP على Win7 لن يلبي متطلباتي.لذا نأمل ألا يكون هذا سؤالًا أساسيًا للغاية.

تتطلب متطلباتي بشكل أساسي القدرة على الاستماع بطريقة غير شرعية إلى بطاقة NIC محددة على نظام متعدد بطاقات NIC.لقد قمت بتعديل نموذج LWF لوضع الواجهات في الوضع المختلط ولكنني الآن عالق في كيفية ضبط المحول المحدد.أدرك أن LWF موجود فوق جميع المحولات، لذا فهو ليس مثل البروتوكول حيث يمكنني فقط الاتصال بـ NdisOpenAdapterEx ولكني أفترض أنه يجب أن تكون هناك بعض آليات التصفية لتجاهل محولات معينة.

أحتاج إلى أن أكون قادرًا على توصيل IOCTL للسائق بعنوان (عناوين) MAC المحددة للواجهة التي أهتم بها.هل من الممكن تحميل برنامج التشغيل مع تشغيل الفلتر فقط على واجهات محددة أم سأضطر فقط إلى تجاهل المكالمات الواردة من الآخرين الذين لا أهتم بهم في FilterReceiveNetBufferLists.يبدو أنه سيكون من الأكثر فعالية عدم الاضطرار إلى الحصول على رد اتصال FilterReceiveNetBufferLists إذا لم أفعل أي شيء به لواجهة معينة.

الأشياء التي تزعجني هي حقيقة أنه يتم استدعاء FilterRestart تلقائيًا أثناء DriverEntry (عبر NdisFRegisterFilterDriver) وأنه لا يبدو أن هناك NdisFPauseFilter (ولكن يوجد NdisFRestartFilter).من الناحية المثالية، أود أن أكون قادرًا على تعيين المعلمات الضرورية قبل بدء أي عملية تصفية وأريد الابتعاد عن استخدام السجل أثناء DriverEntry لأنني سأظل بحاجة إلى القدرة على إعادة المهام ديناميكيًا كما هو مطلوب.

وأخيرًا، فقط من أجل فهم أفضل لجوانب NDIS الداخلية، عندما يتم إيقاف وحدة التصفية مؤقتًا، هل تتوقف المجموعة بأكملها مؤقتًا أم يتم توجيه NDIS حول الوحدة المتوقفة مؤقتًا؟

هل كانت مفيدة؟

المحلول

هذه أسئلة جيدة.

هل من الممكن تحميل برنامج التشغيل مع تشغيل الفلتر فقط على واجهات محددة؟

نعم.لديك ثلاثة خيارات هنا.

  1. تعطيل الربط بشكل ثابت في وضع المستخدم؛أو
  2. رفض الربط في وقت التشغيل.
  3. تجاوز مسار البيانات وإعادة تمكينه ديناميكيًا.(لن يتم تفصيل هذا هنا، لأنه تم توضيحه بالفعل على MSDN.)

لتعطيل الربط بشكل ثابت، يمكنك استخدام واجهة برمجة تطبيقات INetCfg للعثور على الرابط بين برنامج تشغيل الفلتر وبطاقة NIC، ثم قم بتعطيله.قد يبدو هذا كالتالي:

INetCfg::Initialize
myFilter = INetCfg::FindComponent
myFilter->QueryInterface(INetCfgComponentBindings)
for each binding in bindings
    if binding is to undesirable NIC
        INetCfgBindingPath::Enable(FALSE)

يمكنك القيام بذلك في أي وقت، بمجرد تثبيت برنامج التشغيل الخاص بك.على سبيل المثال، قد يقرر تطبيق وضع المستخدم الخاص بك تمكين الارتباطات لبطاقات NIC معينة فقط عند تشغيل واجهة المستخدم الرسومية الخاصة به.

ولكن ليس من المناسب دائمًا تشغيل رمز وضع المستخدم، وإذا لم يكن برنامج التشغيل الخاص بك موجودًا بالفعل في وضع المستخدم، فمن المحتمل أن يكون إنشاء واحد فقط لتعطيل بعض الارتباطات أمرًا مبالغًا فيه.هذا هو المكان الذي تكون فيه التقنية الثانية مفيدة.يمكنك ترك الارتباطات ممكّنة بشكل ثابت في وضع المستخدم، لكن يمكنك رفض الارتباط في وقت التشغيل.

كيف ترفض الارتباط في وقت التشغيل؟في كثير من الحالات، كل ما عليك فعله هو إرجاع حالة الفشل من جهازك FilterAttach معالج.وهذا يكفي لإقناع NDIS بأن الفلتر الخاص بك لا يمكنه (أو لن) إرفاقه ببطاقة NIC.ولكن - إذا تم وضع علامة على الفلتر الخاص بك كـ إلزامي (على سبيل المثال، FilterRunType الخاص بـ INF هو 1)، ثم يفشل FilterAttach سوف يتسبب في أن تصبح بطاقة NIC غير صالحة للعمل.(بعد كل شيء، هذا بيت القصيد من كونها إلزامية.إذا كان عامل التصفية الخاص بك غير موجود، ثم datapath لا يجب run.) ولكن إذا كنت تريد السماح لبطاقة NIC ببدء التشغيل على أي حال، فقم بتعيين NDIS_FILTER_ATTACH_FLAGS_IGNORE_MANDATORY العلم في الخاص بك NDIS_FILTER_ATTACH_PARAMETERS::Flags الحقل مباشرة قبل أن يقوم الفلتر الخاص بك بإرجاع رمز الفشل من ملفه FilterAttach.

يبدو أنه سيكون من الأكثر فعالية عدم الاضطرار إلى الحصول على رد اتصال FilterReceiveNetBufferLists إذا لم أفعل أي شيء به لواجهة معينة.

غرائزك صحيحة.هناك عبء إضافي لوجود مرشح في مسار البيانات، وإذا لم يفعل المرشح شيئًا، فهذا يعني إهدار دورات وحدة المعالجة المركزية.لكن لا تشطب هذا الخيار حتى الآن.في بعض الحالات، تفوق بساطة هذا الخيار تكلفة وحدة المعالجة المركزية (الصغيرة نسبيًا).أي أنه ما لم يكن السوق المستهدف يحسب كل دورة من دورات وحدة المعالجة المركزية، فقد يكون من الجيد اتباع هذا الخيار البسيط.

أرغب في الابتعاد عن استخدام السجل أثناء DriverEntry لأنني سأظل بحاجة إلى القدرة على إعادة المهام ديناميكيًا كما هو مطلوب.

كما ذكرنا أعلاه، أنت يستطيع إعادة المهمة باستخدام رمز وضع المستخدم.في كل مرة يستدعي فيها وضع المستخدم INetCfg::Apply، ستتصل NDIS بأي منها FilterAttach أو FilterDetach اللازمة لإجراء التغييرات الصحيحة.

ليس من الممكن حقًا إعادة المهمة عند استخدام التقنية الثانية.إذا كنت بحاجة إلى إعادة تكليف بطاقة NIC معينة، فيجب عليك إما استخدام التقنية الأولى أو الثالثة.

عند إيقاف وحدة التصفية مؤقتًا، هل تتوقف المجموعة بأكملها مؤقتًا أم أن NDIS يتجه حول الوحدة المتوقفة مؤقتًا؟

تم إيقاف المكدس بالكامل مؤقتًا.لا تقوم NDIS "بالتنقل حول" المرشحات.(إذا كان الفلتر اختياريًا، فستتجاوز حركة المرور الفلتر الخاص بك عندما لا يكون الفلتر قيد التشغيل.ولكن طالما أن الفلتر الخاص بك متصل ببطاقة NIC، فسوف تمر NBLs وOIDs عبر الفلتر الخاص بك.)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top