从上面的代码里可以看到调用函数VfatAddEntry@H_403_2@来添加文件或目录的入口,其实现的代码如下:
#001 @H_403_2@NTSTATUS@H_403_2@
#002 @H_403_2@VfatAddEntry(@H_403_2@
#003 @H_403_2@@H_403_2@IN PDEVICE_EXTENSION DeviceExt,@H_403_2@
@H_502_25@#004 @H_403_2@IN PUNICODE_STRING NameU,@H_403_2@
@H_502_25@#005 @H_403_2@IN PVFATFCB *Fcb,@H_403_2@
#006 @H_403_2@IN PVFATFCB ParentFcb,@H_403_2@
#007 @H_403_2@IN ULONG RequestedOptions,@H_403_2@
#008 @H_403_2@IN UCHAR ReqAttr)@H_403_2@
@H_403_2@
这里判断是使用扩展的FAT16@H_403_2@或者FAT32@H_403_2@。@H_403_2@@H_403_2@
#010 @H_403_2@if (DeviceExt->Flags & VCB_IS_FATX)@H_403_2@
#011 @H_403_2@return FATXAddEntry(DeviceExt,NameU,Fcb,ParentFcb,RequestedOptions,ReqAttr);@H_403_2@
@H_403_2@
这里使用原来的FAT16@H_403_2@或者FAT32@H_403_2@。@H_403_2@@H_403_2@
#013 @H_403_2@return FATAddEntry(DeviceExt,ReqAttr);@H_403_2@
@H_403_2@
接着来分析创建一个FAT@H_403_2@入口函数FATAddEntry@H_403_2@:@H_403_2@@H_403_2@
#001 @H_403_2@static NTSTATUS@H_403_2@
#002 @H_403_2@FATAddEntry(@H_403_2@
#003 @H_403_2@IN PDEVICE_EXTENSION DeviceExt,@H_403_2@
@H_502_25@#005 @H_403_2@IN PVFATFCB* Fcb,@H_403_2@
#008 @H_403_2@IN UCHAR ReqAttr)@H_403_2@
#010 @H_403_2@PVOID Context = NULL;@H_403_2@
#011 @H_403_2@PFAT_DIR_ENTRY pFatEntry;@H_403_2@
#012 @H_403_2@slot *pSlots;@H_403_2@
#013 @H_403_2@USHORT nbSlots = 0,j,posCar;@H_403_2@
#014 @H_403_2@PUCHAR Buffer;@H_403_2@
#015 @H_403_2@BOOLEAN needTilde = FALSE,needLong = FALSE;@H_403_2@
#016 @H_403_2@BOOLEAN lCaseBase = FALSE,uCaseBase,lCaseExt = FALSE,uCaseExt;@H_403_2@
#017 @H_403_2@ULONG CurrentCluster;@H_403_2@
#018 @H_403_2@LARGE_INTEGER SystemTime,FileOffset;@H_403_2@
#019 @H_403_2@NTSTATUS Status = STATUS_SUCCESS;@H_403_2@
#020 @H_403_2@ULONG size;@H_403_2@
#021 @H_403_2@long i;@H_403_2@
#023 @H_403_2@OEM_STRING NameA;@H_403_2@
#024 @H_403_2@CHAR aName[13];@H_403_2@
#025 @H_403_2@BOOLEAN IsNameLegal;@H_403_2@
#026 @H_403_2@BOOLEAN SpacesFound;@H_403_2@
#028 @H_403_2@VFAT_DIRENTRY_CONTEXT DirContext;@H_403_2@
#029 @H_403_2@WCHAR LongNameBuffer[LONGNAME_MAX_LENGTH + 1];@H_403_2@
#030 @H_403_2@WCHAR ShortNameBuffer[13];@H_403_2@
#032 @H_403_2@DPRINT("addEntry: Name='%wZ',Dir='%wZ'/n",&ParentFcb->PathNameU);@H_403_2@
#034 @H_403_2@DirContext.LongNameU = *NameU;@H_403_2@
#036 @H_403_2@/* nb of entry needed for long name+normal entry */@H_403_2@
@H_403_2@
计算一个FAT@H_403_2@入口的占用内存大小。@H_403_2@@H_403_2@
#037 @H_403_2@nbSlots = (DirContext.LongNameU.Length / sizeof(WCHAR) + 12) / 13 + 1;@H_403_2@
#038 @H_403_2@DPRINT("NameLen= %d,nbSlots =%d/n",DirContext.LongNameU.Length / sizeof(WCHAR),nbSlots);@H_403_2@
@H_403_2@
分配FAT@H_403_2@的入口内存。@H_403_2@@H_403_2@
#039 @H_403_2@Buffer = ExAllocatePoolWithTag(NonPagedPool,(nbSlots - 1) * sizeof(FAT_DIR_ENTRY),TAG_VFAT);@H_403_2@
#040 @H_403_2@if (Buffer == NULL)@H_403_2@
#042 @H_403_2@return STATUS_INSUFFICIENT_RESOURCES;@H_403_2@
#044 @H_403_2@RtlZeroMemory(Buffer,(nbSlots - 1) * sizeof(FAT_DIR_ENTRY));@H_403_2@
#045 @H_403_2@pSlots = (slot *) Buffer;@H_403_2@
#047 @H_403_2@NameA.Buffer = aName;@H_403_2@
#048 @H_403_2@NameA.Length = 0;@H_403_2@
#049 @H_403_2@NameA.MaximumLength = sizeof(aName);@H_403_2@
#051 @H_403_2@DirContext.ShortNameU.Buffer = ShortNameBuffer;@H_403_2@
#052 @H_403_2@DirContext.ShortNameU.Length = 0;@H_403_2@
#053 @H_403_2@DirContext.ShortNameU.MaximumLength = sizeof(ShortNameBuffer);@H_403_2@
#055 @H_403_2@RtlZeroMemory(&DirContext.DirEntry.Fat,sizeof(FAT_DIR_ENTRY));@H_403_2@
@H_403_2@
判断文件名称是否符合DOS@H_403_2@里的8.3@H_403_2@的文件命名格式。@H_403_2@@H_403_2@
#057 @H_403_2@IsNameLegal = RtlIsNameLegalDOS8Dot3(&DirContext.LongNameU,&NameA,&SpacesFound);@H_403_2@
#059 @H_403_2@if (!IsNameLegal || SpacesFound)@H_403_2@
@H_403_2@
如果是非法的文件名称,或者包括有空格,就进入下面的处理。@H_403_2@@H_403_2@
#061 @H_403_2@GENERATE_NAME_CONTEXT NameContext;@H_403_2@
#062 @H_403_2@VFAT_DIRENTRY_CONTEXT SearchContext;@H_403_2@
#063 @H_403_2@WCHAR ShortSearchName[13];@H_403_2@
#064 @H_403_2@@H_403_2@needTilde = TRUE;@H_403_2@
#065 @H_403_2@needLong = TRUE;@H_403_2@
#066 @H_403_2@RtlZeroMemory(&NameContext,sizeof(GENERATE_NAME_CONTEXT));@H_403_2@
#067 @H_403_2@SearchContext.LongNameU.Buffer = LongNameBuffer;@H_403_2@
#068 @H_403_2@SearchContext.LongNameU.MaximumLength = sizeof(LongNameBuffer);@H_403_2@
#069 @H_403_2@SearchContext.ShortNameU.Buffer = ShortSearchName;@H_403_2@
#070 @H_403_2@SearchContext.ShortNameU.MaximumLength = sizeof(ShortSearchName);@H_403_2@
@H_403_2@
尝试100@H_403_2@次来分配新的文件名称,并找新分配的文件名是否已经存。@H_403_2@@H_403_2@
#072 @H_403_2@for (i = 0; i < 100; i++)@H_403_2@
#074 @H_403_2@RtlGenerate8dot3Name(&DirContext.LongNameU,FALSE,&NameContext,&DirContext.ShortNameU);@H_403_2@
#075 @H_403_2@DirContext.ShortNameU.Buffer[DirContext.ShortNameU.Length / sizeof(WCHAR)] = 0;@H_403_2@
#076 @H_403_2@SearchContext.DirIndex = 0;@H_403_2@
@H_403_2@
查找新分配的文件是否存在。@H_403_2@@H_403_2@
#077 @H_403_2@Status = FindFile(DeviceExt,&DirContext.ShortNameU,&SearchContext,TRUE);@H_403_2@
#078 @H_403_2@if (!NT_SUCCESS(Status))@H_403_2@
@H_403_2@
尝试100@H_403_2@次分配新的文件名称都失败,就直接返回创建文件失败。@H_403_2@@H_403_2@
#083 @H_403_2@if (i == 100) /* FIXME : what to do after this ? */@H_403_2@
#085 @H_403_2@ExFreePoolWithTag(Buffer,TAG_VFAT);@H_403_2@
#086 @H_403_2@return STATUS_UNSUCCESSFUL;@H_403_2@
@H_403_2@
这里就已经重新分配文件成功了,保存起来在后面使用。@H_403_2@@H_403_2@
#088 @H_403_2@IsNameLegal = RtlIsNameLegalDOS8Dot3(&DirContext.ShortNameU,&SpacesFound);@H_403_2@
#089 @H_403_2@aName[NameA.Length]=0;@H_403_2@
#093 @H_403_2@aName[NameA.Length] = 0;@H_403_2@
@H_403_2@
检查文件名称是否包括点分隔符。@H_403_2@@H_403_2@
#094 @H_403_2@for (posCar = 0; posCar < DirContext.LongNameU.Length / sizeof(WCHAR); posCar++)@H_403_2@
#096 @H_403_2@if (DirContext.LongNameU.Buffer[posCar] == L'.')@H_403_2@
#101 @H_403_2@/* check if the name and the extension contains upper case characters */@H_403_2@
@H_403_2@
检查文件名称和扩展名称是否同为小写。@H_403_2@@H_403_2@
#102 @H_403_2@RtlDowncaseUnicodeString(&DirContext.ShortNameU,&DirContext.LongNameU,FALSE);@H_403_2@
#103 @H_403_2@DirContext.ShortNameU.Buffer[DirContext.ShortNameU.Length / sizeof(WCHAR)] = 0;@H_403_2@
#104 @H_403_2@uCaseBase = wcsncmp(DirContext.LongNameU.Buffer,@H_403_2@
#105 @H_403_2@DirContext.ShortNameU.Buffer,posCar) ? TRUE : FALSE;@H_403_2@
#106 @H_403_2@if (posCar < DirContext.LongNameU.Length/sizeof(WCHAR))@H_403_2@
#108 @H_403_2@i = DirContext.LongNameU.Length / sizeof(WCHAR) - posCar;@H_403_2@
#109 @H_403_2@uCaseExt = wcsncmp(DirContext.LongNameU.Buffer + posCar,@H_403_2@
#110 @H_403_2@DirContext.ShortNameU.Buffer + posCar,i) ? TRUE : FALSE;@H_403_2@
#114 @H_403_2@uCaseExt = FALSE;@H_403_2@
#116 @H_403_2@/* check if the name and the extension contains lower case characters */@H_403_2@
@H_403_2@
检查文件名称和扩展名称是否同为大写。@H_403_2@@H_403_2@
#117 @H_403_2@RtlUpcaseUnicodeString(&DirContext.ShortNameU,FALSE);@H_403_2@
#118 @H_403_2@DirContext.ShortNameU.Buffer[DirContext.ShortNameU.Length / sizeof(WCHAR)] = 0;@H_403_2@
#119 @H_403_2@lCaseBase = wcsncmp(DirContext.LongNameU.Buffer,@H_403_2@
#120 @H_403_2@DirContext.ShortNameU.Buffer,posCar) ? TRUE : FALSE;@H_403_2@
#121 @H_403_2@if (posCar < DirContext.LongNameU.Length / sizeof(WCHAR))@H_403_2@
#123 @H_403_2@i = DirContext.LongNameU.Length / sizeof(WCHAR) - posCar;@H_403_2@
#124 @H_403_2@lCaseExt = wcsncmp(DirContext.LongNameU.Buffer + posCar,@H_403_2@
#125 @H_403_2@DirContext.ShortNameU.Buffer + posCar,i) ? TRUE : FALSE;@H_403_2@
#129 @H_403_2@lCaseExt = FALSE;@H_403_2@
#131 @H_403_2@if ((lCaseBase && uCaseBase) || (lCaseExt && uCaseExt))@H_403_2@
#133 @H_403_2@needLong = TRUE;@H_403_2@
#136 @H_403_2@DPRINT("'%s','%wZ',needTilde=%d,needLong=%d/n",@H_403_2@
#137 @H_403_2@aName,needTilde,needLong);@H_403_2@
@H_403_2@
设置FAT@H_403_2@入口的文件名称。@H_403_2@@H_403_2@
#138 @H_403_2@memset(DirContext.DirEntry.Fat.ShortName,' ',11);@H_403_2@
#139 @H_403_2@for (i = 0; i < 8 && aName[i] && aName[i] != '.'; i++)@H_403_2@
#141 @H_403_2@DirContext.DirEntry.Fat.Filename[i] = aName[i];@H_403_2@
#143 @H_403_2@if (aName[i] == '.')@H_403_2@
#146 @H_403_2@for (j = 0; j < 3 && aName[i]; j++,i++)@H_403_2@
#148 @H_403_2@DirContext.DirEntry.Fat.Ext[j] = aName[i];@H_403_2@
#151 @H_403_2@if (DirContext.DirEntry.Fat.Filename[0] == 0xe5)@H_403_2@
#153 @H_403_2@DirContext.DirEntry.Fat.Filename[0] = 0x05;@H_403_2@
@H_403_2@
#156 @H_403_2@if (needLong)@H_403_2@
#158 @H_403_2@RtlCopyMemory(LongNameBuffer,DirContext.LongNameU.Buffer,DirContext.LongNameU.Length);@H_403_2@
#159 @H_403_2@DirContext.LongNameU.Buffer = LongNameBuffer;@H_403_2@
#160 @H_403_2@DirContext.LongNameU.MaximumLength = sizeof(LongNameBuffer);@H_403_2@
#161 @H_403_2@DirContext.LongNameU.Buffer[DirContext.LongNameU.Length / sizeof(WCHAR)] = 0;@H_403_2@
#162 @H_403_2@memset(DirContext.LongNameU.Buffer + DirContext.LongNameU.Length / sizeof(WCHAR) + 1,0xff,@H_403_2@
#163 @H_403_2@DirContext.LongNameU.MaximumLength - DirContext.LongNameU.Length - sizeof(WCHAR));@H_403_2@
@H_403_2@
#167 @H_403_2@nbSlots = 1;@H_403_2@
#168 @H_403_2@if (lCaseBase)@H_403_2@
#170 @H_403_2@DirContext.DirEntry.Fat.lCase |= VFAT_CASE_LOWER_BASE;@H_403_2@
#172 @H_403_2@if (lCaseExt)@H_403_2@
#174 @H_403_2@DirContext.DirEntry.Fat.lCase |= VFAT_CASE_LOWER_EXT;@H_403_2@
#178 @H_403_2@DPRINT ("dos name=%11.11s/n",DirContext.DirEntry.Fat.Filename);@H_403_2@
#180 @H_403_2@/* set attributes */@H_403_2@
@H_403_2@
设置FAT@H_403_2@的属性。@H_403_2@@H_403_2@
#181 @H_403_2@DirContext.DirEntry.Fat.Attrib = ReqAttr;@H_403_2@
#182 @H_403_2@if (RequestedOptions & FILE_DIRECTORY_FILE)@H_403_2@
#184 @H_403_2@DirContext.DirEntry.Fat.Attrib |= FILE_ATTRIBUTE_DIRECTORY;@H_403_2@
#186 @H_403_2@/* set dates and times */@H_403_2@
@H_403_2@
设置FAT@H_403_2@创建的系统日期和时间。@H_403_2@@H_403_2@
#187 @H_403_2@KeQuerySystemTime(&SystemTime);@H_403_2@
#188 @H_403_2@FsdSystemTimeToDosDateTime(DeviceExt,&SystemTime,&DirContext.DirEntry.Fat.CreationDate,@H_403_2@
#189 @H_403_2@&DirContext.DirEntry.Fat.CreationTime);@H_403_2@
#190 @H_403_2@DirContext.DirEntry.Fat.UpdateDate = DirContext.DirEntry.Fat.CreationDate;@H_403_2@
#191 @H_403_2@DirContext.DirEntry.Fat.UpdateTime = DirContext.DirEntry.Fat.CreationTime;@H_403_2@
#192 @H_403_2@DirContext.DirEntry.Fat.AccessDate = DirContext.DirEntry.Fat.CreationDate;@H_403_2@
#194 @H_403_2@if (needLong)@H_403_2@
#196 @H_403_2@/* calculate checksum for 8.3 name */@H_403_2@
#197 @H_403_2@for (pSlots[0].alias_checksum = 0,i = 0; i < 11; i++)@H_403_2@
#199 @H_403_2@pSlots[0].alias_checksum = (((pSlots[0].alias_checksum & 1) << 7@H_403_2@
#200 @H_403_2@| ((pSlots[0].alias_checksum & 0xfe) >> 1))@H_403_2@
#201 @H_403_2@@H_403_2@+ DirContext.DirEntry.Fat.ShortName[i]);@H_403_2@
#203 @H_403_2@/* construct slots and entry */@H_403_2@
@H_403_2@
#204 @H_403_2@for (i = nbSlots - 2; i >= 0; i--)@H_403_2@
#206 @H_403_2@DPRINT("construct slot %d/n",i);@H_403_2@
#207 @H_403_2@pSlots[i].attr = 0xf;@H_403_2@
#210 @H_403_2@pSlots[i].id = (unsigned char)(nbSlots - i - 1);@H_403_2@
#214 @H_403_2@pSlots[i].id = (unsigned char)(nbSlots - i - 1 + 0x40);@H_403_2@
#216 @H_403_2@pSlots[i].alias_checksum = pSlots[0].alias_checksum;@H_403_2@
#217 @H_403_2@RtlCopyMemory(pSlots[i].name0_4,DirContext.LongNameU.Buffer + (nbSlots - i - 2) * 13,10);@H_403_2@
#218 @H_403_2@RtlCopyMemory(pSlots[i].name5_10,DirContext.LongNameU.Buffer + (nbSlots - i - 2) * 13 + 5,12);@H_403_2@
#219 @H_403_2@RtlCopyMemory(pSlots[i].name11_12,DirContext.LongNameU.Buffer + (nbSlots - i - 2) * 13 + 11,4);@H_403_2@
#222 @H_403_2@/* try to find nbSlots contiguous entries frees in directory */@H_403_2@
@H_403_2@
在这个目录里找到空闲位置。@H_403_2@@H_403_2@
#223 @H_403_2@if (!vfatFindDirSpace(DeviceExt,nbSlots,&DirContext.StartIndex))@H_403_2@
#225 @H_403_2@ExFreePoolWithTag(Buffer,TAG_VFAT);@H_403_2@
#226 @H_403_2@return STATUS_DISK_FULL;@H_403_2@
#228 @H_403_2@DirContext.DirIndex = DirContext.StartIndex + nbSlots - 1;@H_403_2@
#229 @H_403_2@if (RequestedOptions & FILE_DIRECTORY_FILE)@H_403_2@
#231 @H_403_2@CurrentCluster = 0;@H_403_2@
#232 @H_403_2@Status = NextCluster(DeviceExt,&CurrentCluster,TRUE);@H_403_2@
#233 @H_403_2@if (CurrentCluster == 0xffffffff || !NT_SUCCESS(Status))@H_403_2@
#235 @H_403_2@ExFreePoolWithTag(Buffer,TAG_VFAT);@H_403_2@
#236 @H_403_2@if (!NT_SUCCESS(Status))@H_403_2@
#238 @H_403_2@return Status;@H_403_2@
#240 @H_403_2@return STATUS_DISK_FULL;@H_403_2@
#242 @H_403_2@if (DeviceExt->FatInfo.FatType == FAT32)@H_403_2@
#244 @H_403_2@DirContext.DirEntry.Fat.FirstClusterHigh = (unsigned short)(CurrentCluster >> 16);@H_403_2@
#246 @H_403_2@DirContext.DirEntry.Fat.FirstCluster = (unsigned short)CurrentCluster;@H_403_2@
#249 @H_403_2@i = DeviceExt->FatInfo.BytesPerCluster / sizeof(FAT_DIR_ENTRY);@H_403_2@
#250 @H_403_2@FileOffset.u.HighPart = 0;@H_403_2@
#251 @H_403_2@FileOffset.u.LowPart = DirContext.StartIndex * sizeof(FAT_DIR_ENTRY);@H_403_2@
#252 @H_403_2@if (DirContext.StartIndex / i == DirContext.DirIndex / i)@H_403_2@
@H_403_2@
#254 @H_403_2@/* one cluster */@H_403_2@
#255 @H_403_2@CcPinRead(ParentFcb->FileObject,&FileOffset,nbSlots * sizeof(FAT_DIR_ENTRY),@H_403_2@
#256 @H_403_2@TRUE,&Context,(PVOID*)&pFatEntry);@H_403_2@
#257 @H_403_2@if (nbSlots > 1)@H_403_2@
#259 @H_403_2@RtlCopyMemory(pFatEntry,Buffer,(nbSlots - 1) * sizeof(FAT_DIR_ENTRY));@H_403_2@
#261 @H_403_2@RtlCopyMemory(pFatEntry + (nbSlots - 1),&DirContext.DirEntry.Fat,sizeof(FAT_DIR_ENTRY));@H_403_2@
@H_403_2@
#265 @H_403_2@/* two clusters */@H_403_2@
#266 @H_403_2@size = DeviceExt->FatInfo.BytesPerCluster -@H_403_2@
#267 @H_403_2@(DirContext.StartIndex * sizeof(FAT_DIR_ENTRY)) % DeviceExt->FatInfo.BytesPerCluster;@H_403_2@
#268 @H_403_2@i = size / sizeof(FAT_DIR_ENTRY);@H_403_2@
#269 @H_403_2@CcPinRead(ParentFcb->FileObject,size,TRUE,@H_403_2@
#270 @H_403_2@&Context,(PVOID*)&pFatEntry);@H_403_2@
#271 @H_403_2@RtlCopyMemory(pFatEntry,size);@H_403_2@
#272 @H_403_2@CcSetDirtyPinnedData(Context,NULL);@H_403_2@
#273 @H_403_2@CcUnpinData(Context);@H_403_2@
#274 @H_403_2@@H_403_2@FileOffset.u.LowPart += size;@H_403_2@
#275 @H_403_2@CcPinRead(ParentFcb->FileObject,@H_403_2@
#276 @H_403_2@nbSlots * sizeof(FAT_DIR_ENTRY) - size,@H_403_2@
#277 @H_403_2@TRUE,(PVOID*)&pFatEntry);@H_403_2@
#278 @H_403_2@if (nbSlots - 1 > i)@H_403_2@
#280 @H_403_2@RtlCopyMemory(pFatEntry,(PVOID)(Buffer + size),(nbSlots - 1 - i) * sizeof(FAT_DIR_ENTRY));@H_403_2@
#282 @H_403_2@RtlCopyMemory(pFatEntry + nbSlots - 1 - i,sizeof(FAT_DIR_ENTRY));@H_403_2@
#284 @H_403_2@CcSetDirtyPinnedData(Context,NULL);@H_403_2@
#285 @H_403_2@CcUnpinData(Context);@H_403_2@
#287 @H_403_2@/* FIXME: check status */@H_403_2@
#288 @H_403_2@vfatMakeFCBFromDirEntry(DeviceExt,&DirContext,Fcb);@H_403_2@
#290 @H_403_2@DPRINT("new : entry=%11.11s/n",(*Fcb)->entry.Fat.Filename);@H_403_2@
#291 @H_403_2@DPRINT("new : entry=%11.11s/n",DirContext.DirEntry.Fat.Filename);@H_403_2@
@H_403_2@
#293 @H_403_2@if (RequestedOptions & FILE_DIRECTORY_FILE)@H_403_2@
#295 @H_403_2@FileOffset.QuadPart = 0;@H_403_2@
#296 @H_403_2@CcPinRead((*Fcb)->FileObject,DeviceExt->FatInfo.BytesPerCluster,@H_403_2@
#297 @H_403_2@&Context,(PVOID*)&pFatEntry);@H_403_2@
#298 @H_403_2@/* clear the new directory cluster */@H_403_2@
#299 @H_403_2@RtlZeroMemory(pFatEntry,DeviceExt->FatInfo.BytesPerCluster);@H_403_2@
@H_403_2@
在文件目录里创建缺省目录'.' @H_403_2@和 '..'@H_403_2@。@H_403_2@@H_403_2@
#300 @H_403_2@/* create '.' and '..' */@H_403_2@
#301 @H_403_2@RtlCopyMemory(&pFatEntry[0].Attrib,&DirContext.DirEntry.Fat.Attrib,sizeof(FAT_DIR_ENTRY) - 11);@H_403_2@
#302 @H_403_2@RtlCopyMemory(pFatEntry[0].ShortName,". @H_403_2@",11);@H_403_2@
#303 @H_403_2@RtlCopyMemory(&pFatEntry[1].Attrib,sizeof(FAT_DIR_ENTRY) - 11);@H_403_2@
#304 @H_403_2@@H_403_2@RtlCopyMemory(pFatEntry[1].ShortName,".. @H_403_2@",11);@H_403_2@
#305 @H_403_2@pFatEntry[1].FirstCluster = ParentFcb->entry.Fat.FirstCluster;@H_403_2@
#306 @H_403_2@pFatEntry[1].FirstClusterHigh = ParentFcb->entry.Fat.FirstClusterHigh;@H_403_2@
@H_403_2@
如果这里根目录,就设置父目录为空,不能再往上查看。@H_403_2@@H_403_2@
#307 @H_403_2@if (vfatFCBIsRoot(ParentFcb))@H_403_2@
#309 @H_403_2@pFatEntry[1].FirstCluster = 0;@H_403_2@
#310 @H_403_2@pFatEntry[1].FirstClusterHigh = 0;@H_403_2@
#312 @H_403_2@CcSetDirtyPinnedData(Context,NULL);@H_403_2@
#313 @H_403_2@CcUnpinData(Context);@H_403_2@
#315 @H_403_2@ExFreePoolWithTag(Buffer,TAG_VFAT);@H_403_2@
#316 @H_403_2@DPRINT("addentry ok/n");@H_403_2@
#317 @H_403_2@return STATUS_SUCCESS;@H_403_2@
#318}@H_403_2@
原文链接:https://www.f2er.com/react/308397.html