Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.67/12: Рейтинг темы: голосов - 12, средняя оценка - 4.67
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769

Есть небольшая загвоздка по правильности работы Restart Manager API в Windows 7 (64 bit)

10.01.2022, 21:34. Показов 2553. Ответов 34
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Итак, у меня есть странный вопрос по работе Restart Manager API. Меня озадачила одна странная ситуация. А именно определение процессов Restartable из структуры RM_PROCESS_INFO. Этот бит должен определять является ли процесс перезапускаемым, при его завершении. Но меня шокировало что простой калькулятор, процесс calc.exe обычный почему-то выставляет bRestartable (проставляет единичку), а например процесс системный dwm.exe (хотя он даже не системный) проставляет как НЕ перезапускаемый, но на самом деле при его завершении этот процесс перезапускается. Как работает логика определения перезапускаемый процесс или нет в Restart Manager API? В структуре RM_PROCESS_INFO.

Самое больше всего бесит то, что определяет простой калькулятор, который никогда не перезапускается при его завершении, как перезапускаемый процесс. Помогите пожалуйста разобраться с этим чудом.

Приведу для примера свой код определения, является ли процесс перезапускаемым:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
' Подключен ли процесс к диспетчеру перезапуска
Public Function IsProcessRestartable(pid As Long) As Boolean
    Dim SessionHandle As Long
    Dim key As String
    Dim rm As RM_UNIQUE_PROCESS
    Dim ProcInfoNeeded As Long
    Dim ProcInfoNeeded2 As Long
    Dim RebootReasons As Long
    Dim ProcessInfo() As RM_PROCESS_INFO
    Dim ret As Long
    Dim i As Long
    
    rm.dwProcessId = pid ' Установить pid
    key = Space$(256)
    
    If RmStartSession(SessionHandle, 0, StrPtr(key)) = ERROR_SUCCESS Then
        key = Trim$(key)
        
        If RmRegisterResources(SessionHandle, ByVal 0&, ByVal 0&, 1, rm, ByVal 0&, ByVal 0&) = ERROR_SUCCESS Then
            ReDim ProcessInfo(0)
            ret = RmGetList(SessionHandle, ProcInfoNeeded, 1, ProcessInfo(0), RebootReasons)
            
            If ret = ERROR_MORE_DATA Then ' Буфер слишком мал
                ReDim Preserve ProcessInfo(ProcInfoNeeded - 1) ' Увеличиваем буфер
                ret = RmGetList(SessionHandle, ProcInfoNeeded2, ProcInfoNeeded, ProcessInfo(0), RebootReasons) ' Повторяем попытку
            End If
            If ret = ERROR_SUCCESS Then ' Если нету ошибок
                For i = 0 To UBound(ProcessInfo)
                    If ProcessInfo(i).Process.dwProcessId = pid Then
                        IsProcessRestartable = ProcessInfo(i).bRestartable
                        Exit For
                    End If
                Next
            End If
        End If
        
        RmEndSession SessionHandle
    End If
End Function
Добавлено через 7 минут
Или почему mspaint.exe тоже определяется как Restartable. Процесс обычный же C:\Windows\SysWOW64\mspaint.exe

Добавлено через 2 часа 5 минут
Я подумал может это потому, что mspaint.exe в системной папке, взял скопировал в другую левую папку, запустил, и всё равно он Restartable якобы, в чём тут вся суть, я не понимаю.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
10.01.2022, 21:34
Ответы с готовыми решениями:

Есть небольшая загвоздка) подскажите с параметром get
Есть такое задание. 1) Сделайте форму со следующими полями: «Логин» и «Пароль». 2) Обработайте форму и создайте папку с именем...

Критические отличия работы ядра Windows 7 64-bit и Windows 10 64-bit или их ошибки
Здравствуйте! Помогите пж Года два назад купил ПК с установленной на нем Windows 10 64-bit (характеристика пк приложена) ...

Перегрузка операторов и небольшая загвоздка с this
Пирвет, писал я тут в своей фигне перегрузку операторов. Вроде все норм, но наткнулся на интересную ситуацию. vec2.h: #pragma...

