2010-04-14 6 views
5

मैं माइक्रोसॉफ्ट मार्ग-परिवर्तन लाइब्रेरी के बारे में कुछ संक्षिप्त प्रश्नों की है। मैंने पहले (सफलतापूर्वक) इसका इस्तेमाल किया है, लेकिन मैं सिर्फ इस समारोह के बारे में सोचा था:माइक्रोसॉफ्ट मार्ग-परिवर्तन - DetourUpdateThread?

लंबी DetourUpdateThread (hThread संभाल);

मैं कहीं पढ़ा है कि इस समारोह वास्तव में धागा निलंबित कर देगा जब तक लेन-देन पूरा करती है। के बाद से सबसे नमूना कोड कहता है यह अजीब लगता है:

DetourUpdateThread (GetCurrentThread());

वैसे भी, यह कार्य स्पष्ट रूप से धागे को "enlists" करता है ताकि जब लेनदेन (और चक्कर लगाए जाते हैं), तो उनके निर्देश पॉइंटर्स संशोधित होते हैं यदि वे "लक्ष्य फ़ंक्शन या ट्रैम्पोलिन फ़ंक्शन में पुनर्लेखित कोड के भीतर" । "

मेरे प्रश्न हैं:

जब लेनदेन करता है, वर्तमान थ्रेड अनुदेश सूचक DetourTransactionCommit समारोह के भीतर होने जा रहा है? यदि हां, तो हमें इसे अद्यतन करने के लिए क्यों परेशान करना चाहिए?

इसके अलावा, यदि सूचीबद्ध धागे निलंबित कर दिए गए हैं, तो वर्तमान धागा निष्पादन जारी रख सकता है (यह देखते हुए कि अधिकांश नमूना कोड DetourUpdateThread (GetCurrentThread()) को कॉल करते हैं;)?

अंत में, आप मौजूदा प्रक्रिया के लिए सभी धागे को निलंबित कर सकता है, दौड़ की स्थिति से बचने के (यह देखते हुए कि धागे बनाया जा रहा जा सकता है और नष्ट कर दिया किसी भी समय)? शायद लेनदेन शुरू होने पर यह किया जाता है? यह हमें और अधिक सुरक्षित रूप से धागे की गणना करने में (के रूप में यह कम संभावना है कि नए सूत्र निर्मित किया जा सकता है), हालांकि क्या CreateRemoteThread के बारे में() की अनुमति होगी?

धन्यवाद,

पॉल

संदर्भ के लिए, सरल नमूना से एक उद्धरण है:

// DllMain function attaches and detaches the TimedSleep detour to the 
// Sleep target function. The Sleep target function is referred to 
// through the TrueSleep target pointer. 
BOOL WINAPI DllMain(HINSTANCE hinst, DWORD dwReason, LPVOID reserved) 
{ 
    if (dwReason == DLL_PROCESS_ATTACH) { 
     DetourTransactionBegin(); 
     DetourUpdateThread(GetCurrentThread()); 
     DetourAttach(&(PVOID&)TrueSleep, TimedSleep); 
     DetourTransactionCommit(); 
    } 
    else if (dwReason == DLL_PROCESS_DETACH) { 
     DetourTransactionBegin(); 
     DetourUpdateThread(GetCurrentThread()); 
     DetourDetach(&(PVOID&)TrueSleep, TimedSleep); 
     DetourTransactionCommit(); 
    } 
    return TRUE; 
} 

उत्तर

4

कैसे embaressing: मैं भूल गया कि स्रोत उपलब्ध हो गया था!

DetourUpdateThread चुपचाप वर्तमान धागे की भर्ती पर ध्यान नहीं देता। अन्यथा, दिए गए धागे निलंबित है। मुझे आश्चर्य है कि क्यों सभी कोड उदाहरण मौजूदा धागे को वैसे भी सूचीबद्ध करते हैं! यह पहले 2 प्रश्नों का उत्तर देता है।

3 प्रश्न के लिए के रूप में: स्नैपशॉट के माध्यम से

सभी धागे की
  1. प्राप्त स्नैपशॉट

  2. लूप और निलंबित: मैं एक detouring पुस्तकालय है कि निम्न कार्य करके सभी धागे को निलंबित करने का प्रयास करता पाया धागे जिन्हें हमने पहले ही निलंबित नहीं किया है।

  3. तो धागे निलंबित कर दिया गया, फिर वापस 1 करने के लिए जाना (हम अभी भी धागे का ट्रैक है कि हम निलंबित कर दिया है रखने के लिए)। अगर कोई धागा निलंबित नहीं किया गया तो हम कर रहे हैं।

मुझे लगता है कि इस धारणा है कि अगर हम सब धागे के माध्यम से लूप कर सकते हैं और वे कर रहे हैं सभी पहले से ही निलंबित (अर्थात पहले से हम स्नैपशॉट लिया), तो कोई और अधिक धागे सृजन किया गया है सकते हैं। हालांकि CreateRemoteThread के बारे में इतना निश्चित नहीं है!

संपादित करें: पुन: बनाएँRemoteThread।

"एक प्रक्रिया में केवल एक धागा एक डीएलएल प्रारंभ में हो सकता है या एक समय में नियमित रूप से अलग हो सकता है।" CreateRemoteThread "प्रक्रिया में प्रत्येक डीएलएल के प्रवेश बिंदु पर कॉल में परिणाम"। http://msdn.microsoft.com/en-us/library/ms682437%28VS.85%29.aspx

एक नया धागा (जब तक नया थ्रेड अभी तक इस प्रक्रिया में प्रत्येक DLL के प्रवेश बिंदु बुला वजह से नहीं किया गया है) को क्रियान्वित करने शुरू नहीं कर सकते हैं यदि आप एक DllMain समारोह में हैं। तो यदि आप अपने डोरमैन को एक डेलमेन फ़ंक्शन के भीतर लागू करते हैं, तो आप केवल एक नए रिमोट थ्रेड की दौड़ की स्थिति से सुरक्षित हो सकते हैं और इसके निर्देशक पॉइंटर को आपके पुनर्लेखित लक्ष्य/ट्रैम्पोलिन फ़ंक्शन के भीतर सुरक्षित कर सकते हैं।

धन्यवाद,

पॉल

+0

साझा करने के लिए धन्यवाद! – Danra

संबंधित मुद्दे