枚举进程使用的DLL
2014-10-26 15:45
239 查看
// tt2.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <windows.h>
#include <iostream.h>
#include "Shlwapi.h"
#include "Psapi.h"
#pragma comment(lib,"Psapi.lib")
bool DebugPrivilege(const char *PName, BOOL bEnable)
{
bool bResult = TRUE;
HANDLE hToken;
TOKEN_PRIVILEGES TokenPrivileges;
if (!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY | TOKEN_ADJUST_PRIVILEGES, &hToken))
{
bResult = FALSE;
return bResult;
}
TokenPrivileges.PrivilegeCount = 1;
TokenPrivileges.Privileges[0].Attributes = bEnable ? SE_PRIVILEGE_ENABLED : 0;
LookupPrivilegeValue(NULL, PName, &TokenPrivileges.Privileges[0].Luid);
AdjustTokenPrivileges(hToken, FALSE, &TokenPrivileges, sizeof(TOKEN_PRIVILEGES), NULL, NULL);
if (GetLastError() != ERROR_SUCCESS)
{
bResult = FALSE;
}
CloseHandle(hToken);
return bResult;
}
//我们还是以“计算器”这个实例来枚举该进程的所有用到的模块的句柄,并打印出来
int main()
{
DebugPrivilege(SE_DEBUG_NAME, TRUE);
HMODULE nHmodule[1024]={NULL};
char lpFilename[MAX_PATH]="";
DWORD cbNeeded=0;
HWND hwnd=::FindWindow(NULL,"计算器");//以计算机为例子,枚举它的模块句柄
DWORD idProcess=0;
::GetWindowThreadProcessId(hwnd,&idProcess);//获取计算器进程ID
HANDLE hCalc=::OpenProcess(PROCESS_ALL_ACCESS,NULL,idProcess);//获取进程的句柄
if (!hCalc)
{
CloseHandle(hwnd);
::MessageBox(NULL,"很遗憾,你没有运行计算器","EnumProcessModules",MB_OK);
}
else
{
BOOL bRetn= ::EnumProcessModules(hCalc,nHmodule,sizeof(nHmodule),&cbNeeded);
if (!bRetn)
{
CloseHandle(hCalc);
::MessageBox(NULL,"很遗憾,获取模块句柄失败","EnumProcessModules",MB_OK);
}
else
{
for (int i=0;i<((int)cbNeeded/sizeof(HMODULE));i++)
{
cout<<"第"<<i<<"个:";
GetModuleFileNameEx(hCalc,nHmodule[i],lpFilename,MAX_PATH);
cout<<lpFilename;
cout<<endl;
}
}
}
DebugPrivilege(SE_DEBUG_NAME, FALSE);
return 0;
}
//
#include "stdafx.h"
#include <windows.h>
#include <iostream.h>
#include "Shlwapi.h"
#include "Psapi.h"
#pragma comment(lib,"Psapi.lib")
bool DebugPrivilege(const char *PName, BOOL bEnable)
{
bool bResult = TRUE;
HANDLE hToken;
TOKEN_PRIVILEGES TokenPrivileges;
if (!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY | TOKEN_ADJUST_PRIVILEGES, &hToken))
{
bResult = FALSE;
return bResult;
}
TokenPrivileges.PrivilegeCount = 1;
TokenPrivileges.Privileges[0].Attributes = bEnable ? SE_PRIVILEGE_ENABLED : 0;
LookupPrivilegeValue(NULL, PName, &TokenPrivileges.Privileges[0].Luid);
AdjustTokenPrivileges(hToken, FALSE, &TokenPrivileges, sizeof(TOKEN_PRIVILEGES), NULL, NULL);
if (GetLastError() != ERROR_SUCCESS)
{
bResult = FALSE;
}
CloseHandle(hToken);
return bResult;
}
//我们还是以“计算器”这个实例来枚举该进程的所有用到的模块的句柄,并打印出来
int main()
{
DebugPrivilege(SE_DEBUG_NAME, TRUE);
HMODULE nHmodule[1024]={NULL};
char lpFilename[MAX_PATH]="";
DWORD cbNeeded=0;
HWND hwnd=::FindWindow(NULL,"计算器");//以计算机为例子,枚举它的模块句柄
DWORD idProcess=0;
::GetWindowThreadProcessId(hwnd,&idProcess);//获取计算器进程ID
HANDLE hCalc=::OpenProcess(PROCESS_ALL_ACCESS,NULL,idProcess);//获取进程的句柄
if (!hCalc)
{
CloseHandle(hwnd);
::MessageBox(NULL,"很遗憾,你没有运行计算器","EnumProcessModules",MB_OK);
}
else
{
BOOL bRetn= ::EnumProcessModules(hCalc,nHmodule,sizeof(nHmodule),&cbNeeded);
if (!bRetn)
{
CloseHandle(hCalc);
::MessageBox(NULL,"很遗憾,获取模块句柄失败","EnumProcessModules",MB_OK);
}
else
{
for (int i=0;i<((int)cbNeeded/sizeof(HMODULE));i++)
{
cout<<"第"<<i<<"个:";
GetModuleFileNameEx(hCalc,nHmodule[i],lpFilename,MAX_PATH);
cout<<lpFilename;
cout<<endl;
}
}
}
DebugPrivilege(SE_DEBUG_NAME, FALSE);
return 0;
}
相关文章推荐
- 枚举进程使用的DLL
- 使用 ToolHelp32 库枚举进程
- Win32汇编实现枚举进程(PSAPI.DLL)
- 使用DLL在进程间共享数据
- Windows中使用DLL在进程间共享数据
- 使用DLL在进程间共享数据(5)
- ListDLLs 列出某个DLL被哪个进程使用了
- 动态加载 dll 枚举所有进程
- DLL入门浅析(5)——使用DLL在进程间共享数据
- DLL入门浅析(5)——使用DLL在进程间共享数据
- 使用DLL在进程间共享数据
- [编程实例]win32汇编语言调用dll结束进程[使用masmplus1.2]
- 使用DLL在多个进程间共享全局变量
- DLL入门浅析(5)——使用DLL在进程间共享数据
- 两种方法枚举进程加载的DLL
- 使用DLL在多个进程间共享全局变量
- 使用 ToolHelp32 库枚举进程(转)
- DLL入门浅析(5)——使用DLL在进程间共享数据
- 使用DLL在进程间共享数据
- 使用易语言完成进程枚举代码分析