34
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
10.01.2022, 23:06
Для сервисов и процессов которые зарегистрированы через RegisterApplicationRestart будет TRUE, кроме CRITICAL процессов.
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
10.01.2022, 23:09  [ТС]
Но причём тут обычный калькулятор и MsPaint
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
10.01.2022, 23:11
Цитата Сообщение от HackerVlad Посмотреть сообщение
Но причём тут обычный калькулятор и MsPaint
Он вызывает RegisterApplicationRestart.
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
10.01.2022, 23:14  [ТС]
Цитата Сообщение от The trick Посмотреть сообщение
Он вызывает RegisterApplicationRestart
Если честно, я не понимаю, при каких случаях калькулятор или MsPaint может быть перезапущен. И с каким кодом он регистрирует процесс функцией RegisterApplicationRestart. Там какие-то есть константы для этого.
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
10.01.2022, 23:52
Цитата Сообщение от HackerVlad Посмотреть сообщение
Если честно, я не понимаю, при каких случаях калькулятор или MsPaint может быть перезапущен.
Ну к примеру при аварийном завершении работы приложение может попытаться сохранить данные, а затем система перезапустит программу с ключом указанным в RegisterApplicationRestart и приложение поймет что оно было перезапущено после сбоя.
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
11.01.2022, 00:07  [ТС]
The trick, спасибо, я понял, а есть ли какой-то способ узнать с каким кодом программа зарегистрирована к перезапуску, чтобы узнать в каком из случаев она будет перезапускаться
И ещё я хотел бы знать можно ли снять регистрацию перезапуска чужого процесса (для калькулятора например)

Добавлено через 7 минут
И ещё интересный вопрос как использовать самому функцию RegisterApplicationRestart. Вот набросал сам побыстрому код:

Private Declare Function RegisterApplicationRestart Lib "kernel32" (ByVal pszCommandline As Long, ByVal dwFlags As Long) As Long

Visual Basic
1
2
3
4
5
6
7
Private Sub Form_Load()
    Dim RestartCmd As String
    
    RestartCmd = "-r"
    
    Print RegisterApplicationRestart(StrPtr(RestartCmd), 0)
End Sub
Но процесс не перезапускается, даже когда я вызываю искусственно исключительную ошибку для завершения. И не предлагает процесс перезапустить. Может код не ноль надо было? В dwFlags ?

Добавлено через 4 минуты
Интересно то, что мой процесс стал Restartble по определению Restart Manager API после использования этой функции RegisterApplicationRestart. Но по сути ничего больше не происходит после завершения процесса любыми способами, что-то не перезапускается совсем. Странно. Есть рабочие примеры по этой теме для VB?
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
11.01.2022, 00:10
Цитата Сообщение от HackerVlad Посмотреть сообщение
The trick, спасибо, я понял, а есть ли какой-то способ узнать с каким кодом программа зарегистрирована к перезапуску, чтобы узнать в каком из случаев она будет перезапускаться
GetApplicationRestartSettings

Цитата Сообщение от HackerVlad Посмотреть сообщение
И ещё я хотел бы знать можно ли снять регистрацию перезапуска чужого процесса (для калькулятора например)
Удаленно - только недокументированными и ненадежными способами. Для локального случая - UnregisterApplicationRestart.
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
11.01.2022, 00:14  [ТС]
Цитата Сообщение от The trick Посмотреть сообщение
GetApplicationRestartSettings
Спасибо, надеюсь эта функция работает для всех чужих процессов, мне бы прочитать что там калькулятор о себе думает)
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
11.01.2022, 00:25
Цитата Сообщение от HackerVlad Посмотреть сообщение
Но процесс не перезапускается, даже когда я вызываю искусственно исключительную ошибку для завершения. И не предлагает процесс перезапустить. Может код не ноль надо было? В dwFlags ?
Добавлено через 4 минуты
Интересно то, что мой процесс стал Restartble по определению Restart Manager API после использования этой функции RegisterApplicationRestart. Но по сути ничего больше не происходит после завершения процесса любыми способами, что-то не перезапускается совсем. Странно. Есть рабочие примеры по этой теме для VB?
Ну в описании функции написано же:
To prevent cyclical restarts, the system will only restart the application if it has been running for a minimum of 60 seconds.
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
11.01.2022, 00:27  [ТС]
Цитата Сообщение от The trick Посмотреть сообщение
Ну в описании функции написано же
Блин, точно, забыл выждать 60 секунд))) Спасибо, что напомнил)))
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
11.01.2022, 00:45  [ТС]
Ха! Сработало! По-быстрому написал примерчик для этой темы:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Option Explicit
Private Declare Function PrivilegeCheck Lib "advapi32.dll" (ByVal ClientToken As Long, RequiredPrivileges As Any, ByVal pfResult As Long) As Long
Private Declare Function RegisterApplicationRestart Lib "kernel32" (ByVal pszCommandline As Long, ByVal dwFlags As Long) As Long
 
Dim Seconds As Long ' Секундочки
 
Private Sub Command1_Click()
    If CLng(Timer - Seconds) > 60 Then ' Если прошло больше 60 секунд
        ' Специально вызываю самую глючную функцию PrivilegeCheck (позор Microsoft'у) для вызова необратимого исключения в приложении
        PrivilegeCheck 0, 0, 0
    Else
        MsgBox "Подождите ещё чуток :-)" & vbCrLf & "Прошло только " & CLng(Timer - Seconds) & " сек.", vbInformation
    End If
End Sub
 
Private Sub Form_Load()
    Dim RestartCmd As String
    
    Seconds = CLng(Timer) ' Засекаем время
    RestartCmd = "-r" ' Придумываем команду перезапуска
    
    Me.AutoRedraw = True
    Print RegisterApplicationRestart(StrPtr(RestartCmd), 0) ' Регистрируем программу к перезапуску
    Print Chr(34) & Command$ & Chr(34)
End Sub
Миниатюры
Есть небольшая загвоздка по правильности работы Restart Manager API в Windows 7 (64 bit)  
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
11.01.2022, 00:48  [ТС]
The trick, но автоматически приложение перезапускаться не будет? только по кнопке?
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
11.01.2022, 00:56
Цитата Сообщение от HackerVlad Посмотреть сообщение
The trick, но автоматически приложение перезапускаться не будет? только по кнопке?
Да, но там есть условия авто перезапуска при обновлении.
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
11.01.2022, 01:17  [ТС]
Цитата Сообщение от The trick Посмотреть сообщение
To prevent cyclical restarts, the system will only restart the application if it has been running for a minimum of 60 seconds
Кстати я вот тут подмал Explorer.exe перезапускается мгновенно, не выжидая даже одной секунды, после его старта, не говоря уже про 60 секунд)) Странно, да?

Добавлено через 2 минуты
Кстати, я сначала думал чтобы завершать Explorer нужно его сначала с помощью API отключать от диспетчера перезапуска (я даже не знал что это невозможно для других процессов) а оказалось всего-то надо код завершения 1 было проставлять.

Добавлено через 8 минут
The trick, The trick, кстати хочу спросить, так получается, что можно определить является ли процесс перезапускаемым, не используя Restart Manager API? А просто использовав функцию GetApplicationRestartSettings из kernel32.dll? Просто для меня это было бы вообще отлично.
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
11.01.2022, 02:08
Цитата Сообщение от HackerVlad Посмотреть сообщение
Кстати я вот тут подмал Explorer.exe перезапускается мгновенно, не выжидая даже одной секунды, после его старта, не говоря уже про 60 секунд)) Странно, да?
Нужно смотреть как там реализовано.

Цитата Сообщение от HackerVlad Посмотреть сообщение
The trick, The trick, кстати хочу спросить, так получается, что можно определить является ли процесс перезапускаемым, не используя Restart Manager API? А просто использовав функцию GetApplicationRestartSettings из kernel32.dll? Просто для меня это было бы вообще отлично.
Ну это актуально для пользовательских процессов, для сервисов не знаю как эта функция поведет себя. Сам Restart Manager для сервисов устанавливает TRUE даже не проверяя GetApplicationRestartSettings.
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
11.01.2022, 03:11  [ТС]
Цитата Сообщение от The trick Посмотреть сообщение
для сервисов устанавливает TRUE даже не проверяя GetApplicationRestartSettings
Ну не знаю, я думал, что не все сервисы автоматически перезапускаемы. Тем более если взять даже svchost.exe то Restart Manager API не для всех штук проставляет Reatartable. И кстати сейчас проверил, с включенным UAC вообще не определяет даже - без админ прав работает только для пользовательских. А это только Explorer (и калькулятор на удивление)

Добавлено через 8 минут
Я обязательно напишу функцию которая будет определять перезапускаемый процесс или нет. Мне это интересно. Все процессы должны определяться, я думаю, там PROCESS_VM_READ должен быть, а значит придётся для большинства включать привилегии.

Добавлено через 16 секунд
Я обязательно напишу функцию которая будет определять перезапускаемый процесс или нет. Мне это интересно. Все процессы должны определяться, я думаю, там PROCESS_VM_READ должен быть, а значит придётся для большинства включать привилегии.
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
11.01.2022, 12:07
Цитата Сообщение от HackerVlad Посмотреть сообщение
Ну не знаю, я думал, что не все сервисы автоматически перезапускаемы. Тем более если взять даже svchost.exe то Restart Manager API не для всех штук проставляет Reatartable. И кстати сейчас проверил, с включенным UAC вообще не определяет даже - без админ прав работает только для пользовательских. А это только Explorer (и калькулятор на удивление)
Я уже написал и в описании функции сказано что CRITICAL процессы также возвращают FALSE.

Цитата Сообщение от HackerVlad Посмотреть сообщение
Я обязательно напишу функцию которая будет определять перезапускаемый процесс или нет. Мне это интересно. Все процессы должны определяться, я думаю, там PROCESS_VM_READ должен быть, а значит придётся для большинства включать привилегии.
Да, там нужно PEB читать для этого.
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
11.01.2022, 15:08  [ТС]
Начал писать функцию. Начал сталкиваться с подводными камнями. Скажите, пожалуйста, как правильно объявить функцию:

Visual Basic
1
Private Declare Function GetApplicationRestartSettings Lib "kernel32" (ByVal hProcess As Long, pwzCommandline As Any, pcchSize As Long, pdwFlags As Long) As Long
Оно вроде бы работает, но всё равно мне кажется, что я что-то напутал - иногда бывают вылеты из среды VB.
Объявления этой функции абсолютно нигде нет в Интеренте, для VB, как обычно впрочем. Поэтому переписываю с MSDN.
Вопрос для знатоков, что такое PDWORD и как мне это правильно объявлять в VB6. Я поставил As Long, но всё равно терзают сомнения. Бывают вылеты почему-то.
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
11.01.2022, 15:24
Цитата Сообщение от HackerVlad Посмотреть сообщение
Private Declare Function GetApplicationRestartSettings Lib "kernel32" (ByVal hProcess As Long, ByVal pwzCommandline As Long, pcchSize As Long, pdwFlags As Long) As Long
Цитата Сообщение от HackerVlad Посмотреть сообщение
Вопрос для знатоков, что такое PDWORD и как мне это правильно объявлять в VB6. Я поставил As Long, но всё равно терзают сомнения. Бывают вылеты почему-то.
PDWORD это указатель на Long, т.е. ByRef As Long.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
11.01.2022, 15:24
Помогаю со студенческими работами здесь

Файловый ввод вывод. небольшая загвоздка
имеем текстовый файл.нужно переписать в новый файл все его строки, вставив в конец каждой строки количество символов в ней. #include...

Программа из книги Шилдта, небольшая загвоздка)
Привет форумчане!) В книге Шилдта при объяснении методов с параметрами есть пример, в котором находится наименьший множитель двух чисел....

Есть ли русификатор к windows 10 manager ?
Добрый вечер! Кто знает есть ли русификатор к windows 10 manager ? Буду благодарен за информацию. Виктор

Сохранение драйверов после смены windows xp sp3 32 bit на windows SL 8 64 bit
Здравствуйте! Если на диск C где стояла windows xp sp3 32bit поставить windows SL 8 64bit при этом диск не форматируя все драйвера могут...

Не корректное завершение работы компа Windows 7 64 bit (мешают фоновые процессы)
Привет всем При выключении компа появляется всегда окно: закрытие фоновых программ, как это убрать в Windows 7 ,т.е где искать в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
YAFU@home — распределённые вычисления для математики. На CPU
Programma_Boinc 20.01.2026
YAFU@home — распределённые вычисления для математики. На CPU YAFU@home — это BOINC-проект, который занимается факторизацией больших чисел и исследованием aliquot-последовательностей. Звучит. . .
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит: токи, напряжения и их 1 и 2 производные при t = 0;. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru