// Für Win98DDK, mit Nachhilfe von W. Oney für Kugelsicherheit
#include <wdm.h>
#include "w2k.h"
VOID InitializeRemoveLock(PIO_REMOVE_LOCK rl) {
rl->ct=1; // 1 = Null Referenzen, 0 = Ende mit Warten
rl->rm=FALSE; // TRUE wenn Gerät entfernt werden soll und Acquire versagt
KeInitializeEvent(&rl->ev,NotificationEvent,FALSE);
}
NTSTATUS AcquireRemoveLock(PIO_REMOVE_LOCK rl) { // Inbesitznahme
InterlockedIncrement(&rl->ct);
if (rl->rm) {
ReleaseRemoveLock(rl);
return STATUS_DELETE_PENDING; // im Ernstfall ist dieser Thread weg!?
}
return STATUS_SUCCESS;
}
VOID ReleaseRemoveLock(PIO_REMOVE_LOCK rl) { // Freigabe
if (!InterlockedDecrement(&rl->ct)) KeSetEvent(&rl->ev,IO_NO_INCREMENT,FALSE);
}
VOID ReleaseRemoveLockAndWait(PIO_REMOVE_LOCK rl) {
rl->rm++;
InterlockedDecrement(&rl->ct); // Nun kann es auch Null werden
ReleaseRemoveLock(rl);
KeWaitForSingleObject(&rl->ev,Executive,KernelMode,FALSE,NULL);
}
Detected encoding: ANSI (CP1252) | 4
|
|