Будьте добры, напишите прототипы таких функций, если они существуют, и примеры для MASM. Также буду признателен за ссылку на хороший справочник по винапи на русском.
Базовых не много. Код (Text): NTSYSAPI NTSTATUS NTAPI RtlIntegerToChar ( ULONG Value, ULONG Base, LONG OutputLength, PSZ String ); NTSYSAPI NTSTATUS NTAPI RtlIntegerToUnicode ( IN ULONG Value, IN ULONG Base OPTIONAL, IN LONG OutputLength, OUT PWSTR String ); NTSYSAPI NTSTATUS NTAPI RtlCharToInteger ( PCSZ String, ULONG Base, PULONG Value ); NTSYSAPI NTSTATUS NTAPI RtlLargeIntegerToChar ( PLARGE_INTEGER Value, ULONG Base OPTIONAL, LONG OutputLength, PSZ String ); NTSYSAPI NTSTATUS NTAPI RtlLargeIntegerToUnicode ( IN PLARGE_INTEGER Value, IN ULONG Base OPTIONAL, IN LONG OutputLength, OUT PWSTR String ); NTSYSAPI NTSTATUS NTAPI RtlIntegerToUnicodeString ( ULONG Value, ULONG Base, PUNICODE_STRING String ); NTSYSAPI NTSTATUS NTAPI RtlInt64ToUnicodeString ( IN ULONGLONG Value, IN ULONG Base OPTIONAL, IN OUT PUNICODE_STRING String ); NTSYSAPI NTSTATUS NTAPI RtlUnicodeStringToInteger ( PCUNICODE_STRING String, ULONG Base, PULONG Value ); Ну есчо для вывода те, что обёртки для _output, это vsprintf() и пр. В либах масма есть нужные функи. Для особо извращённых вычислений можно какуюнибудь либу подгрузить, например VBVM.
мсдн + учебник английского. GoldFinch она не преобразовывает строку в число. Clerk +1 в тему Rtl***. ну и еще встроенная мини-CRT с ее функциями типа atoi
помогите отловить ошибку в данной проге: .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 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"
В MASM32 положено некоторое количество файликов с расширением asm. Там есть и то, и другое, и ещё много всякого. Ещё есть wsprintf, но это можно использовать только от безысходности.
bizdon Во-первых, не ret 4, а просто ret, с зачисткой стека MASM сам разберётся. Во-вторых, callback-функция не должна возвращать 0, но при нажатии на кнопку OK она именно его и вернёт (то же самое - при тексте окна нулевой длины). В-третьих, а разве atol не портит EAX? И что тогда с чем сравнивает cmp? В-четвёртых, ситуацию с неполучением текста окна стоит проверять до выполнения аtol, cmp и всей фигни. И вообще, что должен делать этот термойадерный кодез?!
смысл наверное в том чтобы "пощупать" те или иные апи функи, мне если надо поэксперементировать, пишу подобный бред. ставь int 3 где охота тормознуть на засыпку, как ты думаешь, куда дальше пойдет управление после Invoke EnumWindows,offset WindowsProc,0 когда окна закончатся?
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
bizdon Потому что callback-функция должна возвращать ненулевое значение, если нужно продолжить движение по списку окон. А теперь представь, что первое же найденное тобой окно вернуло пустой текст с длиной 0 - что тогда окажется в EAX? А вот когда ты используешь je и жмёшь на кнопку OK в messagebox, функция MessageBoxA возвращает в EAX константу ID_OK, которая не равна 0, поэтому функция продолжает выполняться даже натыкаясь на окна без текста. Ассемблер - это такой низкоуровневый Бейсик, в нём всё исполняется именно так, как написано в тексте. После EnumWindows будет исполнено "WindowsProc PROC hwnd:HWND", то есть push ebp; mov ebp, esp-... и так далее. Параметр hwnd, естественно, будет взят от фонаря (то есть из мусора на стеке).
Потому что она не void по спецификации, а BOOL. И она должна вернуть 1 для продолжения перечисления Он где-то прописан после invoke EnumWindows? Не видно. Функции нельзя пихать посередине тела других функций. Размести сначала функцию WindowProc, а потом WinMain
поняв, наконец-то, что сказал CyberManiac родил рабочий код: Код (Text): .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 :DWORD .data buff byte 256 dup(?) .code start: Invoke EnumWindows,offset WindowsProc,0 invoke ExitProcess, 0 WindowsProc PROC hwnd:HWND Invoke GetWindowText,hwnd,addr buff,256 .if eax==0 mov eax,1 jmp next .endif cmp byte ptr buff,"H" ; сравнение с " H " jnz next Invoke MessageBox,0,offset buff, offset buff,MB_OK next: ret WindowsProc ENDP end start