列舉程序控制代碼

2021-06-22 03:24:13 字數 3623 閱讀 4437

目前正在做的專案進行效能測試,被通知程序控制代碼數已經到達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...