|
为什么我在网上看到和《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 版本 |
|