Process tree....
От: reider  
Дата: 15.10.18 13:06
Оценка:
Доброго времени суток.
Подскажите, вот я хочу запустить calc.exe, но так чтобы он не был виден как мой дочерний, и при
вызове через диспетчер задач "завершить дерево..." при выделении моего процесса калькулятор продолжал работать...
Как такое организовать?
Re: Process tree....
От: Don Reba Канада https://stackoverflow.com/users/49329/don-reba
Дата: 15.10.18 13:18
Оценка:
Здравствуйте, reider, Вы писали:

R>Доброго времени суток.

R>Подскажите, вот я хочу запустить calc.exe, но так чтобы он не был виден как мой дочерний, и при
R>вызове через диспетчер задач "завершить дерево..." при выделении моего процесса калькулятор продолжал работать...
R>Как такое организовать?

Создать задачу. https://docs.microsoft.com/en-us/windows/desktop/taskschd/task-scheduler-reference
Ce n'est que pour vous dire ce que je vous dis.
Re[2]: Process tree....
От: reider  
Дата: 15.10.18 13:22
Оценка:
Здравствуйте, Don Reba, Вы писали:

DR>Здравствуйте, reider, Вы писали:


R>>Доброго времени суток.

R>>Подскажите, вот я хочу запустить calc.exe, но так чтобы он не был виден как мой дочерний, и при
R>>вызове через диспетчер задач "завершить дерево..." при выделении моего процесса калькулятор продолжал работать...
R>>Как такое организовать?

DR>Создать задачу. https://docs.microsoft.com/en-us/windows/desktop/taskschd/task-scheduler-reference

А для этого должен быть запущен планировщик задач?
Re: Process tree....
От: Mystic Artifact  
Дата: 15.10.18 13:50
Оценка:
Здравствуйте, reider, Вы писали:

Если под виндой — то например ShellExecute.

Или создать свой дочерний процесс, который запустит calc.exe и тут же завершиться (не проверял).
Re[2]: Process tree....
От: reider  
Дата: 15.10.18 14:14
Оценка: 4 (1)
Здравствуйте, Mystic Artifact, Вы писали:

MA>Здравствуйте, reider, Вы писали:


MA>Если под виндой — то например ShellExecute.


MA>Или создать свой дочерний процесс, который запустит calc.exe и тут же завершиться (не проверял).


