目前正在做的專案進行效能測試,被通知程序控制代碼數已經到達2600多,心中甚是一驚,用procexp檢視控制代碼表得知,為型別為key的控制代碼,名稱為\registry\hklm\microsoft\ctf\assemblyitem....,基本上得知是輸入法關聯的登錄檔項,而後用procmon監視登錄檔項操作關聯的執行緒棧,確認控制代碼為sogou輸入法元件開啟,為什麼控制代碼沒有關閉,原因不得而知,本人並沒有深入的研究,或許是sogou的bug,或者我們的登錄檔過濾驅動導致。也沒有時間去協調人員去檢查,於是我打算在使用者層列舉控制代碼,而後關閉這些控制代碼。經過google,查到了一下方法
於是本人寫了個列舉控制代碼的類
#pragma once
#define systemhandleinformation 16
#define objectbasicinformation 0
#define objectnameinformation 1
#define objecttypeinformation 2
#define status_success 0x00000000
#define status_info_length_mismatch 0xc0000004
typedef ntstatus (winapi *_ntquerysysteminformation)(
ulong systeminformationclass,
pvoid systeminformation,
ulong systeminformationlength,
pulong returnlength
);typedef ntstatus (winapi *_ntqueryobject)(
handle objecthandle,
ulong objectinformationclass,
pvoid objectinformation,
ulong objectinformationlength,
pulong returnlength
);/* the following structure is actually called system_handle_table_entry_info, but system_handle is shorter. */
typedef struct _system_handle
system_handle, *psystem_handle;
typedef struct _system_handle_information
system_handle_information, *psystem_handle_information;
typedef struct _unicode_string
unicode_string, *punicode_string;
typedef struct _object_type_information
object_type_information, *pobject_type_information;
class cprochandles
;
#include "stdafx.h"
#include "prochandles.h"
#define onepagesize 0x1000
cprochandles::cprochandles(void)
cprochandles::~cprochandles(void)
bool cprochandles::getundocumentedfunctionaddress()
bool cprochandles::queryhandleinfomation(dword pid)
else
} while (true);
for (int i=0;ihandlecount;i++)
/* query the object type. */
pobject_type_information objecttypeinfo = (pobject_type_information)malloc(onepagesize);
ntstatus = m_pfunntqueryobject((handle)systemhandle->handle,
objecttypeinformation,
objecttypeinfo,
onepagesize,
null
);if(ntstatus!=status_success)
/* query the object name (unless it has an access of
0x0012019f, on which ntqueryobject could hang. */
if (systemhandle->grantedaccess == 0x0012019f)
pvoid objectnameinfo;
objectnameinfo = malloc(onepagesize);
ulong retlength;
if (m_pfunntqueryobject((handle)systemhandle->handle,objectnameinformation,objectnameinfo,onepagesize,&retlength)!=status_success)
}/* cast our buffer into an unicode_string. */
unicode_string objectname;
objectname = *(punicode_string)objectnameinfo;
/* print the information! */
if (objectname.length)
else
cstring strtype=objecttypeinfo->typename.buffer;
if (strtype.comparenocase(_t("key"))==0)
//closehandle((handle)systemhandle->handle);
}free(objecttypeinfo);
free(objectnameinfo);
//closehandle(duplicatedhandle);
} }free(psyshandleinfo);
return true;
}
1. 本人寫的和人家的源**有點區別,我並沒有複製控制代碼,但是覺得這樣寫是有道理的,防止程式其它部分**關閉控制代碼後,導致查詢控制代碼資訊失敗。
2. 我最開始想不管三七二十一把所有的登錄檔控制代碼都關閉,這樣做從邏輯上是不正確的,例如程式的例程a剛剛建立登錄檔控制代碼,還沒使用,就被執行在其它執行緒中的這段**關閉,造成異常。另外我還發現,把所有的登錄檔控制代碼都關閉,其中包括乙個控制代碼名稱為hklm的控制代碼,關閉這個控制代碼後,會導致後繼的操作
regopenkeyex(hkey_local_machine,_t("software"),0,key_read,&hkey)失敗,失敗**為error_invalid_handle。
所以最後我還是匹配了控制代碼型別,控制代碼名稱(匹配\registry\hklm\microsoft\ctf\assemblyitem),控制代碼存在時長等條件去關閉登錄檔控制代碼。
視窗控制代碼,程序ID,程序控制代碼,視窗與程序之間的關係
在windows或linux等作業系統下視窗控制代碼對應著每個視窗的鑰匙,例如,你要對某乙個視窗進行操作,你必須知道你要操作哪乙個視窗,這裡就拿windows做舉例,windows下幾乎會建立許許多多個視窗,但是我們怎麼知道我們操作的是哪個視窗?答 就是視窗控制代碼,每個視窗在被建立出來之後就會被賦...
DuplicateHandle程序間控制代碼複製
1 bool duplicatehandle handle hsourceprocesshandle,handle hsourcehandle,handle htargetprocesshandle,lphandle lptargethandle,dword dwdesiredaccess,bool...
已知程序控制代碼,如何知道此程序的主視窗控制代碼
已知程序控制代碼,如何知道此程序的主視窗控制代碼,在此說明兩種方法 1.呼叫findwindow 前提是必須知道該程序中視窗類名和視窗名,返回後的控制代碼可以通過iswindow 函式來驗證是否是有效的視窗控制代碼.hwnd hwnd findwindow szclassname,szwndname...