كيف تسمح تطبيقات 32 بت على ويندوز 64 بت لتنفيذ 64 بت التطبيقات المتوفرة في Windows\System32

StackOverflow https://stackoverflow.com/questions/509989

سؤال

نقول لديك التطبيق, أن كنت تريد أن توفر للمستخدمين القدرة على تصفح system32 وتنفيذ البرامج (مثل telnet).

ما هي أفضل طريقة لدعم هذا عندما كنت في حاجة إلى دعم XP وما بعده عميل و 2k فصاعدا عن الخادم ؟

وقد كتب كل هذا أتساءل عما إذا كان هناك فقط الكثير من الوقت/الجهد في توفير تصفح للقيام بذلك ، حيث أنها يمكن أن مجرد نسخ من explorer.لا يزال يتطلب القدرة على إطلاق.

لقد وجدت بعض المناقشات على Nynaeve.

حتى الآن يبدو أن هناك الخيارات التالية

  1. إنشاء sysnative مجلد في ويندوز والتي سوف تسمح لك لتصفح/تنفيذ 64 بت.المسائل هي:
    • متوفر فقط في ويندوز فيستا/قرون طويلة ، لذلك أي دعم XP 64
    • يؤدي إلى مسار مختلف التسمية ، لا يمكن استخدام نفس المسار على إصدارات متعددة.
    • سوف تكون نشطة على كل من ويندوز ، ليس فقط التطبيق لدينا
    • قد لا (ربما لا) المناسب أن تفعل عند تثبيت التطبيق
    • يسمح تحديد صراحة من خلال المسار الوحيد الذي الإصدار من التطبيق لإطلاق إذا كان هناك 32 بت و 64 بت
  2. استخدام windows API مؤقتا تعطيل إعادة توجيه عندما عرض ملف القوائم أو تنفيذ المستخدمين تشغيل الأوامر.المسائل هي:
    • متوفر فقط على 64 بت يجب أن الفوضى مع GetProcAddress
    • متاح فقط تحت بعض حزم الخدمة
    • يجب على حدة تحديد جميع المواقع التي يجب أن يكون هذا تنفيذها
    • المستخدم سوف تحتاج إلى توفير منفصلة معلومات حول ما إذا كان هذا هو 64 بت التطبيق أو 32 بت.

إذا كان أي شخص لديه بعض التعليمة البرمجية الموجودة في المثال الذي عرض ويندوز OpenFile الحوار (أقول باستخدام MFC CFileDialog) تظهر nativly for XP/Vista والسماح بعرض 64 بت system32, التي من شأنها أن تكون رهيبة.

إذا كان أي شخص لديه مثال على إطلاق اسمه التطبيق ، وهذا من شأنه أيضا أن تكون كبيرة!

تحرير:
حاليا نحن نستخدم CreateProcess لإطلاق التطبيق (الذي هو الفشل).

err = CreateProcess((wchar_t*)exeName.c_str(), (wchar_t*)cmdLine.c_str(), NULL, NULL, FALSE, CREATE_SEPARATE_WOW_VDM, NULL, workingDir.c_str(), &startupInfo, &processInfo);
هل كانت مفيدة؟

المحلول

لقد ذهبت مع الخيار 2 ، بالنسبة لأولئك الذين قد تكون مهتمة;هنا هو بلدي الإختراق السريع في وراقب الإصدار من إدارة تعطيل Wow64 توجيه استنادا إلى ملاحظات من السيدةسيتم إعادة توجيه إذا API المتاحة ، يتوقع أن kernel32.dll هو متاح بالفعل.

class Wow64RedirectOff {
    typedef BOOL (WINAPI *FN_Wow64DisableWow64FsRedirection) ( __out PVOID *OldValue );
    typedef BOOL (WINAPI *FN_Wow64RevertWow64FsRedirection) ( __in  PVOID OldValue );

public:
    Wow64RedirectOff() {
        LPFN_Disable = (FN_Wow64DisableWow64FsRedirection)GetProcAddress(
            GetModuleHandle(TEXT("kernel32")),"Wow64DisableWow64FsRedirection");
        if( LPFN_Disable ) {
            LPFN_Disable(&OldValue);
        }
    }

    ~Wow64RedirectOff() {
        if( LPFN_Disable ) {
            FN_Wow64RevertWow64FsRedirection LPFN_Revert = (FN_Wow64RevertWow64FsRedirection)GetProcAddress(
                GetModuleHandle(TEXT("kernel32")),"Wow64RevertWow64FsRedirection");
            if( LPFN_Revert ) {
                LPFN_Revert(OldValue);
            }
        }
    }

private:
    FN_Wow64DisableWow64FsRedirection LPFN_Disable;
    PVOID OldValue; 
};

وبالتالي من شأنه أن يكون استخدام

Wow64RedirectOff scopedRedirect;
//CFileOpen
//CreateProcess

نصائح أخرى

يمكنك الحصول على إعادة توجيهك إلى Windows/SysWoW64?لا يمكن إطلاق 64 بت التطبيقات من نظام التشغيل Windows/System32 من OpenFile في 32 بت تمكنت للتنفيذ.

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