работа с процессами и потоками

Обсуждение программ nnCron и nnCron LITE

работа с процессами и потоками

Postby AlikasS » Thu, 02 Sep 2010, 02:00

небольшой сборник решений
Code: Select all
WINAPI: CreateToolhelp32Snapshot KERNEL32.DLL
WINAPI: Process32First           KERNEL32.DLL
WINAPI: Process32Next            KERNEL32.DLL
WINAPI: Thread32First kernel32.dll
WINAPI: Thread32Next kernel32.dll
WINAPI: NtQueryInformationProcess ntdll.dll
WINAPI: OpenProcess kernel.dll
WINAPI: ReadProcessMemory Kernel32.dll
WINAPI: VirtualAllocEx kernel32.dll
WINAPI: VirtualFreeEx kernel32.dll
WINAPI: CreateRemoteThread kernel32.dll
WINAPI: WriteProcessMemory Kernel32.dll
WINAPI: GetExitCodeThread Kernel32.dll
WINAPI: OpenProcessToken advapi32.dll
WINAPI: GetTokenInformation advapi32.dll
WINAPI: ConvertSidToStringSidA advapi32.dll
WINAPI: LookupAccountSidA advapi32.dll

1 CONSTANT TH32CS_SNAPHEAPLIST
\ 2 CONSTANT TH32CS_SNAPPROCESS \ уже инициализирована в кроне
 4 CONSTANT TH32CS_SNAPTHREAD
\ 8 CONSTANT TH32CS_SNAPMODULE \ уже инициализирована в кроне
15 CONSTANT TH32CS_SNAPALL

0
CELL -- P32.dwSize
CELL -- P32.cntUsage
CELL -- P32.th32ProcessID \ ID процесса
CELL -- P32.th32DefaultHeapID
CELL -- P32.th32ModuleID
CELL -- P32.cntThreads
CELL -- P32.th32ParentProcessID
CELL -- P32.pcPriClassBase
CELL -- P32.dwFlags
260  -- P32.szExeFile \ [MAX_PATH];  \ имя exe
CONSTANT /-PROCESSENTRY32

0
CELL -- P32.dwSize2
CELL -- P32.cntUsage2
CELL -- P32.th32ThreadID \ ID потока
CELL -- P32.th32OwnerProcessID \ ID процесса
CELL -- P32.tpBasePri
CELL -- P32.tpDeltaPri
CELL -- P32.dwFlags2
CONSTANT /ThreadENTRY32

USER PIDEXE
USER MY_LIST_THREAD_EXE
USER-VALUE SUMM

0 CONSTANT PROCESS_ALL_ACCESS
2 CONSTANT PROCESS_CREATE_THREAD
8 CONSTANT PROCESS_VM_OPERATION
0x20 CONSTANT PROCESS_VM_WRITE
0x400 CONSTANT PROCESS_QUERY_INFORMATION
0x10 CONSTANT PROCESS_VM_READ
0 CONSTANT ProcessBasicInformation

0x0002 CONSTANT THREAD_SUSPEND_RESUME
0x0040 CONSTANT THREAD_QUERY_INFORMATION
0x0008 CONSTANT THREAD_GET_CONTEXT

0x1000 CONSTANT MEM_COMMIT
0x8000 CONSTANT MEM_RELEASE
4 CONSTANT PAGE_READWRITE
-1 CONSTANT INFINITE

USER prochandle
USER tokenhandle
USER TokenInformation
USER TokenInfLength
USER tmpvar
USER tmpvar1

1 CONSTANT TokenUser
USER-CREATE uName 255 USER-ALLOT
USER-CREATE rdn 255 USER-ALLOT

0x0008    CONSTANT TOKEN_QUERY
\ 122  CONSTANT ERROR_INSUFFICIENT_BUFFER
12   CONSTANT TokenSessionId \ TOKEN_INFORMATION_CLASS Enumeration

\ ----------- слова

: ForEachProcess { xt \ h mem -- }
  0 TH32CS_SNAPPROCESS CreateToolhelp32Snapshot
  DUP INVALID_HANDLE_VALUE = IF DROP GetLastError THROW THEN
  -> h
  /-PROCESSENTRY32 ALLOCATE THROW -> mem
  /-PROCESSENTRY32 mem P32.dwSize !
  mem h Process32First 1 =
  IF
    BEGIN
      mem xt EXECUTE
      mem h Process32Next 1 <>
    UNTIL
  THEN
  mem FREE THROW
  h CLOSE-FILE THROW
;

: ForEachThread { xt2 \ h2 mem2 -- }
  0 TH32CS_SNAPALL CreateToolhelp32Snapshot
   DUP INVALID_HANDLE_VALUE = IF DROP GetLastError THROW THEN
  TO h2
  /ThreadENTRY32 ALLOCATE THROW -> mem2
  /ThreadENTRY32 mem2 P32.dwSize2 !
  mem2 h2 Thread32First 1 =
  IF
    BEGIN
      mem2 xt2 EXECUTE
      mem2 h2 Thread32Next 1 <>
    UNTIL
  THEN
  mem2 FREE THROW
  h2 CLOSE-FILE THROW
;
: ~Threadexe DUP
 P32.th32ThreadID @ SWAP
 P32.th32OwnerProcessID @ PIDEXE @ =
 IF  MY_LIST_THREAD_EXE AppendNode
 ELSE DROP
 THEN
;

: ALLTHREAD1EXE ['] ~Threadexe ForEachThread ;

: ThreadExeToList ( PID -- true | false)
\ заполнить массив MY_LIST_THREAD_EXE значениями id потоков процесса PID
N>S PROC-EXIST? ?DUP
IF PIDEXE ! ALLTHREAD1EXE TRUE
ELSE FALSE
THEN
;

: FreeThreadExeList MY_LIST_THREAD_EXE FreeList 0 TO SUMM ;
\ очистить массив MY_LIST_THREAD_EXE

: ExistThreadInExeList?   ( num PID --  true | false )
\ есть ли поток с id num у процесса ( PID )
FreeThreadExeList
ThreadExeToList
IF
   MY_LIST_THREAD_EXE InList? 0=
   IF FALSE
   ELSE TRUE
   THEN
ELSE DROP FALSE
THEN
FreeThreadExeList
;

: suspend_thread { pid \ hThread -- }
\ простановить поток
pid FALSE THREAD_SUSPEND_RESUME OpenThread \ 0 ошибка
DUP TO hThread NOT IF S" Error: OpenTread" EXIT THEN
hThread SuspendThread DROP
hThread CloseHandle DROP
;

: resume_thread { pid \ hThread -- }
\ продолжить поток
pid FALSE THREAD_SUSPEND_RESUME OpenThread \ 0 ошибка
DUP TO hThread NOT IF S" Error: OpenTread" EXIT THEN
hThread ResumeThread DROP
hThread CloseHandle DROP
;

: ~SuspendThreadExe NodeValue suspend_thread ;
: ~ResumeThreadExe NodeValue resume_thread ;

: Suspend_Process { pid \ hProcess1 -- }
\ остановить все потоки у процесса  у процесса  с идентификатором приложения pid
pid FALSE PROCESS_VM_OPERATION OpenProcess \ 0=error
DUP TO hProcess1 NOT IF S" Error: OpenProcess" EXIT THEN
pid ThreadExeToList
IF
   MY_LIST_THREAD_EXE @
   IF ['] ~SuspendThreadExe MY_LIST_THREAD_EXE DoList
   THEN
THEN
FreeThreadExeList
hProcess1 CloseHandle DROP
;
: Resume_Process { pid \ hProcess1 -- }
\ продолжить выполнять все потоки у процесса  с идентификатором приложения pid
pid FALSE PROCESS_VM_OPERATION OpenProcess \ 0=error
DUP TO hProcess1 NOT IF S" Error: OpenProcess" EXIT THEN
pid ThreadExeToList
IF
   MY_LIST_THREAD_EXE @
   IF ['] ~ResumeThreadExe MY_LIST_THREAD_EXE DoList
   THEN
THEN
FreeThreadExeList
hProcess1 CloseHandle DROP
;

: GetProcessCmdLine { pid \ hProcess1 retLength bufAddr -- a u }
pid FALSE PROCESS_QUERY_INFORMATION PROCESS_VM_READ OR OpenProcess \ 0=error
DUP TO hProcess1 NOT IF S" Error: OpenProcess" EXIT THEN

4096 ALLOCATE THROW TO bufAddr   \ думаю 4к хватит ;-)

AT retLength 0x18 bufAddr ProcessBasicInformation hProcess1 NtQueryInformationProcess \ STATUS_SUCCESS=0 ?
IF hProcess1 CloseHandle DROP bufAddr FREE DROP S" Error: NtQueryInformationProcess" EXIT THEN
\ DROP \ S" NtQueryInformationProcess NTSTATUS=%0 esPICK%" EVAL-SUBST MsgBox

AT retLength    \ сюда вернет количество прочитанных байт
0x230           \ сколько байт читать \ PEB size ?
bufAddr         \ куда
bufAddr 4 + @   \ откуда (адрес PEB)
hProcess1 ReadProcessMemory \ 1 - OK
\ DROP \ GetLastError S" Читаю PEB: ReadProcessMemory=%1 esPICK%, GetLastError=%0 esPICK%" EVAL-SUBST MsgBox
NOT IF hProcess1 CloseHandle DROP bufAddr FREE DROP S" Error: ReadProcessMemory (1)" EXIT THEN


AT retLength
0x290           \ PROCESS_PARAMETERS size
bufAddr
bufAddr 0x10 + @ \ PROCESS_PARAMETERS
hProcess1
ReadProcessMemory
DROP \ GetLastError S" Читаю PROCESS_PARAMETERS: ReadProcessMemory=%1 esPICK%, GetLastError=%0 esPICK%" EVAL-SUBST MsgBox

AT retLength
bufAddr 0x40 + W@ ( длина строки в старшем слове ) 4096 2 - ( под нолик ) MIN \ длина юникодной строки в байтах
bufAddr
bufAddr 0x44 + @ \ адрес комстроки
hProcess1
ReadProcessMemory
DROP \ GetLastError S" Читаю комстроку: ReadProcessMemory=%1 esPICK%, GetLastError=%0 esPICK%" EVAL-SUBST MsgBox

0 bufAddr retLength + W! \ пишу 0 за конец строки

bufAddr retLength 2 / UNICODE>S \ конверчу в ANSI/1251
bufAddr FREE DROP
hProcess1 CloseHandle DROP
;
: AttachDllToProcess { pID aLibName uLibName \ ThreadID ThreadHndl AllocBuffer BytesWritten ProcAddr ExitCode hProcess -- flag }
pID  FALSE  PROCESS_CREATE_THREAD PROCESS_VM_OPERATION OR PROCESS_VM_WRITE OR  OpenProcess
DUP TO hProcess NOT IF 0 EXIT THEN
PAGE_READWRITE  MEM_COMMIT  uLibName 1+  0  hProcess  VirtualAllocEx
DUP TO AllocBuffer NOT IF 0 EXIT THEN
AT BytesWritten  uLibName 1+  aLibName  AllocBuffer  hProcess  WriteProcessMemory DROP
Z" LoadLibraryA"  Z" Kernel32.dll"  LoadLibraryA GetProcAddress TO ProcAddr
AT ThreadID  0  AllocBuffer  ProcAddr  0  0  hProcess  CreateRemoteThread TO ThreadHndl
INFINITE  ThreadHndl  WaitForSingleObject DROP
AT ExitCode  ThreadHndl  GetExitCodeThread DROP
ThreadHndl CloseHandle DROP
MEM_RELEASE  0  AllocBuffer  hProcess  VirtualFreeEx DROP
hProcess CloseHandle DROP
-1 \ flag
;
: proc-handle ( pid -- ) TRUE PROCESS_QUERY_INFORMATION OpenProcess DUP prochandle ! ;
:  PIDEXE->SID ( PID - строка-SID -1 / 0 ) \ строка пользователя, аля ... S-1-5-21-1214440339-1580818891-725345543-4398
proc-handle >R
tokenhandle TOKEN_QUERY R> OpenProcessToken
IF
   tmpvar 0 0 TokenUser tokenhandle @ GetTokenInformation DROP
   GetLastError ERROR_INSUFFICIENT_BUFFER =
   IF
   tmpvar @ ALLOCATE THROW TokenInformation !
   tmpvar DUP @ TokenInformation @ TokenUser tokenhandle @ GetTokenInformation
      IF
         HERE TokenInformation @ @ ConvertSidToStringSidA
         IF
         HERE @ ASCIIZ> S" " S+ HERE @ LocalFree DROP
         TRUE
         ELSE FALSE
         THEN
      ELSE FALSE
      THEN
   ELSE FALSE
   THEN
   TokenInformation @ FREE THROW
   tokenhandle @ CloseHandle DROP
ELSE FALSE
THEN
prochandle @ CloseHandle DROP
;
:  PIDEXE->USER ( PID - имя домен -1 / 0 ) \ 2 строки аля домен юзер
proc-handle >R
tokenhandle TOKEN_QUERY R> OpenProcessToken
IF
   tmpvar 0 0 TokenUser tokenhandle @ GetTokenInformation DROP
   GetLastError ERROR_INSUFFICIENT_BUFFER =
   IF
   tmpvar @ ALLOCATE THROW TokenInformation !
   tmpvar DUP @ TokenInformation @ TokenUser tokenhandle @ GetTokenInformation
      IF
         255 DUP tmpvar ! tmpvar1 !
         HERE tmpvar1 rdn tmpvar uName TokenInformation @ @ 0 LookupAccountSidA
         IF
            uName ASCIIZ>
            rdn ASCIIZ>
            TRUE
         ELSE FALSE
         THEN
      ELSE FALSE
      THEN
   ELSE FALSE
   THEN

TokenInformation @ FREE THROW
tokenhandle @ CloseHandle DROP
ELSE FALSE
THEN
prochandle @ CloseHandle DROP
;
: PID->SID ( PID -- SID -1 | 0 ) \ здесь ID сессии
    proc-handle >R
    tokenhandle TOKEN_QUERY R> ( prochandle @ ) OpenProcessToken
    IF
        4 TokenInfLength !
            TokenInfLength @ ALLOCATE THROW TokenInformation !
            TokenInfLength DUP @ TokenInformation @ TokenSessionId tokenhandle @ GetTokenInformation DROP
        tokenhandle @ CloseHandle DROP
        TokenInformation @ @ TRUE
    ELSE
        FALSE
    THEN
    prochandle @ CloseHandle DROP
;
WINAPI: WTSLogoffSession     wtsapi32.dll
WINAPI: WTSDisconnectSession wtsapi32.dll
WINAPI: WTSOpenServerA       wtsapi32.dll
WINAPI: WTSCloseServer       wtsapi32.dll
WINAPI: ProcessIdToSessionId wtsapi32.dll
: 2PID->SID ( pid -- session-id -1/0 ) \ аналог предыдущего
    { pid \ session-id -- }
    AT session-id pid ProcessIdToSessionId
    IF
        session-id
        TRUE
    ELSE
        FALSE
    THEN
;
: LOGOFF-SESSION ( session-id srv-name -- -1/0 ) \ закрыть сессию номер  session-id на сервере srv-name
    { session-id srv-name \ srv-handle -- }
    srv-name WTSOpenServerA TO srv-handle
    srv-handle 0 = NOT
    IF
        TRUE session-id srv-handle WTSLogoffSession
        IF \ Потому что функция скорее всего возвращает 1/0, а не -1/0
            TRUE
        ELSE
            FALSE
        THEN
        \ Хоть функция и VOID, все же она возвращает единицу, которую надо дропнуть.
        srv-handle WTSCloseServer DROP
    THEN
;
: DISCONNECT-SESSION ( session-id srv-name -- -1/0 ) \ дисконектится от  сессии номер  session-id на сервере srv-name
    { session-id srv-name \ srv-handle -- }
    srv-name WTSOpenServerA TO srv-handle
    srv-handle 0 = NOT
    IF
        TRUE session-id srv-handle WTSDisconnectSession
        IF \ Потому что функция скорее всего возвращает 1/0, а не -1/0
            TRUE
        ELSE
            FALSE
        THEN
        \ Хоть функция и VOID, все же она возвращает единицу, которую надо дропнуть.
        srv-handle WTSCloseServer DROP
    THEN
;
USER MY_LIST_PROCESS_CH
USER MY_PR_PROCESS
: ~~PidCH->PidP { pid -- pid }
pid P32.th32ProcessID @ PIDEXE @ =
IF
pid  P32.th32ParentProcessID @ MY_PR_PROCESS !
THEN
;
: ~PidCH->PidP ['] ~~PidCH->PidP ForEachProcess ;
: PidCH->PidP
\ по PID процесса найти PID его родителя либо 0
0 MY_PR_PROCESS !
N>S PROC-EXIST? ?DUP
IF PIDEXE ! ~PidCH->PidP MY_PR_PROCESS @
ELSE FALSE
THEN
;
: ~~PidP->PidCH { pid -- pid }
pid  P32.th32ParentProcessID @ PIDEXE @ =
IF
pid P32.th32ProcessID @ MY_LIST_PROCESS_CH @ 1 + MY_LIST_PROCESS_CH !
THEN
;
: ~PidP->PidCH ['] ~~PidP->PidCH ForEachProcess ;
: PidP->PidCH
\ по PID родителя перечислить все дочерние (запущенные им) процессы
\ на стеке либо ноль, либо дочерние PID (все) и последнее число их количество
0 MY_LIST_PROCESS_CH !
N>S PROC-EXIST? ?DUP
IF PIDEXE ! ~PidP->PidCH MY_LIST_PROCESS_CH @
ELSE FALSE
THEN
;


\ слова для использования
\ значения из структур
\ /-PROCESSENTRY32
\ /ThreadENTRY32

\ USER PIDEXE
\ USER MY_LIST_THREAD_EXE

\ ForEachProcess ( xt -- )
\ ForEachThread  ( xt -- )
\ ThreadExeToList ( PID -- true | false) \ заполнить массив MY_LIST_THREAD_EXE значениями id потоков процесса PID
\ FreeThreadExeList \ очистить массив MY_LIST_THREAD_EXE
\ ExistThreadInExeList?   ( num PID --  true | false ) \ есть ли поток с id num у процесса ( PID )
\ Suspend_Process ( pid  -- ) \ остановить все потоки у процесса с идентификатором приложения pid
\ Resume_Process ( pid  -- ) \ продолжить выполнять все потоки у процесса  с идентификатором приложения pid
\ GetProcessCmdLine ( pid  -- a u )
\ AttachDllToProcess ( pID aLibName uLibName \ ThreadID ThreadHndl AllocBuffer BytesWritten ProcAddr ExitCode hProcess -- flag )
\ PIDEXE->SID ( PID - строка-SID -1 / 0 ) \ строка пользователя, аля ... S-1-5-21-1214440339-1580818891-725345543-4398
\ PIDEXE->USER ( PID - имя домен -1 / 0 ) \ 2 строки аля "домен" "юзер"
\ PID->SID ( PID -- SID -1 | 0 ) \ здесь ID сессии
\ 2PID->SID ( pid -- session-id -1/0 ) \ аналог предыдущего
\ LOGOFF-SESSION ( session-id srv-name -- -1/0 ) \ закрыть сессию номер  session-id на сервере srv-name
\ DISCONNECT-SESSION ( session-id srv-name -- -1/0 ) \ дисконектится от  сессии номер  session-id на сервере srv-name
\ PidCH->PidP \ по PID процесса найти PID его родителя либо 0
\ PidP->PidCH \ по PID родителя перечислить все дочерние (запущенные им) процессы \ на стеке либо ноль, либо дочерние PID (все) и последнее число их количество

\ частные решения
: ~TypeThreadExe NodeValue . CR ;
: TypeThreadExeList  ( PID -- )
\ вывести в консоли список id потоков  у процесса ( PID )
FreeThreadExeList ThreadExeToList
IF
   MY_LIST_THREAD_EXE @
   IF ['] ~TypeThreadExe MY_LIST_THREAD_EXE DoList
   THEN
THEN
FreeThreadExeList
;

: ~?NumberThreadExe DROP SUMM 1 + TO SUMM ;
: ?NumberThreadExeList  ( PID --  summ )
\ вывести на стек количество потоков у процесса ( a u )
0 TO SUMM FreeThreadExeList ThreadExeToList
IF
   MY_LIST_THREAD_EXE @
   IF ['] ~?NumberThreadExe MY_LIST_THREAD_EXE DoList
   THEN
THEN
SUMM FreeThreadExeList
;

\ информация по процессу
\ надо переделать что бы получал по PID процесса !!!!

WINAPI: GetProcessMemoryInfo psapi.dll
USER-VALUE priznak
: ~proc-mem-info ( N adr n -- n )
2>R
TO priznak
44
HERE
2R> PROC-EXIST?
?DUP IF
FALSE
PROCESS_VM_READ PROCESS_QUERY_INFORMATION + OpenProcess DUP >R
GetProcessMemoryInfo DROP
HERE priznak CELLS + @
R> CloseHandle DROP
ELSE
2DROP 0
THEN
;
\ пример
\ ~proc-mem-info ( N adr n -- n )
\ где N
\ 1 - Page Faults Virtual memory
\ 2 - Пик по физ.памяти (PeakWorkingSetSize) в байтах
\ 3 - занимаемая физ.память в байтах
\ 4 -
\ 5 -
\ 6 -
\ 7 -
\ 8 - занимаемая вирт. память в байтах
\ 9 - Пик по виртуалке (PeakPagefileUsage) в байтах

\ 3 S" nncron.exe" ~proc-mem-info N>S MsgBox

\ #( инфо_по_nncron
\ HyperActive
\ SingleInstance
\ NoLog
\ WatchHotKey: "^+@D"
\ Action:
\ S" физ.Память (КБ): " 3 S" nncron.exe" ~proc-mem-info 1024 / N>S S+ crlf S+
\ S" Вирт.Память (КБ): " 8 S" nncron.exe" ~proc-mem-info 1024 / N>S S+ crlf S+ S+
\ S" Пик по физ.Память (КБ): " 2 S" nncron.exe" ~proc-mem-info 1024 / N>S S+ crlf S+ S+
\ S" Пик Вирт.Память (КБ): " 9 S" nncron.exe" ~proc-mem-info 1024 / N>S S+ crlf S+ S+
\ S" Загрузка процессора (%): " S" nncron.exe" PROC-CPU-USAGE N>S S+ S+
\ MsgBox 
\ )#


\ дальнейшая разработка (не окончена) временно отложена :-)
\ работа с потоками

\ THREAD_QUERY_INFORMATION       (0x0040
\ THREAD_GET_CONTEXT             (0x0008) 
 WINAPI: GetExitCodeThread KERNEL32.DLL
\ BOOL GetExitCodeThread(
\   HANDLE hThread,      // handle to the thread
\   LPDWORD lpExitCode   // address to receive termination status
\ );

: ?aktiv_thread { piddd \ hThread adrerr -- }
piddd FALSE THREAD_QUERY_INFORMATION ( THREAD_GET_CONTEXT OR )  ( PROCESS_QUERY_INFORMATION OR ) OpenThread \ 0 ошибка
DUP TO hThread NOT IF S" Error: OpenTread" EXIT THEN
AT adrerr hThread GetExitCodeThread . adrerr . 
hThread CloseHandle DROP
S" end1" TYPE CR
;
: ~AktivThreadExe NodeValue DUP . ?aktiv_thread ;

: ?Aktiv_Process { pid \ hProcess1 -- }
pid FALSE PROCESS_VM_OPERATION PROCESS_VM_READ OR OpenProcess \ 0=error
DUP TO hProcess1 NOT IF S" Error: OpenProcess" EXIT THEN
pid ThreadExeToList
IF
   MY_LIST_THREAD_EXE @
   IF ['] ~AktivThreadExe MY_LIST_THREAD_EXE DoList
   THEN
THEN
FreeThreadExeList
hProcess1 CloseHandle DROP
S" end all" TYPE CR
;
User avatar
AlikasS
 
Posts: 1437
Joined: Wed, 28 Jun 2006, 05:39
Location: Khabarovsk

Re: работа с процессами и потоками

Postby SeMa » Mon, 06 Sep 2010, 16:28

Может, в Plugins?
Компьютер ─ устройство, разработанное для ускорения и автоматизации человеческих ошибок
User avatar
SeMa
 
Posts: 637
Joined: Fri, 15 Apr 2005, 12:49
Location: Украина

Re: работа с процессами и потоками

Postby elos » Mon, 06 Sep 2010, 20:12

и назвать типа process_maintenance.spf, а то process.spf уже есть...
elos
 
Posts: 667
Joined: Tue, 25 Apr 2006, 11:15

Re: работа с процессами и потоками

Postby AlikasS » Tue, 07 Sep 2010, 01:18

да, надо бы там убрать недоделку-слово ?Aktiv_Process ,
чуть переделать слово ~proc-mem-info,
под работу с PID, а не по названию процесса.
и можно выложить,
если ни у кого ошибок не вызывает остальное
а название уже третье дело, хоть
process&thread&user.spf :-)
User avatar
AlikasS
 
Posts: 1437
Joined: Wed, 28 Jun 2006, 05:39
Location: Khabarovsk

Re: работа с процессами и потоками

Postby AlikasS » Tue, 07 Sep 2010, 01:24

кстати, еще одно частное решение, на основе кода из первого поста
Code: Select all
\ слежение за работой потока (задачи)
\ визуально через иконку в трее
REQUIRE ExistThreadInExeList?  plugins\other\process&thread.spf
\ здесь мой плагин лежит

 USER ~TEK-TASK-NAME
 USER ~tray_icon_id
 USER ~tred_task_id
500 VALUE ~time_tred_control
 USER ~tred_exist?

: save2num->adr ( Adr sound  -- adr ) HERE ROT , SWAP , ( DUP DP ! ) ;
: adr->2num ( adr -- Adr sound ) DUP @ SWAP CELL+ @ ;

:NONAME
adr->2num
ASCIIZ> S>ZALLOC ~TEK-TASK-NAME !
~tred_task_id !

S" Task %QUOTE%%~TEK-TASK-NAME @ ASCIIZ>%%QUOTE%, thread %~tred_task_id @%, start..." EVAL-SUBST 32515 0 LoadIconA ADD-TI ~tray_icon_id !
 BEGIN
  FOR-PROCS: "nncron.exe"
    ~tred_task_id @     FOUND-PID  ExistThreadInExeList? ~tred_exist? @ OR ~tred_exist? !
    ;FOR-PROCS
   ~tred_exist? @

\ ~tred_task_id @ S" nncron.exe" PROC-EXIST? ExistThreadInExeList? \ закоммент из-за предыдущи 3-х строчек
\ ибо может быть несколько процессов крона
 WHILE
~time_tred_control PAUSE
S" Task %QUOTE%%~TEK-TASK-NAME @ ASCIIZ>%%QUOTE%, thread %~tred_task_id @%, working..." EVAL-SUBST 32516 0 LoadIconA ~tray_icon_id @ MODIFY-TI
0 ~tred_exist? !
 REPEAT
S" Task %QUOTE%%~TEK-TASK-NAME @ ASCIIZ>%%QUOTE%, thread %~tred_task_id @%, end..." EVAL-SUBST 32513 0 LoadIconA ~tray_icon_id @ MODIFY-TI
~time_tred_control PAUSE
~tray_icon_id @ DEL-TI
DESTROY-HEAP
  -1 ExitThread
 ; TASK: ~WatchWorkTask


 : WatchWorkTask GetCurrentThreadId CUR-TASK-NAME S>ZALLOC save2num->adr ~WatchWorkTask START DROP ;
 : WWT WatchWorkTask ;
пример
Code: Select all
#( сообщение_тест
\ если запустить задачу вручную несколько раз
\ будет видно через трей, когда какая задача (поток) заканчивается
NoActive
Action:
WWT
MSG: "сообщение"
)#
User avatar
AlikasS
 
Posts: 1437
Joined: Wed, 28 Jun 2006, 05:39
Location: Khabarovsk

Re: работа с процессами и потоками

Postby noob2k6 » Thu, 09 Sep 2010, 15:32

elos wrote:и назвать типа process_maintenance.spf, а то process.spf уже есть...

Предлагаю process_handling.spf — название чуть короче, а смысл («работа с процессами») передается верно.
noob2k6
 
Posts: 123
Joined: Thu, 01 Jun 2006, 06:30

Re: работа с процессами и потоками

Postby Ilya » Sun, 07 Nov 2010, 21:43

AlikasS wrote:небольшой сборник решений
........

Жесть! :shock:
Вот вас попёрло!
Почти как исходники 7-ки! :D
Когда устаканиет плагин - дайте знать в личку, выложу в Плагины!
Ilya
 
Posts: 445
Joined: Mon, 07 Aug 2006, 09:51
Location: Санкт-Петербург

Re: работа с процессами и потоками

Postby ascerdfg1 » Mon, 08 Nov 2010, 16:39

А зачем оно надо?
nncron.exe v 1.93b10 Build 1141
tm.exe v 1.93b10 Build 569
Windows XP (5.1.2600) SP3
Комп без nnCron - груда металла!
User avatar
ascerdfg1
 
Posts: 541
Joined: Thu, 29 Nov 2007, 02:45
Location: г. Алексин

Re: работа с процессами и потоками

Postby AlikasS » Wed, 10 Nov 2010, 08:59

ascerdfg1 wrote:А зачем оно надо?

это к чему вопрос?
User avatar
AlikasS
 
Posts: 1437
Joined: Wed, 28 Jun 2006, 05:39
Location: Khabarovsk

Re: работа с процессами и потоками

Postby Morituruz » Thu, 21 Jun 2012, 09:41

AlikasS
Можете подсказать слово на основе вашего кода, которое бы получало имя процесса по его PID. Имеющийся в nncron PROC-NAME очень медленный:
Code: Select all
#( proc_name_test
NoLog
NoActive
SingleInstance
Action:
." PROC-NAME: "
GetTickCount
S" *" FOR-PROCS
   FOUND-PID PROC-NAME 2DROP
;FOR-PROCS
GetTickCount SWAP - . CR

." GetProcessCmdLine: "
GetTickCount
S" *" FOR-PROCS
   FOUND-PID GetProcessCmdLine Get_Process_Name 2DROP
;FOR-PROCS
GetTickCount SWAP - . CR
)#


Code: Select all
PROC-NAME: 2328
GetProcessCmdLine: 31

Можно, конечно, выковыривать его из GetProcessCmdLine, но это неудобно.

p.s. Если что, про FOUND-PROC я в курсе :)
User avatar
Morituruz
 
Posts: 727
Joined: Sun, 14 Oct 2007, 01:51

Re: работа с процессами и потоками

Postby VoidVolker » Thu, 21 Jun 2012, 19:20

Code: Select all
: PID>NAME   \ ( pid -- a u )
  PAD PAD-SIZE ERASE
  0 0x410 OpenProcess >R
  PAD
  PAD-SIZE PAD 0 R@ GetModuleBaseNameA
  R> CloseHandle DROP
;
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2898
Joined: Tue, 25 Apr 2006, 17:56

Re: работа с процессами и потоками

Postby Morituruz » Thu, 21 Jun 2012, 20:00

Спасибо!
User avatar
Morituruz
 
Posts: 727
Joined: Sun, 14 Oct 2007, 01:51


Return to nnCron forum (Russian)

Who is online

Users browsing this forum: No registered users and 2 guests