这个实例在src|network|ndis|packet
问题一:
read.c的中一段代码如下
//
    //  Allocate an MDL to map the portion of the buffer following the
    //  header
    //
    pMdl=IoAllocateMdl(
              MmGetMdlVirtualAddress(irp->MdlAddress),
              MmGetMdlByteCount(irp->MdlAddress),
              FALSE,
              FALSE,
              NULL
              );
    if (pMdl == NULL) {
        DebugPrint(("Packet: Read-Failed to allocate Mdl\n"));
        status = NDIS_STATUS_RESOURCES;
        goto ERROR;
    }    //
    //  Build the mdl to point to the the portion of the buffer following
    //  the header
    //
    IoBuildPartialMdl(
        irp->MdlAddress,
        pMdl,
        ((PUCHAR)MmGetMdlVirtualAddress(irp->MdlAddress))+ETHERNET_HEADER_LENGTH,
        0
        );
问题在执行
pMdl=IoAllocateMdl(
              MmGetMdlVirtualAddress(irp->MdlAddress),
              MmGetMdlByteCount(irp->MdlAddress),
              FALSE,
              FALSE,
              NULL
              );
之后,pMdl描述的是就是irp->MdlAddress描述的内存块,而
IoBuildPartialMdl(
        irp->MdlAddress,
        pMdl,
        ((PUCHAR)MmGetMdlVirtualAddress(irp->MdlAddress))+ETHERNET_HEADER_LENGTH,
        0
        );
之后,pMdl描述的是从以太网头(ETHERNET_HEADER)后面开始内存段,所以pMdl的MdlByteCount应当要减去
ETHERNET_HEADER_LENGTH,所以我觉得这里有问题,代码应当改成这样。
pMdl=IoAllocateMdl(
              (PVOID)((PUCHAR)MmGetMdlVirtualAddress(irp->MdlAddress)+ETHERNET_HEADER_LENGTH),
              MmGetMdlByteCount(irp->MdlAddress)-ETHERNET_HEADER_LENGTH,
              FALSE,
              FALSE,
              NULL
              );
而去掉
IoBuildPartialMdl(
        irp->MdlAddress,
        pMdl,
        ((PUCHAR)MmGetMdlVirtualAddress(irp->MdlAddress))+ETHERNET_HEADER_LENGTH,
        0
        );
但是这样做之后,我用测试程序测试时执行命令adapter|read后系统突然重起。
请高手指点,我这样做是否合理