獲得執行緒或者程序的真實控制代碼的方法
上章我們講到偽控制代碼帶來的一系列麻煩,那麼怎麼辦呢
一個方法是使用duplicateHandle把偽控制代碼轉化程實控制代碼
DuplicateHandle原本是程序間複製控制代碼的函式,原理其實很簡單把一個程序的控制代碼複製到另一個程序控制代碼表
在這裡我們要說下,什麼是偽控制代碼,偽控制代碼返回了物件的引用,但是,在控制代碼表中查詢不到該控制代碼,所以,可用,但是在控制代碼表中找不到的控制代碼是偽控制代碼,反之能在控制代碼表中找到的控制代碼是真實的控制代碼
DuplicateHandle(GetCurrentProcess(),GetCurrentThread(),GetCurrentProcess(),&hThread,0,false,DUPLICATE_SAME_ACCESS);、
DuplicateHandle把本程序的某個執行緒的核心物件的引用複製到本程序的控制代碼表中,那麼,返回的控制代碼當然是該執行緒的真實控制代碼
那麼附上測試程式碼
#include <windows.h>
#include <iostream>
#include <process.h>
using namespace std;
unsigned int WINAPI WorkThread(void* param);
typedef HANDLE (WINAPI * OPENTHREADFUN)(DWORD dwDesiredAccess,BOOL bInheritHandle,DWORD dwThreadId);
int main()
{
FILETIME CreatTime;
FILETIME ExitTime;
FILETIME KernelTime;
FILETIME UserTime;
HANDLE hThread;
GetThreadTimes(GetCurrentThread(),&CreatTime,&ExitTime,&KernelTime,&UserTime);
cout <<"CreatTime:"<<CreatTime.dwHighDateTime<<","<<CreatTime.dwLowDateTime<<endl;
cout<<"ExitTime:"<<ExitTime.dwHighDateTime<<","<<ExitTime.dwLowDateTime<<endl;
cout<<"KernelTime:"<<KernelTime.dwHighDateTime<<","<<KernelTime.dwLowDateTime<<endl;
cout <<"UserTime:"<<UserTime.dwHighDateTime<<","<<UserTime.dwLowDateTime<<endl;
hThread=GetCurrentThread();
DuplicateHandle(GetCurrentProcess(),GetCurrentThread(),GetCurrentProcess(),&hThread,0,false,DUPLICATE_SAME_ACCESS);
HANDLE hThreadNew=(HANDLE) _beginthreadex(NULL,0,WorkThread,(void*)hThread,0,NULL);
WaitForSingleObject(hThreadNew,INFINITE);
CloseHandle(hThreadNew);
CloseHandle(hThread);
system("pause");
return 0;
}
unsigned int WINAPI WorkThread(void* param)
{
HANDLE hThread=(HANDLE)param;
//cout<<"ThreadHandle:"<<hThread<<endl;
FILETIME CreatTime;
FILETIME ExitTime;
FILETIME KernelTime;
FILETIME UserTime;
GetThreadTimes(hThread,&CreatTime,&ExitTime,&KernelTime,&UserTime);
cout<<"CreatTime:"<<CreatTime.dwHighDateTime<<","<<CreatTime.dwLowDateTime<<endl;
cout<<"ExitTime:"<<ExitTime.dwHighDateTime<<","<<ExitTime.dwLowDateTime<<endl;
cout<<"KernelTime:"<<KernelTime.dwHighDateTime<<","<<KernelTime.dwLowDateTime<<endl;
cout<<"UserTime:"<<UserTime.dwHighDateTime<<","<<UserTime.dwLowDateTime<<endl;
return 0;
}
,這樣的話兩個執行緒取主執行緒的相關的時間就都一樣了
其實也可以不用轉化的方法就是使用OpenThread方法,
首先DWORD id=GetCurrentThreadId來獲取當前執行緒的ID
然後OpenThread(THREAD_ALL_ACCESS,FALSE,id)根據執行緒ID就可以得到當前執行緒的真實控制代碼了
使用這個方法的根據是執行緒id或者程序id是唯一的,所以,只要根據id就可以準確的定位到想要開啟的那個物件,同理也可以根據當前程序的ID獲取控制代碼
相關推薦
獲得執行緒或者程序的真實控制代碼的方法
上章我們講到偽控制代碼帶來的一系列麻煩,那麼怎麼辦呢 一個方法是使用duplicateHandle把偽控制代碼轉化程實控制代碼 DuplicateHandle原本是程序間複製控制代碼的函式,原理其實
TLS(執行緒區域性儲存)模擬控制代碼的實現
這是今天做一個郵件傳送模組把一個類包裝成Win32 API形式呼叫時想到的。簡單的實現了一下控制代碼的概念,對於理解核心物件和控制代碼的概念有一定幫助,看起來還頗像那麼回事,呵呵。不過這裡的“控制代碼表”是藉助了TLS實現的。 值得一提的是,這個小例子也實現了引用計數的概念
執行緒&程序(獲取偽控制代碼 & 轉為真實控制代碼)
一. 1. HANDLE GetCurrentThread(); //獲得當前執行緒偽控制代碼 HANDLE GetCurrentProcess(); //獲取當前程序偽控制代碼 2.
獲得指定程序的控制代碼數
環境是VC6.0 Win2000不能使用GetProcessHandleCount函式 /***************************************************************************/ GetProcessHand
c# 呼叫c++dll掛鉤其他程式執行緒或者程序
為msdn 明確的說過c#不能全域性掛鉤,對於我這個學習面向物件的c#來說,無疑是有一定的難度的。鉤子分為全域性鉤子和執行緒鉤子,全域性鉤子掛鉤整個windows作業系統體系內的甄別優先權,而執行緒鉤子則掛鉤某一特定的程式,例如外掛,QQ盜號技術等都是有執行
windows核心程式設計-程序的控制代碼和如何獲得
程序控制代碼不同於程序核心物件的控制代碼 程序核心物件控制代碼:代表整個程序的 程序控制代碼:exe或者dll裝入某個程序的地址空間,有唯一的例項控制代碼,也可以叫做模組控制代碼 程序控制代碼的本質是程序模組在程序地址空間中的首地址! 一:GetModuleFileName
MFC 獲取當前視窗控制代碼,或者父子視窗控制代碼
父子視窗 在子視窗中,需要用到父視窗的控制代碼: AfxGetMainWnd()->m_hWnd 注:在父視窗中,也可以這麼用來呼叫自己視窗的控制代碼 在子視窗中,需要用到自己視窗的控制代碼 ChildDlg *pChildDlg ; pChildDlg->m_h
程序模組控制代碼
一、注意區別程序模組控制代碼和程序核心控制代碼 二、每個可執行檔案或者DLL檔案被裝入到某個程序地址空間後,都會有一個唯一的例項控制代碼,來表示裝入後的可執行檔案或者DLL,此時我們把這個可執行檔案或者DLL叫做程序地址空間中的一個模組。 &
關於VMware問題:無法獲得 VMCI 驅動程式的版本: 控制代碼無效。驅動程式“vmci.sys”的版本不正確......
問題 解決 根據配置檔案路徑找到對應的.vmx檔案: 用編輯器開啟,找到vmci0.present = “TRUE”一項: 將該項修改為:vmci0.present = “FALSE”
Vmware error:無法獲得 VMCI 驅動程式的版本: 控制代碼無效。
error:無法獲得 VMCI 驅動程式的版本: 控制代碼無效。驅動程式“vmci.sys”的版本不正確。請嘗試重新安裝 VMware Workstation。開啟模組 DevicePowerOn 的操作失敗。未能啟動虛擬機器。solution:到建好的虛擬機器資料夾裡,找到
DuplicateHandle程序間控制代碼複製
1、 BOOL DuplicateHandle( HANDLE hSourceProcessHandle, HANDLE hSourceHandle, HANDLE hTargetProcessHandle, LPHANDLE lpTargetHandle,
MFC中使用GetParent獲得子視窗的父視窗控制代碼
今天真是暈了,為了解決控制端開啟程序管理器頁面只能開啟一個介面且關閉後還可以開啟這個問題,在設計的主視窗類CBOFDlg,子視窗類CProcessManagerPageDlg,以及會話類CSession三個類之間周旋了好久,在這個類放一個變數來標記,另一個類中判斷,最後還是
在DLL中獲取主程序視窗控制代碼
有的時候難免需要在DLL中獲取主程序的視窗控制代碼,比如在DLL注入的時候等等。那麼如何在DLL中獲取主程序的視窗控制代碼呢?可以通過EnumWindows來實現。先通過GetCurrentProcessId獲取程序的PID,然後在EnumWindows中呼叫GetWind
根據程序控制代碼 獲得可執行檔案路徑 的幾種方法
通過程序控制代碼,獲得可執行檔案的路徑,主要有以下幾種方法: 第一種方法:也是最常用的方法,是通過GetModuleFileNameEx函式獲得可執行檔案的模組路徑,這個函式從Windows NT 4.0開始到現在的Vista系統都能使用,向後相容性比較好。 【函式
建立執行緒後為什麼關閉了執行緒控制代碼,執行緒還是可以執行?
主執行緒只要擁有執行緒控制代碼,事後就可以對執行緒執行某些操作,比如查詢執行緒狀態等等,靠的就是控制代碼,如果沒有控制代碼,系統就無從知道要查的是那個執行緒的狀態。但保持這個控制代碼不關閉,並不是執行緒執行的條件。 &nbs
程序控制代碼HANDLE獲得程序主視窗的控制代碼HWND
一個程序可以擁有很多主視窗,也可以不擁有主視窗,所以這樣的函式是不存在的,所幸的是,相反的函式是有的。所以我們可以呼叫EnumWindows來判斷所有的視窗是否屬於這個程序。 typedef struct tagWNDINFO { DWORD dwProc
用C#呼叫Windows API和其它程序通訊及C# 獲得另外一程式 控制代碼 後控制該程式 控制其透明 窗體大小
作者:邊城浪子◎2005-01-16 關鍵字: C#,API,FindWindow,FindWindowEx,SendMessage,程序,登錄檔 設計初衷:公司為了便於網路管理,使用了IEEE 802.1X的網路訪問控制,這樣每次開機需要輸入兩次登入密碼,於是我就研究了
多執行緒委託之跨執行緒問題分析--在建立視窗控制代碼之前,不能在控制元件上呼叫 Invoke 或 BeginInvoke(解決方法已更新)
檢視巢狀檢視+groupby+sum+if超慢?檢視巢狀檢視+groupby+sum+if超慢? 炯蕉蔚郝iar貉k湯秤TP2Fx扯訃詬壤撞蝸 《 http://babyknow.baidu.com/article/1376a5480527629546e457877078
C# 多執行緒(lock,Monitor,Mutex,同步事件和等待控制代碼)
原文地址:http://www.cnblogs.com/SkySoot/archive/2012/04/02/2430295.html 本篇從 Monitor,Mutex,ManualResetEvent,AutoResetEvent,WaitHandler 的類關係圖
執行引擎(三):程序編譯與代碼優化
早期 角度 保存 ann 多態 內存空間 控制 數值類型 精確 早期(編譯期)優化 java語言編譯期 1.前端編譯器(編譯器的前端):*.java文件 => .class文件 Sun的Javac,Eclipse_JDT中的增量式編譯器(ECJ) 2.後端運