Второй способ проверял — не сработало(((
ShellExecute — также не решает это проблему
Re[2]: Process tree....
От: reider  
Дата: 15.10.18 14:24
Оценка:
Здравствуйте, Mystic Artifact, Вы писали:

MA>Здравствуйте, reider, Вы писали:


MA>Если под виндой — то например ShellExecute.


MA>Или создать свой дочерний процесс, который запустит calc.exe и тут же завершиться (не проверял).


Кто подскажет , как через
ntcreateprocess ntcreatesection
это сделать
Re[3]: Process tree....
От: Don Reba Канада https://stackoverflow.com/users/49329/don-reba
Дата: 15.10.18 14:34
Оценка:
Здравствуйте, reider, Вы писали:

DR>>Создать задачу. https://docs.microsoft.com/en-us/windows/desktop/taskschd/task-scheduler-reference

R>А для этого должен быть запущен планировщик задач?

Этот сервис всегда запущен. Без него Windows не работает.
Ce n'est que pour vous dire ce que je vous dis.
Re: Process tree....
От: dead0k  
Дата: 15.10.18 16:47
Оценка:
Здравствуйте, reider, Вы писали:

R>Как такое организовать?

Сириусли?
CreateProcess->STARTUPINFOEX->lpAttributeList

Но вообще бить за такие экзерсизы надо. Если пользователь хочет убить процесс и всех его потомков, то значит ему так надо. Если процесс не должен быть убиваем — значит надо разруливать это правами доступа
Отредактировано 15.10.2018 16:55 dead0k . Предыдущая версия .
Re[2]: Process tree....
От: reider  
Дата: 16.10.18 06:30
Оценка:
Здравствуйте, dead0k, Вы писали:

D>Здравствуйте, reider, Вы писали:


R>>Как такое организовать?

D>Сириусли?
D>CreateProcess->STARTUPINFOEX->lpAttributeList

D>Но вообще бить за такие экзерсизы надо. Если пользователь хочет убить процесс и всех его потомков, то значит ему так надо. Если процесс не должен быть убиваем — значит надо разруливать это правами доступа



    HANDLE FileHandle, SectionHandle, ProcessHandle;
    NTSTATUS status;
    IO_STATUS_BLOCK isb;
    OBJECT_ATTRIBUTES obj;
    UNICODE_STRING str;
    WCHAR filepath[100] = L"\\??\\\\C:\\Windows\\System32\\calc.exe";

    RtlInitUnicodeString_(&str, filepath);
    InitializeObjectAttributes(&obj, &str, OBJ_CASE_INSENSITIVE, NULL, NULL);

    status = NtOpenFile_(&FileHandle, FILE_EXECUTE | SYNCHRONIZE, &obj, &isb, FILE_SHARE_READ | FILE_SHARE_DELETE, FILE_SYNCHRONOUS_IO_NONALERT | FILE_NON_DIRECTORY_FILE);

    if (!NT_SUCCESS(status))return 1;

    InitializeObjectAttributes(&obj, NULL, 0, NULL, NULL);
    status = NtCreateSection_(&SectionHandle, SECTION_ALL_ACCESS, &obj, 0, PAGE_EXECUTE, SEC_IMAGE, FileHandle);
    if (!NT_SUCCESS(status))
    {
        return 0;
    }
    NtClose_(FileHandle);

    SECTION_IMAGE_INFORMATION ImageInformation;
    status = NtQuerySection_(
        SectionHandle,
        SectionImageInformation,
        &ImageInformation,
        sizeof(ImageInformation),
        NULL
        );
    if (!NT_SUCCESS(status))return 1;
    if (ImageInformation.ImageCharacteristics & IMAGE_FILE_DLL)
    {
        return 1;
    }


    HANDLE DB = OpenProcess(PROCESS_ALL_ACCESS, false, 520);
    status = NtCreateProcess_(&ProcessHandle, PROCESS_ALL_ACCESS, NULL, DB, FALSE, SectionHandle, NULL, NULL);
    if (!NT_SUCCESS(status))
    {
        return 0;
    }
    NtClose_(SectionHandle);


Объект ядра создаётся, а что дальше делать не пойму......
Re[2]: Process tree....
От: reider  
Дата: 16.10.18 07:00
Оценка:
Здравствуйте, dead0k, Вы писали:

D>Здравствуйте, reider, Вы писали:


R>>Как такое организовать?

D>Сириусли?
D>CreateProcess->STARTUPINFOEX->lpAttributeList

D>Но вообще бить за такие экзерсизы надо. Если пользователь хочет убить процесс и всех его потомков, то значит ему так надо. Если процесс не должен быть убиваем — значит надо разруливать это правами доступа


Не совсм понял вас
    HANDLE FileHandle, SectionHandle, ProcessHandle;
    NTSTATUS status;
    IO_STATUS_BLOCK isb;
    OBJECT_ATTRIBUTES obj;
    UNICODE_STRING str;
    WCHAR filepath[100] = L"\\??\\\\C:\\Windows\\System32\\calc.exe";

    RtlInitUnicodeString_(&str, filepath);
    InitializeObjectAttributes(&obj, &str, OBJ_CASE_INSENSITIVE, NULL, NULL);

    status = NtOpenFile_(&FileHandle, FILE_EXECUTE | SYNCHRONIZE, &obj, &isb, FILE_SHARE_READ | FILE_SHARE_DELETE, FILE_SYNCHRONOUS_IO_NONALERT | FILE_NON_DIRECTORY_FILE);

    if (!NT_SUCCESS(status))return 1;

    InitializeObjectAttributes(&obj, NULL, 0, NULL, NULL);
    status = NtCreateSection_(&SectionHandle, SECTION_ALL_ACCESS, &obj, 0, PAGE_EXECUTE, SEC_IMAGE, FileHandle);
    if (!NT_SUCCESS(status))
    {
        return 0;
    }
    NtClose_(FileHandle);

    SECTION_IMAGE_INFORMATION ImageInformation;
    status = NtQuerySection_(
        SectionHandle,
        SectionImageInformation,
        &ImageInformation,
        sizeof(ImageInformation),
        NULL
        );
    if (!NT_SUCCESS(status))return 1;
    if (ImageInformation.ImageCharacteristics & IMAGE_FILE_DLL)
    {
        return 1;
    }


    HANDLE DB = OpenProcess(PROCESS_ALL_ACCESS, false, 520);
    status = NtCreateProcess_(&ProcessHandle, PROCESS_ALL_ACCESS, NULL, DB, FALSE, SectionHandle, NULL, NULL);
    if (!NT_SUCCESS(status))
    {
        return 0;
    }
    NtClose_(SectionHandle);

А дальше что делать то?
Re[3]: Process tree....
От: Mystic Artifact  
Дата: 16.10.18 07:31
Оценка:
Здравствуйте, reider, Вы писали:

R>Здравствуйте, dead0k, Вы писали:


D>>Здравствуйте, reider, Вы писали:


R>>>Как такое организовать?

D>>Сириусли?
D>>CreateProcess->STARTUPINFOEX->lpAttributeList

D>>Но вообще бить за такие экзерсизы надо. Если пользователь хочет убить процесс и всех его потомков, то значит ему так надо. Если процесс не должен быть убиваем — значит надо разруливать это правами доступа


R>Не совсм понял вас

R>А дальше что делать то?
Думаю речь о PROC_THREAD_ATTRIBUTE_PARENT_PROCESS.
Re: Process tree....
От: VVV Россия  
Дата: 16.10.18 22:41
Оценка:
Здравствуйте, reider, Вы писали:

R>Доброго времени суток.

R>Подскажите, вот я хочу запустить calc.exe, но так чтобы он не был виден как мой дочерний, и при
R>вызове через диспетчер задач "завершить дерево..." при выделении моего процесса калькулятор продолжал работать...
R>Как такое организовать?

Создай файл startcalc.bat (ну, например...), запиши туда
start calc.exe
закрой файл.
Запусти этот .batник его через ShellExecute
Re[2]: Process tree....
От: reider  
Дата: 17.10.18 10:19
Оценка:
Здравствуйте, VVV, Вы писали:

VVV>Здравствуйте, reider, Вы писали:


R>>Доброго времени суток.

R>>Подскажите, вот я хочу запустить calc.exe, но так чтобы он не был виден как мой дочерний, и при
R>>вызове через диспетчер задач "завершить дерево..." при выделении моего процесса калькулятор продолжал работать...
R>>Как такое организовать?

VVV>Создай файл startcalc.bat (ну, например...), запиши туда

VVV>start calc.exe
VVV>закрой файл.
VVV>Запусти этот .batник его через ShellExecute

Это ничего не даст
Re[3]: Process tree....
От: VVV Россия  
Дата: 17.10.18 14:25
Оценка:
Здравствуйте, reider, Вы писали:

R>Это ничего не даст


Гмм.. а почему бы тебе не попробовать самому и убедиться, что calc и notepad не продолжают работать?

#include "stdafx.h"
#include <stdio.h>
#include <windows.h>

int _tmain(int argc, _TCHAR* argv[])
{
    FILE *f=fopen("startcalc.bat", "wt");
    if(f != NULL)
    {
        fprintf(f, "start calc.exe\nstart notepad.exe\n");
        fclose(f);
    }

    ::ShellExecute(NULL, NULL, "startcalc.bat", NULL, NULL, SW_SHOWDEFAULT);

    while(true)
    {
        ::Sleep(100);
    }

    return 0;
}
Re[4]: Process tree....
От: reider  
Дата: 18.10.18 07:53
Оценка:
Здравствуйте, VVV, Вы писали:

VVV>Здравствуйте, reider, Вы писали:


R>>Это ничего не даст


VVV>Гмм.. а почему бы тебе не попробовать самому и убедиться, что calc и notepad не продолжают работать?


VVV>
VVV>#include "stdafx.h"
VVV>#include <stdio.h>
VVV>#include <windows.h>

VVV>int _tmain(int argc, _TCHAR* argv[])
VVV>{
VVV>    FILE *f=fopen("startcalc.bat", "wt");
VVV>    if(f != NULL)
VVV>    {
VVV>        fprintf(f, "start calc.exe\nstart notepad.exe\n");
VVV>        fclose(f);
VVV>    }

VVV>    ::ShellExecute(NULL, NULL, "startcalc.bat", NULL, NULL, SW_SHOWDEFAULT);

VVV>    while(true)
VVV>    {
VVV>        ::Sleep(100);
VVV>    }

VVV>    return 0;
VVV>}

VVV>



Огромное спасибо!!!!
И вправду где-то я протупил
Re[4]: Process tree....
От: reider  
Дата: 18.10.18 08:46
Оценка:
Здравствуйте, VVV, Вы писали:

VVV>Здравствуйте, reider, Вы писали:


R>>Это ничего не даст


VVV>Гмм.. а почему бы тебе не попробовать самому и убедиться, что calc и notepad не продолжают работать?


VVV>
VVV>#include "stdafx.h"
VVV>#include <stdio.h>
VVV>#include <windows.h>

VVV>int _tmain(int argc, _TCHAR* argv[])
VVV>{
VVV>    FILE *f=fopen("startcalc.bat", "wt");
VVV>    if(f != NULL)
VVV>    {
VVV>        fprintf(f, "start calc.exe\nstart notepad.exe\n");
VVV>        fclose(f);
VVV>    }

VVV>    ::ShellExecute(NULL, NULL, "startcalc.bat", NULL, NULL, SW_SHOWDEFAULT);

VVV>    while(true)
VVV>    {
VVV>        ::Sleep(100);
VVV>    }

VVV>    return 0;
VVV>}

VVV>



Осталось понять один нюанс.
На Windows 7 всё хорошо, но на Windows 8 и Windows 2012 Server нет.....Там ситуация такая же как и раньше.
Моё приложение является родителем
Re[5]: Process tree....
От: ononim  
Дата: 18.10.18 11:00
Оценка:
R>Осталось понять один нюанс.
R>На Windows 7 всё хорошо, но на Windows 8 и Windows 2012 Server нет.....Там ситуация такая же как и раньше.
R>Моё приложение является родителем
А если закрыть (совсем) и заново открыть диспетчер?
Как много веселых ребят, и все делают велосипед...
Re[5]: Process tree....
От: VVV Россия  
Дата: 18.10.18 15:17
Оценка:
Здравствуйте, reider, Вы писали:


R>Осталось понять один нюанс.

R>На Windows 7 всё хорошо, но на Windows 8 и Windows 2012 Server нет.....Там ситуация такая же как и раньше.
R>Моё приложение является родителем

У меня 7-ка. И такой же результат получается так:
    system("start calc.exe");
    system("start notepad.exe");
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.