Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows K从驱动程序获取时锁定块';主线程_Windows_Multithreading_Kernel_Driver_Wdk - Fatal编程技术网

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
获取/释放锁。

以下是我的“卡住”自旋锁检查表:

  • 确保已使用KeInitializeSpinLock初始化自旋锁。如果KSPIN_锁保存未初始化的垃圾,那么第一次尝试获取它可能会永远旋转
  • 检查您是否不是以递归/嵌套方式获取它。KSPIN_锁不支持递归,如果您尝试它,它将永远旋转

  • 正常的自旋锁必须在IRQL获得,非常感谢!!我终于发现了问题:我实际上是在持有自旋锁时从一个函数返回的,并且从未释放过它。。所以它是你名单上的第四名:)。我花了好几个小时才认出它。我很感激你提供的代码,你添加的所有者让我想起了互斥。另外,我很高兴您告诉我有关驱动程序验证的事情,我以前从未听说过:)。
    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);
    }