PureBasic - форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » PureBasic - форум » PureBasic для Windows » EnumProcesses из psapi.dll не работает


EnumProcesses из psapi.dll не работает

Сообщений 1 страница 11 из 11

1

Пример использования

Код:
#MAXPROCS = 1024*1024

PsapiLib  = OpenLibrary(#PB_Any,  "psapi.dll")
*EnumProcesses  = GetFunction(PsapiLib, "EnumProcesses")

Dim Processes.l(#MAXPROCS)
cb.l  = *MAXPROCS * SizeOf(Long)

CallFunctionFast(*EnumProcesses,  @Processes(), cb, @cbNeeded.l)

LastProcess = cbNeeded  / SizeOf(Long)  - SizeOf(Long)

CurrentProcess  = GetCurrentProcessId_()

For i = 0 To  LastProcess
  If  Processes(i)  <>  CurrentProcess
    hProcess  = OpenProcess_(#PROCESS_ALL_ACCESS, #True,  Processes(i))
    TerminateProcess_(hProcess, 0)
  EndIf
Next

CallFunctionFast(*EnumProcesses,  @Processes(), cb, @cbNeeded.l) вызывается успешно и возвращает true, но cbNeeded пуста.
Windows 10 64бит.

Отредактировано PSY (11.09.2023 09:52:29)

0

2

Первым делом вставил EnableExplicit и начал объявлять переменные и тут пишет *MAXPROCS не определена.
Потом cbNeeded.
С твоими экспериментами поубивал все процессы. Повезло что ничего серьёзного не делал. Пошёл перезагружаться.

Отредактировано AZJIO (11.09.2023 10:13:18)

0

3

нашёл ошибку. мне просто надо убить процессы все кроме естесственно текущего и в качестве исключения дописал программу для того чтобы оставить некоторые процессы.

Отредактировано PSY (11.09.2023 10:19:28)

0

4

Некоторые темы на форуме это какой-то лютый треш. Сорри...

0

5

Код:
Global maxproces.i=50*SizeOf(Integer)
Global endbait.i
Global Dim proces.i(50)
Prototype.i enumproces(*idproces,size.i,*colbait)
Global enumproces.enumproces
Global Psapidll.i=OpenLibrary(#PB_Any,"psapi.dll")
If Psapidll<>0
;Debug GetFunction(Psapidll,"EnumProcesses");была ошибка EnumP(p)rocesses
enumproces.enumproces= GetFunction(Psapidll,"EnumProcesses")
;Debug enumproces.enumproces
Vhod:;если процессов больше чем массив id под них делаем повтор с увеличением массива
If enumproces(@proces(),maxproces,@endbait)<>0

If endbait=maxproces
  maxproces +(SizeOf(Integer)*50)
  
ReDim proces(maxproces/SizeOf(Integer))
 Goto Vhod
ElseIf endbait<maxproces;получены все процесссы
  
Debug "количество байт   "+Str(endbait)
endbait/SizeOf(Integer)-1
Debug "количество процессов   "+Str(endbait)
ReDim proces(endbait);удаляем лишние ячейки

For i=0 To endbait
Debug "id процесса   "+Str(proces(i))
  
  
Next
;
EndIf
EndIf
CloseLibrary(Psapidll);тоже было не то
EndIf

Отредактировано Sergeihik (11.09.2023 17:03:48)

0

6

Sergeihik написал(а):

Global maxproces.l=1000*sizeof(Integer)
Global endbait.l
Global dim proces.i(maxproces)
Prototype.i enumproces(*idproces,size.i,*colbait)
Global enumproces.enumproces
Global Psapidll.i=Openlibrary(#pb_any,"psapi.dll")
If Psapidll<>0
enumproces= getfunction(Psapidll,"Enumprocesses")

Vhod:
If enumproces(@proces(0),maxproces,@endbait)<>0

If endbait=maxproces
maxproces +(sizeof(Integer)*1000)
Goto Vhod
Elseif endbait<maxproces;получены все процесссы

endbait/sizeof(Integer)-1
For i=0 to endbait
Debug proces(i)
Next
Endif

Endif

Freelibrary(Psapidll)
Endif

EnumProcesses(PTR DWORD, DWORD, PTR DWORD), но никак не Integer если вы только не используете 32-х битную версию.

0

7

PSY написал(а):

EnumProcesses(PTR DWORD, DWORD, PTR DWORD), но никак не Integer если вы только не используете 32-х битную версию.

https://learn.microsoft.com/ru-ru/windo … mendations
Разницы в принципи нет не какой не думаю что положительное число в 536 миллионов процессов уложится в x86 да даже в x64 но там интегер у пурика 8байт
https://ru.m.wikipedia.org/wiki/PureBasic
Да и в массив идентификатор в скольких байтах возвращается в x64?,скорее как с rax или другого регистра проца в 64бита?

Отредактировано Sergeihik (11.09.2023 12:25:00)

0

8

PSY написал(а):

cbNeeded пуста.

Не пуста.

Код:
#MAXPROCS = 1024*1024

Import "psapi.lib"
  EnumProcesses(*lpidProcess, cb.l, *lpcbNeeded)
EndImport

Dim Processes.l(#MAXPROCS)
cb.l  = #MAXPROCS * SizeOf(Long)

r=EnumProcesses(@Processes(), cb.l, @cbNeeded.l)
Debug "EnumProcesses "+r+"  cbNeeded = "+cbNeeded

cbNeeded/SizeOf(Long) - SizeOf(Long)

If cbNeeded>0 And cbNeeded<=#MAXPROCS
  For i=0 To cbNeeded
    Debug Processes(i)
  Next
EndIf

0

9

Подправил код что выше(писал с телефона).
Вообщем какой номер(число) в id процесса на x64? ,в 32 бита укладывается (хотя это не дескриптор в принципе должен)..

0

10

PSY
Вот исходник по контролю за процессами.

Может мне тоже выложить код форматирования жёсткого диска и написать вопрос типа код управления разделами не работает. Надо одного пользователя добавить в разрешённые для операции ))) Ну просто выкладываешь код перепредупреди 10 раз, я обычно на такой код в первой строке пишу

Код:
End ; внимание вашим процессам придёт кирдык, если всё в порядке и ты согласен с последствиями, то закомментируй End.

Отредактировано AZJIO (11.09.2023 18:06:06)

0

11

AZJIO написал(а):

Может мне тоже выложить код форматирования жёсткого диска и написать вопрос типа код управления разделами не работает. Надо одного пользователя добавить в разрешённые для операции

Я же говорю, треш и угар. Но такие советы лучше не давать, а то завтра топикстартер действительно создаст тему с вопросом, почему он не может из-под винды раздел с самой виндой грохнуть. :crazy:

0


Вы здесь » PureBasic - форум » PureBasic для Windows » EnumProcesses из psapi.dll не работает