هو أول الخيط الذي يحصل لتشغيل داخل Win32 عملية "الأولية الموضوع"?تحتاج إلى فهم دلالات

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

سؤال

إنشاء عملية استخدام CreateProcess() مع CREATE_SUSPENDED ثم المضي قدما لإنشاء التصحيح قليلا من التعليمات البرمجية داخل بعد عملية تحميل DLL و استدعاء دالة (المصدرة من أن DLL) باستخدام VirtualAllocEx() (مع ..., MEM_RESERVE | MEM_COMMIT, PAGE_EXECUTE_READWRITE), WriteProcessMemory(), ثم اتصل FlushInstructionCache() على أن التصحيح من الذاكرة مع رمز.

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

الآن يأتي غريبة الملاحظة:تذكر أن PROCESS_INFORMATION::hThread لا تزال معلقة.عندما كنت ببساطة تجاهل hRemoteThread's رمز الإنهاء و أيضا لا انتظر حتى خروج كل يذهب "بخير".روتين المكالمات CreateRemoteThread() يعود PROCESS_INFORMATION::hThread يحصل استؤنفت (عن بعد) برنامج يحصل في الواقع إلى تشغيل.

ومع ذلك ، إذا كنت الاتصال WaitForSingleObject(hRemoteThread, INFINITE) أو القيام بما يلي (الذي له نفس التأثير):

DWORD exitCode = STILL_ACTIVE;
while(STILL_ACTIVE == exitCode)
{
    Sleep(500);
    if(!GetExitCodeThread(hRemoteThread, &exitCode))
        break;
}

تليها CloseHandle() وهذا يؤدي إلى hRemoteThread قبل الانتهاء PROCESS_INFORMATION::hThread يحصل استؤنفت العملية ببساطة "يختفي".وهو ما يكفي للسماح hRemoteThread لإنهاء بطريقة أو بأخرى دون PROCESS_INFORMATION::hThread تسبب عملية الموت.

هذا يبدو مثير للريبة مثل حالة سباق منذ ظل ظروف معينة hRemoteThread قد يكون لا يزال أسرع وأكثر عملية من المرجح أن لا يزال "تختفي" ، حتى لو تركت الكود كما هو.

هل هذا يعني أن الموضوع الأول الذي يحصل على تشغيل في إطار عملية يصبح تلقائيا الأولية الموضوع أن هناك قواعد خاصة الابتدائي الخيط ؟

كنت دائما تحت انطباع بأن عملية ينتهي عند آخر خيط يموت, لا عندما خاصة موضوع يموت.

لاحظ أيضا: هناك دعوة إلى ExitProcess() تشارك هنا بأي طريقة لأن hRemoteThread يعود ببساطة ، PROCESS_INFORMATION::hThread لا يزال موقوفا في حين أنا انتظر hRemoteThread للعودة.

يحدث هذا في Windows XP SP3 32bit.

تحرير: لقد حاولت فقط Sysinternals عملية مراقبة لمعرفة ما يحدث وأنا لا يمكن التحقق من ملاحظاتي من قبل.حقن رمز لا تحطم أو أي شيء بدلا من ذلك أرى أنه إذا أنا لا أنتظر موضوع لا الخروج قبل إغلاق البرنامج حيث أصبح الرمز حقن.أنا أفكر ما إذا كانت الدعوة إلى CloseHandle(hRemoteThread) يجب تأجيل أو شيء ...

تحرير+1: ليس CloseHandle().إذا تركت هذا مجرد اختبار سلوك لا تتغير عندما انتظار مؤشر ترابط إلى النهاية.

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

المحلول

أول موضوع لتشغيل ليست خاصة.

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

أو جعل موضوع جديد انتظر لمدة خمس ثوان ثم الخروج.كما هو متوقع فإن هذه العملية سوف يعيش لمدة خمس ثوان والخروج عندما الثانوية ينهي الموضوع.

أنا لا أعرف ما يحدث مع المثال الخاص بك.أسهل طريقة لتجنب العرق هو جعل موضوع جديد استئناف الموضوع الأصلي.

المضاربة الآن أنا أتساءل عما إذا كان ما تفعلونه ليس من المرجح أن يسبب مشاكل على أي حال.على سبيل المثال, ماذا يحدث DllMain ويدعو ضمنيا تحميل Dll ؟ هم بشكل غير متوقع يحدث على موضوع الخطأ, يتم تخطي, أم أنها أجلت حتى بعد التعليمات البرمجية تشغيل مؤشر الترابط الرئيسي يبدأ ؟

نصائح أخرى

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

أنا لا أعرف أن هناك طريقة جيدة لجعل الترابط الرئيسي الانتظار بالنسبة لك لإكمال...

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