Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Asm для Windows/Dos > Определение количества потоков в моей программе


Автор: 586 18.5.2006, 18:30
Как определить количество потоков в моей программе и получить к ним хендлы? 

Автор: rsm 21.5.2006, 13:16
Типа такого имеешь в виду?
Код

;goto make

.386    
.model flat,stdcall    
option casemap:none    

include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\user32.inc

includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\user32.lib

.data    

    msg_cap1 db "Before starting two new threads...",0
    msg_cap2 db "With two new threads...",0
    msg_cap3 db "After terminating two threads...",0
    
    buff db 800h dup(0)
    
    dwCurProc dd 0
    hThread1 dd 0
    hThread2 dd 0
    
    dwAbort dd 0
    
.code

EnumThreads proc dwProcessId :DWORD

    LOCAL te32 :THREADENTRY32
    LOCAL hSnapshot :DWORD
    LOCAL nThreads :DWORD
    LOCAL info[50] :BYTE
    jmp @F
        fmt_str db "thread %d, ID = 0x%.8X",0Dh,0
    @@:

    ; ------------------------------------------------------------------
    
    mov nThreads,0
    mov te32.dwSize,SIZEOF THREADENTRY32

    invoke CreateToolhelp32Snapshot, TH32CS_SNAPTHREAD, dwProcessId
    test eax,eax
    js _leave

    mov hSnapshot,eax

    invoke Thread32First, hSnapshot, ADDR te32
    or eax,eax
    jz _closesnap

_nextthread:
    
    mov eax,dwProcessId
    cmp eax,te32.th32OwnerProcessID
    jne _notour

    inc nThreads
    invoke wsprintf, ADDR info, ADDR fmt_str, nThreads, te32.th32ThreadID
    invoke lstrcat, ADDR buff, ADDR info

_notour:

    invoke Thread32Next, hSnapshot, ADDR te32
    or eax,eax
    jnz _nextthread

_closesnap:
    
    invoke CloseHandle, hSnapshot
    
_leave:
    
    ret

EnumThreads endp

; ----------------------------------------------------------------------

ThreadProc1 proc lpParam :DWORD

    cmp dwAbort,1
    je @F
    invoke Sleep, 10
@@:
    ret

ThreadProc1 endp

; ----------------------------------------------------------------------

ThreadProc2 proc lpParam :DWORD

    cmp dwAbort,1
    je @F
    invoke Sleep, 10
@@:
    ret

ThreadProc2 endp

; ----------------------------------------------------------------------

start:

    invoke GetCurrentProcessId
    mov dwCurProc,eax
    
    invoke EnumThreads, eax

    invoke MessageBox, 0, ADDR buff, ADDR msg_cap1, MB_ICONINFORMATION
    
    invoke CreateThread, 0, 0, OFFSET ThreadProc1, 0, 0, 0
    mov hThread1,eax
    
    invoke CreateThread, 0, 0, OFFSET ThreadProc2, 0, 0, 0
    mov hThread2,eax
    
    invoke RtlZeroMemory, ADDR buff, SIZEOF buff

    invoke EnumThreads, dwCurProc

    invoke MessageBox, 0, ADDR buff, ADDR msg_cap2, MB_ICONINFORMATION

    inc dwAbort
    
    invoke CloseHandle, hThread2
    
    invoke CloseHandle, hThread1
    
    invoke RtlZeroMemory, ADDR buff, SIZEOF buff
    
    invoke EnumThreads, dwCurProc
    
    invoke MessageBox, 0, ADDR buff, ADDR msg_cap3, MB_ICONINFORMATION

    invoke ExitProcess, 0
    
end start

;:make
;\masm32\bin\ml.exe /c /coff threads.cmd
;\masm32\bin\link.exe /SUBSYSTEM:WINDOWS threads.obj
;pause
 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)