169 похожих чатов

Типа вызывать GetParent и проверять на соответствие GetModuleHandle?

67 ответов

74 просмотра

Нет, EnumWindows или EnumWindowsEx на каждое окно возвращает структуру, там поле hwndParent и hwnd, первое - это хэндл главного окна, и проверяешь тупо со своим: mov eax, dword[my_main_hwnd] cmp eax, dword[window.hwndParent] jne .not_my_window

The Bird of Hermes- Автор вопроса
КТ315
Нет, EnumWindows или EnumWindowsEx на каждое окно ...

А, так там еще прикол в том, что я эти окошки генерирую без родителя, чтобы они не перекрывали основное окно

The Bird of Hermes
А, так там еще прикол в том, что я эти окошки гене...

GetWindowThreadProcessId, ну и сравниваешь со своим GetCurrentProcessId. Но это какой-то костыль. Почему бы не учитывать окна в связном списке, например? Вот захочешь ты открыть порт, а он в одном из окон уже открыт, и ты такой прошёлся по списку, нашёл и ShowWindow ему, а не ругаешься, что не удалось порт открыть.

s54820
GetWindowThreadProcessId, ну и сравниваешь со свои...

Это не костыль. Вот я бы сделал ReadProcessMemory, и в памяти какую-то константу уникальную хранить, и так определять мой это процесс, или нет. Ну, и проверку на свой же дескриптор, чтоб самого себя не прикрыть.

s54820
GetWindowThreadProcessId, ну и сравниваешь со свои...

Список это выделение памяти, переменная, функции для работы с добавлением и удалением из этой памяти, и сортировка (либо можно при добавлении просто искать дыру, если нет - добавлять в конец, при удалении выставить 0, а при добавлении туда уже добавится новый дескриптор, но это тоже функция, это тоже цикл, и тоже лишние операции).

КТ315
Список это выделение памяти, переменная, функции д...

Интересны — да, хороши — нет. Читать память ненадёжно как минимум, потому что процессов может быть больше одного. И ещё потому что читать памтяь чужих процессов без причины — зло, может быть какое-нибудь весёлое поведение с античитами, антивирусами, отладчиками, ещё с чем-нибудь, но мы об этом не узнаем, пока не случится. А что до выделения памяти, то тут опять происходит ассемблер, потому что надо же код писать, а код писать больно, поэтому мы изобретаем костыли. И нет, для связного списка не нужно искать дыры, он не массив. И нет, на фоне всего того, что делает винда при создании окна, «лишний» цикл стоит примерно ноль.

В яву это три строчки. А если мы имеем в виду хотя бы C++, то одна.

s54820
В яву это три строчки. А если мы имеем в виду хотя...

😳 Одна строчка на функцию для поиска своих окон?

Simple Sorcerer
не забываем про free :D

ну для плюсов делит)

КТ315
😳 Одна строчка на функцию для поиска своих окон?

А зачем нам искать свои окна, если мы в WM_CREATE можем положить в хэш номер порта и hWnd?

s54820
Оно само.

ну мб ядро и офистит всё, но желательно чистить

КТ315
Не понял. Как это решит задачу?

@MrMiscipitlick хочет закрывать свои окна. Он не знает, какие окна он открыл, поэтому он хочет обходить все топлевел окна в системе и проверять, не ему ли они принадлежат. Если бы он при открытии запоминал hWnd открытых окон, при завершении процесса он мог бы просто взять их из списка/словаря.

КТ315
А хеш то где?

Хэш = словарь.

s54820
Хэш = словарь.

Впервые слышу, чтобы его так называли. Но, в любом случае, не подходит сюда никак твой аргумент про "на ассемблере писать долго, поэтому придумываем костыли". У меня тут столько много вопросов вытекает вроде: 1. А что плохого, что язык учит думать над алгоритмом и сокращать его? 2. Но написать словарь\список на ассемблере это несложно вообще, и не слишком долго, быстрее чем сама программа @MrMiscipitlick

КТ315
Впервые слышу, чтобы его так называли. Но, в любом...

Сокращать — это делать ReadProcessMemory * количество топ-левел окон? Отличные оптимизации, да. А написать список, конечно же, несложно, но лень.

s54820
Сокращать — это делать ReadProcessMemory * количес...

Кстати, что-то мне кажется, что NtReadVirtualProcessMemory намного меньше кода имеет, чем тот же EnumWindowsEx :)

КТ315
Кстати, что-то мне кажется, что NtReadVirtualProce...

А это тебя от Enum* не избавляет никак. Это вдобавок. И процесс ещё нужно открыть тоже. А про длину конкретно Read*Memory не знаю, но там же проверки, что можно читать, что можно писать, и вроде там несколько способов копирования ещё.

s54820
А это тебя от Enum* не избавляет никак. Это вдобав...

