Какая функция WindowsAPI переводит ANSI строку в число и наоборот?

Тема в разделе "WASM.BEGINNERS", создана пользователем himik, 6 янв 2010.

  1. himik

    himik New Member

    Публикаций:
    0
    Регистрация:
    6 янв 2010
    Сообщения:
    4
    Будьте добры, напишите прототипы таких функций, если они существуют, и примеры для MASM. Также буду признателен за ссылку на хороший справочник по винапи на русском.
     
  2. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    и ключ от квартиры где деньги лежат
     
  3. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    wsprintf в строку
     
  4. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    atol наоборот
     
  5. Clear__Energy

    Clear__Energy New Member

    Публикаций:
    0
    Регистрация:
    30 янв 2009
    Сообщения:
    432
    atoi <> itoa

    [​IMG]

    Use google, Luke!
     
  6. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Базовых не много.
    Код (Text):
    1. NTSYSAPI
    2. NTSTATUS
    3. NTAPI
    4. RtlIntegerToChar (
    5.     ULONG Value,
    6.     ULONG Base,
    7.     LONG OutputLength,
    8.     PSZ String
    9.     );
    10.  
    11. NTSYSAPI
    12. NTSTATUS
    13. NTAPI
    14. RtlIntegerToUnicode (
    15.     IN ULONG Value,
    16.     IN ULONG Base OPTIONAL,
    17.     IN LONG OutputLength,
    18.     OUT PWSTR String
    19.     );
    20.    
    21. NTSYSAPI
    22. NTSTATUS
    23. NTAPI
    24. RtlCharToInteger (
    25.     PCSZ String,
    26.     ULONG Base,
    27.     PULONG Value
    28.     );
    29.  
    30. NTSYSAPI
    31. NTSTATUS
    32. NTAPI
    33. RtlLargeIntegerToChar (
    34.     PLARGE_INTEGER Value,
    35.     ULONG Base OPTIONAL,
    36.     LONG OutputLength,
    37.     PSZ String
    38.     );
    39.  
    40. NTSYSAPI
    41. NTSTATUS
    42. NTAPI
    43. RtlLargeIntegerToUnicode (
    44.     IN PLARGE_INTEGER Value,
    45.     IN ULONG Base OPTIONAL,
    46.     IN LONG OutputLength,
    47.     OUT PWSTR String
    48.     );
    49.  
    50. NTSYSAPI
    51. NTSTATUS
    52. NTAPI
    53. RtlIntegerToUnicodeString (
    54.     ULONG Value,
    55.     ULONG Base,
    56.     PUNICODE_STRING String
    57.     );
    58.  
    59. NTSYSAPI
    60. NTSTATUS
    61. NTAPI
    62. RtlInt64ToUnicodeString (
    63.     IN ULONGLONG Value,
    64.     IN ULONG Base OPTIONAL,
    65.     IN OUT PUNICODE_STRING String
    66.     );
    67.  
    68. NTSYSAPI
    69. NTSTATUS
    70. NTAPI
    71. RtlUnicodeStringToInteger (
    72.     PCUNICODE_STRING String,
    73.     ULONG Base,
    74.     PULONG Value
    75.     );
    Ну есчо для вывода те, что обёртки для _output, это vsprintf() и пр. В либах масма есть нужные функи. Для особо извращённых вычислений можно какуюнибудь либу подгрузить, например VBVM.
     
  7. wasm_test

    wasm_test wasm test user

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

    GoldFinch
    она не преобразовывает строку в число.

    Clerk
    +1 в тему Rtl***.
    ну и еще встроенная мини-CRT с ее функциями типа atoi
     
  8. kero

    kero Модератор SOURCES & 2LZ Команда форума

    Публикаций:
    0
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва
    + shlwapi: StrToInt* etc
     
  9. himik

    himik New Member

    Публикаций:
    0
    Регистрация:
    6 янв 2010
    Сообщения:
    4
    Благодарю.
     
  10. bizdon

    bizdon Member

    Публикаций:
    0
    Регистрация:
    7 апр 2009
    Сообщения:
    86
    помогите отловить ошибку в данной проге:

    .386
    .model flat,stdcall
    option casemap:none
    include \masm32\include\windows.inc
    include \masm32\include\kernel32.inc
    include \masm32\include\user32.inc
    include \masm32\include\masm32.inc
    includelib \masm32\lib\kernel32.lib
    includelib \masm32\lib\user32.lib
    include \masm32\macros\macros.asm
    includelib \masm32\lib\masm32.lib

    WindowsProc PROTO :lol: WORD
    .data
    buff byte 256 dup(?)

    .code
    start:
    Invoke EnumWindows,offset WindowsProc,0

    WindowsProc PROC hwnd:HWND
    Invoke GetWindowText,hwnd,addr buff,256
    invoke atol, byte ptr buff
    ; mov al, byte ptr buff
    cmp al,"M"
    jne next
    Invoke MessageBox,0,addr buff,addr buff,0
    next:
    ret 4
    WindowsProc ENDP
    invoke ExitProcess, 0
    end start

    ;просто переводить строку в число и назад умею как ф-ми masm, так и +-48d
    в данном примере без условия окно выводится; выводится и при замене jne на je (кроме окон на М)
    отладить в оле не получается - не останавливается на бряке "cmp"
     
  11. CyberManiac

    CyberManiac New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2003
    Сообщения:
    2.473
    Адрес:
    Russia
    В MASM32 положено некоторое количество файликов с расширением asm. Там есть и то, и другое, и ещё много всякого. Ещё есть wsprintf, но это можно использовать только от безысходности.
     
  12. CyberManiac

    CyberManiac New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2003
    Сообщения:
    2.473
    Адрес:
    Russia
    bizdon
    Во-первых, не ret 4, а просто ret, с зачисткой стека MASM сам разберётся. Во-вторых, callback-функция не должна возвращать 0, но при нажатии на кнопку OK она именно его и вернёт (то же самое - при тексте окна нулевой длины). В-третьих, а разве atol не портит EAX? И что тогда с чем сравнивает cmp? В-четвёртых, ситуацию с неполучением текста окна стоит проверять до выполнения аtol, cmp и всей фигни. И вообще, что должен делать этот термойадерный кодез?!
     
  13. dr_godsl

    dr_godsl New Member

    Публикаций:
    0
    Регистрация:
    13 дек 2009
    Сообщения:
    60
    смысл наверное в том чтобы "пощупать" те или иные апи функи, мне если надо поэксперементировать, пишу подобный бред.

    ставь int 3 где охота тормознуть

    на засыпку, как ты думаешь, куда дальше пойдет управление после Invoke EnumWindows,offset WindowsProc,0 когда окна закончатся?
     
  14. bizdon

    bizdon Member

    Публикаций:
    0
    Регистрация:
    7 апр 2009
    Сообщения:
    86
    CyberManiac, dr_godsl
    спасибо, что откликнулись!
    этот кодес первоначально имел вид:
    WindowsProc PROC hwnd:HWND
    Invoke GetWindowText,hwnd,addr buff,256
    invoke lstrcmp,offset buff,chr$(" ")
    cmp byte ptr buff,48h ; сравнение с " H "
    jnz next
    Invoke MessageBox,0,offset buff, 0,0
    next:
    ret 4
    WindowsProc ENDP

    прекрасно работал и выводил все окна, начинающиеся на букву H. Не разобравшись со строкой " invoke lstrcmp,offset buff,chr$(" ")", решил переписать сам.
    с "wsprintf" - проблем нет (она здесь не нужна, ибо переводит число в строку, а нам надо наоборот), c ret - согласен; если callback-функция вернет ноль, то программа должна перейти к next; В третьих
    invoke atol,addr byte ptr buff
    add al,48
    работает правильно (на простом примере, когда buff задана в .data) - atol и возвращает результат в eax.

    Код
    WindowsProc PROC hwnd:HWND
    Invoke GetWindowText,hwnd,addr buff,256
    mov al, byte ptr buff
    cmp al,"M"
    je next
    Invoke MessageBox,0,addr buff,addr buff,0
    next:
    ret
    WindowsProc ENDP

    работает правильно - выводит все окна системы, не содержащие первой буквы "М", то есть сравнение идет (у меня есть окна на М). Без сравнения выводит все окна. Но стоит заменить je на jne как всё перестает работать! Вот, интнресно, почему?

    "куда дальше пойдет управление после Invoke EnumWindows,offset WindowsProc,0" - думаю на invoke ExitProcess, 0
     
  15. CyberManiac

    CyberManiac New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2003
    Сообщения:
    2.473
    Адрес:
    Russia
    bizdon
    Потому что callback-функция должна возвращать ненулевое значение, если нужно продолжить движение по списку окон. А теперь представь, что первое же найденное тобой окно вернуло пустой текст с длиной 0 - что тогда окажется в EAX? А вот когда ты используешь je и жмёшь на кнопку OK в messagebox, функция MessageBoxA возвращает в EAX константу ID_OK, которая не равна 0, поэтому функция продолжает выполняться даже натыкаясь на окна без текста.

    Ассемблер - это такой низкоуровневый Бейсик, в нём всё исполняется именно так, как написано в тексте. После EnumWindows будет исполнено "WindowsProc PROC hwnd:HWND", то есть push ebp; mov ebp, esp-... и так далее. Параметр hwnd, естественно, будет взят от фонаря (то есть из мусора на стеке).
     
  16. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Потому что она не void по спецификации, а BOOL. И она должна вернуть 1 для продолжения перечисления
    Он где-то прописан после invoke EnumWindows? Не видно. Функции нельзя пихать посередине тела других функций. Размести сначала функцию WindowProc, а потом WinMain
     
  17. bizdon

    bizdon Member

    Публикаций:
    0
    Регистрация:
    7 апр 2009
    Сообщения:
    86
    поняв, наконец-то, что сказал CyberManiac
    родил рабочий код:

    Код (Text):
    1. .386
    2. .model flat,stdcall
    3. option casemap:none
    4. include    \masm32\include\windows.inc
    5. include \masm32\include\kernel32.inc
    6. include \masm32\include\user32.inc
    7. include    \masm32\include\masm32.inc
    8. includelib \masm32\lib\kernel32.lib
    9. includelib \masm32\lib\user32.lib
    10. include \masm32\macros\macros.asm
    11. includelib \masm32\lib\masm32.lib
    12.  
    13. WindowsProc PROTO :DWORD
    14. .data
    15. buff byte 256 dup(?)
    16.  
    17. .code
    18. start:
    19. Invoke    EnumWindows,offset WindowsProc,0
    20. invoke ExitProcess, 0
    21. WindowsProc PROC hwnd:HWND
    22.              Invoke    GetWindowText,hwnd,addr buff,256
    23.             .if eax==0
    24.                 mov eax,1
    25.                 jmp next
    26.             .endif
    27.      cmp byte ptr buff,"H"  ; сравнение с " H "
    28.         jnz next
    29.      Invoke    MessageBox,0,offset buff, offset buff,MB_OK
    30.         next:
    31. ret
    32. WindowsProc ENDP
    33. end start