Page 1 of 2

Получение слота потока по его идентификатору

Posted: Sat Aug 18, 2007 4:26 pm
by Alver
Просматривая функции ядра Kolibri, я не нашел каким образом можно получить номер слота потока(процесса) по его PID/TID. В тоже время большинство системных функций работают со слотами, а программы при создании потоков и запуске приложений получают идентификаторы.
Предлагаю добавить подфункцию 21 к функции 18 для определения номера слота по идентификатору, благо это займет всего несколько десятков байт и немного добавлений в файл 'kernel.asm':
В конец таблицы 'sys_system_table' добавить:

Code: Select all

     dd      sysfn_pid_to_slot       ; 21 = get slot number for pid
А среди процедур, следующих за 'sys_system' вставить:

Code: Select all

sysfn_pid_to_slot:
     mov   eax, ebx
     call  pid_to_slot
     mov   [esp+36], eax
     ret
И получим:
Function 18,21
Получение номера слота потока по его идентификатору
---------------------------------------------------
Параметры:
* eax = 18 - номер функции
* ebx = 21 - номер подфункции
* ecx = PID/TID (идентификатор процесса/потока)
Возвращаемое значение:
* eax = номер слота потока если он существует или 0, если PID/TID ложный.

Posted: Sat Aug 18, 2007 10:09 pm
by Mario79
Alver
Собственно я может, и туплю, но где сама процедура pid_to_slot?

Posted: Sun Aug 19, 2007 1:02 pm
by Serge
Mario79

В taskman.inc

Posted: Sun Aug 19, 2007 5:57 pm
by Alver
Mario79
Да, 'pid_to_slot' есть в ядре, и используется некоторыми функциями, но прямого вызова пока почемуто не было предусмотрено.
Прежде чем предлагать, я cкомпилил эту фишку в ядре, проверял простенькой прогой через CPUID - работало.
Вообще я хотел расширить ядро еще функциями сворачивания/восстановления окна указанного процесса (сейчас есть только своего). Это моглобы позволить добавить в интерфейс панели кнопки расчистки рабочего стола и даже подобие виртуальных рабочих мест, но не вышло, не врубился как работают функции 'minimize_window' и 'restore_minimized_window'. :cry:

Posted: Sun Aug 19, 2007 6:36 pm
by mike.dld
Отдельная функция такого рода не нужна (для мнимизации окна). Нужна функция для установки состояния окна, то есть свернуть/развернуть, максимировать/восстановить, roll-up/roll-down. Вот это было бы действительно полезно.

Posted: Sun Aug 19, 2007 7:16 pm
by Alver
Только успел запоститься и обнаружил причину неудачи с минимизацией.
Ленин
Отдельная функция такого рода не нужна (для мнимизации окна). Нужна функция для установки состояния окна, то есть свернуть/развернуть, максимировать/восстановить, roll-up/roll-down. Вот это было бы действительно полезно.
Никаких проблем не вижу, состояние устанавливается в процессе, все функции уже есть в ядре, нет только соответствующих входов.
Привожу доработку:

Code: Select all

 Function 18,22
 Минимизация/восстановление окна процесса.
----------------------------------------------------
 Параметры:
    * eax = 18 - номер функции
    * ebx = 22 - номер подфункции
    * ecx = Тип операции
            0 - минимизация окна (сворачивание на панель) по номеру слота потока
            1 - минимизация окна по идентификатору PID/TID
            2 - Восстановление минимизированного окна по слоту потока
            3 - Восстановление минимизированного окна по идентификатору PID/TID
    * edx = Параметр операции (Номер слота или PID/TID)
 Возвращаемое значение:
    * eax = 0  - Завершилась успешно
            -1 - Не получилось.
Дополнительные изменения в файле 'kernel.asm'
В конец таблицы 'sys_system_table' добавить:

Code: Select all

       dd      sysfn_min_rest_window   ; 22 = minimize and restore any window
Среди процедур, следующих за 'sys_system' вставить:

Code: Select all

sysfn_min_rest_window:
     pushad
     mov   eax, ecx      ; ebx - operating
     shr   ebx, 1
     jnc    @f
     call  pid_to_slot
@@:                      ; eax - Номер слота потока
     or    eax, eax      ; eax - number of slot
     jz    .error
     xor   ecx, ecx
     mov   cx, [WIN_STACK + eax*2]  ; ecx - window number
     mov   eax, ecx
     shr   ebx, 1
     jc    .restore
 ; .minimize:
     call  minimize_window
     jmp   .exit
.restore:
     call  restore_minimized_window
.exit:
     popad
     xor   eax, eax
     mov   [esp+36], eax
     ret
.error:
     popad
     xor   eax, eax
     dec   eax
     mov   [esp+36], eax
     ret
Максимизация пока не поддерживается, не понял я как она производится.

Posted: Sun Aug 19, 2007 10:10 pm
by Alver
Я извиняюсь конечно что отошел от заявленной темы, но раз уж начал...
Состряпал маленькую прогу для сворачивания окошек рабочего стола, использующую новые функции.:lol:
Исходник здесь: http://alver-mage.narod.ru/Kolibri/clean_src.7z

Posted: Mon Aug 20, 2007 7:37 am
by Mario79
Alver
Не пора ли в таком случае залить на SVN?
Попроси у Mike.dld (Ленин) регистрацию и вперед.

Posted: Mon Aug 20, 2007 10:51 am
by vectoroc
Не лучше ли ввести подобие сообщений в виндовс? Послал окну сообщение свернуться - оно и свернулось само, если захочет...
Так на каждое действие прийдётся новую функцию клепать

Posted: Mon Aug 20, 2007 5:07 pm
by bw
А так придется новые сообщения и обработчики клепать, не вижу разницы.
К тому же это совсем др. вешь и служит она для др. целей. И вообще то, в винде окна сворачиваются вызовом функции, а не посылкой сообщения.

..bw

Posted: Mon Aug 20, 2007 8:31 pm
by Alver
В проце sysfn_min_rest_window пожалуй стоит добавить ограничение на максимальный слот иначе может какая уязвимость выплывет.

Code: Select all

sysfn_min_rest_window:
     pushad
     mov   eax, ecx      ; ebx - operating
     shr   ebx, 1
     jnc    @f
     call  pid_to_slot
@@:                    ; eax - Номер слота потока.
     or    eax, eax      ; eax - number of slot
     jz    .error
     cmp   eax, 255         ; varify maximal slot number
     ja    .error      ; Проверка на выход за пределы слотов
     xor   ecx, ecx
     mov   cx, [WIN_STACK + eax*2]  ; ecx - window number
     mov   eax, ecx
     shr   ebx, 1
     jc    .restore
 ; .minimize:
     call  minimize_window
     jmp   .exit
.restore:
     call  restore_minimized_window
.exit:
     popad
     xor   eax, eax
     mov   [esp+36], eax
     ret
.error:
     popad
     xor   eax, eax
     dec   eax
     mov   [esp+36], eax
     ret
Я не знаю есть ли в Kolibri константа или переменная, указывающая максимально возможное число слотов, если есть то правильнее было бы конечно использовать ее вместо 255.

Posted: Mon Aug 20, 2007 8:45 pm
by Alver
Mario79
Не пора ли в таком случае залить на SVN?
Попроси у Mike.dld (Ленин) регистрацию и вперед.
Если честно то я с SVN как то не очень, скачивать через kdesvn научился, но лезть на сервер пожалуй побоюсь.
Если кто может залить то пожалуйста.

Описание изменений поместил здесь: http://alver-mage.narod.ru/Kolibri/koos_kernel.htm
Скомпилированное ядро: http://alver-mage.narod.ru/Kolibri/Kernel_M.7z
Програмка сворачивания стола: http://alver-mage.narod.ru/Kolibri/clean.7z
Ее исходник: http://alver-mage.narod.ru/Kolibri/clean_asm.7z

Да думаю програмку в SVN пихать не нужно, она скорее для прикола. :wink:

Posted: Mon Aug 20, 2007 10:21 pm
by vectoroc
Alver сходи на http://wiki.kolibrios.org/index.php/Как ... ом_Kolibri
bw в итоге всё сводится к фунциям, абстрагируясь, можно помоему более гибко реализовать этот сервис через сообщения

Posted: Mon Aug 20, 2007 10:46 pm
by bw
> в итоге всё сводится к фунциям, абстрагируясь, можно помоему более гибко реализовать этот сервис через сообщения
Реализуй сообщения через IPC, зачем впутывать ядро. К тому же это сомнительная гибкость, как я сказал. Всеравно нужно реализовывать обработчик. Удобство в основном состоит в том что бы вызывать фукнциональность процесса (окна) не предусмотренную ядром (графической системой). Ну да ладно, сейчас мы уйдем в спор, который ни к чему не приведет. Только зафлудим тему.

..bw

Posted: Tue Aug 21, 2007 9:27 pm
by Alver
Mario79
Ввиду того что от изначально заявленной темы осталось только 3.5 первых поста, не мог бы ты как администратор поменять название темы на более подходящее, или перенести последние посты в другую тему, скажем "О минимизации окон и т.п." или чтото в этом духе.

vectoroc
Использовать сообщения для минимизации окна, помоему больший геморой, и меньшая функциональность.
Попробую обьяснить свою позицию. Минимизация и восстановление окна фактически является элементом интерфейса рабочего стола, и служит для освобождения от нагромождений открытых приложений. Используя новые функции, можно доработать код панели, для быстрой очистки-восстановления desktopа, можно даже сделать возможность разделить окна на группы, получив подобие виртуальных рабочих мест как в GNOME,KDE и т.п. Если использовать для этих целей сообщения, вопервых время отклика возрастет, во вторых в kolibri насколько я понял, обработка кнопки сворачивания ведется ядром а не программой, если передать контроль этой функции программе, то придется переписывать все приложения, если сделать для программ возможность выбора контролировать/нет то передача сообщений неконтролирующим программам будет бесполезна.