Нужно замерить, что быстрее - Enum*+ReadProcessMemory, или выделение памяти+функции добавления и удаления элементов из списка+функция проверки находится ли элемент в списке+очистка памяти

КТ315
Нужно замерить, что быстрее - Enum*+ReadProcessMem...

Проход по списку дешевле даже одного сисколла. Итого у нас будет PostMessage * количество наших окон сисколлов + освобождение памяти (в юзермоде) vs. около 10 контекстсвитчей * количество топлевел окон. Про выделение памяти на фоне открытия окна я уже писал, это ни о чём.

s54820
Проход по списку дешевле даже одного сисколла. Ито...

Если я буду оценивать по нагрузке на процессор в ProcessHacker - это честно?

КТ315
Если я буду оценивать по нагрузке на процессор в P...

запусти на дохленьком селероне или атоме, с вин10 , сразу видно как всё работает, даже видно будет как окна рисуются

КТ315
Если я буду оценивать по нагрузке на процессор в P...

Без понятия. Попробуй. Но ещё раз. Тебе в любом случае нужно PostMessage на одно окно. Только в варианте с Enum* у тебя вдобавок есть этот самый Enum*, колбеки, сравнения (по pid, памяти или как ты там сделаешь). И PostMessage никуда не девается. Что тут сравнивать-то?

s54820
Без понятия. Попробуй. Но ещё раз. Тебе в любом сл...

Зачем PostMessage? Я хочу через диалоговые окна, один процесс в таймере будет запускать и закрывать диалоговое окно (перебирать процессы и искать дочернее), а другой - будет сохранять выделять память, добавлять в список, затем смотреть есть ли окно в списке, и если есть - убрать из списка, затем очистить память. И проверить, кто сколько будет нагружать.

КТ315
Зачем PostMessage? Я хочу через диалоговые окна, о...

PostMessage итог всей этой затеи. Посылать WM_CLOSE. Ну а так, да. Тебе и закрывать не нужно. Ты же меряешь, сколько времени нужно на поиск одного окна vs. malloc+free+проход по списку.

КТ315
Зачем PostMessage? Я хочу через диалоговые окна, о...

как микросервисная архитектура в асм софт проникла?

КТ315
Не malloc, а NtVirtualAlloc, он быстрее))

Ладно, как-то уже перехотелось. Хочу что-то другое замерить.

КТ315
Не malloc, а NtVirtualAlloc, он быстрее))

всё равно в ядро прыгать

Mixail Frolov
всё равно в ядро прыгать

А, ну тогда давай перед этим 10 раз вычислим Фибоначчи и отрисуем танцующего медведя на GDI.

s54820
Нет не быстрее.

А если замерить?

КТ315
А если замерить?

на малых блоках желательно, меньше страницы

КТ315
А если замерить?

А если подумать? Сисколл один раз в n выделений vs. сисколл каждое выделение?

s54820
А если подумать? Сисколл один раз в n выделений vs...

Один раз в N конечно быстрее будет, там проверки, и на одно действие проверки по отношению к реальному коду 50 на 50, а когда 10 раз вызываешь - то уже большую часть действий составляют одни и те же проверки, код умножается, кода больше, код медленнее.

s54820
А если подумать? Сисколл один раз в n выделений vs...

Вот замеры сделал кто-то, только там про new[], но не суть.

КТ315
Один раз в N конечно быстрее будет, там проверки, ...

любой сискол это минимум 100-120 тактов + сохранение контекста и тд Проверки это 1 такт на штуку если уж упрощать

Mixail Frolov
любой сискол это минимум 100-120 тактов + сохранен...

Забавно, что ты считаешь, что проверка это тупо один cmp.

КТ315
Забавно, что ты считаешь, что проверка это тупо од...

я так не считаю, но думается явно меньше 100 для самого простого malloc

The Bird of Hermes- Автор вопроса
КТ315
screenshot Вот замеры сделал кто-то, только там про new[], но...

И правда шустрый VirtualAlloc😁 но он вроде минимум 1кб выделяет

Mixail Frolov
я так не считаю, но думается явно меньше 100 для с...

И что теперь? Есть две функции, оба вызывают VirtualAlloc, это уже по 100 тактов на две функции. Затем другая функция делает какую-то ещё свою дичь, из 100 вырастает 200, 300, 400... Вопрос - при чём тут вообще переход в ядро и системный вызов, если речь про нагрузку самой функции?

КТ315
screenshot Вот замеры сделал кто-то, только там про new[], но...

Не знаю, что там, но судя по описанию, это свой аллокатор, который использует апи или кучу как бэк. Т.е., это не аллокация указанной функцией каждый раз. А если каждый раз, то будет вот так: heap, 32 size, 50000 iters: -> 16 ms virtualalloc, 32 size, 50000 iters: -> 18594 ms

s54820
Не знаю, что там, но судя по описанию, это свой ал...

