[USBPORT] Make unload work

This commit is contained in:
Timo Kreuzer 2020-10-05 15:43:47 +02:00
parent db0c59cbd4
commit e693d5ffc0
3 changed files with 30 additions and 2 deletions

View file

@ -490,7 +490,6 @@ NTAPI
USBPORT_StopDevice(IN PDEVICE_OBJECT FdoDevice) USBPORT_StopDevice(IN PDEVICE_OBJECT FdoDevice)
{ {
DPRINT1("USBPORT_StopDevice: UNIMPLEMENTED. FIXME\n"); DPRINT1("USBPORT_StopDevice: UNIMPLEMENTED. FIXME\n");
DbgBreakPoint();
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }
@ -901,6 +900,7 @@ USBPORT_StartDevice(IN PDEVICE_OBJECT FdoDevice,
return Status; return Status;
ExitWithError: ExitWithError:
USBPORT_StopWorkerThread(FdoDevice);
USBPORT_StopDevice(FdoDevice); USBPORT_StopDevice(FdoDevice);
DPRINT1("USBPORT_StartDevice: ExitWithError Status - %lx\n", Status); DPRINT1("USBPORT_StartDevice: ExitWithError Status - %lx\n", Status);

View file

@ -1390,6 +1390,11 @@ USBPORT_WorkerThread(IN PVOID StartContext)
FALSE, FALSE,
NULL); NULL);
if (FdoExtension->Flags & USBPORT_FLAG_WORKER_THREAD_EXIT)
{
break;
}
KeQuerySystemTime(&NewTime); KeQuerySystemTime(&NewTime);
KeAcquireSpinLock(&FdoExtension->WorkerThreadEventSpinLock, &OldIrql); KeAcquireSpinLock(&FdoExtension->WorkerThreadEventSpinLock, &OldIrql);
@ -1445,6 +1450,23 @@ USBPORT_CreateWorkerThread(IN PDEVICE_OBJECT FdoDevice)
return Status; return Status;
} }
VOID
NTAPI
USBPORT_StopWorkerThread(IN PDEVICE_OBJECT FdoDevice)
{
PUSBPORT_DEVICE_EXTENSION FdoExtension;
NTSTATUS Status;
DPRINT("USBPORT_StopWorkerThread ... \n");
FdoExtension = FdoDevice->DeviceExtension;
FdoExtension->Flags |= USBPORT_FLAG_WORKER_THREAD_EXIT;
USBPORT_SignalWorkerThread(FdoDevice);
Status = ZwWaitForSingleObject(FdoExtension->WorkerThreadHandle, FALSE, NULL);
NT_ASSERT(Status == STATUS_SUCCESS);
}
VOID VOID
NTAPI NTAPI
USBPORT_SynchronizeControllersStart(IN PDEVICE_OBJECT FdoDevice) USBPORT_SynchronizeControllersStart(IN PDEVICE_OBJECT FdoDevice)

View file

@ -8,7 +8,7 @@
#ifndef USBPORT_H__ #ifndef USBPORT_H__
#define USBPORT_H__ #define USBPORT_H__
#include <ntddk.h> #include <ntifs.h>
#include <windef.h> #include <windef.h>
#include <stdio.h> #include <stdio.h>
#include <wdmguid.h> #include <wdmguid.h>
@ -67,6 +67,7 @@
#define USBPORT_FLAG_HC_STARTED 0x00000002 #define USBPORT_FLAG_HC_STARTED 0x00000002
#define USBPORT_FLAG_HC_POLLING 0x00000004 #define USBPORT_FLAG_HC_POLLING 0x00000004
#define USBPORT_FLAG_WORKER_THREAD_ON 0x00000008 #define USBPORT_FLAG_WORKER_THREAD_ON 0x00000008
#define USBPORT_FLAG_WORKER_THREAD_EXIT 0x00000010
#define USBPORT_FLAG_HC_SUSPEND 0x00000100 #define USBPORT_FLAG_HC_SUSPEND 0x00000100
#define USBPORT_FLAG_INTERRUPT_ENABLED 0x00000400 #define USBPORT_FLAG_INTERRUPT_ENABLED 0x00000400
#define USBPORT_FLAG_SELECTIVE_SUSPEND 0x00000800 #define USBPORT_FLAG_SELECTIVE_SUSPEND 0x00000800
@ -595,6 +596,11 @@ NTAPI
USBPORT_CreateWorkerThread( USBPORT_CreateWorkerThread(
IN PDEVICE_OBJECT FdoDevice); IN PDEVICE_OBJECT FdoDevice);
VOID
NTAPI
USBPORT_StopWorkerThread(
IN PDEVICE_OBJECT FdoDevice);
BOOLEAN BOOLEAN
NTAPI NTAPI
USBPORT_StartTimer( USBPORT_StartTimer(