Windows K从驱动程序获取时锁定块';主线程
我有一个Windows K从驱动程序获取时锁定块';主线程,windows,multithreading,kernel,driver,wdk,Windows,Multithreading,Kernel,Driver,Wdk,我有一个KSPIN\u锁,它在Windows驱动程序的主线程和我用PsCreateSystemThread创建的一些线程之间共享。问题是,如果我试图获取自旋锁并且没有解除锁定,主线程就会阻塞。我很不明白为什么会这样。。据我所知,这可能与主线程在驱动程序IRQL上运行,而其他线程在被动_级别上运行这一事实有关 注意:如果我只运行主线程,获取/释放锁就可以了 注意:我正在使用功能KeAcquireSpinLock和KeReleaseSpinLock获取/释放锁。以下是我的“卡住”自旋锁检查表: 确保
KSPIN\u锁
,它在Windows驱动程序的主线程和我用PsCreateSystemThread
创建的一些线程之间共享。问题是,如果我试图获取自旋锁并且没有解除锁定,主线程就会阻塞。我很不明白为什么会这样。。据我所知,这可能与主线程在驱动程序IRQL上运行,而其他线程在被动_级别上运行这一事实有关
注意:如果我只运行主线程,获取/释放锁就可以了
注意:我正在使用功能KeAcquireSpinLock
和KeReleaseSpinLock
获取/释放锁。以下是我的“卡住”自旋锁检查表:
typedef struct _MY_LOCK {
KSPIN_LOCK Lock;
ULONG OwningProcessor;
KIRQL OldIrql;
} MY_LOCK;
void MyInitialize(MY_LOCK *lock) {
KeInitializeSpinLock(&lock->Lock);
lock->OwningProcessor = (ULONG)-1;
}
void MyAcquire(MY_LOCK *lock) {
ULONG current = KeGetCurrentProcessorIndex();
NT_ASSERT(KeGetCurrentIrql() <= DISPATCH_LEVEL);
NT_ASSERT(current != lock->OwningProcessor); // check for recursion
KeAcquireSpinLock(&lock->Lock, &lock->OldIrql);
NT_ASSERT(lock->OwningProcessor == (ULONG)-1); // check lock was inited
lock->OwningProcessor = current;
}
void MyRelease(MY_LOCK *lock) {
NT_ASSERT(KeGetCurrentProcessorIndex() == lock->OwningProcessor);
lock->OwningProcessor = (ULONG)-1;
KeReleaseSpinLock(&lock->Lock, lock->OldIrql);
}