15,471
社区成员
发帖
与我相关
我的任务
分享
#include <Tlhelp32.h>
#include <Windows.h>
#pragma comment(lib, "Advapi32.lib")
int main()
{
PROCESSENTRY32 pe;
// explorer.exe的进程ID
DWORD pid = 0;
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
pe.dwSize = sizeof(PROCESSENTRY32);
if( !Process32First(hSnapshot,&pe) )
return 0;
do
{
pe.dwSize = sizeof(PROCESSENTRY32);
if( Process32Next(hSnapshot,&pe)==FALSE )
break;
if(wcscmp (pe.szExeFile,L"explorer.exe") == 0)
{
pid = pe.th32ProcessID;
break;
}
} while(1);
CloseHandle(hSnapshot);
/* 已全部权限打开explorer.exe 进程 */
HANDLE handle = OpenProcess(PROCESS_ALL_ACCESS,FALSE,pid);
/* 创建启动信息结构体 */
STARTUPINFOEXA si;
/* 初始化结构体 */
ZeroMemory(&si,sizeof(si));
/* 设置结构体成员 */
si.StartupInfo.cb = sizeof(si);
SIZE_T lpsize = 0;
/* 用微软规定的特定的函数初始化结构体 */
InitializeProcThreadAttributeList(NULL,1,0,&lpsize);
char * temp = new char[lpsize];
/* 转换指针到正确类型 */
LPPROC_THREAD_ATTRIBUTE_LIST AttributeList = (LPPROC_THREAD_ATTRIBUTE_LIST)temp;
/* 真正为结构体初始化属性参数 */
InitializeProcThreadAttributeList(AttributeList,1,0,&lpsize);
/* 用已构造的属性结构体更新属性表 */
if (!UpdateProcThreadAttribute(AttributeList,0,PROC_THREAD_ATTRIBUTE_PARENT_PROCESS, &handle,sizeof(HANDLE),NULL,NULL))
{
}
/* 移交指针,这里已更换了父进程的属性表是 explorer.exe */
si.lpAttributeList = AttributeList;
PROCESS_INFORMATION pi;
ZeroMemory(&pi, sizeof(pi));
if (CreateProcessAsUserA(NULL,0,"notepad.exe",0, 0, 0, EXTENDED_STARTUPINFO_PRESENT,0, 0, (LPSTARTUPINFOA)&si, &pi))
{
}
else
{
}
/* 处理后事 */
DeleteProcThreadAttributeList(AttributeList);
delete temp;
printf("exit");
getch();
return 0;
}
// by creating process ***********************************
BOOL GoNotePad(char *path,BOOL bWait=TRUE)
{
char pathexe[MAX_PATH];
strcpy(pathexe,"notepad.exe ");
strcat(pathexe,path);//pathname="notepad.exe ",
STARTUPINFO sinfo;
PROCESS_INFORMATION pinfo;
memset (&sinfo,0,sizeof(STARTUPINFO));
sinfo.cb=sizeof(STARTUPINFO);
sinfo.dwFlags|=STARTF_USESHOWWINDOW;
sinfo.wShowWindow=SW_SHOWNORMAL;//SW_SHOW;// SW_SHOWDEFAULT;
//BOOL fsuccess=0;
BOOL fsuccess=CreateProcess(NULL,//lpApplicationName
pathexe, //lpCommanderLine
NULL, //lpProcessAttributes
NULL, //lpThreadAttributes
FALSE, //bInheritHandles
NORMAL_PRIORITY_CLASS,//dwCreationFlags
NULL, //lpEnvironment
NULL, //lpCurrentDirectory
&sinfo, //lpStartupInfo
&pinfo); //lpProcessInformation
// wait for NotePad finishes
if(fsuccess)
{
HANDLE hProcess=pinfo.hProcess;
CloseHandle(pinfo.hThread);// close thread at once
if (bWait)
{
if (WaitForSingleObject(hProcess,INFINITE)!=WAIT_FAILED)
{
DWORD dwExitCode;
GetExitCodeProcess(hProcess,&dwExitCode);
if (dwExitCode==STILL_ACTIVE) AfxMessageBox(IDS_NOTEPAD_ALIVE);
}
}
CloseHandle(pinfo.hProcess);
}
return(fsuccess);
}