阅读:2865回复:5
漏文件,不知道原因,请兄弟们帮忙看看
用下面的代码不知道为什么会漏掉文件有的时候。
if (NT_SUCCESS(Status) && (STATUS_REPARSE != Status) && SfIsObjectFile(FileObject)) { PFILE_CONTEXT FileCtxPtr2 = NULL; BOOLEAN NewElement = FALSE; FileCtxPtr->FsContext = FileObject->FsContext; ExAcquireFastMutex(&DevExt->FsCtxTableMutex); FileCtxPtr2 = RtlLookupElementGenericTable(&DevExt->FsCtxTable, FileCtxPtr); if (FileCtxPtr2) { ++FileCtxPtr2->RefCount; KdPrint(("SfCreate2: FileCtxPtr2->Name = %s\n", FileCtxPtr2->Name)); } else { FileCtxPtr2 = RtlInsertElementGenericTable( &DevExt->FsCtxTable, FileCtxPtr, sizeof(FILE_CONTEXT), &NewElement //设置为False,返回以个空的指针 ); FileCtxPtr2->RefCount = 1; ASSERT(FileName); strcpy(FileCtxPtr2->Name, fullPathName); KdPrint(("SfCreate: FileCtxPtr2->Name = %s\n", FileCtxPtr2->Name)); KeInitializeEvent(&FileCtxPtr2->Event, SynchronizationEvent, TRUE); } FileCtxPtr2->DeleteOnClose = DeleteOnClose; ExReleaseFastMutex(&DevExt->FsCtxTableMutex); KeWaitForSingleObject(&FileCtxPtr2->Event, Executive, KernelMode, FALSE, NULL); KeSetEvent(&FileCtxPtr2->Event, IO_NO_INCREMENT, FALSE); |
|
沙发#
发布于:2008-02-22 09:41
//
// Log (if it is turned on) and pass the request on. // // // We only care about volume filter device object // if (!DevExt->DiskDeviceObject) { IoSkipCurrentIrpStackLocation(Irp); return IoCallDriver(DevExt->AttachedToDeviceObject, Irp); } if (((FileObject->Flags & FO_STREAM_FILE) == FO_STREAM_FILE) || (FileObject->SectionObjectPointer && (CcGetFileObjectFromSectionPtrs(FileObject->SectionObjectPointer) == FileObject))) { } else { FileCtxHdr.FsContext = FileObject->FsContext; ExAcquireFastMutex(&DevExt->FsCtxTableMutex); FileCtxPtr = RtlLookupElementGenericTable(&DevExt->FsCtxTable, &FileCtxHdr); if (FileCtxPtr) { //KdPrint(("SfClose: %s\n", FileCtxPtr->Name)); if (FileCtxPtr->RefCount > 0) --FileCtxPtr->RefCount; if ((0 == FileCtxPtr->RefCount) && (!FileObject->SectionObjectPointer || (!FileObject->SectionObjectPointer->DataSectionObject && !FileObject->SectionObjectPointer->ImageSectionObject))) { //KdPrint(("SfClose: %s\n", FileCtxPtr->Name)); RtlDeleteElementGenericTable(&DevExt->FsCtxTable, &FileCtxHdr); } } ExReleaseFastMutex(&DevExt->FsCtxTableMutex); } IoSkipCurrentIrpStackLocation(Irp); return IoCallDriver(DevExt->AttachedToDeviceObject, Irp); |
|
板凳#
发布于:2008-02-22 11:30
去试试,谢谢了先
|
|