Девайс при открытие создает поток , 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........... " и так далее. В чем дело? Я не раз использовал такую схему.