سؤال

أنا محاصرة لتنفيذ بعض تطبيقات 16 بت التي لدينا الداخلية أن الناس لم تعد تستخدم.هم 1985 DOS التطبيقات ، لذلك محاصرة بالنسبة لهم كان من السهل...التقاط أي العملية التي تطلق تحت NTVDM.exe

المشكلة الآن هي معرفة البرنامج الذي NTVDM هو في الواقع يعمل تحت غطاء محرك السيارة.على ما يبدو هناك coupleof 1985 البرامج التي ينبغي السماح لتشغيل لذلك أريد أن أرى الفعلية EXE الاسم الذي يختبئ تحت NTVDM.

        WqlEventQuery query =
            new WqlEventQuery("__InstanceCreationEvent",
            new TimeSpan(0, 0, 1),
            "TargetInstance isa \"Win32_Process\"");

        ManagementEventWatcher watcher = new ManagementEventWatcher(query);

        watcher.EventArrived += new EventArrivedEventHandler(watcher_EventArrived);

        watcher.Start();


...


    static void watcher_EventArrived(object sender, EventArrivedEventArgs e)
    {
        ManagementBaseObject instance = (ManagementBaseObject)e.NewEvent["TargetInstance"];

        ProcessInfo PI = new ProcessInfo();
        PI.ProcessID = int.Parse(instance["ProcessID"].ToString());
        PI.ProcessName = instance["Name"].ToString();
        PI.ProcessPath = instance["ExecutablePath"].ToString();

        // Here's the part I need...
        PI.ActualEXE = ???;

        // ... do the magic on the PI class ...

        instance.Dispose();
    }

عندما كنت التقاط سبيل المثال المعلومات ، يمكنني الحصول على سطر الأوامر, ولكن الحجج "-f-i10" ...لا يوجد EXE اسم في سطر الأوامر.هل هناك أي طريقة أخرى/الملكية يجب أن أنظر إلى تحديد EXE اسم تطبيق 16-بت هذا في الواقع يعمل ؟

تحديث: اسمحوا لي صقل السؤال:إذا كان بإمكاني إيجاد عملية NTVDM كم أنا برمجيا-معرفة المسار الفعلي إلى EXE التي يجري تنفيذها تحت ؟

شكرا

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

المحلول

الخدعة هو عدم استخدام VDMEnumProcessWOW (الذي يعطي VDMs) ، VDMEnumTasksWOW.العداد الوظيفة التي كنت تمر على هذه الوظيفة عن كل 16 بت مهمة في تحديد VDM.

لم أتحقق بنفسي لكن وفقا للوثائق ، مكتبة CodeProject لا بالضبط, إذا كنت تمر في PROC16 التعداد القيمة.إنها C++, إذا كنت بحاجة إلى مساعدة في تجميع هذا رمز الدعوة من C#, اسمحوا لي أن أعرف وأنا سوف أعطيك مثال على ذلك.

البرنامج الذي يستخدم هذا الأسلوب عملية ماجستير, ويأتي مع كامل المصدر.أقترح عليك تشغيله لمعرفة ما إذا كان يعطي المعلومات التي تحتاج إليها ، وإذا كان الأمر كذلك, يمكنك تطبيق هذا الأسلوب إلى التطبيق الخاص بك (أنها لا تعمل على ويندوز فيستا أو 7 ، فإنه يستخدم القديمة VB5 رمز ، على ما يبدو انه غير متوافق.يجب أن تعمل على XP).

إذا كانت الأمور مع هذه المهام لا يذهب كما هو مخطط لها ، قد تكون على Vista و قد تحتاج الإصلاح العاجل الموضح في هذه ستاكوفيرفلوو السؤال, مما يشير إلى تنزيل الإصلاح العاجل, الذي هو بدوره هو موضح هنا:

"تطبيق يستخدم VDMEnumProcessWOW وظيفة تعداد الظاهري دوس آلات يعود أي الإخراج أو غير صحيحة الناتج على كمبيوتر يعمل بنظام التشغيل 32-بت نسخة من ويندوز فيستا"

تحديث: في حين أن هذا يبدو واعدا ، تم تطبيق التصحيح ، ركض عدة إصدارات من القانون ، بما في ذلك مايكروسوفت ، في حين أنهم جميعا العمل على XP, فشلوا بصمت (أي خطأ أو خطأ إرجاع القيمة) على ويندوز فيستا.


إن "كيندا" العامل رمز

تحديث: أنا جربت مع (بين أمور أخرى) مع التعليمات البرمجية التالية ، الذي يجمع ما يرام في C# (و يمكن كتابة أبسط, ولكن لم أكن أريد لتشغيل المشير-خطأ المخاطر).عند إضافة هذه الوظائف ، يمكنك الاتصال Enum16BitProcesses, والتي سوف أكتب أسماء من ملفات EXE من 16 بت العمليات إلى وحدة التحكم.

لا أستطيع تشغيله على ويندوز فيستا 32 بت.ولكن ربما يمكن للآخرين ومحاولة تجميع أو العثور على خطأ في التعليمات البرمجية.سيكون من الجميل أن تعرف ما إذا كان يعمل على أنظمة أخرى:

