VOID NTAPI FatNotifyReportChange(IN PFAT_IRP_CONTEXT IrpContext, IN PVCB Vcb, IN PFCB Fcb, IN ULONG Filter, IN ULONG Action) { if (Fcb->FullFileName.Buffer == NULL) FatSetFullFileNameInFcb(IrpContext, Fcb); ASSERT(Fcb->FullFileName.Length != 0 ); ASSERT(Fcb->FileNameLength != 0 ); ASSERT(Fcb->FullFileName.Length > Fcb->FileNameLength ); ASSERT(Fcb->FullFileName.Buffer[(Fcb->FullFileName.Length - Fcb->FileNameLength)/sizeof(WCHAR) - 1] == L'\\' ); FsRtlNotifyFullReportChange(Vcb->NotifySync, &Vcb->NotifyList, (PSTRING)&Fcb->FullFileName, (USHORT)(Fcb->FullFileName.Length - Fcb->FileNameLength), NULL, NULL, Filter, Action, NULL); }
PFCB NTAPI FatCreateDcb(IN PFAT_IRP_CONTEXT IrpContext, IN PVCB Vcb, IN PFCB ParentDcb, IN FF_FILE *FileHandle) { PFCB Fcb; /* Allocate it and zero it */ Fcb = ExAllocatePoolWithTag(NonPagedPool, sizeof(FCB), TAG_FCB); RtlZeroMemory(Fcb, sizeof(FCB)); /* Set node types */ Fcb->Header.NodeTypeCode = FAT_NTC_DCB; Fcb->Header.NodeByteSize = sizeof(FCB); Fcb->Condition = FcbGood; /* Initialize resources */ Fcb->Header.Resource = &Fcb->Resource; ExInitializeResourceLite(Fcb->Header.Resource); Fcb->Header.PagingIoResource = &Fcb->PagingIoResource; ExInitializeResourceLite(Fcb->Header.PagingIoResource); /* Initialize mutexes */ Fcb->Header.FastMutex = &Fcb->HeaderMutex; ExInitializeFastMutex(&Fcb->HeaderMutex); FsRtlSetupAdvancedHeader(&Fcb->Header, &Fcb->HeaderMutex); /* Insert into parent's DCB list */ InsertHeadList(&ParentDcb->Dcb.ParentDcbList, &Fcb->ParentDcbLinks); /* Set backlinks */ Fcb->ParentFcb = ParentDcb; Fcb->Vcb = Vcb; /* Initialize parent dcb list */ InitializeListHead(&Fcb->Dcb.ParentDcbList); /* Set FullFAT handle */ Fcb->FatHandle = FileHandle; /* Set names */ if (FileHandle) { FatSetFcbNames(IrpContext, Fcb); /* Ensure the full name is set */ FatSetFullFileNameInFcb(IrpContext, Fcb); } return Fcb; }