Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Проблема с остановкой процесса  (Прочитано 6487 раз)
0 Пользователей и 2 Гостей смотрят эту тему.
onio
Гость
« : 01-12-2009 21:05 » 

Пишу IM driver вернее дорабатываю passthru =)  необходимо добавить Процесс который делал то что мне надо, а точнее сбрасывал переменную ... но суть не в этом ...

Глобальные переменные :

Код:
PADAPT             pAdaptList = NULL;  // это device extension
PETHREAD         pThreadObj;

В Drive Entry вызываю процедуру регистрации процесса
Код:
	InitThreadTimer(DriverObject);

Вот сама InitThreadTimer(DriverObject);

Код:
NTSTATUS InitThreadTimer(IN PDRIVER_OBJECT pDriverObject)
{
HANDLE hThread;
NTSTATUS status;
PADAPT pAdapt = NULL;

status = PsCreateSystemThread(&hThread, THREAD_ALL_ACCESS, NULL,(HANDLE)0,NULL, ThreadTimer, NULL);
ObReferenceObjectByHandle(hThread, THREAD_ALL_ACCESS, NULL, KernelMode, (PVOID*)&pThreadObj, NULL);

ZwClose(hThread);

if(!NT_SUCCESS(status)) return status;

return status;

}

Вот процедура потока ThreadTimer()

Код:
VOID ThreadTimer(IN PVOID pContext)
{
    KEVENT  kEvent;
KTIMER kTimer;
    LARGE_INTEGER   qTimeout;
LARGE_INTEGER   delay;
PADAPT pAdapt = NULL;

    qTimeout.QuadPart = 10000L;
    qTimeout.QuadPart *= 2000;
qTimeout.QuadPart = -(qTimeout.QuadPart);

KeInitializeEvent(&kEvent,SynchronizationEvent,FALSE);

KeWaitForSingleObject((PVOID)&kEvent,Executive,KernelMode,FALSE,&qTimeout); //ну тут я жду пока проинтелизируется мой адаптер

KeInitializeTimer(&kTimer);

DbgPrint("WAIT... INIT ADAPTER");

pAdapt = pAdaptList;   // тут я плучаю девайс екстеншин
pAdapt->bThreadTerminate = FALSE;

while(TRUE)
{
if(pAdapt->bThreadTerminate == TRUE)
{
DbgPrint(" PsTerminateSystemThread ");

PsTerminateSystemThread(STATUS_SUCCESS);
}

KeSetTimer(&kTimer,qTimeout,NULL);
KeWaitForSingleObject(&kTimer, Executive, KernelMode, FALSE, NULL);

DbgPrint(" ThreadTimer - 2 sek :: reset ");

NdisAcquireSpinLock(&pAdapt->TimerLock);

pAdapt->Counter = 0;

        NdisReleaseSpinLock(&pAdapt->TimerLock);
}

}

Тут все работает как надо, проблемы начинаются когда я пытаюсь сделать unload

а Unload я делаю в NDIS_STATUS PtDeregisterDevice(VOID) потому что сдесь еще доступно девайс екстеншен.

Код:
            KEVENT      kEvent;
            LARGE_INTEGER   qTimeout;
PADAPT pAdapt = NULL;
            NDIS_STATUS Status = NDIS_STATUS_SUCCESS;

            DBGPRINT(("==>PassthruDeregisterDevice\n"));
pAdapt = pAdaptList;

qTimeout.QuadPart = 10000L;
            qTimeout.QuadPart *= 5000;
qTimeout.QuadPart = -(qTimeout.QuadPart);

if(pAdapt != NULL)
{
pAdapt->bThreadTerminate = TRUE;

KeInitializeEvent(&kEvent,SynchronizationEvent,FALSE);
KeWaitForSingleObject((PVOID)&kEvent,Executive,KernelMode,FALSE,&qTimeout);

DbgPrint(" IF pAdapt->bThreadTerminate STOP %x\n",pAdapt->bThreadTerminate);

KeWaitForSingleObject(pThreadObj,Executive,KernelMode,FALSE,NULL);
}

DBGPRINT(("STOP ALL THREAD - 5 sek"));

Ну и собственно в отладчике после UNLOAD я вижу бесконечное повторение  " ThreadTimer - 2 sek :: reset "

В чем тут дело и как правильно остановить процесс ??


« Последнее редактирование: 02-12-2009 18:28 от onio » Записан
Sel
Злобный
Администратор

ru
Offline Offline

« Ответ #1 : 02-12-2009 03:33 » 

"Унлод" - это шедевр.  Жжешь  Слушай, onio, ты по национальности китаец или...?
Исправь грамматику русского языка в своем сообщении!
Записан

Слово не воробей. Всё не воробей, кроме воробья.
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 02-12-2009 08:21 » 

ЭТО пример того, как делать не надо)
такой вид корявой синхронизации потоков - криво будет работает даже в ring-3. а вы его в драйвер запихиваете...

особенно остроумно - использование Event вместо Sleep()
только пустых циклов не хватает для полной картины)))

короче все криво.вопрос:
почему вы используете именно нить? (может быть можно было обойтись DPC-таймерами?)

межпроцессорная сигнализация флагами через переменные - честно говоря, неудачный способ синхроназации. во первых, он крайне запутывает понимание программы, а значит  эта путанница рано или поздно приведет к труднообъяснимым ошибкам. а во вторых их потом чрезвычайно трудно искать.
почему я так говорю - у нас писали похожий шедевр в приложении, понять что там в коде - невозможно, и вечно падает.

крайне рекомендую переделать все на mutex-ах или семафорах. будет радовать глаз)
из ошибок что бросаются в глаза: pAdapt->bThreadTerminate и аналогичные должны быть объявлены как volatile. и посмотрите что на каких IRQL вызывается на всякий случай.

и еще, на будущее. в NDIS не рекомендуется использовать обычные функции ядра. рекомендуется использовать только NDIS функции - там  даже выделение памяти объявлено. почти каждой функции ядра есть NDIS аналог. на этот счет есть соответствующие рекомендации DDK.
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
onio
Гость
« Ответ #3 : 02-12-2009 16:27 » 

Ochkarik, спасибо вам за критику...  Это была моя первая попытка в жизни работы с потоками =)

В итоге сделал с использванием DPC таймера, все отлично работает да и кода в 4 раза меньше. Спасибо.
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #4 : 02-12-2009 19:22 » 

Пардон, если был чересчур резок)
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines