Пишу 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 "
В чем тут дело и как правильно остановить процесс ??