为什么IoGetInitialStack函数仅限于IRQL<=APC_级别?

为什么IoGetInitialStack函数仅限于IRQL<=APC_级别?,c,windows,kernel,disassembly,irql,C,Windows,Kernel,Disassembly,Irql,我试图在Windows内核中使用的回调函数中找到堆栈的顶部(或底部)。我本想使用IoGetInitialStack函数来实现这一点,但不幸的是指出: IRQL“我的猜测是:因为指向堆栈的指针不能保证在中断>APC_级别上可用。也就是说,当设备中断启动时,可能不会自动设置堆栈。@Ctx:我可能会在这里冒险,但我不认为x86/64 CPU可以在没有堆栈的情况下走得太远。@Ctx-当前线程内核堆栈当然始终可用-不可能运行任何其他代码。线程对象本身总是来自notpaged池,所以正式地说,我们可以随时调

我试图在Windows内核中使用的回调函数中找到堆栈的顶部(或底部)。我本想使用
IoGetInitialStack
函数来实现这一点,但不幸的是指出:


IRQL“我的猜测是:因为指向堆栈的指针不能保证在中断>APC_级别上可用。也就是说,当设备中断启动时,可能不会自动设置堆栈。@Ctx:我可能会在这里冒险,但我不认为x86/64 CPU可以在没有堆栈的情况下走得太远。@Ctx-当前线程内核堆栈当然始终可用-不可能运行任何其他代码。线程对象本身总是来自notpaged池,所以正式地说,我们可以随时调用这个apiirql@RbMm:我就是这么想的。可能是文件中的打字错误。顺便说一句,什么是
gs:188h
?它是
\u ETHREAD
指针吗?这里更快意味着在dpc中断上线程可以在特殊的dpc堆栈上运行。跟平常不一样。因此,
IoGetInitialStack
失去意义的返回值。但我们可以称之为正式