Как узнать каким приложением создан процесс ? Такая информация точно есть -- сисинтерналовский эксплорер показывает. Вопрос где её взять самому ? Спасибо
Tampabelle поискать слабо? ZwQueryInformationProcess (ProcessBasicInformation class(InheritedFromUniqueProcessId) кусок из ntddk.inc ; + ; Basic Process Information ; NtQueryInformationProcess using ProcessBasicInfo ; - PROCESS_BASIC_INFORMATION STRUCT ; sizeof = 18h ExitStatus NTSTATUS ? PebBaseAddress PVOID ? ; PPEB AffinityMask DWORD ? BasePriority DWORD ? ; KPRIORITY UniqueProcessId DWORD ? InheritedFromUniqueProcessId DWORD ? PROCESS_BASIC_INFORMATION ENDS PPROCESS_BASIC_INFORMATION typedef PTR PROCESS_BASIC_INFORMATION
Вот завалялся сэмпл убития родительского процесса Код (Text): .code ;===================================================================== ntdll db 'ntdll.dll',0 zwqip db 'NtQueryInformationProcess',0 ;===================================================================== start: assume fs:nothing ; берем PID mov eax,fs:[18h] ; текущего mov eax,[eax+20h] ; процесса (можно использовать GetCurrentProcessId) invoke OpenProcess,PROCESS_QUERY_INFORMATION,1,eax ; получаем handle sub esp,6*4 ; выделяем в стеке место под структуру PROCESS_BASIC_INFORMATION mov ecx,esp ; адресс её ещё пригодиться push 0 ; ниже заполняем параметры push 6*4 ; для вызова push ecx ; NtQueryInformationProcess push 0 ; push eax ; handle нашего процесса invoke GetModuleHandle,addr ntdll ; получаем handle ntdll.dll invoke GetProcAddress,eax,addr zwqip ; находим адресс ф-ции NtQueryInformationProcess call eax ; вызываем ф-цию (она нам вернет ParentID в структуре) add esp,5*4 ; убираем выделенное место (кроме последнего поля, там находится ParentID) push 0 ; push PROCESS_TERMINATE ; call OpenProcess ; Вызываем, чтобы получить из ParentID хендл для TerminateProcess invoke TerminateProcess,eax,0 ; давим родительский процесс ;=====================================================================
еще есть функция Process32First/Next из TOOLHELP32, которая, кстати говоря, работает и на NT, и на 9x. поле th32ParentProcessID - ID процесса-родителя.
Не стал создавать новую тему, сорри за некрофилию. Проблемы получить PID родителя нет, делаю как и в этом примере. Возникла проблема с тем, что родитель того же Explorer'а умирает после его запуска, а на его месте в скором времени может появится уже совсем другой процесс, с таким же PID'ом, у которого родитель опять же будет Explorer, в следствие чего у меня в программе начинается бесконечная рекурсия, т.к. у меня задача найти основного предка, до процесса System. Process Explorer от sysint, хорошо показывает, что у эксплорера родитель уже не существует, как он это делает?
x64 Полноценную инфу про родитель можно получить только если сбор этой инфы разрешён при старте системы(FLG_MAINTAIN_OBJECT_TYPELIST). Иначе её нельзя получить в ядре, так как это инфы нигде нет. Получать наследуемый описатель родителя не надёжно.
NtQueryInformationProcess с ProcessBasicInformation typedef struct _PROCESS_BASIC_INFORMATION { PVOID Reserved1; PPEB PebBaseAddress; PVOID Reserved2[2]; ULONG_PTR UniqueProcessId; PVOID Reserved3; -> PID родительского процесса. } PROCESS_BASIC_INFORMATION;
Partner InheritedFromUniqueProcessId это поле завётся. И берётся оно из прототипа сервиса(после референса): Код (Text): NTSTATUS NtCreateProcessEx( __out PHANDLE ProcessHandle, __in ACCESS_MASK DesiredAccess, __in_opt POBJECT_ATTRIBUTES ObjectAttributes, __in HANDLE ParentProcess, __in ULONG Flags, __in_opt HANDLE SectionHandle, __in_opt HANDLE DebugPort, __in_opt HANDLE ExceptionPort, __in ULONG JobMemberLevel ) ParentProcess - который опциональный. Хорошие, годные хидеры
Из приведенного прототипа не следует, что он опциональный. http://msdn.microsoft.com/en-us/library/windows/desktop/ms684280