PureBasic - форум

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

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


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


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

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

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:

+1

12

Вот ещё код подкину.

Код:

Procedure.i IFText_UTF16_Left(*s,*c);сверка строки с лева
  !push esi
  !push edi
  !mov dword esi,[p.p_s+8]
  !mov dword edi,[p.p_c+8]
  ;
  !smotrim_simmvvol:
  !mov word ax,[esi]
  !cmp word [edi],ax
  !jnz vyiti
  ;
  !add dword edi,2
  !add dword esi,2
  !cmp word[edi],0h
  !jnz smotrim_simmvvol
  ;
  !mov dword eax,1h
  !pop edi
  !pop esi
  ProcedureReturn
  !vyiti:
  !xor eax,eax
  !pop edi
  !pop esi
  ProcedureReturn
EndProcedure
Procedure.i GetModuleProcessa(lpModuleName.s, dwProcessId.l);вывод модулей процесса
;dwSize=Размер структуры в байтах. Перед вызовом функции Module32First установите для этого члена значение SizeOf(MODULEENTRY32) . Если вы не инициализируете dwSize , произойдет сбой Module32First .
;th32ModuleID=Этот элемент больше не используется и всегда имеет значение 1.
;th32ProcessID=Идентификатор процесса, модули которого должны быть проверены.
;GlblcntUsage=Счетчик загрузки модуля, который обычно не имеет смысла и обычно равен 0xFFFF.
;ProccntUsage=Счетчик загрузки модуля (такой же, как GlblcntUsage ), который обычно не имеет смысла и обычно равен 0xFFFF.
;modBaseAddr=Базовый адрес модуля в контексте процесса владения.
;modBaseSize=Размер модуля в байтах.
;hModule=Дескриптор модуля в контексте процесса владения.
;szModule=Название модуля.
;szExePath=Путь к модулю.
;замечания=Члены modBaseAddr и hModule действительны только в контексте процесса, указанного в th32ProcessID .
  Protected hendlmodule
  Protected lpModule.MODULEENTRY32
  hendlmodule = CreateToolhelp32Snapshot_(#TH32CS_SNAPMODULE, dwProcessId)
  If hendlmodule <>#INVALID_HANDLE_VALUE

    lpModule\dwSize = SizeOf(MODULEENTRY32)
  If Module32First_(hendlmodule, @lpModule)    
    While Module32Next_(hendlmodule, @lpModule)
      Debug PeekS(@lpModule\szModule,-1,#PB_Unicode)+"  "+Str(lpModule\th32ProcessID)
      If IFText_UTF16_Left(@lpModule\szModule,@lpModuleName)
        CloseHandle_(hendlmodule);
        ProcedureReturn lpModule\modBaseAddr
       EndIf   
     Wend  
    EndIf  
    CloseHandle_(hendlmodule)
  EndIf  
  ProcedureReturn 0
EndProcedure
Procedure.i GetProcessPID(*processname);ищет запущенный просесс по имени
;dwSize=;Длина в байтах структуры.
;cntUsage=;Количество ссылок на процесс. Процесс заканчивается, как только он падает до нуля.
;th32ProcessID=;Идентификатор процесса. Это значение может использоваться другими функциями API, которые работают с процессами.
;th32DefaultHeapID=;Идентификатор кучи по умолчанию для процесса. Это значение может использоваться только функциями API справки инструмента и никакими другими.
;thModuleID=;Идентификатор модуля процесса. Это значение может использоваться только функциями API справки инструмента и никакими другими.
;cntThreads=;Количество потоков, запущенных программой.
;th32ParentProcessID=;Идентификатор процесса, который создал этот процесс. Это значение может использоваться другими функциями API, которые работают с процессами.
;pcPriClassBase=;Базовый приоритет для любых потоков, созданных этим классом.
;dwFlags=;Зарезервировано - не использовать.
;szExeFile=Имя файла исполняемого файла для процесса.
  Protected handle.i
  Protected pe.processentry32
  ;
  handle=CreateToolhelp32Snapshot_(#TH32CS_SNAPPROCESS,0)
  If handle<>#INVALID_HANDLE_VALUE
    pe\dwSize=SizeOf(processentry32)
    If Process32First_(handle,@pe)
      While Process32Next_(handle,@pe)
        Debug "======================"
        Debug PeekS(@pe\szExeFile,-1,#PB_Unicode)+"  "+Str(pe\th32ProcessID)+"  "+Str(pe\th32ParentProcessID)
        GetModuleProcessa("lpModuleName", pe\th32ProcessID)
        If IFText_UTF16_Left(@pe\szExeFile,*processname)
          
        ;CloseHandle_(handle)
        ;ProcedureReturn pe\th32ProcessID ;id найденного процесса
       EndIf
      Wend
    EndIf
      CloseHandle_(handle)
  EndIf 
  ProcedureReturn 0  
EndProcedure

Debug GetProcessPID(@"notepad")


0

13

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

!mov dword esi,[p.p_s+8]
  !mov dword edi,[p.p_c+8]

А почему 8 прибавляется?

0

14

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

!push esi
!push edi

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

А почему 8 прибавляется?

ранее стек увеличен 2 раза по 4 байта а аргументы в стеке p.p_s=esp+4,p.p_c=esp+8 ,esp вершина это адрес возврата из процедуры
вообщем смысл такой и можно сразу написать s=esp+12,c это esp+16
потому как на самом деле может быть s=esp+4+8
ps:аргументы в стек грузятся начиная с последнего аргумента и указатель стека на эту ячейку 4 байта сдвигается,и +адрес возврата в самый верх=esp(+0)
таким образом память стека можно использовать под сохранение прежних значений регистров а также типа локальных переменных,главное при выходе из процедуры привести в исходное состояние чтобы выход был правильный
  !pop edi вытолкнуть значение из стека,в данном случае вернуть прежнее значение регистра edi что было при входе в процедуру
  !pop esi также как edi и соответственно меняется указатель esp на свою память стека[esp],скобки это работа с ячейкой памяти стека(загрузить ,получить значение)а без скобок это указатель и это по сути с любым регистром так без скобок это либо его значение загруженное а асли он в скобках то значит это указатель на память иот туда с адреса берётся числовое
значение
Pps; так fasm интерпритирует машинные команды, и если стоит PTR edi допустим но без скобок то определение PTR говорит типа что это тоже указатель=[значение ячейки памяти по адресу]
а стек это типа реализация с своим участком памяти в системе ну или отдельно физически может быть но смысл такой первый вошёл в него последний ушёл.....
ppps:проц обслуживает типа десятка переменных ну и типа стек с своей памятью и это для всего что на компе вот поэтому как бы и важно сохранить эти переменные типа регистров
в исходное состояние что перед вызовом своей задачи но опять же не все регистры такие,допустим типа eax это не касается условно он как аккумулятор получил отдал.и т.д.

Код:
  !push esi;+4
  !push edi;+4
  !mov dword esi,[p.p_s+8]
  !mov dword edi,[p.p_c+8]

Отредактировано Sergeihik (10.10.2023 17:59:28)

0

15

Sergeihik
Понял. Не подумал, что стек-то меняется. :idea:

P.S.
Добавлю хинт fasm, чтобы обойтись без меток на коротких переходах фрагмент кода можно заменить на

Код:
  !@@:
  !mov word ax,[esi]
  !cmp word [edi],ax
  !jnz @f
  ;
  !add dword edi,2
  !add dword esi,2
  !cmp word[edi],0h
  !jnz @b
  ;
  !mov dword eax,1h
  !pop edi
  !pop esi
  ProcedureReturn
  !@@:

Отредактировано Smitis (11.10.2023 10:13:49)

0

16

Вообще очень полезная программа получилась для убивания запущенных программ, ко примеру когда что-то сбоит - то помогает сразу прибить всё.

0


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