CreateFile - отрабатывает под ollydbg, а под XP не хочет.

Тема в разделе "WASM.BEGINNERS", создана пользователем Fakir, 24 фев 2008.

  1. Fakir

    Fakir New Member

    Публикаций:
    0
    Регистрация:
    24 фев 2008
    Сообщения:
    11
    Здравствуйте.

    Помогите, пожалуйста, понять - почему так


    .data
    FNM1 db 20 DUP(0)
    .
    .
    .data?
    hFile HANDLE ?
    MEMSIZE DWORD ?
    .
    .
    .code
    start:
    .
    .
    ; invoke CreateFile,ADDR FNM1,GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ,\
    ; NULL,OPEN_EXISTING,FILE_ATTRIBUTE_ARCHIVE,NULL

    invoke CreateFile,offset FNM1,GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ,\
    NULL,OPEN_EXISTING,FILE_ATTRIBUTE_ARCHIVE,NULL


    mov hFile,eax
    .IF EAX == -1
    JMP EXIT_ERR
    .ENDIF

    invoke GetFileSize,hFile,NULL
    mov MEMSIZE,EAX
    .
    .
    ........


    У знакомого когда-то была подобная ситуация,-под дебагером на NT и без дебагера под Win98 отрабатывало нормально, а без дебагера под NT- нет.
    Может кто-то еще наступал на такие грабли и знает в чем глюк?

    Заранее благодарю.
     
  2. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    fnm1 вседа в 19 байт укладывается?
     
  3. Fakir

    Fakir New Member

    Публикаций:
    0
    Регистрация:
    24 фев 2008
    Сообщения:
    11
    В догонку - в FNM1 помещаю имя файла с 0 в конце, полученого из командной строки.
    Под дебагером переход на EXIT_ERR не происходит, файл открывается нормально.
    С таким-же именем файла без дебагера - происходит переход на EXIT_ERR.
    Если в FNM1 принудительно в исходнике помещаю нужное имя - срабатывает нормально и без отладчика.
     
  4. Fakir

    Fakir New Member

    Публикаций:
    0
    Регистрация:
    24 фев 2008
    Сообщения:
    11
    Да.
     
  5. Magnum

    Magnum New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2007
    Сообщения:
    925
    Fakir
    как имя файла загоняешь в FNM1 ?
     
  6. Fakir

    Fakir New Member

    Публикаций:
    0
    Регистрация:
    24 фев 2008
    Сообщения:
    11
    ...
    invoke GetCommandLine
    mov CommandLine,eax
    ; в MsgBoxCng получаем имя ini-файла
    ;----------------------------------------------------------------
    MOV CL,[EAX]
    LEA ESI,FNM1
    XOR CH,CH
    .WHILE CL != 0
    ;--тут отсекаю путь и имя исполняемого файла между 2-мя (")
    .IF CL == '"'
    INC CH
    .ENDIF
    .IF CH == 2
    INC CH
    ADD EAX,2
    MOV CL,[EAX]
    .ENDIF
    ;-- ниже заношу имя передаваемого файла в FNM1
    .IF CH > 2
    INC CH
    mov [ESI],CL
    inc ESI
    .ENDIF
    inc EAX
    MOV CL,[EAX]
    .ENDW
    MOV CL,0
    MOV [ESI],CL

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

    invoke CreateFile,ADDR FNM1,GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ,\
    NULL,OPEN_EXISTING,FILE_ATTRIBUTE_ARCHIVE,NULL
    ...
     
  7. diamond

    diamond New Member

    Публикаций:
    0
    Регистрация:
    21 май 2004
    Сообщения:
    507
    Адрес:
    Russia
    У меня ситуация, когда под отладчиком работает, а без отладчика - нет, иногда встречается и всегда означает залезание за пределы выделенной памяти в каком-то месте программы (условно говоря, выделил 16 байт и перезаписал 17-й). (При наличии отладчика немного меняется стратегия выделения памяти.) Весь код - в студию...
     
  8. Fakir

    Fakir New Member

    Публикаций:
    0
    Регистрация:
    24 фев 2008
    Сообщения:
    11
    .386
    .model flat, stdcall
    option casemap:none
    include \masm32\include\windows.inc
    include \masm32\include\kernel32.inc
    includelib \masm32\lib\kernel32.lib
    include \masm32\include\user32.inc
    includelib \masm32\lib\user32.lib
    .const
    .data
    MsgCaption db " ",0
    MsgBoxCng DB 19 DUP(0)
    FileNM1 DB 19 DUP(0)
    FileNM2 DB 19 DUP(0)

    FNM1 db 19 DUP(0)

    ofn OFSTRUCT <>


    .data?
    hInstance HINSTANCE ? ; Хэндл нашей пpогpаммы
    CommandLine LPSTR ?
    hFile HANDLE ?
    hMemory DWORD ?
    pMemory DWORD ?
    ;MsgBoxCng DB 20 DUP(?)
    MEMSIZE DWORD ?

    .code
    start:
    invoke GetModuleHandle, NULL
    mov hInstance,eax
    invoke GetCommandLine
    mov CommandLine,eax
    ; имя файла
    ;----------------------------------------------------------------
    MOV CL,[EAX]
    ; MOV ECX, offset MsgBoxCng
    LEA ESI,FNM1
    ; MOV EDI,MsgBoxCng
    XOR CH,CH
    .WHILE CL != 0
    .IF CL == '"'
    INC CH
    .ENDIF
    .IF CH == 2
    INC CH
    ADD EAX,2
    MOV CL,[EAX]
    .ENDIF
    .IF CH > 2
    INC CH ; (СH - 2) - получим кол-во байт в имени
    mov [ESI],CL
    inc ESI
    .ENDIF
    inc EAX
    MOV CL,[EAX]
    .ENDW
    MOV CL,0
    MOV [ESI],CL

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


    invoke CreateFile,ADDR FNM1,GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ,\
    NULL,OPEN_EXISTING,FILE_ATTRIBUTE_ARCHIVE,NULL


    mov hFile,eax
    .IF EAX == -1
    JMP EXIT_ERR
    .ENDIF

    invoke GetFileSize,hFile,NULL
    mov MEMSIZE,EAX
    invoke GlobalAlloc,GMEM_MOVEABLE or GMEM_ZEROINIT,MEMSIZE
    mov hMemory,eax
    invoke GlobalLock,hMemory
    mov pMemory,eax




    invoke MessageBox, NULL,addr FNM1, addr MsgCaption, MB_OK
    EXIT_ERR: invoke ExitProcess,NULL
    end start
     
  9. twgt

    twgt New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    1.494
    Fakir
    Попробуй сделать SetCurrentDirectory(...)
    Да и зачем FILE_ATTRIBUTE_ARCHIVE?
    Сделай FILE_ATTRIBUTE_NORMAL
     
  10. Fakir

    Fakir New Member

    Публикаций:
    0
    Регистрация:
    24 фев 2008
    Сообщения:
    11
    Не помогло.
     
  11. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    Fakir
    происходит переход на EXIT_ERR
    Что собщает GetLastError?
     
  12. Fakir

    Fakir New Member

    Публикаций:
    0
    Регистрация:
    24 фев 2008
    Сообщения:
    11
    Под Тotal Commanderom отработало!!! Через "Run" тоже! Из под Far-а (DOS-сесия??) не хочет. Возможно в этом причина? Можно-ли обойти?
     
  13. diamond

    diamond New Member

    Публикаций:
    0
    Регистрация:
    21 май 2004
    Сообщения:
    507
    Адрес:
    Russia
    Ну конечно! Кто сказал, что имя exe-шника всегда обрамляется в кавычки? В общем случае кавычек может и не быть. (например, при запуске из Far'а это проявляется).
     
  14. Fakir

    Fakir New Member

    Публикаций:
    0
    Регистрация:
    24 фев 2008
    Сообщения:
    11
    БЛАГОДАРЮ!

    А не подскажите способ/функцию получения из коммандной строки только передаваемых параметров?
    Как новичек в асме под Win32 - прошу снисходительности.
     
  15. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    командная строка и эмуляция доса совсем разные вещи.