首页
社区
课程
招聘
[求助]大家帮我看下这段代码那里出问题了!急啊
发表于: 2007-12-14 19:34 3993

[求助]大家帮我看下这段代码那里出问题了!急啊

2007-12-14 19:34
3993
.386
        .model flat, stdcall
        option casemap :none

include        windows.inc
include        user32.inc
includelib    user32.lib
include        kernel32.inc
includelib    kernel32.lib
include        ole32.inc
includelib    ole32.lib
include        shell32.inc
includelib    shell32.lib
include        Advapi32.inc
includelib    Advapi32.lib

ICO_MAIN    equ        1000
DLG_MAIN    equ        100
IDC_RESULT    equ        101
IDC_BROWSE    equ        102

        .data?
hInstance    dd    ?
hRichEdit    dd    ?
hWinMain    dd    ?

        .const
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
szFilter    db    '*.*',0
szExts        db    '.exe',0
szExtb        db    '.EXE',0
szDesktop    db    'vexed.ini',0
szSystemTime    db    '%d-%d-%d',0dh,0ah,0
        .code

_Handler        proc        _lpExceptionRecord,_lpSEH,_lpContext,_lpDispatcherContext

                pushad
                mov        esi,_lpExceptionRecord
                mov        edi,_lpContext
                assume        esi:ptr EXCEPTION_RECORD,edi:ptr CONTEXT
                mov        eax,_lpSEH
                push        [eax + 0ch]
                pop        [edi].regEbp
                push        [eax + 8]
                pop        [edi].regEip
                push        eax
                pop        [edi].regEsp
                assume        esi:nothing,edi:nothing
                popad
                mov        eax,ExceptionContinueExecution
                ret

_Handler        endp

_OpenFile        proc   _lpszPath

        local    @hFile,@dwFileSize,@hMapFile,@lpMemory,@dwTemp
        local    @szFileBuffer[MAX_PATH]:byte

;********************************************************************
; 打开文件并建立文件 Mapping
;********************************************************************
                invoke        CreateFile,_lpszPath,GENERIC_READ,FILE_SHARE_READ or \
                        FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_ARCHIVE,NULL
                .if        eax !=        INVALID_HANDLE_VALUE
                        mov        @hFile,eax
                        invoke        GetFileSize,eax,NULL
                        mov        @dwFileSize,eax
                        .if        eax
                                invoke        CreateFileMapping,@hFile,NULL,PAGE_READONLY,0,0,NULL
                                .if        eax
                                        mov        @hMapFile,eax
                                        invoke        MapViewOfFile,eax,FILE_MAP_READ,0,0,0
                                        .if        eax
                                                mov        @lpMemory,eax
;********************************************************************
; 创建用于错误处理的 SEH 结构
;********************************************************************
                                                assume        fs:nothing
                                                push        ebp
                                                ;push        offset _ErrFormat
                                                push        offset _Handler
                                                push        fs:[0]
                                                mov        fs:[0],esp
;********************************************************************
; 检测 PE 文件是否有效
;********************************************************************
                                                mov        esi,@lpMemory
                                                assume        esi:ptr IMAGE_DOS_HEADER
                                                .if        [esi].e_magic != IMAGE_DOS_SIGNATURE
                                                        jmp        _ErrorExit
                                                .endif
                                                add        esi,[esi].e_lfanew
                                                assume        esi:ptr IMAGE_NT_HEADERS
                                                .if        [esi].Signature != IMAGE_NT_SIGNATURE
                                                        jmp        _ErrorExit
                                                .endif
                                                ;invoke        _ProcessPeFile,@lpMemory,esi,@dwFileSize
                                                invoke        MessageBox,NULL,addr @dwFileSize,NULL,MB_OK or MB_ICONSTOP
                                                jmp        _ErrorExit
_ErrorExit:
                                                pop        fs:[0]
                                                add        esp,0ch
                                                invoke        UnmapViewOfFile,@lpMemory
                                        .endif
                                        invoke        CloseHandle,@hMapFile
                                .endif
                                ;invoke        CloseHandle,@hFile
                        .endif
                        invoke        CloseHandle,@hFile
                .endif
@@:
                ret

_OpenFile        endp

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;搜索EXE
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_FindExe    proc   uses ebx esi edi _lParam
        local    @stFindFile:WIN32_FIND_DATA
        local    @hFindFile
        local    @szPath[MAX_PATH]:byte        ;用来存放“路径\”
        local    @szSearch[MAX_PATH]:byte    ;用来存放“路径\*.*”
        local    @szFindFile[MAX_PATH]:byte    ;用来存放“路径\找到的文件”
        local    @szTerm[MAX_PATH]:byte        ;用来存放查找条件

        pushad
        invoke    lstrcpy,addr @szPath,_lParam
;********************************************************************
; 在路径后面加上\*.*
;********************************************************************
    @@:
        invoke    lstrlen,addr @szPath
        lea    esi,@szPath
        add    esi,eax
        xor    eax,eax
        mov    al,'\'
        .if    byte ptr [esi-1] != al
            mov    word ptr [esi],ax
        .endif
        invoke    lstrcpy,addr @szSearch,addr @szPath
        invoke    lstrcpy,addr @szTerm,addr @szSearch
        invoke    lstrcat,addr @szSearch,addr szFilter
        invoke    lstrcat,addr @szTerm,addr szDesktop
        invoke    FindFirstFile,addr @szTerm,addr @szFindFile
        .if    eax != -1h
            jmp    _Ret
        .endif
;********************************************************************
; 寻找文件
;********************************************************************
        invoke    FindFirstFile,addr @szSearch,addr @stFindFile
        .if    eax !=    INVALID_HANDLE_VALUE
            mov    @hFindFile,eax
            .repeat
                invoke    lstrcpy,addr @szFindFile,addr @szPath
                invoke    lstrcat,addr @szFindFile,addr @stFindFile.cFileName
                .if    @stFindFile.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY
                    .if    @stFindFile.cFileName != '.'
                        invoke    _FindExe,addr @szFindFile
                    .endif
                .else
                    pushad
                    invoke    lstrlen,addr @szFindFile
                    lea    ebx,@szFindFile
                    add    ebx,eax
                    sub    ebx,4
                    invoke    lstrcmp,ebx,addr szExts
                    mov    esi,eax
                    invoke    lstrcmp,ebx,addr szExtb
                    .if    eax==0 || esi==0
                        invoke    _OpenFile,addr @szFindFile        ;打开文件
                    .endif
                    popad
                .endif
                invoke    FindNextFile,@hFindFile,addr @stFindFile
            .until    (eax ==    FALSE)
            invoke    FindClose,@hFindFile
        .endif
        popad
    _Ret:
        ret

_FindExe    endp

_CopyMe        proc    _szDir
        local    @szBuffer[128]:byte
   
        pushad
        mov    esi,_szDir

    @@:
        invoke    GetDriveType,esi
        .if    eax == DRIVE_FIXED || DRIVE_REMOVABLE            ;如果为可用驱动器
            invoke    lstrcpy,addr @szBuffer,esi
            invoke    _FindExe,addr @szBuffer
        .endif
        add    esi,4
        cmp    byte ptr [esi],0
        jnz    @B
        popad
        ret
_CopyMe        endp

_Browse        proc    uses ebx esi edi _lParam
        local    @szBuffer[1024]:byte

        invoke    GetLogicalDriveStrings,sizeof @szBuffer,addr @szBuffer
        .if    eax
            invoke    _CopyMe,addr @szBuffer
        .endif
        ret
_Browse        endp

start:

        call    _Browse

        invoke    ExitProcess,NULL

        end    start

运行几分钟后就出错.说程序遇到问题.加SEH 后.程序运行到出错的地方后,CPU百分百,程序不做任何处理了

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
invoke    FindFirstFile,addr @szTerm,addr @szFindFile
        .if    eax != -1h
            jmp    _Ret
        .endif

;这里是不是要加一行:   invoke    FindClose,@hFindFile

;********************************************************************
; 寻找文件
;********************************************************************
        invoke    FindFirstFile,addr @szSearch,addr @stFindFile
2007-12-15 03:48
0
雪    币: 230
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
[QUOTE=;]...[/QUOTE]

在 _Handler  proc 里把产生 异常的原因
[esi].ExceptionCode
MessageBox 下,最好是输出到控制台用 invoke StdOut
看看是什么原因

还有你创建SEH的地方也有问题
; 创建用于错误处理的 SEH 结构
assume  fs:nothing
  push  ebp
  push  offset _ErrorExit  ;根据你_Handler里的处理
                          ;这里应该是处理完异常后开始执行的地方
  push  offset _Handler
  push  fs:[0]
2007-12-16 01:21
0
雪    币: 116
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
确实是我的 SEH的出了问题。
楼上说的对。
问题已经解决了
谢谢大家
2007-12-17 00:04
0
游客
登录 | 注册 方可回帖
返回
//