您的位置:首页 > 其它

枚举进程使用的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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: