Форум программистов, компьютерный форум, киберфорум
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. Показов 2555. Ответов 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
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
11.01.2022, 15:26  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от The trick Посмотреть сообщение
PDWORD это указатель на Long, т.е. ByRef As Long
А разве по умолчанию не ByRef? Разве его обязательно писать?
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
11.01.2022, 15:27
Цитата Сообщение от HackerVlad Посмотреть сообщение
А разве по умолчанию не ByRef? Разве его обязательно писать?
Необязательно.
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
11.01.2022, 15:40  [ТС]
Ну вот написал функцию считывания командной строки для перезапуска процесса.

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
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Declare Function GetApplicationRestartSettings Lib "kernel32" (ByVal hProcess As Long, pwzCommandline As Any, ByRef pcchSize As Long, ByRef pdwFlags As Long) As Long
 
Public Function IsProcessRestartableCommandLine(pid As Long) As String
    Dim hProc As Long
    Dim BuferSize As Long
    Dim dwFlags As Long
    Dim bufer() As Byte
    
    hProc = OpenProcess(PROCESS_QUERY_INFORMATION Or PROCESS_VM_READ, False, pid)
    
    If hProc > 0 Then
        GetApplicationRestartSettings hProc, ByVal 0&, BuferSize, dwFlags
        
        If BuferSize > 0 Then
            ReDim Preserve bufer(BuferSize)
            
            GetApplicationRestartSettings hProc, bufer(0), BuferSize, dwFlags
            
            IsProcessRestartableCommandLine = bufer
        End If
        
        CloseHandle hProc
    End If
End Function
Оно работает. И для калькулятора проставляет команду "/rest". Но Explorer.exe вызывает недоумение просто. После него вылеты и бывают.

Добавлено через 3 минуты
И по возвращаемым значениям тоже недоумения у меня. Почему я говорю, что может я объявил неправильно, потому что возвращаемое значение для простых процессов не подключенных к перезапуску это -2 млрд. на всю катушку

А MSDN пишет что возвращаемое значение должно быть HRESULT_FROM_WIN32(ERROR_NOT_FOUND). А эта константа 122 или 127 что-ли по моему, но точно не 2 млрд.

Добавлено через 1 минуту
В том числе должно было возвращать правильно ERROR_INSUFFICIENT_BUFFER. Но этого тоже не происходит. Это 122 для буфера слишком малого. Но и этого не происходит. По возвращаемым значениям вопросы у меня. As Long ли?
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
11.01.2022, 15:45
Цитата Сообщение от HackerVlad Посмотреть сообщение
Ну вот написал функцию считывания командной строки для перезапуска процесса.
Размер неверно считается из-за этого вылеты. Там в pcchSize размер в символах, а не в байтах.

Цитата Сообщение от HackerVlad Посмотреть сообщение
И по возвращаемым значениям тоже недоумения у меня. Почему я говорю, что может я объявил неправильно, потому что возвращаемое значение для простых процессов не подключенных к перезапуску это -2 млрд. на всю катушку
Ну так это не просто код ошибки, а код ошибки WIN32 приведенный к HRESULT. Посмотри что макрос HRESULT_FROM_WIN32 делает.
0
 Аватар для VBOrion
10 / 6 / 0
Регистрация: 06.11.2017
Сообщений: 21
11.01.2022, 15:51
Цитата Сообщение от The trick Посмотреть сообщение
Размер неверно считается из-за этого вылеты. Там в pcchSize размер в символах, а не в байтах.
Нужно ByVal StrPtr передавать в pwzCommandline.
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
11.01.2022, 15:54  [ТС]
Цитата Сообщение от The trick Посмотреть сообщение
Там в pcchSize размер в символах, а не в байтах
Знаешь я в самом начале проверял возвращаемые значения буфера BuferSize на самом деле в байтах для кажого символа по два байта, а не в символах

для калькулятора "/rest" выдаёт 9, если считать вместе с нулём то 10, на пять символов.

Добавлено через 1 минуту
Цитата Сообщение от VBOrion Посмотреть сообщение
Нужно ByVal StrPtr передавать в pwzCommandline
Это я тоже пробовал. Но не получалось. Может я забывал нули почистить правда... Но по сути через байтовый массив ведь работает
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
11.01.2022, 16:02
Цитата Сообщение от HackerVlad Посмотреть сообщение
Знаешь я в самом начале проверял возвращаемые значения буфера BuferSize на самом деле в байтах для кажого символа по два байта, а не в символах
для калькулятора "/rest" выдаёт 9, если считать вместе с нулём то 10, на пять символов.
Там должно быть /restart.

Цитата Сообщение от VBOrion Посмотреть сообщение
Нужно ByVal StrPtr передавать в pwzCommandline.
Верно. Код должен быть приблизительно таким:
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
Option Explicit
 
Private Const PROCESS_QUERY_INFORMATION As Long = &H400
Private Const PROCESS_VM_READ As Long = &H10
 
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Declare Function GetApplicationRestartSettings Lib "kernel32" (ByVal hProcess As Long, ByVal pwzCommandline As Long, ByRef pcchSize As Long, ByRef pdwFlags As Long) As Long
 
Public Function IsProcessRestartableCommandLine(ByVal pid As Long) As String
    Dim hProc As Long
    Dim BuferSize As Long
    Dim dwFlags As Long
 
    hProc = OpenProcess(PROCESS_QUERY_INFORMATION Or PROCESS_VM_READ, False, pid)
    
    If hProc > 0 Then
        
        If GetApplicationRestartSettings(hProc, ByVal 0&, BuferSize, dwFlags) >= 0 Then
            
            If BuferSize > 0 Then
                
                IsProcessRestartableCommandLine = Space$(BuferSize - 1)
                
                If GetApplicationRestartSettings(hProc, StrPtr(IsProcessRestartableCommandLine), BuferSize, dwFlags) < 0 Then
                    IsProcessRestartableCommandLine = vbNullString
                End If
    
            End If
            
        End If
        
        CloseHandle hProc
        
    End If
    
End Function
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
11.01.2022, 16:13  [ТС]
Я в шоке если честно. Ну да StrPtr будет лучше гораздо. Я и правда забыл почистить нули поэтому не получалось.
Вот тогда правильно:

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
Public Function IsProcessRestartableCommandLine(pid As Long) As String
    Dim hProc As Long
    Dim BuferSize As Long
    Dim dwFlags As Long
    Dim CmdLine As String
    'Dim bufer() As Byte (это уже не надо)
    
    hProc = OpenProcess(PROCESS_QUERY_INFORMATION Or PROCESS_VM_READ, False, pid)
    
    If hProc > 0 Then
        Form1.Caption = GetApplicationRestartSettings(hProc, ByVal 0&, BuferSize, dwFlags)
        
        If BuferSize > 0 Then
            CmdLine = String$(BuferSize, vbNullChar)
            
            GetApplicationRestartSettings hProc, ByVal StrPtr(CmdLine), BuferSize, dwFlags
            CmdLine = Replace(CmdLine, vbNullChar, vbNullString)
            IsProcessRestartableCommandLine = CmdLine
        End If
        
        CloseHandle hProc
    End If
End Function
Добавлено через 7 минут
The trick, странно, но твой код у меня не работает, я написал свой он работает.
Большое спасибо что обратил внимание на мои ошибки. Я и правда, как идиот, думал что там в байтах. Потому что для моей команды "-r" своей возвращало 3 буферсайза. А что калькулятор выдаст "/restart" полное я и не ожидал даже))))) Спасибо ещё раз, что обратил моё внимание на это.
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
11.01.2022, 16:15
Цитата Сообщение от HackerVlad Посмотреть сообщение
The trick, странно, но твой код у меня не работает, я написал свой он работает.
Потому что я изменил декларацию, там нет смысла делать As Any.
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
11.01.2022, 16:18  [ТС]
Цитата Сообщение от The trick Посмотреть сообщение
Потому что я изменил декларацию, там нет смысла делать As Any
Да, спасибо и ещё это потому что pwzCommandline поставил ByVal, а без ByVal не работает) Очень странно что там ByVal, я прям не ожидал)
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
11.01.2022, 16:21
Цитата Сообщение от HackerVlad Посмотреть сообщение
Да, спасибо и ещё это потому что pwzCommandline поставил ByVal, а без ByVal не работает) Очень странно что там ByVal, я прям не ожидал)
Я тут дал правильную декларацию.
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
11.01.2022, 16:25  [ТС]
Цитата Сообщение от The trick Посмотреть сообщение
Я тут дал правильную деклараци
Точно, спасибо. Вот мой вариант. Работает правильно.

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Public Function IsProcessRestartableCommandLine(pid As Long) As String
    Dim hProc As Long
    Dim BuferSize As Long
    Dim dwFlags As Long
    Dim CmdLine As String
    
    hProc = OpenProcess(PROCESS_QUERY_INFORMATION Or PROCESS_VM_READ, False, pid)
    
    If hProc > 0 Then
        GetApplicationRestartSettings hProc, ByVal 0&, BuferSize, dwFlags
        
        If BuferSize > 0 Then
            CmdLine = String$(BuferSize - 1, vbNullChar)
            
            GetApplicationRestartSettings hProc, StrPtr(CmdLine), BuferSize, dwFlags
            IsProcessRestartableCommandLine = CmdLine
        End If
        
        CloseHandle hProc
    End If
End Function
Добавлено через 1 минуту
Цитата Сообщение от The trick Посмотреть сообщение
Ну так это не просто код ошибки, а код ошибки WIN32 приведенный к HRESULT. Посмотри что макрос HRESULT_FROM_WIN32 делает.
Последний вопрос у меня остался по возвращаемым значениям. Как быстро написать провыерку подключен процесс к перезапуску или нет.
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
11.01.2022, 16:26
Цитата Сообщение от HackerVlad Посмотреть сообщение
Последний вопрос у меня остался по возвращаемым значениям. Как быстро написать провыерку подключен процесс к перезапуску или нет.
Ну смотри возвращаемое значение, если меньше нуля - ошибка.
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
11.01.2022, 16:40  [ТС]
Большое спасибо за помощь и за ответы. Свои ошибки я понял и исправил. Я не догадался сделать -1 в возвращаемой строке. А например процесс Explorer.exe для командной строки значит возвращает один только vbNullChar и всё.
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
03.04.2023, 12:41  [ТС]
Сейчас обнаружил лайфхак если указать код -2147483640 то не нужно даже ждать 60 сек. для перезапуска.
RegisterApplicationRestart(StrPtr(Restar tCmd), -2147483640)
И всё! Хоть через секунду перезапускай! Ждать минуты теперь не надо. Майкрософт будет в ярости, что я раскрыл их секретную опцию)))
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
03.04.2023, 12:41
Помогаю со студенческими работами здесь

Файловый ввод вывод. небольшая загвоздка
имеем текстовый файл.нужно переписать в новый файл все его строки, вставив в конец каждой строки количество символов в ней. #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 ,т.е где искать в...


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

Или воспользуйтесь поиском по форуму:
35
Ответ Создать тему
Новые блоги и статьи
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 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты 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. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru