资源释放问题

时间:2022-04-04 05:02:10

// 查找系统正在运行的进程
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);,后面还使用它的导出函数,肯定也会出现异常。
下面函数指针加载失败的情况也一样。

#2


if(hPsDll==NULL)
    {
        AfxMessageBox("Load Library Failed...");
    }

关闭句柄的地方都判断一下不为空

#3


 return dwPID[i];
找到了就 return了呀,都不关闭句柄了吗?

#4


也要用 CloseHandle 来关呀。

#5


恩,我这几句关闭句柄对不对呢?
都是哪里需要修改,能不能再具体具体啊?

#6


我在外面加了一个while循环,只跑几次这个函数是没有问题的,但是跑的次数多了,就会出现异常,貌似内存溢出???
while(pro.EnumAllProcess(SoftName1) != -1)

#7


我不知道你的 FindClose 是哪来的,不过我看得msdn 里面 OpenProcessToken 和 OpenProcess 都是说
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);,后面还使用它的导出函数,肯定也会出现异常。
下面函数指针加载失败的情况也一样。

#2


if(hPsDll==NULL)
    {
        AfxMessageBox("Load Library Failed...");
    }

关闭句柄的地方都判断一下不为空

#3


 return dwPID[i];
找到了就 return了呀,都不关闭句柄了吗?

#4


也要用 CloseHandle 来关呀。

#5


恩,我这几句关闭句柄对不对呢?
都是哪里需要修改,能不能再具体具体啊?

#6


我在外面加了一个while循环,只跑几次这个函数是没有问题的,但是跑的次数多了,就会出现异常,貌似内存溢出???
while(pro.EnumAllProcess(SoftName1) != -1)

#7


我不知道你的 FindClose 是哪来的,不过我看得msdn 里面 OpenProcessToken 和 OpenProcess 都是说
When you finish with the handle, close it using the CloseHandle function

#8


哪个函数异常呢,跟踪下

#9


http://blog.csdn.net/azkabannull/article/details/6314068
看得这篇帖子改的。。。