清寜 发表于 2016-10-3 03:02:17

LIST_ENTRY 遍历问题

为什么我在网上看到和《Windows 内核安全与驱动开发》遍历LIST_ENTRY 的方式是

//摘录书中代码
BOOLEAN cfIsFileCrypting(PFILE_OBJECT file)
{
    PLIST_ENTRY p;
    PCF_NODE node;
   for(p = s_cf_list.Flink; p != &s_cf_list; p = p->Flink)
    {
          node = (PCF_NODE)p;
      if(node->fcb == file->FsContext)
      {
            //KdPrint(("cfIsFileCrypting: file %wZ is crypting. fcb = %x \r\n",&file->FileName,file->FsContext));
            return TRUE;
      }
    }
    return FALSE;
}


但是我自己实现的

    int inedx = 0;
    for (PLIST_ENTRY plist = pDevExt->ProcessHead.Flink;
      plist != &pDevExt->ProcessHead;
      plist = plist->Flink, inedx++)
    {
      KdBreakPoint();

      if (inedx == pDevExt->processInedx && inedx != pDevExt->processCount)
      {
            pDevExt->processInedx++;

            *data = CONTAINING_RECORD(plist, tagProcess, listEntry);
            return STATUS_SUCCESS;
      }
    }

只循环第一次,链表指针就飞掉了。。。 但是用那种最土的,拿一个丢一个却又能正常拿到。。。

这样子又能正常遍历完毕。。。

PDEVICE_EXTENSION pDevExt = (PDEVICE_EXTENSION)pDevObj->DeviceExtension;
   
    if (IsListEmpty(&pDevExt->ProcessHead))
    {
      *data = NULL;
      return STATUS_SUCCESS;
    }

    PLIST_ENTRY plist = RemoveTailList(&pDevExt->ProcessHead);

    *data = CONTAINING_RECORD(plist, tagProcess, listEntry);

    return STATUS_SUCCESS;

我就是不想获取一个就释放一个。但是用for。我这里每次循环拿第二项的时候就指针错乱了。。 有人遇见过这种情况吗???

环境 7600 XP Checked 版本

马大哈 发表于 2016-10-7 06:58:38

帮顶........

驱动相关问题请 @Tesla.Angela

gfw 发表于 2016-10-8 10:06:04

难道你要找的是这个?
http://www.m5home.com/bbs/thread-8450-1-1.html

Tesla.Angela 发表于 2016-10-30 01:25:01

遍历链表参考我的这个帖子(http://www.m5home.com/bbs/thread-8450-1-1.html)即可。
页: [1]
查看完整版本: LIST_ENTRY 遍历问题