PsCreateSystemThread зависает?
От: Аноним  
Дата: 06.11.06 14:47
Оценка:
Девайс при открытие создает поток , 1ый раз все Ок , следующие разы поток стартует с задержкой от 3 до 10 минут, Юзер приложение по тайм-ауту считает что девайс не подключен, переинициализируется, ждет минут 5, потом опять пытается подрубиться и так до бесконечности.Схема простая:
NTSTATUS WorkerThreadStart(PVOID Context)
{
..........................................................

    KdPrint(("WorkerThreadStart Enter \r\n"));

    Context->bWriteThreadAlive = TRUE;
 
    status = PsCreateSystemThread(&WriteThreadHandle,
                                    THREAD_ALL_ACCESS,
                                    NULL,
                                    NULL,
                                    NULL,
                                    WorkerThread,
                                    (PVOID)pTdiSession);

    KdPrint(("PsCreateSystemThread go........... \r\n"));

    if (status != STATUS_SUCCESS)
        return status;

    KdPrint(("Thread Create Enter \r\n"));

    status = ObReferenceObjectByHandle(WriteThreadHandle,
                                  THREAD_ALL_ACCESS,
                                  NULL,
                                  KernelMode,
                                  (PVOID *)&Context->pThread,
                                  NULL);

    if (status != STATUS_SUCCESS)
    {
        Context->bWriteThreadAlive = FALSE;
    }
    else
        ZwClose(WriteThreadHandle);


    return status;
}

VOID WorkerThread(IN PVOID StartContext)
{
.............................................................

    BOOLEAN                    workThread = TRUE;
//    LARGE_INTEGER            DelayTime;

    KdPrint(("WorkerThread Enter \r\n"));

    events[EV_START]    = &pDevExt->eStart;
    events[EV_STOP]        = &pDevExt->eStop;

    while (workThread)
    {
        switch (KeWaitForMultipleObjects(2, events, WaitAny, Executive, KernelMode, FALSE, NULL, waitBlocks))
        {
        case EV_START:
            {
                KdPrint(("Thread: START\n") );
                Start();
                break;
            }
        case EV_STOP:
            {
                KdPrint(("Thread: STOP\n") );
                Stop();
                workThread = FALSE;

                break;
            }
        }
    }

    ObDereferenceObject(pDevExt->pThread);
    pDevExt->pThread = NULL;

    pDevExt->bWriteThreadAlive = FALSE;

    
    KdPrint(( "Waiting After Disconnect...\n" ));
    DelayTime.QuadPart = -10000000*5;   // 5 Seconds
    KeDelayExecutionThread( KernelMode, FALSE, &DelayTime );

    KdPrint(("Thread: Exiting...\n") );

    (void)PsTerminateSystemThread( STATUS_SUCCESS );
}

"WorkerThreadStart Enter" это последнее что я вижу в отладчике, через ннекоторое время появляется "PsCreateSystemThread go........... " и так далее. В чем дело? Я не раз использовал такую схему.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.