मैं माइक्रोसॉफ्ट मार्ग-परिवर्तन लाइब्रेरी के बारे में कुछ संक्षिप्त प्रश्नों की है। मैंने पहले (सफलतापूर्वक) इसका इस्तेमाल किया है, लेकिन मैं सिर्फ इस समारोह के बारे में सोचा था:माइक्रोसॉफ्ट मार्ग-परिवर्तन - 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;
}
साझा करने के लिए धन्यवाद! – Danra