wsprintf - короткий буфер!

Тема в разделе "WASM.BEGINNERS", создана пользователем Semiono, 4 май 2025.

  1. Semiono

    Semiono Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2005
    Сообщения:
    803
    А что делать? StringCbPrintf заменить? Вот блин, ещё изучать :\
    А может кусками как-то wsprintf, а потом lstrcat? а длину буфера как подчистить или NULL?

    Код (Text):
    1.         invoke wsprintf,a,'1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111112'
    2.         invoke wsprintf,b,'345'
    3.         invoke lstrcat,a,b
    4.         invoke MessageBoxTimeout,HWND_DESKTOP,a,'',MB_TOPMOST,LANG_NEUTRAL,5000
    Впринципе работает, но 345345345 целый килобайт ещё в хвост :lol:
    --- Сообщение объединено, 4 май 2025 ---
    Интересно, можно ли так обойти ограничение

    Код (Text):
    1. include '%fasm%/win64ax.inc'
    2. section '.code' executable
    3. start:
    4.         sub rsp,8
    5.  
    6.         invoke wsprintf,a,'123'
    7.         invoke lstrcat,a,i
    8.         invoke wsprintf,b,'678'
    9.         invoke lstrcat,a,b
    10.         invoke MessageBoxTimeout,HWND_DESKTOP,a,'',MB_TOPMOST,LANG_NEUTRAL,5000
    11.  
    12. exit:
    13.         invoke ExitProcess,NULL
    14.  
    15. section '.data' readable
    16.  
    17.         i db '45',NULL
    18.  
    19. section '.data' readable writeable
    20.  
    21.         a rb MAX_PATH
    22.         b rb MAX_PATH
    То есть нарастить огромный файл по частям.

    Получается! Ура!
    --- Сообщение объединено, 5 май 2025 ---
    wsprintf + wsprintf + wsprintf
     

    Вложения:

    • test.asm
      Размер файла:
      5,1 КБ
      Просмотров:
      64
    Последнее редактирование: 5 май 2025
  2. Ahimov

    Ahimov Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2024
    Сообщения:
    253
    Никак длину не увеличить. Печатают частями.

    0x400.png
     
    Semiono нравится это.
  3. alex_dz

    alex_dz Active Member

    Публикаций:
    0
    Регистрация:
    26 июл 2006
    Сообщения:
    580
    все можно, но если осторожно (С)
     
    Semiono нравится это.
  4. Research

    Research Active Member

    Публикаций:
    1
    Регистрация:
    6 янв 2024
    Сообщения:
    233
    Даже когда сложно и неудобно?
     
  5. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.933
    Research, программирование на ассемблере ― удел людей с извращенной фантазией. Так что смиритесь, это карма ;)...
     
    Semiono нравится это.
  6. Ahimov

    Ahimov Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2024
    Сообщения:
    253
    Как же без извратов ;)

    Код (Text):
    1. VEH proc X:ptr EXCEPTION_POINTERS
    2.     mov eax,X
    3.     mov ecx,EXCEPTION_POINTERS.ExceptionRecord[eax]
    4.     mov edx,EXCEPTION_POINTERS.ContextRecord[eax]
    5.     .if EXCEPTION_RECORD.ExceptionCode[Ecx] == STATUS_SINGLE_STEP
    6.         assume edx:ptr CONTEXT
    7.         mov eax,[edx].rEip
    8.         .if Eax != offset Break
    9.             movzx ecx,B[eax]
    10.             sub ecx,0B8h
    11.             .if !Carry? && (Cl < 8) && (D[Eax][1] == 400h)
    12.                 not ecx
    13.                 mov [edx].rEax[ecx*4][4],10000h
    14.                 add [edx].rEip,5
    15.             .endif
    16.             or [edx].rEFlags,100h
    17.         .endif
    18.         mov eax,EXCEPTION_CONTINUE_EXECUTION
    19.     .else
    20.         mov eax,EXCEPTION_CONTINUE_SEARCH
    21.     .endif
    22.     ret
    23. VEH endp
    24.  
    25. Entry proc
    26.     invoke RtlAddVectoredExceptionHandler, 1, addr VEH
    27.     push 100h
    28.     popfd
    29.     invoke wsprintfA, addr V, addr F
    30. Break::
    31.     ret
    32. Entry endp
     

    Вложения:

    • s.zip
      Размер файла:
      1,5 КБ
      Просмотров:
      78
    shanya0xff нравится это.
  7. miilalex

    miilalex New Member

    Публикаций:
    0
    Регистрация:
    8 сен 2024
    Сообщения:
    17
    в си sprintf возвращает длину напечатанной в строковый буфер строки
    в винде - нет?
    можно strcat сэкономить

    вообще тут код выглядит если даже и работоспособным, то максимально небезопасным с точки зрения расходования стека - потому что конструкция вида %c%c%c%c%c%c%c%c%c%c требует столько же 32 бит слов поместить в стек

    и быстродействие будет так себе из-за необходимости парсить отдельно каждый так печатаемый байт

    тут разумный подход выглядел бы в рукописном аналоге sprintf, где каждый элемент формата от % до след пробела, % или " копируется из источника данных (п0ля СУБД как пример) отдельно и тут же сливается в WriteFile

    если длинные символьные поля источника мы помещаем как есть посредством гирлянды %c то и это дешевле проделать записью буфера оптом на диск через вызов WriteFile

    тем самым мы не ограничены длиной каждой подстроки и общей длиной получаемого xml
     
    Semiono нравится это.
  8. Research

    Research Active Member

    Публикаций:
    1
    Регистрация:
    6 янв 2024
    Сообщения:
    233
    Не всегда. Иногда хочется из своего кода пару функций на асм перевести, чтобы все было быстрее, но из меня кодер на ассемблере, как из говна пуля.
     
    Последнее редактирование: 5 май 2025
    Semiono нравится это.
  9. Semiono

    Semiono Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2005
    Сообщения:
    803
    Мне главное дистрибутив, fasm.exe - один файл, IDE как блокнот! И такая мощь, правда мозги если приложить, но это везде так, мозг нужен))
    А если си, я там половина дистрибутива не знаю, всякий треш на диске будет лежать. Это для работы в корпорации) Или если в Линукс сидишь и там весь треш уже в дистрибутив входит,
    так же как теперь .NET в Windows
     
    Research нравится это.
  10. Ahimov

    Ahimov Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2024
    Сообщения:
    253
    Semiono,

    Три способа есть задачу решить. Трассировать, транслировать и пересобрать всю процедуру. Какой вам нравится ?
     
    Mikl___ и galenkane нравится это.
  11. Semiono

    Semiono Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2005
    Сообщения:
    803
    Решить задачу нравится) Не знаю, я думаю что я решил. Маленький конфиг xml пишется по частям. Сам код у меня ещё запускает прогу, выравнивает окно итд итп. Просто я был в шоке, когда буфер закончился, вначале я думал это глюк, все %s пересчитывал)) Но теперь знаю как обойти ограничение.
     
  12. galenkane

    galenkane Active Member

    Публикаций:
    0
    Регистрация:
    13 янв 2017
    Сообщения:
    372
    Код (ASM):
    1. .386
    2. .model     flat, stdcall
    3. option     casemap:none
    4.  
    5. include    \masm32\include\windows.inc
    6. include    \masm32\include\kernel32.inc
    7. include    \masm32\include\user32.inc
    8. includelib \masm32\lib\kernel32.lib
    9. includelib \masm32\lib\user32.lib
    10.  
    11. .data
    12.     ; Test strings
    13.     testStr  db 1024 dup("1"), 0 ; Long string of 1's
    14.     testStr2 db "222", 0         ; Short string to append
    15.     testStr3 db "333", 0         ; Another short string
    16.  
    17.     ; Buffers
    18.     buffer1 db 2048 dup(0) ; Buffer for wsprintf attempt
    19.     buffer2 db 2048 dup(0) ; Buffer for concatenation solution
    20.     tempBuf db 1024 dup(0) ; Temporary buffer
    21.  
    22.     ; Format strings
    23.     fmt1 db "Testing wsprintf with long string:", 13, 10
    24.                 db "First attempt with direct wsprintf:", 13, 10
    25.                 db "%s", 0
    26.     fmt2 db "Now testing concatenation method:", 13, 10
    27.                 db "%s%s%s", 0
    28.  
    29.     ; Messages
    30.     caption1   db "Direct wsprintf Test", 0
    31.     caption2   db "Concatenation Test", 0
    32.     msgSuccess db "Test completed successfully!", 0
    33.  
    34. .code
    35. start:
    36.     ; Test 1: Direct wsprintf (will show limitation)
    37.     invoke wsprintf, addr buffer1, addr fmt1, addr testStr
    38.     invoke MessageBox, NULL, addr buffer1, addr caption1, MB_OK
    39.  
    40.     ; Clear buffer
    41.     invoke RtlZeroMemory, addr buffer1, 2048
    42.  
    43.     ; Test 2: Solution using concatenation
    44.     invoke lstrcpy, addr buffer2, addr testStr
    45.     invoke lstrcat, addr buffer2, addr testStr2
    46.     invoke lstrcat, addr buffer2, addr testStr3
    47.  
    48.     ; Show result of concatenation
    49.     invoke MessageBox, NULL, addr buffer2, addr caption2, MB_OK
    50.  
    51.     ; Show completion message
    52.     invoke MessageBox, NULL, addr msgSuccess, NULL, MB_OK
    53.  
    54.     invoke ExitProcess, 0
    55.  
    56. end start
    57.  
    Вот так может?
    --- Сообщение объединено, 5 май 2025 ---
    Вот advanced
     

    Вложения:

    • my name sol.zip
      Размер файла:
      10,2 КБ
      Просмотров:
      59
    Semiono нравится это.
  13. Ahimov

    Ahimov Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2024
    Сообщения:
    253
    Через трансляцию.

    d.png
     

    Вложения:

    • print.zip
      Размер файла:
      567,4 КБ
      Просмотров:
      57
    Semiono нравится это.
  14. miilalex

    miilalex New Member

    Публикаций:
    0
    Регистрация:
    8 сен 2024
    Сообщения:
    17
    с точки зрения include ассемблер ничем не хуже си, и там и там удобно повторяющиеся части текста, будь то одинаковые процедуры (чтение файла и тп) или описания структур данных WinApi вынести в отдельные и редко изменяемые файлы, а редактируемый код изолировать в небольших по числу строк модулях

    так уже за счет навигации по тексту можно выиграть время

    что касается треша на диске, в установленном VC скорее всего найдутся в том числе исходники sprintf() из MS VC runtime

    и скорее всего можно себе скомпилировать приватную версию sprintf с буфером желаемой длины, или как минимум посмотреть листинг на ассемблере кода, в который превратился этот исходник на си.
    или вырезать из статической библиотеки один объектный файл и его одного дизассемблировать, почему нет.
     
    Semiono нравится это.
  15. Ahimov

    Ahimov Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2024
    Сообщения:
    253
    Сорян, аргументы перепутал :)

    Вот печать 0x500 символов:

    d2.png
     
    Semiono нравится это.
  16. Ahimov

    Ahimov Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2024
    Сообщения:
    253
    miilalex

    Вот тут есть:

    Код (Text):
    1. define BUFFERSIZE    512
    2.  
    3. char sz[BUFFERSIZE];
     
    Semiono и miilalex нравится это.
  17. M0rg0t

    M0rg0t Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 окт 2010
    Сообщения:
    1.602
    В нтдлл есть варианты wsprintf , где буфер больше 1024 байт.