//获得父进程ID,失败则返回0
DWORD GetPPid()
{
HANDLE hProcessSnap = NULL;
PROCESSENTRY32 pe32 = {0};
DWORD dwPID = GetCurrentProcessId();
hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if(hProcessSnap==(HANDLE)-1)
return (FALSE);
pe32.dwSize = sizeof(PROCESSENTRY32);
if (Process32First(hProcessSnap, &pe32))
{
while(pe32.th32ProcessID!=dwPID)
Process32Next(hProcessSnap, &pe32);
}
CloseHandle(hProcessSnap);
return(pe32.th32ParentProcessID);
}
//判断程序是否以服务运行
BOOL isRuninServices()
{
DWORD dwPPID = GetPPid();
HANDLE hProcessSnap = NULL;
PROCESSENTRY32 pe32 = {0};
hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (hProcessSnap == (HANDLE)-1)
return (FALSE);
pe32.dwSize = sizeof(PROCESSENTRY32);
if (Process32First(hProcessSnap, &pe32))
{
while(pe32.th32ProcessID!=dwPPID)
Process32Next(hProcessSnap, &pe32);
}
CloseHandle(hProcessSnap);
if(_tcsncicmp(pe32.szExeFile,_T("services.exe"),20)==0)
return TRUE;
else return FALSE;
}
//提升为调试权限
BOOL EnableDebugPrivilege(BOOL bEnable)
{
BOOL bOk = FALSE;
HANDLE hToken;
if(::OpenProcessToken(::GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken))
{
LUID uID;
::LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &uID);
TOKEN_PRIVILEGES tp;
tp.PrivilegeCount = 1;
tp.Privileges[0].Luid = uID;
tp.Privileges[0].Attributes = bEnable ? SE_PRIVILEGE_ENABLED : 0;
::AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(tp), NULL, NULL);
bOk = (::GetLastError() == ERROR_SUCCESS);
::CloseHandle(hToken);
}
return bOk;
}
//用于在release下输出调试信息
void KDbgPrint(LPCTSTR lpszFormat, ...)
{
#define _countof(array) (sizeof(array)/sizeof(array[0]))
#ifdef KOUT_DEBUG_STRING
va_list args;
va_start(args, lpszFormat);
int nBuf;
TCHAR szBuffer[512];
nBuf = _vsntprintf(szBuffer, _countof(szBuffer), lpszFormat, args);
OutputDebugString(szBuffer);
va_end(args);
#endif
}
//从地址去获得模块基址
HMODULE WINAPI ModuleFromAddress(PVOID pv)
{
MEMORY_BASIC_INFORMATION mbi;
if(::VirtualQuery(pv, &mbi, sizeof(mbi)) != 0)
{
return (HMODULE)mbi.AllocationBase;
}
else
{
return NULL;
}
}
//获得DLL自身
BOOL GetDllPath(TCHAR * path)
{
HMODULE hDll = ModuleFromAddress(GetDllPath);
if(hDll==NULL)
return FALSE;
else
{
GetModuleFileName(hDll, path, _MAX_PATH);
return TRUE;
}
}
//格式化string
void format_string(string & str,LPCTSTR lpszFormat, ...)
{
#define _countof(array) (sizeof(array)/sizeof(array[0]))
va_list args;
va_start(args, lpszFormat);
int nBuf;
TCHAR szBuffer[1024];
nBuf = _vsntprintf(szBuffer, _countof(szBuffer), lpszFormat, args);
str = szBuffer;
va_end(args);
}
//提升所需的权限
BOOL EnablePrivilege(LPCTSTR lpName,BOOL bEnable)
{
BOOL bOk = FALSE;
HANDLE hToken;
if(::OpenProcessToken(::GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken))
{
LUID uID;
::LookupPrivilegeValue(NULL, lpName, &uID);
TOKEN_PRIVILEGES tp;
tp.PrivilegeCount = 1;
tp.Privileges[0].Luid = uID;
tp.Privileges[0].Attributes = bEnable ? SE_PRIVILEGE_ENABLED : 0;
::AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(tp), NULL, NULL);
bOk = (::GetLastError() == ERROR_SUCCESS);
::CloseHandle(hToken);
}
return bOk;
}
//跳转到注册表
void Jump2Reg(string strRegPath,string strKey)
{
//ShellExecute(NULL,NULL,"regjump.exe",strRegPath.c_str(),NULL,SW_SHOW);
ShellExecute(NULL,NULL,"regedit.exe",NULL,NULL,SW_SHOW);
//然后查找注册表窗口
HWND hMain = NULL;
HWND hTree = NULL;
HWND hList = NULL;
BOOL bFind = FALSE;
for(int i=0;i<10;i++)
{
hMain = FindWindow("RegEdit_RegEdit","注册表编辑器");
if(hMain!=NULL)
{//查找成功
bFind = TRUE;
break;
}
Sleep(200);
}
if(bFind)
{
hTree = FindWindowEx(hMain,NULL,"SysTreeView32",NULL);
hList = FindWindowEx(hMain,NULL,"SysListView32",NULL);
//选择树
SetForegroundWindow(hTree);
SetFocus(hTree);
DWORD dwPID;
GetWindowThreadProcessId(hMain,&dwPID);
HANDLE hProc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwPID);
//先把树给折叠起,最多30层
for(int i=0;i<30;i++)
{
SendMessage(hTree, WM_KEYDOWN, VK_LEFT, 0);
}
SendMessage(hTree, WM_KEYDOWN, VK_RIGHT, 0);
WaitForInputIdle(hProc, INFINITE);
for(i=0;i<strRegPath.length();i++)
{
if(strRegPath.at(i)=='//')
SendMessage(hTree, WM_KEYDOWN, VK_RIGHT, 0);
else
SendMessage(hTree,WM_CHAR,WPARAM(strRegPath.at(i)),0);
}
WaitForInputIdle(hProc, INFINITE);
//然后到列表了..
SetForegroundWindow(hList);
SetFocus(hList);
Sleep(1000);
SendMessage(hList, WM_KEYDOWN, VK_HOME, 0);
for(i=0;i<strKey.length();i++)
{
SendMessage(hList,WM_CHAR,WPARAM(strKey.at(i)),0);
}
CloseHandle(hProc);
}
return;
}
//
//显示文件属性
void ShowProperties(string strPath)
{
SHELLEXECUTEINFO si;
ZeroMemory(&si,sizeof(SHELLEXECUTEINFO));
si.cbSize = sizeof(SHELLEXECUTEINFO);
si.fMask = SEE_MASK_NOCLOSEPROCESS | SEE_MASK_INVOKEIDLIST | SEE_MASK_FLAG_NO_UI ;
si.lpVerb = "properties";
si.lpFile = strPath.c_str();
si.nShow = SW_SHOW;
ShellExecuteEx(&si);
}
//定位文件
void Jump2File(string strPath)
{
string cmd = "/e,/select,"+strPath;
ShellExecute(NULL,NULL,"explorer",cmd.c_str(),NULL,SW_SHOW);
}
一些常用函数
最新推荐文章于 2022-11-23 18:11:23 发布