Вот я открыл malloc сейчас, что вижу: 1. Проверка на 0 аргумент (конечно, оригинальный VirtualAlloc же не проверяет это!! Спасибо!) 2. Вызов заглушки какой-то с set_error_mode, круто 3. Вызов ещё одной заглушки 4. Ещё одна заглушка 5. Ищет библиотеку mscoree.dll, ищет там функцию LdrpInitializeProcess, шикарно! 6. Ещё куча проверок, и только потом вызов HeapAlloc

КТ315
Вот я открыл malloc сейчас, что вижу: 1. Проверка...

Я тебе померял, смирись уже. Разница в сотни раз. Сисколлы медленные. 500 тактов ты платишь только за сам факт сисколла, а внутри сисколла менеджмент виртуальной памяти дико медленный, потому что делать нужно очень много всего. И проверять нужно очень много всего.

s54820
Я тебе померял, смирись уже. Разница в сотни раз. ...

Ты померял HeapAlloc, это нечестно. Куча естественно быстрее, но она и ограничена на старте процесса, а VirtualAlloc из ОЗУ выделяет, которое больше.

s54820
Я тебе померял, смирись уже. Разница в сотни раз. ...

А вот если померять NtHeapAlloc и malloc? Что быстрее?

КТ315
Ты померял HeapAlloc, это нечестно. Куча естествен...

😳 Кто ограничена? Она тот же самый VirtualAlloc использует, просто реже.

s54820
Я тебе померял, смирись уже. Разница в сотни раз. ...

Я вот не пойму, при чём тут системные вызовы? А malloc что-ли не использует системный вызов? Из воздуха берёт?

КТ315
Я вот не пойму, при чём тут системные вызовы? А ma...

Куча по определению берёт кучу памяти и нарезает блоки оттуда. В юзермоде. Быстро. В результате системные вызовы у тебя только когда куча заканчивается, и тебе нужна новая.

s54820
😳 Кто ограничена? Она тот же самый VirtualAlloc ис...

Поле SizeOfHeapCommit/SizeOfHeapReserve не влияют на HeapAlloc?

КТ315
Поле SizeOfHeapCommit/SizeOfHeapReserve не влияют ...

Влияют на то, сколько будет изначально у процесса. Например, у тебя есть какие-то классы, они вместе весят N. И ты можешь попросить при инициализации сразу выделить тебе N, чтобы эти классы её разобрали, чтобы как раз избежать лишних походов в ядро. Но это не значит, что ты не можешь попросить потом ещё сколько-то.

s54820
Куча по определению берёт кучу памяти и нарезает б...

А я еще думал, зачем в PE указывается размер кучи, если она безразмерная, а оказывается вон оно что.

s54820
Влияют на то, сколько будет изначально у процесса....

Ладно, так а если NtHeapAlloc и malloc сравнить? Что быстрее? Всё-таки мы тут именно malloc оцениваем, я забыл что он HeapAlloc использует.

КТ315
Пример?

Да хоть что. Я такой функции не помню, я плохо нейтив знаю.

s54820
Да хоть что. Я такой функции не помню, я плохо ней...

Ой, я ошибся, такой функции нет, там RtlAllocateHeap, на который в целом и ведёт HeapAlloc, без всяких заглушек, так что это одно и то же.

s54820
Да хоть что. Я такой функции не помню, я плохо ней...

mov eax, dword[fs:0x30] mov dword[esp], 256 ; Size mov eax, dword[eax+0x18] mov dword[esp-4], HEAP_ZERO_MEMORY mov dword[esp-8], eax sub esp, 8 call dword[HeapAlloc] ; RtlAllocateHeap

КТ315
mov eax, dword[fs:0x30] mov dword[esp], 256 ; ...

Будет чуть быстрее, malloc рано или поздно туда придёт, если кастомный аллокатор не использовать.

Похожие вопросы

Обсуждают сегодня

30500 за редактор? )
Владимир
47
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
вы делали что-то подобное и как? может есть либы готовые? увидел картинку нокода, где всё линиями соединено и стало интересно попробовать то же в ddl на lua сделать. решил с ч...
Victor
8
Подскажите пожалуйста, как в CustomDrawCell(Sender: TcxCustomGridTableView; ACanvas: TcxCanvas; AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean); получить наз...
A Z
7
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
1
Он в одиночку это дело запилил или была какая-то команда?
Aquinary
12
~ 2m21s  nix shell github:nixos/nixpkgs#stack ~  stack ghc -- --version error: … while calling the 'derivationStrict' builtin at /builtin/derivation.nix:...
Rebuild your mind.
6
Всем привет, нужна как никогда, нужна помощь с IO в загрузчике. Пишу в code16 после установки сегментных регистров, пишу вывод символа. Пробовал 2 варианта: # 1 mov $0x0E, %a...
Shadow Akira
14
Карта сайта