首页
社区
课程
招聘
[旧帖] [求助]老罗里面一个线程例子中标志位的设置 0.00雪花
发表于: 2012-11-16 12:11 1152

[旧帖] [求助]老罗里面一个线程例子中标志位的设置 0.00雪花

2012-11-16 12:11
1152
先贴上原码:
                .386
                .model flat, stdcall
                option casemap :none
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Include 文件定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include                windows.inc
include                user32.inc
includelib        user32.lib
include                kernel32.inc
includelib        kernel32.lib
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Equ 等值定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
ICO_MAIN        equ        1000
DLG_MAIN        equ        1000
IDC_COUNTER        equ        1001
IDC_PAUSE        equ        1002
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 数据段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
                .data?
hInstance        dd        ?
hWinMain        dd        ?
hWinCount        dd        ?
hWinPause        dd        ?

dwOption                        dd          ?
F_PAUSE                equ        0001h
F_STOP                equ        0002h
F_COUNTING        equ        0004h

                .const
szStop                db        '停止计数',0
szStart                db        '计数',0
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 代码段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

                .code
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_Counter        proc        uses ebx esi edi _lParam

                or        dwOption,F_COUNTING
                and        dwOption,not (F_STOP or F_PAUSE)  ;这句不要好像没影响
                invoke        SetWindowText,hWinCount,addr szStop
                invoke        EnableWindow,hWinPause,TRUE

                xor        ebx,ebx
                .while        ! (dwOption & F_STOP)
                        .if        !(dwOption & F_PAUSE)
                                inc        ebx
                                invoke        SetDlgItemInt,hWinMain,IDC_COUNTER,ebx,FALSE
                        .endif
                .endw

                invoke        SetWindowText,hWinCount,addr szStart
                invoke        EnableWindow,hWinPause,FALSE
                and        dwOption,not (F_COUNTING or F_STOP or F_PAUSE)  ;这里应该是把dwOption变回0吧
                ret

_Counter        endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_ProcDlgMain        proc        uses ebx edi esi hWnd,wMsg,wParam,lParam
                local        @dwThreadID

                mov        eax,wMsg
;********************************************************************
                .if        eax ==        WM_COMMAND
                        mov        eax,wParam
                        .if        ax ==        IDOK   ;具体就是这里不懂,怎么进到循环内。
                                .if        dwOption & F_COUNTING
                                        or        dwOption,F_STOP
                                .else
                                        invoke        CreateThread,NULL,0,offset _Counter,NULL,\
                                                NULL,addr @dwThreadID
                                ;创建一个线程
                                        invoke        CloseHandle,eax
                                .endif
                        .elseif        ax ==        IDC_PAUSE  ;还有这里
                                xor        dwOption,F_PAUSE
                        .endif
;********************************************************************
                .elseif        eax ==        WM_CLOSE
                        invoke        EndDialog,hWnd,NULL
;********************************************************************
                .elseif        eax ==        WM_INITDIALOG
                        push        hWnd
                        pop        hWinMain
                        invoke        GetDlgItem,hWnd,IDOK
                        mov        hWinCount,eax
                        invoke        GetDlgItem,hWnd,IDC_PAUSE
                        mov        hWinPause,eax
;********************************************************************
                .else
                        mov        eax,FALSE
                        ret
                .endif
                mov        eax,TRUE
                ret

_ProcDlgMain        endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
start:
                invoke        GetModuleHandle,NULL
                mov        hInstance,eax
                invoke        DialogBoxParam,eax,DLG_MAIN,NULL,offset _ProcDlgMain,NULL
                invoke        ExitProcess,NULL
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
                end        start

反正程序中用到dwOption的地方就有点不懂,虽然我知道是位运算。但是我还是不太明白为什么这样设置。设置后的效果也一太清楚。求解释。

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//