// 查找系统正在运行的进程
BOOL CProcess::EnablePrivilege(HANDLE hToken, LPCSTR szPrivName)
{
TOKEN_PRIVILEGES tkp;// 访问令牌权限结构变量
LUID luid;// 本地唯一标识符结构变量
// 查询SE_DEBUG_NAME权限所对应的luid值
if(!LookupPrivilegeValue(NULL,szPrivName,&luid))
{
AfxMessageBox("Lookup Privilege Value Failed...");
return 0;
}
// 填充Token_Privileges结构
tkp.PrivilegeCount=1;
tkp.Privileges[0].Luid=luid;
tkp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;
// 提升权限
if(!AdjustTokenPrivileges(hToken,FALSE,&tkp,sizeof(tkp),NULL,NULL))
{
AfxMessageBox("Adjust Token Privileges Failed...");
return 0;
}
return(GetLastError()==ERROR_SUCCESS);
}
DWORD CProcess::EnumAllProcess(CString SoftName1)
{
ENUMPROCESS pEnumProcess;
ENUMPROCESSMODULES pEnumProcessModules;
GETMODULEFILENAMEEX pGetModuleFileNameEx;
GETMODULEBASENAME pGetModuleBaseName;
HANDLE hToken;// 访问令牌句柄
DWORD dwPID[MAX_ID];// 接授进程ID的数组
DWORD cbReturn;// 返回的字节数
DWORD dwPCount;// 进程数
DWORD i;
char szFileName[MAX_PATH];// 文件名
char szPathName[MAX_PATH];// 路径名
memset(szFileName,'0',MAX_PATH);
memset(szPathName,'0',MAX_PATH);
char Id[]="ID",Pid[]="PID",Exe[]="ProcessName",Path[]="Path";
HANDLE hProcess; // 进程句柄
HMODULE hModule; // 模块句柄
HINSTANCE hPsDll;// 实例句柄
hPsDll=LoadLibrary("PSAPI.DLL");//获得DLL的实例
if(hPsDll==NULL)
{
FreeLibrary(hPsDll);
AfxMessageBox("Load Library Failed...");
}
// 获得函数的地址
pEnumProcess=(ENUMPROCESS)GetProcAddress(hPsDll,"EnumProcesses");
pEnumProcessModules=(ENUMPROCESSMODULES)GetProcAddress(hPsDll,"EnumProcessModules");
pGetModuleFileNameEx=(GETMODULEFILENAMEEX)GetProcAddress(hPsDll,"GetModuleFileNameExA");
pGetModuleBaseName=(GETMODULEBASENAME)GetProcAddress(hPsDll,"GetModuleBaseNameA");
if(!(pEnumProcess && pEnumProcessModules && pGetModuleFileNameEx &&pGetModuleBaseName))
{
FreeLibrary(hPsDll);
AfxMessageBox("Get Processs Address Failed...");
}
CString* strName=new CString[50];
// 打开当前进程访问令牌
if(OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES,&hToken))
{
if(EnablePrivilege(hToken,SE_DEBUG_NAME))
{
pEnumProcess(dwPID,sizeof(dwPID),&cbReturn);// 枚举进程
dwPCount=cbReturn/sizeof(DWORD);// 计算线程总数
for(i=0;i<dwPCount-1;i++)
{
// 打开进程
hProcess=OpenProcess(PROCESS_QUERY_INFORMATION|PROCESS_VM_READ,// 访问权限
false,// 是否允许得到的进程句柄被后创建的子进程继承
dwPID[i]);//进程ID
if(hProcess)
{
// 枚举进程模块
pEnumProcessModules(hProcess,&hModule,sizeof(hModule),&cbReturn);
// 保存文件名
pGetModuleBaseName(hProcess,hModule,szFileName,sizeof(szFileName));
// printf("%-4d %-8u %-8s\n",i,dwPID[i],szFileName);
// 获得进程模块文件名(包含路径)
pGetModuleFileNameEx(hProcess,hModule,szPathName,sizeof(szPathName));
//printf("Path:%s\n\n",szPathName);
// 存数信息
//strName[i] = szFileName;
//CString str = strName[i];
if(strcmp(szFileName,SoftName1) == 0)
{
printf("123");
return dwPID[i];
}
}
}
}
}
// 关闭句柄和实例
::FindClose(hProcess);
::FindClose(hModule);
::FindClose(hToken);
::FreeLibrary(hPsDll);
return -1;
}
请问一下,我这段查找系统正在运行的进程函数,有哪些没有释放资源吗?我在运行函数的时候有时候会出席异常错误。。*中断了程序。。很是郁闷。。。请大家帮我看一看,谢谢!
9 个解决方案
#1
if(hPsDll==NULL)
{
FreeLibrary(hPsDll);
AfxMessageBox("Load Library Failed...");
}
这句话如果真的执行到,肯定会出异常。
而且你都FreeLibrary(hPsDll);,后面还使用它的导出函数,肯定也会出现异常。
下面函数指针加载失败的情况也一样。
{
FreeLibrary(hPsDll);
AfxMessageBox("Load Library Failed...");
}
这句话如果真的执行到,肯定会出异常。
而且你都FreeLibrary(hPsDll);,后面还使用它的导出函数,肯定也会出现异常。
下面函数指针加载失败的情况也一样。
#2
if(hPsDll==NULL)
{
AfxMessageBox("Load Library Failed...");
}
关闭句柄的地方都判断一下不为空
{
AfxMessageBox("Load Library Failed...");
}
关闭句柄的地方都判断一下不为空
#3
return dwPID[i];
找到了就 return了呀,都不关闭句柄了吗?
找到了就 return了呀,都不关闭句柄了吗?
#4
也要用 CloseHandle 来关呀。
#5
恩,我这几句关闭句柄对不对呢?
都是哪里需要修改,能不能再具体具体啊?
都是哪里需要修改,能不能再具体具体啊?
#6
我在外面加了一个while循环,只跑几次这个函数是没有问题的,但是跑的次数多了,就会出现异常,貌似内存溢出???
while(pro.EnumAllProcess(SoftName1) != -1)
while(pro.EnumAllProcess(SoftName1) != -1)
#7
我不知道你的 FindClose 是哪来的,不过我看得msdn 里面 OpenProcessToken 和 OpenProcess 都是说
When you finish with the handle, close it using the CloseHandle function
When you finish with the handle, close it using the CloseHandle function
#8
哪个函数异常呢,跟踪下
#9
http://blog.csdn.net/azkabannull/article/details/6314068
看得这篇帖子改的。。。
看得这篇帖子改的。。。
#1
if(hPsDll==NULL)
{
FreeLibrary(hPsDll);
AfxMessageBox("Load Library Failed...");
}
这句话如果真的执行到,肯定会出异常。
而且你都FreeLibrary(hPsDll);,后面还使用它的导出函数,肯定也会出现异常。
下面函数指针加载失败的情况也一样。
{
FreeLibrary(hPsDll);
AfxMessageBox("Load Library Failed...");
}
这句话如果真的执行到,肯定会出异常。
而且你都FreeLibrary(hPsDll);,后面还使用它的导出函数,肯定也会出现异常。
下面函数指针加载失败的情况也一样。
#2
if(hPsDll==NULL)
{
AfxMessageBox("Load Library Failed...");
}
关闭句柄的地方都判断一下不为空
{
AfxMessageBox("Load Library Failed...");
}
关闭句柄的地方都判断一下不为空
#3
return dwPID[i];
找到了就 return了呀,都不关闭句柄了吗?
找到了就 return了呀,都不关闭句柄了吗?
#4
也要用 CloseHandle 来关呀。
#5
恩,我这几句关闭句柄对不对呢?
都是哪里需要修改,能不能再具体具体啊?
都是哪里需要修改,能不能再具体具体啊?
#6
我在外面加了一个while循环,只跑几次这个函数是没有问题的,但是跑的次数多了,就会出现异常,貌似内存溢出???
while(pro.EnumAllProcess(SoftName1) != -1)
while(pro.EnumAllProcess(SoftName1) != -1)
#7
我不知道你的 FindClose 是哪来的,不过我看得msdn 里面 OpenProcessToken 和 OpenProcess 都是说
When you finish with the handle, close it using the CloseHandle function
When you finish with the handle, close it using the CloseHandle function
#8
哪个函数异常呢,跟踪下
#9
http://blog.csdn.net/azkabannull/article/details/6314068
看得这篇帖子改的。。。
看得这篇帖子改的。。。