mirror of
https://github.com/veracrypt/VeraCrypt.git
synced 2025-11-11 02:58:02 -06:00
Windows driver: simplify TCSleep to use KeDelayExecutionThread
Replace timer-based TCSleep (which allocated a KTIMER and waited on it) with an implementation that calls KeDelayExecutionThread. This removes dynamic allocation and kernel timer usage to simplify the code and reduce resource overhead. Adds an IRQL <= APC_LEVEL assertion and documents the requirement. This is safe because TCSleep is always called from code that runs at PASSIVE_LEVEL
This commit is contained in:
@@ -2992,21 +2992,13 @@ void TCStopVolumeThread (PDEVICE_OBJECT DeviceObject, PEXTENSION Extension)
|
|||||||
|
|
||||||
|
|
||||||
// Suspend current thread for a number of milliseconds
|
// Suspend current thread for a number of milliseconds
|
||||||
void TCSleep (int milliSeconds)
|
// Must be called at IRQL <= APC_LEVEL
|
||||||
|
VOID TCSleep(ULONG milliSeconds)
|
||||||
{
|
{
|
||||||
PKTIMER timer = (PKTIMER) TCalloc (sizeof (KTIMER));
|
LARGE_INTEGER interval;
|
||||||
LARGE_INTEGER duetime;
|
interval.QuadPart = -(LONGLONG)milliSeconds * 10000; // 100 ns units
|
||||||
|
ASSERT(KeGetCurrentIrql() <= APC_LEVEL);
|
||||||
if (!timer)
|
(void)KeDelayExecutionThread(KernelMode, FALSE, &interval);
|
||||||
return;
|
|
||||||
|
|
||||||
duetime.QuadPart = (__int64) milliSeconds * -10000;
|
|
||||||
KeInitializeTimerEx(timer, NotificationTimer);
|
|
||||||
KeSetTimerEx(timer, duetime, 0, NULL);
|
|
||||||
|
|
||||||
KeWaitForSingleObject (timer, Executive, KernelMode, FALSE, NULL);
|
|
||||||
|
|
||||||
TCfree (timer);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOL IsDeviceName(wchar_t wszVolume[TC_MAX_PATH])
|
BOOL IsDeviceName(wchar_t wszVolume[TC_MAX_PATH])
|
||||||
|
|||||||
@@ -151,7 +151,7 @@ NTSTATUS TCStartVolumeThread (PDEVICE_OBJECT DeviceObject, PEXTENSION Extension,
|
|||||||
void TCStopThread (PKTHREAD kThread, PKEVENT wakeUpEvent);
|
void TCStopThread (PKTHREAD kThread, PKEVENT wakeUpEvent);
|
||||||
void TCStopVolumeThread (PDEVICE_OBJECT DeviceObject, PEXTENSION Extension);
|
void TCStopVolumeThread (PDEVICE_OBJECT DeviceObject, PEXTENSION Extension);
|
||||||
VOID VolumeThreadProc (PVOID Context);
|
VOID VolumeThreadProc (PVOID Context);
|
||||||
void TCSleep (int milliSeconds);
|
void TCSleep (ULONG milliSeconds);
|
||||||
void TCGetNTNameFromNumber (LPWSTR ntname, int cbNtName, int nDriveNo);
|
void TCGetNTNameFromNumber (LPWSTR ntname, int cbNtName, int nDriveNo);
|
||||||
void TCGetDosNameFromNumber (LPWSTR dosname, int cbDosName, int nDriveNo, DeviceNamespaceType namespaceType);
|
void TCGetDosNameFromNumber (LPWSTR dosname, int cbDosName, int nDriveNo, DeviceNamespaceType namespaceType);
|
||||||
LPWSTR TCTranslateCode (ULONG ulCode);
|
LPWSTR TCTranslateCode (ULONG ulCode);
|
||||||
|
|||||||
Reference in New Issue
Block a user