首页 > 编程知识 正文

enablewindow函数,open函数返回值

时间:2023-05-05 04:35:49 阅读:157249 作者:4829

方法名称: OpenProcess位置: Kernel32.dll OpenProcess函数用于打开现有流程对象并返回流程句柄。 1 .函数原型handle open process (dworddwdesiredaccess,

BOOL bInheritHandle,

DWORD dwProcessId

);

2 .参数

a.dwDesiredAccess :我想拥有的这个进程访问权限

PROCESS_ALL_ACCESS //可以获取的所有权限

需要创建PROCESS_CREATE_PROCESS //进程

需要创建PROCESS_CREATE_THREAD //线程

重复使用process _ dup _ handle//duplicate handle句柄

PROCESS_QUERY_INFORMATION //获取退出代码和优先级等进程信息的权限

process _ query _ limited _ information/*具有获取某些信息的权限,在获取了PROCESS_QUERY_INFORMATION的情况下为process _ query _ limion

PROCESS_SET_INFORMATION //设置对特定信息的权限,例如进程优先级

PROCESS_SET_QUOTA //设置内存限制权限并使用SetProcessWorkingSetSize

PROCESS_SUSPEND_RESUME //暂停或恢复进程的权限

PROCESS_TERMINATE //终止进程的权限。 使用终端流程

PROCESS_VM_OPERATION //操作进程内存空间的权限(VirtualProtectEx和WriteProcessMemory可用) )。

PROCESS_VM_READ //读取进程内存区域的权限。 可以使用读进程存储器

PROCESS_VM_WRITE //读取进程内存空间的权限。 可以使用WriteProcessMemory

等待同步//进程结束

b.bInheritHandle :显示得到的进程句柄是否可以继承

c.dwProcessId :打开的进程的PID

3 .返回类型

如果成功,返回值将成为指定进程的句柄。 如果失败,如果返回值为NULL,则可以调用GetLastError ()获取错误代码。

当一个进程关闭另一个进程时,通常会枚举系统打开的进程的标识符(PID ),然后使用OpenProcess函数获取进程句柄。 此函数可以在第一个参数中设置对句柄的新访问权限。 (需要证明和学习),例如,如果打开的句柄无权终止句柄,则线性终止进程的操作将失败,并返回错误代码5 (意味着拒绝访问)。 可以通过获取的句柄获取进程名称,然后使用GetModuleBaseName函数匹配进程名称来获取指定要关闭的进程。 注意:请使用closeHandle函数减少进程计数器。

# include windows.h # include psapi.h # include iostream # include tchar.husingstd : cout; using std:endl; HANDLE hDesProcess=NULL; //基于进程的名称(image name )打开该进程的boolfindprocess (lpctstrlpszprocessname ) dworddwprocessidentify (max _ path ) HANDLE hProcess=NULL; if (! enum processes (dwprocessidentify,max_path*sizeof ) dword ),dwTrueBytes ) {cout 'enum process fail ' endl; 返回假; } intnprocessnum=dwtruebytes/sizeof (dword ); hmodulehmoduleinprocess [ max _ path ]={0}; DWORD dwModuleBytes=0; tharmodulebasename [ max _ path ]={0}; for(intnindex=0; 倪

ndex < nProcessNum; ++nIndex ){hProcess = OpenProcess( PROCESS_ALL_ACCESS, false, dwProcessIdentify[nIndex] );// if ( hProcess == NULL )// {// continue;// }// memset( hModuleInProcess, 0, MAX_PATH*sizeof(HMODULE));// dwModuleBytes = 0;// if ( !EnumProcessModules( hProcess, hModuleInProcess, MAX_PATH*sizeof(HMODULE),&dwModuleBytes ))// {// cout << "Enum modules in process failed " << endl;// DWORD dwErrorCode = GetLastError();// //return false;// continue;// }//int nModulesNumInProcess = dwModuleBytes/sizeof(DWORD);memset( moduleBaseName, 0, MAX_PATH*sizeof(TCHAR));//for ( int nModuleIndex = 0; nModuleIndex < nModulesNumInProcess; ++nModuleIndex ){GetModuleBaseName( hProcess, NULL,moduleBaseName,MAX_PATH );if ( !_tcscmp( moduleBaseName, lpszProcessName)){cout << "查找的进程存在" << endl;hDesProcess = hProcess;return true;}}}return false;}const LPCTSTR lpszProcessName = _T("DriveTheLife.exe");int main(){if ( !FindProcess( lpszProcessName )){cout << "进程不存在" << endl;return EXIT_FAILURE;}//终止目标进程UINT unExitCode = 0;if ( hDesProcess != NULL ){BOOL bRet = TerminateProcess( hDesProcess, unExitCode );if ( !bRet ){DWORD dwErrorCode = GetLastError();cout << "进程终止失败" << endl;}}DWORD dw = WaitForSingleObject( hDesProcess, INFINITE );switch ( dw ){case WAIT_OBJECT_0:cout << 1 << endl;break;case WAIT_FAILED:{DWORD dw1 = GetLastError();cout << 2 << endl;}break ;default:cout << 3 << endl;}return EXIT_SUCCESS;}



在使用此函数时会发现不能成功获得有些系统进程的句柄,原因是没有权限。解决办法是在调用此函数前让我们的进程提升权限。

提升权限的函数(当然不会是所以地方都起作用,视情况而定)

bool AdjustProcessTokenPrivilege(){LUID luidTmp;HANDLE hToken;TOKEN_PRIVILEGES tkp;if(!OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,&hToken)){OutputDebugString("AdjustProcessTokenPrivilege OpenProcessToken Failed ! n");cout<<"AdjustProcessTokenPrivilege OpenProcessToken Failed !"<<endl;}if(!LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &luidTmp)){OutputDebugString("AdjustProcessTokenPrivilege LookupPrivilegeValue Failed !");cout<<"AdjustProcessTokenPrivilege LookupPrivilegeValue Failed !"<<endl;CloseHandle(hToken);return FALSE;}tkp.PrivilegeCount = 1;tkp.Privileges[0].Luid = luidTmp;tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;if(!AdjustTokenPrivileges(hToken, FALSE, &tkp, sizeof(tkp), NULL, NULL)){OutputDebugString("AdjustProcessTokenPrivilege AdjustTokenPrivileges Failed ! n");cout<<"AdjustProcessTokenPrivilege AdjustTokenPrivileges Failed !"<<endl;CloseHandle(hToken);return FALSE;}CloseHandle(hToken);return true;}

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。