public class YourEnumerateClass
{
    public static void Enum16BitProcesses()
    {
        // create a delegate for the callback function
        ProcessTasksExDelegate procTasksDlgt = 
             new ProcessTasksExDelegate(YourEnumerateClass.ProcessTasksEx);

        // this part is the easy way of getting NTVDM procs
        foreach (var ntvdm in Process.GetProcessesByName("ntvdm"))
        {
            Console.WriteLine("ntvdm id = {0}", ntvdm.Id);
            int apiRet = VDMEnumTaskWOWEx(ntvdm.Id, procTasksDlgt, IntPtr.Zero);
            Console.WriteLine("EnumTaskWOW returns {0}", apiRet);
        }

    }

    // declaration of API function callback
    public delegate bool ProcessTasksExDelegate(
        int ThreadId,
        IntPtr hMod16,
        IntPtr hTask16,
        IntPtr ptrModName,
        IntPtr ptrFileName,
        IntPtr UserDefined
        );

    // the actual function that fails on Vista so far
    [DllImport("VdmDbg.dll", SetLastError = false, CharSet = CharSet.Auto)]
    public static extern int VDMEnumTaskWOWEx(
        int processId, 
        ProcessTasksExDelegate TaskEnumProc, 
        IntPtr lparam);

    // the actual callback function, on Vista never gets called
    public static bool ProcessTasksEx(
        int ThreadId,
        IntPtr hMod16,
        IntPtr hTask16,
        IntPtr ptrModName,
        IntPtr ptrFileName,
        IntPtr UserDefined
        )
    {
        // using PtrToStringAnsi, based on Matt's comment, if it fails, try PtrToStringAuto
        string filename = Marshal.PtrToStringAnsi(ptrFileName);
        Console.WriteLine("Filename of WOW16 process: {0}", filename);
        return false;       // false continues enumeration
    }

}

تحديث: قراءة مثيرة للاهتمام قبل شهرة مات Pietrek.العقل الجملة في مكان ما قرب نهاية:

"بالنسبة للمبتدئين ، يستند إلى MS-DOS البرامج يبدو دائما منفصلة NTVDM الدورات.لم أكن قادرة على الحصول على MS-DOS تشغيل في نفس الدورة 16-بت يستند إلى Windows البرنامج.ولا كنت قادرا على الحصول على اثنين التي مستقل يستند إلى MS-DOS برامج تشغيل في نفس NTVDM الدورة.في الواقع ، NTVDM دورات تشغيل MS-DOS البرامج لا تظهر في VDMEnumProcessWOW والتعدادات."

يبدو أن معرفة ما هي العمليات التي يتم تحميلها, سوف تحتاج إلى كتابة هوك في NTVDM أو كتابة المستمع أن شاشات الوصول إلى الملف.عند التطبيق الذي يحاول قراءة معينة DOS NTVDM.exe إنه البنغو.قد ترغب في كتابة DLL التي تعلق NTVDM.exe ولكن نحن الآن الحصول على قليلا قبل أنفسنا.قصة قصيرة طويلة:هذا القليل ركوب في NTVDM أظهرت "الاحتمالات" التي ظهرت الحقيقي الخدع في نهاية المطاف.

هناك طريقة واحدة أخرى, لكن الوقت قصير جدا لخلق مثال على ذلك.يمكنك كزة حولها في دوس شرائح الذاكرة و EXE عادة ما يتم تحميلها في نفس الجزء.ولكن أنا متأكد لو أن في نهاية المطاف سوف يؤدي إلى نفس النتيجة وما إذا كان الأمر يستحق كل هذا الجهد.

نصائح أخرى

يعمل هذا بالنسبة لي:

  • اتبع الإرشادات التي تظهر في وصف نهج تقييد البرامج في نظام التشغيل Windows XP لفتح المحلي أو المجال محرر نهج.

  • في إطار نهج تقييد البرامج -> قواعد إضافية, انقر بزر الماوس الأيمن واختر جديد تجزئة القاعدة.

  • استعرض للوصول إلى (على سبيل المثال) edit.com.تأكد من يتم تعيين مستوى الأمان إلى غير مسموح به.انقر فوق "موافق".

الآن ،

C:\>edit
The system cannot execute the specified program.

(أنا الحصول على نفس النتائج من command.com و cmd.exe - تحت Win XP)

من هذا الرابط عن وظائف VDMDBG, قد تكون قادرة على P/الاحتجاج "VDMEnumProcessWOW ()" ، ثم تعداد وحدات داخل العملية باستخدام PSAPI.

ملاحظة بخصوص 16-بت DOS التطبيقات:

أيا من وظائف VDMDBG العمل مع 16-بت DOS التطبيقات.تعداد دوس VDMs, تحتاج إلى استخدام آخر الأسلوب.أولا, هل يمكن استخدام VDMEnumProcessWOW() لجعل قائمة كل Win16 VDMs ثم تعداد جميع حالات NTVDM.exe باستخدام بعض البرنامج الآخر (مثل PSAPI).أي NTVDM.exe من كامل التعداد أن لم يكن في Win16 قائمة دوس VDM.يمكنك إنشاء وإنهاء 16-بت DOS التطبيقات مع CreateProcess () ، TerminateProcess().

على أمل أن يساعد...

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