先说结论 细节再补充
StackCount = StackSize
StackCount 是 StackLocation的数目
StackSize 是 DeviceObjectStack的数目
CurrentLocation 指的是 现在所处的StackLocation的位置
由于申请IRP者本身不具有irp空间,所以初始化时CurrentLocation = StackCount+1;
IoCallDriver 中
Irp->CurrentLocation--;
if (Irp->CurrentLocation <= 0) {
KiBugCheck3( NO_MORE_IRP_STACK_LOCATIONS, (ULONG_PTR) Irp, 0, 0 );
}
CurrentLocation会减1,然后使用IRP的空间
CurrentLocation至少为1;
在WRK源码中找到了充足的证据
#define IopInitializeIrp( Irp, PacketSize, StackSize ) { \
RtlZeroMemory( (Irp), (PacketSize) ); \
(Irp)->Type = (CSHORT) IO_TYPE_IRP; \
(Irp)->Size = (USHORT) ((PacketSize)); \
<strong>(Irp)->StackCount = (CCHAR) ((StackSize)); \
(Irp)->CurrentLocation = (CCHAR) ((StackSize) + 1); \</strong>
(Irp)->ApcEnvironment = KeGetCurrentApcEnvironment(); \
InitializeListHead (&(Irp)->ThreadListEntry); \
<strong> (Irp)->Tail.Overlay.CurrentStackLocation = \
((PIO_STACK_LOCATION) ((UCHAR *) (Irp) + \
sizeof( IRP ) + \
( (StackSize) * sizeof( IO_STACK_LOCATION )))); }</strong>