Студентам с вопросами о лабораторных работах сюда

Тема в разделе "WASM.BEGINNERS", создана пользователем IceStudent, 11 ноя 2006.

  1. Semiono

    Semiono Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2005
    Сообщения:
    831
    Может быть мне как студенту побыстрому?

    Мне надо (64bit) убрать треш окно из 5% запусков оно появляется.
    Код (Text):
    1.  
    2.         invoke ShellExecute,NULL,NULL,'Giglad.exe',NULL,NULL,SW_NORMAL; запуск
    3.  
    4.         invoke FindWindow,NULL,'Giglad - Unlicensed'
    5.         invoke SendMessage,eax,WM_CLOSE,NULL,NULL ;  каким-то способом закрыть случайное окно если оно появиться.
    6.  
    7.         invoke ShellExecute,NULL,NULL,'Giglad.exe',NULL,NULL,SW_NORMAL ; снова запустить
    8.  
    И ещё нужен шаблон.. template как ждать закрытие сторонней програмы... WaitForSingleObject
    Чтобы ещё одно окно зачистить после закрытия 'Giglad.exe'

    Код (Text):
    1.  
    2.         invoke FindWindow,NULL,'Giglad.exe - Application Error'
    3.         invoke SendMessage,eax,WM_CLOSE,NULL,NULL
    4.  
    Кстати, «системное» окно может быть неубиваемое, оно висит даже если процес закрыт.. впрочем нет, WM_CLOSE его закрывает, но иногда мимо. Видимо опять FindWindow кривой)

    В 32-бит вроде был набросок и всё работало, но в 64 дебри, регистры как-то надо сохранять перед процедурами, а мне код нужен современный x64 :)
     
  2. Ahimov

    Ahimov Active Member

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

    А какое окно, с исключением(ошибкой) ?

    > как ждать закрытие сторонней програмы... WaitForSingleObject

    Передать в эту апи хэндл обьекта, на котором идёт ожидание. В данном случае процесса.
     
  3. Semiono

    Semiono Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2005
    Сообщения:
    831
    [​IMG]

    Код (Text):
    1.  
    2. include '%fasm%/win64ax.inc'
    3. section '.code' executable
    4. start:
    5.         sub rsp,8
    6.  
    7.         invoke SHGetSpecialFolderPath,NULL,a,CSIDL_PROGRAM_FILES,NULL
    8.         invoke PathAddBackslash,a
    9.         invoke lstrcat,a,'Giglad'
    10.         invoke PathAddBackslash,a
    11.         invoke lstrcat,a,'Giglad.exe'
    12.  
    13.         invoke GetBinaryType,a,z
    14.         cmp eax,NULL
    15.         jz exit
    16.  
    17.         call main
    18.  
    19.         invoke FindWindow,NULL,'Giglad.exe - Application Error'
    20.         invoke SendMessage,[r],WM_CLOSE,NULL,NULL ; WM_CLOSE
    21. exit:
    22.         invoke ExitProcess,NULL
    23.  
    24. proc main
    25.  
    26.         invoke RtlZeroMemory,startInfo,sizeof.startInfo
    27.         invoke RtlZeroMemory,procInfo,sizeof.procInfo
    28.         mov [startInfo.cb],sizeof.startInfo
    29.         invoke CreateProcess,NULL,a,NULL,NULL,DETACHED_PROCESS,NORMAL_PRIORITY_CLASS,NULL,NULL,startInfo,procInfo
    30.         invoke WaitForSingleObject,[procInfo.hProcess],0xffffffff ; INFINITE
    31.         invoke CloseHandle,[procInfo.hProcess]
    32.         invoke CloseHandle,[procInfo.hThread]
    33.  
    34.         invoke FindWindow,NULL,'Giglad.exe - Application Error'
    35.         invoke SendMessage,[r],WM_CLOSE,NULL,NULL
    36.         invoke ExitProcess,NULL
    37. endp
    38.  
    39. section '.data' readable writeable
    40.  
    41.         a rb MAX_PATH
    42.         b rb MAX_PATH
    43.  
    44.         r dd NULL
    45.  
    46.         x dd NULL
    47.         z dd NULL
    48.  
    49.         startInfo STARTUPINFO; <>
    50.         sizeof.startInfo = $ - startInfo
    51.         procInfo PROCESS_INFORMATION; <>
    52.         sizeof.procInfo = $ - procInfo
    53.  
    54. struct PROCESSENTRY32
    55.  
    56.         dwSize dd MAX_PATH
    57.         cntUsage dd NULL
    58.         th32ProcessID dq NULL
    59.         th32DefaultHeapID dq NULL
    60.         th32ModuleID dd NULL
    61.         cntThreads dd NULL
    62.         th32ParentProcessID dd NULL
    63.         pcPriClassBase dd NULL
    64.         dwFlags dd NULL
    65.         szExeFile db MAX_PATH dup NULL
    66. ends
    67.         pe32 PROCESSENTRY32
    68.  
    Что-то я мудрил тут, уходит в вечный луп, причём дело наверное не в WaitForSingleObject, а скорее из за FindWindow.
    В процедурах не шарю, стараюсь без них обходится) А тут ещё и 64бит. Где-то просто подсмотрел, а почему нельзя без процедуры прямо код воткнуть, или можно? Для меня процедура это лишний повод для глюка))
    А что за угловые скобки там были? startInfo STARTUPINFO <>
     
  4. Ahimov

    Ahimov Active Member

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

    Этому окну нельзя слать сообщения, оно наверно из csrss, такое не известно к чему приведёт.

    По нормальному нужно прицепить отладчик, в смысле простейший отладочный цикл(в аттаче семпл) и в нём ждать необработанный фаулт. Либо же впрыскиваться в процесс и там локально обрабатывать.

    Снимать окна затея плохая, так как это асинхронно и в зависимости от логики приложения будут последствия. Если окно принадлежит приложению, то может его просто сделать невидимым..

    > почему нельзя без процедуры прямо код воткнуть

    Можно конечно.

    > А что за угловые скобки там были?

    Обозначение структуры.
    --- Сообщение объединено, 2 май 2025 ---
    Кстате у вас косяк с аргументами createprocess.

    Прототип. 5-й параметр указывет наследование описателей, флаги 6-й параметр.
     

    Вложения:

    • db.asm
      Размер файла:
      2,1 КБ
      Просмотров:
      255
    Последнее редактирование: 2 май 2025
    Semiono нравится это.