Код (Text): include '%fasm%/win64ax.inc' section '.code' executable start: sub rsp,8 mov ecx,10 @@: invoke FindWindow,NULL,'Giglad - Unlicensed' mov [r],eax cmp eax,NULL jnz @f dec ecx cmp ecx,NULL jz exit invoke Sleep,300 jmp @r @@: invoke SendMessage,[r],WM_CLOSE,NULL,NULL exit: invoke ExitProcess,NULL section '.data' readable writeable a rb MAX_PATH b rb MAX_PATH r dd NULL x dd NULL y dd NULL z dd NULL Не могу понять что не так? Когда окно есть, работает вроде, когда окна нет, уходит в вечный полёт. Причём раньше этот кусок кода работал вроде бы в другой програме. Хотелось бы ещё и запустить после выхода из цикла... Код (Text): invoke SHGetSpecialFolderPath,NULL,a,CSIDL_PROGRAM_FILES,NULL invoke PathAppend,a,'Giglad' invoke PathAddBackslash,a invoke lstrcat,a,'Giglad.exe' invoke GetBinaryType,a,z cmp eax,NULL jz exit ;;;; тут invoke FindWindow,NULL,'Giglad - Unlicensed' invoke ShellExecute,NULL,NULL,a,NULL,NULL,SW_NORMAL
Для передачи параметров в x86_64 используются регистры в порядке rcx, rdx, r8, r9. После FindWindow в ecx не будет счетчика цикла. Используйте, скажем, r10. Тем более, если из FindWindow в rcx вернется значение параметра, тогда ваш цикл вечно будет отнимать от 0 и переходить по jnz на -1.
Я и не говорил про возврат значения, а про состояния регистра, содержащего параметр после вызова. Он сохраняться не должен, но может остаться равным значению параметра, которое через него передавали. Т.е. ответьте на вопрос: что содержит rcx после call FindWindow? У вас есть три варианта: содержимое регистра не изменилось т.е. он все еще содержит этот же параметра для FindWindow; содержимое регистра изменилось, но численно равно значению параметра переданного в FindWindow; содержимое регистра изменилось и содержит значение отличное от значения параметра FindWindow; Первые два случая равнозначны по значению. Вторые два по алгоритму внутри FindWindow. Но нас интересует именно первое - равнозначность по значению для последующего алгоритма. Т.е. при rcx = 0 будет dec ecx = -1 и cmp ecx, 0 + jz exit (ne).
MaKsIm, > Т.е. ответьте на вопрос: что содержит rcx после call FindWindow? Я тогда посмотрел конечно, там указатель на локальные переменные(стек) где то внутри FindWindow. Можем глянуть.
Это не важно, что внутри FindWindow. Тем более, что в каждом билде Windows они могут различаться из-за даже версии компилятора.
MaKsIm, Чисто интересно как у тс работало. Это я наверно 32 смотрел. У меня на 10 получается возвращается константа 0x49, либо что то зависящее от фазы луны из freeheap(). Обрати внимание что и там серия call имеется add: а не константа, не внимательно глянул: Код (Text): .text:0000000140411257 mov rcx, [rbp+0E8h] Что там(значение возвращаемое сервисами) хз, может даже это kernel disclosure. На до бы проверить..
Вот поэтому то и интересно выяснить что за магия в этих call. Но вот значение rcx после call FindWindows не очень интересно т.к. ошибка явно не из-за функции, что его затирает, а из-за команды, что подготавливает вызов этой функции (еще до call FindWindow).