#include<windows.h>
#include <iostream>
#include <cassert>
#include <string>
#include <algorithm>
#include <functional>
#include <algorithm> // STL 通用算法
#include <vector> // STL 动态数组容器
#include <fstream>
//-------下面是必须的
#include <wtypes.h>
#include<tlhelp32.h>
#include <psapi.h>
#pragma comment(lib,"psapi.lib")
/------必须的end
using namespace std;
bool isfileexist(char FILENAME[]);
#define ProcessBasicInformation 0
typedef struct
{
DWORD ExitStatus;
DWORD PebBaseAddress;
DWORD AffinityMask;
DWORD BasePriority;
ULONG UniqueProcessId;
ULONG InheritedFromUniqueProcessId;
} PROCESS_BASIC_INFORMATION;
typedef LONG (__stdcall *PROCNTQSIP)(HANDLE,UINT,PVOID,ULONG,PULONG);
//
DWORD GetParentProcessID(DWORD dwProcessId);
int main()
{ // 输入文件名
HANDLE hSnapShot=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0 );
PROCESSENTRY32 procentry;//=sizeof(PROCESSENTRY32);
BOOL bFlag=Process32First( hSnapShot, &procentry ) ;
DWORD parentprocessid;
while( bFlag )
{
if(stricmp(procentry.szExeFile, "unique.exe")==0) //你的程序
{
DWORD processid=procentry.th32ProcessID; //找到
cout <<procentry.th32ProcessID <<endl;
cout <<GetParentProcessID(procentry.th32ProcessID)<< endl;
parentprocessid=GetParentProcessID(procentry.th32ProcessID);
}
bFlag=Process32Next(hSnapShot,&procentry);
}
cout <<parentprocessid<< endl;
HANDLE processHandle = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, parentprocessid);
char processName[MAX_PATH]={0};
GetModuleBaseName(processHandle, 0, processName, MAX_PATH) ;
char processFullPath[MAX_PATH]={0};
GetModuleFileNameEx(processHandle, 0, processFullPath, MAX_PATH);
cout<< processName<< endl;
cout<< processFullPath<< endl;
//cout << Environment::CommandLine<< endl;
system("pause");
return 0;
}
DWORD GetParentProcessID(DWORD dwProcessId)
{
LONG status;
DWORD dwParentPID = (DWORD)-1;
HANDLE hProcess;
PROCESS_BASIC_INFORMATION pbi;
PROCNTQSIP NtQueryInformationProcess = (PROCNTQSIP)GetProcAddress(
GetModuleHandle("ntdll"), "NtQueryInformationProcess");
if(NULL == NtQueryInformationProcess)
{
return (DWORD)-1;
}
// Get process handle
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION,FALSE, dwProcessId);
if (!hProcess)
{
return (DWORD)-1;
}
// Retrieve information
status = NtQueryInformationProcess( hProcess,
ProcessBasicInformation,
(PVOID)&pbi,
sizeof(PROCESS_BASIC_INFORMATION),
NULL
);
// Copy parent Id on success
if (!status)
{
dwParentPID = pbi.InheritedFromUniqueProcessId;
}
CloseHandle (hProcess);
return dwParentPID;
}