阅读:1046回复:2
痛苦解决之路: copy问题
我引用了大师的一段清缓存代码;copy的问题茂似解决了,只是我不太确定,因为测试得少啊
我的测试: copy d盘的test.txt文件(密文)到e: 盘 和c:盘,重启动计算机看e:/c:盘的文件都是密文. 下面给出代码,大家一起测试看看: void ManageFileCache(PFILE_OBJECT pFileObject, BOOLEAN bClearOrFlush) { PFSRTL_COMMON_FCB_HEADER pFcb; LARGE_INTEGER liInterval; BOOLEAN bNeedReleaseResource = FALSE; BOOLEAN bNeedReleasePagingIoResource = FALSE; KIRQL irql; pFcb = (PFSRTL_COMMON_FCB_HEADER)pFileObject->FsContext; if(pFcb == NULL) { return; } irql = KeGetCurrentIrql(); if (irql >= DISPATCH_LEVEL) { return; } liInterval.QuadPart = -1 * (LONGLONG)50; while (TRUE) { BOOLEAN bBreak = TRUE; BOOLEAN bLockedResource = FALSE; BOOLEAN bLockedPagingIoResource = FALSE; bNeedReleaseResource = FALSE; bNeedReleasePagingIoResource = FALSE; if (pFcb->PagingIoResource) { bLockedPagingIoResource = ExIsResourceAcquiredExclusiveLite(pFcb->PagingIoResource); } if (pFcb->Resource) { bLockedResource = TRUE; if (ExIsResourceAcquiredExclusiveLite(pFcb->Resource) == FALSE) { bNeedReleaseResource = TRUE; if (bLockedPagingIoResource) { if (ExAcquireResourceExclusiveLite(pFcb->Resource, FALSE) == FALSE) { bBreak = FALSE; bNeedReleaseResource = FALSE; bLockedResource = FALSE; } } else { ExAcquireResourceExclusiveLite(pFcb->Resource, TRUE); } } } //if (bBreak) if (bLockedPagingIoResource == FALSE) { if (pFcb->PagingIoResource) { bLockedPagingIoResource = TRUE; bNeedReleasePagingIoResource = TRUE; if (bLockedResource) { if (ExAcquireResourceExclusiveLite(pFcb->PagingIoResource, FALSE) == FALSE) { bBreak = FALSE; bLockedPagingIoResource = FALSE; bNeedReleasePagingIoResource = FALSE; } } else { ExAcquireResourceExclusiveLite(pFcb->PagingIoResource, TRUE); } } } if (bBreak) { break; } if (bNeedReleasePagingIoResource) { ExReleaseResourceLite(pFcb->PagingIoResource); } if (bNeedReleaseResource) { ExReleaseResourceLite(pFcb->Resource); } if (irql == PASSIVE_LEVEL) { KeDelayExecutionThread(KernelMode, FALSE, &liInterval); } else { KEVENT waitEvent; KeInitializeEvent(&waitEvent, NotificationEvent, FALSE); KeWaitForSingleObject(&waitEvent, Executive, KernelMode, FALSE, &liInterval); } } //加锁完毕 if (pFileObject->SectionObjectPointer) { if (bClearOrFlush == FALSE) { IO_STATUS_BLOCK ioStatus; CcFlushCache(pFileObject->SectionObjectPointer, NULL, 0, &ioStatus); if (pFileObject->SectionObjectPointer->ImageSectionObject) { MmFlushImageSection(pFileObject->SectionObjectPointer, MmFlushForWrite);//MmFlushForDelete } } CcPurgeCacheSection(pFileObject->SectionObjectPointer, NULL, 0, FALSE); } if (bNeedReleasePagingIoResource) { ExReleaseResourceLite(pFcb->PagingIoResource); } if (bNeedReleaseResource) { ExReleaseResourceLite(pFcb->Resource); } } |
|
沙发#
发布于:2007-07-05 17:27
忘了这段代码是哪位老大贡献的了,先谢过拉
对拉,我还是带怀疑: 清cache能解决copy密文变成明文的问题吗??? 各位,....... |
|
板凳#
发布于:2007-07-18 08:25
ding
|
|
|