1
0
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:
Mounir IDRASSI
2025-09-08 12:14:20 +09:00
parent 7df2c2957f
commit f6f25eec8f
2 changed files with 7 additions and 15 deletions

View File

@@ -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])

View File

@@ -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);