Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Каким образом можно приостановить загрузку ОС 
:(
    Опции темы
Sleepman
Дата 30.8.2007, 09:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 1.1.2005
Где: Санкт-Петербург

Репутация: нет
Всего: нет



Использую winlogon notification packeges. Создал dll, экспортирующую функцию, которая вызывается при событии Logon. Функция проверяет наличие в слоте смарт-карты, а также некоторые параметры в смарт-карте. Если параметры не верны, то вызываю LockWorkStation(), при этом станция блокируется, НО процесс загрузки продолжается. Например, если в автозагрузке стоит totalcommander, то он с успехом запустится. Вопрос: как предотвратить дальнейшую загрузку ОС, после вызова LockWorkStation().
    PS. Написать свою GINA - не предлагать.
    PPS. OC - Windows 2000/XP
PM MAIL   Вверх
NiJazz
Дата 30.8.2007, 09:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Jazz coder
****


Профиль
Группа: Экс. модератор
Сообщений: 2286
Регистрация: 10.8.2003
Где: Москва

Репутация: 6
Всего: 23



Я не помню наверняка, можно ли получить описатель потока, созданного в чужом процессе. Но первое, что приходит на ум, это CreateToolhelp32Snapshot с флагом TH32CS_SNAPTHREAD. Далее, получив ThreadIDs, вызываем OpenThread и SuspendThread.
PM MAIL   Вверх
NiJazz
Дата 30.8.2007, 13:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Jazz coder
****


Профиль
Группа: Экс. модератор
Сообщений: 2286
Регистрация: 10.8.2003
Где: Москва

Репутация: 6
Всего: 23



Вот примерчик на скорую руку:
Код

#include <windows.h>
#include <Tlhelp32.h>

int _tmain(int argc, _TCHAR* argv[])
{
    HANDLE snap = ::CreateToolhelp32Snapshot( TH32CS_SNAPALL, 0 );

    if ( INVALID_HANDLE_VALUE == snap )
        return ::GetLastError();

    __try
    {
        PROCESSENTRY32 entry = {0};

        entry.dwSize = sizeof entry;

        if ( !::Process32First( snap, &entry ) )
            return ::GetLastError();

        do
        {
            HANDLE snap_ = ::CreateToolhelp32Snapshot( TH32CS_SNAPTHREAD, entry.th32ProcessID );

            if ( INVALID_HANDLE_VALUE != snap_ )
            {
                THREADENTRY32 entry_ = {0};
                entry_.dwSize = sizeof entry_;

                if ( !!::Thread32First( snap_, &entry_ ) )
                {
                    do
                    {
                        HANDLE thread = ::OpenThread( THREAD_SUSPEND_RESUME, FALSE, entry_.th32ThreadID );
                        
                        if ( !!thread )
                        {
                            ::SuspendThread( thread );
                            ::CloseHandle( thread );
                        }
                    }
                    while ( !!::Thread32Next( snap_, &entry_ ) );
                }

                ::CloseHandle( snap_ );
            }
        }
        while ( !!::Process32Next( snap, &entry ) );
    }
    __finally
    {
        ::CloseHandle( snap );
    }    

    return 0;
}


Сразу несколько замечаний:
1. Нужна проверка на ошибки
2. Нужно проверять состояние каждого потока, если он спит, то потом его не будить.
3. Можно фильтровать процессы по именам их exe (свой, к примеру, трогать не стоит).
4. Обязательно будут проблемы с доступом (а ля access denied).

У себя запустил этот код, всё повисло, пришлось перезагрузку сделать. smile
Не забудь после разбудить усыплённые потоки.
PM MAIL   Вверх
Tectoder
Дата 1.9.2007, 09:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 202
Регистрация: 13.3.2007

Репутация: 7
Всего: 8



SuspendThread это такая функция которую крайне нежелательно использовать для потоков, которые создавал не твой код. Чисто идеалогически.
Ну и кроме того, никто не гарантирует, что к тому моменту пока ты заморозишь все потоки у тебя не появяться новые потоки smile А тогда твоя функция не сделает того что должна
PM   Вверх
NiJazz
Дата 1.9.2007, 10:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Jazz coder
****


Профиль
Группа: Экс. модератор
Сообщений: 2286
Регистрация: 10.8.2003
Где: Москва

Репутация: 6
Всего: 23



Да, могут родиться новые потоки. Можно попытаться отслеживать потоки каждого процесса в отдельности.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0433 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.