創建線程時候多參數傳遞方法及參數改變問題--掃雷輔助(三)

創建線程時候參數傳遞方法及參數改變問題

多參數傳遞

這個是MSDN 給出的函數原型

HANDLE WINAPI CreateRemoteThread(
  _In_  HANDLE                 hProcess,
  _In_  LPSECURITY_ATTRIBUTES  lpThreadAttributes,
  _In_  SIZE_T                 dwStackSize,
  _In_  LPTHREAD_START_ROUTINE lpStartAddress,
  _In_  LPVOID                 lpParameter,
  _In_  DWORD                  dwCreationFlags,
  _Out_ LPDWORD                lpThreadId
);

lpParameter 我們用於傳遞參數的形參
由於其類型是 LPVOID 感覺MS 命名 就是 (VOID *)類型, 所以對參數進行取址, 在線程中進行轉換就好

        CreateRemoteThread(hRemoteProcess, NULL, 0, pfnStartAddr, &i, 0, NULL))

如果涉及到多參數傳遞 , 就需要傳遞一個結構體了

struct ThrdPara
{
    HWND hWnd;
    HWND hWnd2;
    HANDLE hPipe;
};

ThrdPara thrdPara;
thrdPara.hPipe = m_hPipe;
thrdPara.hWnd = ::AfxGetMainWnd()->m_hWnd;

CreateRemoteThread(hRemoteProcess, NULL, 0, pfnStartAddr, &thrdPara, 0, NULL))

//然後在線程函數裏面, 重新轉換爲ThrdPara類型即可

參數改變問題

遇到了一個難搞的問題, 還是折騰了半天

就以上述代碼爲例, 在運行過程中,
發現在主線程中的值, 和在子線程的值,完全不一樣,基本是子線程是隨機的
傳入的值,和子線程得到的不等(還以爲發現了啥天大的bug

最後終於找到了問題躲在

func()
{
    CreateThread...
    //sleep
    return...
}

這裏是代碼結構導致的 , 因爲此處,創建完成線程之後, 函數直接返回
讓後,問題就來了 , 傳入的是局部變量, 返回之後, 進過棧平衡,
那這樣我們傳入的地址,早都不知道是啥了;
所以去掉sleep的註釋即可

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章