reactos操作系统实现(127)

前端之家收集整理的这篇文章主要介绍了reactos操作系统实现(127)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

从上面的代码里可以看到调用函数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@

#009 @H_403_2@{@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@

#012 @H_403_2@else@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@

#014 @H_403_2@}@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@

#009 @H_403_2@{@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@

#022 @H_403_2@@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@

#027 @H_403_2@@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@

#031 @H_403_2@@H_403_2@

#032 @H_403_2@DPRINT("addEntry: Name='%wZ',Dir='%wZ'/n",&ParentFcb->PathNameU);@H_403_2@

#033 @H_403_2@@H_403_2@

#034 @H_403_2@DirContext.LongNameU = *NameU;@H_403_2@

#035 @H_403_2@@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@

#041 @H_403_2@{@H_403_2@

#042 @H_403_2@return STATUS_INSUFFICIENT_RESOURCES;@H_403_2@

#043 @H_403_2@}@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@

#046 @H_403_2@@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@

#050 @H_403_2@@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@

#054 @H_403_2@@H_403_2@

#055 @H_403_2@RtlZeroMemory(&DirContext.DirEntry.Fat,sizeof(FAT_DIR_ENTRY));@H_403_2@

#056 @H_403_2@@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@

#058 @H_403_2@@H_403_2@

#059 @H_403_2@if (!IsNameLegal || SpacesFound)@H_403_2@

#060 @H_403_2@{@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@

#071 @H_403_2@@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@

#073 @H_403_2@{@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@

#079 @H_403_2@{@H_403_2@

#080 @H_403_2@break;@H_403_2@

#081 @H_403_2@}@H_403_2@

#082 @H_403_2@}@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@

#084 @H_403_2@{@H_403_2@

#085 @H_403_2@ExFreePoolWithTag(Buffer,TAG_VFAT);@H_403_2@

#086 @H_403_2@return STATUS_UNSUCCESSFUL;@H_403_2@

#087 @H_403_2@}@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@

#090 @H_403_2@}@H_403_2@

#091 @H_403_2@else@H_403_2@

#092 @H_403_2@{@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@

#095 @H_403_2@{@H_403_2@

#096 @H_403_2@if (DirContext.LongNameU.Buffer[posCar] == L'.')@H_403_2@

#097 @H_403_2@{@H_403_2@

#098 @H_403_2@break;@H_403_2@

#099 @H_403_2@}@H_403_2@

#100 @H_403_2@}@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@

#107 @H_403_2@{@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@

#111 @H_403_2@}@H_403_2@

#112 @H_403_2@else@H_403_2@

#113 @H_403_2@{@H_403_2@

#114 @H_403_2@uCaseExt = FALSE;@H_403_2@

#115 @H_403_2@}@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@

#122 @H_403_2@{@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@

#126 @H_403_2@}@H_403_2@

#127 @H_403_2@else@H_403_2@

#128 @H_403_2@{@H_403_2@

#129 @H_403_2@lCaseExt = FALSE;@H_403_2@

#130 @H_403_2@}@H_403_2@

#131 @H_403_2@if ((lCaseBase && uCaseBase) || (lCaseExt && uCaseExt))@H_403_2@

#132 @H_403_2@{@H_403_2@

#133 @H_403_2@needLong = TRUE;@H_403_2@

#134 @H_403_2@}@H_403_2@

#135 @H_403_2@}@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@

#140 @H_403_2@{@H_403_2@

#141 @H_403_2@DirContext.DirEntry.Fat.Filename[i] = aName[i];@H_403_2@

#142 @H_403_2@}@H_403_2@

#143 @H_403_2@if (aName[i] == '.')@H_403_2@

#144 @H_403_2@{@H_403_2@

#145 @H_403_2@i++;@H_403_2@

#146 @H_403_2@for (j = 0; j < 3 && aName[i]; j++,i++)@H_403_2@

#147 @H_403_2@{@H_403_2@

#148 @H_403_2@DirContext.DirEntry.Fat.Ext[j] = aName[i];@H_403_2@

#149 @H_403_2@}@H_403_2@

#150 @H_403_2@}@H_403_2@

#151 @H_403_2@if (DirContext.DirEntry.Fat.Filename[0] == 0xe5)@H_403_2@

#152 @H_403_2@{@H_403_2@

#153 @H_403_2@DirContext.DirEntry.Fat.Filename[0] = 0x05;@H_403_2@

#154 @H_403_2@}@H_403_2@

#155 @H_403_2@@H_403_2@

@H_403_2@

如果需要长文件名称@H_403_2@@H_403_2@

#156 @H_403_2@if (needLong)@H_403_2@

#157 @H_403_2@{@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@

#164 @H_403_2@}@H_403_2@

#165 @H_403_2@else@H_403_2@

#166 @H_403_2@{@H_403_2@

@H_403_2@

这里是使用短文件名称@H_403_2@@H_403_2@

#167 @H_403_2@nbSlots = 1;@H_403_2@

#168 @H_403_2@if (lCaseBase)@H_403_2@

#169 @H_403_2@{@H_403_2@

#170 @H_403_2@DirContext.DirEntry.Fat.lCase |= VFAT_CASE_LOWER_BASE;@H_403_2@

#171 @H_403_2@}@H_403_2@

#172 @H_403_2@if (lCaseExt)@H_403_2@

#173 @H_403_2@{@H_403_2@

#174 @H_403_2@DirContext.DirEntry.Fat.lCase |= VFAT_CASE_LOWER_EXT;@H_403_2@

#175 @H_403_2@}@H_403_2@

#176 @H_403_2@}@H_403_2@

#177 @H_403_2@@H_403_2@

#178 @H_403_2@DPRINT ("dos name=%11.11s/n",DirContext.DirEntry.Fat.Filename);@H_403_2@

#179 @H_403_2@@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@

#183 @H_403_2@{@H_403_2@

#184 @H_403_2@DirContext.DirEntry.Fat.Attrib |= FILE_ATTRIBUTE_DIRECTORY;@H_403_2@

#185 @H_403_2@}@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@

#193 @H_403_2@@H_403_2@

#194 @H_403_2@if (needLong)@H_403_2@

#195 @H_403_2@{@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@

#198 @H_403_2@{@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@

#202 @H_403_2@}@H_403_2@

#203 @H_403_2@/* construct slots and entry */@H_403_2@

@H_403_2@

构造所有入口。@H_403_2@@H_403_2@

#204 @H_403_2@for (i = nbSlots - 2; i >= 0; i--)@H_403_2@

#205 @H_403_2@{@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@

#208 @H_403_2@if (i)@H_403_2@

#209 @H_403_2@{@H_403_2@

#210 @H_403_2@pSlots[i].id = (unsigned char)(nbSlots - i - 1);@H_403_2@

#211 @H_403_2@}@H_403_2@

#212 @H_403_2@else@H_403_2@

#213 @H_403_2@{@H_403_2@

#214 @H_403_2@pSlots[i].id = (unsigned char)(nbSlots - i - 1 + 0x40);@H_403_2@

#215 @H_403_2@}@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@

#220 @H_403_2@}@H_403_2@

#221 @H_403_2@}@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@

#224 @H_403_2@{@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@

#227 @H_403_2@}@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@

#230 @H_403_2@{@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@

#234 @H_403_2@{@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@

#237 @H_403_2@{@H_403_2@

#238 @H_403_2@return Status;@H_403_2@

#239 @H_403_2@}@H_403_2@

#240 @H_403_2@return STATUS_DISK_FULL;@H_403_2@

#241 @H_403_2@}@H_403_2@

#242 @H_403_2@if (DeviceExt->FatInfo.FatType == FAT32)@H_403_2@

#243 @H_403_2@{@H_403_2@

#244 @H_403_2@DirContext.DirEntry.Fat.FirstClusterHigh = (unsigned short)(CurrentCluster >> 16);@H_403_2@

#245 @H_403_2@}@H_403_2@

#246 @H_403_2@DirContext.DirEntry.Fat.FirstCluster = (unsigned short)CurrentCluster;@H_403_2@

#247 @H_403_2@}@H_403_2@

#248 @H_403_2@@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@

#253 @H_403_2@{@H_403_2@

@H_403_2@

一个簇的处理。@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@

#258 @H_403_2@{@H_403_2@

#259 @H_403_2@RtlCopyMemory(pFatEntry,Buffer,(nbSlots - 1) * sizeof(FAT_DIR_ENTRY));@H_403_2@

#260 @H_403_2@}@H_403_2@

#261 @H_403_2@RtlCopyMemory(pFatEntry + (nbSlots - 1),&DirContext.DirEntry.Fat,sizeof(FAT_DIR_ENTRY));@H_403_2@

#262 @H_403_2@}@H_403_2@

#263 @H_403_2@else@H_403_2@

#264 @H_403_2@{@H_403_2@

@H_403_2@

二个簇的处理。@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@

#279 @H_403_2@{@H_403_2@

#280 @H_403_2@RtlCopyMemory(pFatEntry,(PVOID)(Buffer + size),(nbSlots - 1 - i) * sizeof(FAT_DIR_ENTRY));@H_403_2@

#281 @H_403_2@}@H_403_2@

#282 @H_403_2@RtlCopyMemory(pFatEntry + nbSlots - 1 - i,sizeof(FAT_DIR_ENTRY));@H_403_2@

#283 @H_403_2@}@H_403_2@

#284 @H_403_2@CcSetDirtyPinnedData(Context,NULL);@H_403_2@

#285 @H_403_2@CcUnpinData(Context);@H_403_2@

#286 @H_403_2@@H_403_2@

#287 @H_403_2@/* FIXME: check status */@H_403_2@

#288 @H_403_2@vfatMakeFCBFromDirEntry(DeviceExt,&DirContext,Fcb);@H_403_2@

#289 @H_403_2@@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@

#292 @H_403_2@@H_403_2@

@H_403_2@

检查是否目录文件@H_403_2@@H_403_2@

#293 @H_403_2@if (RequestedOptions & FILE_DIRECTORY_FILE)@H_403_2@

#294 @H_403_2@{@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@

#308 @H_403_2@{@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@

#311 @H_403_2@}@H_403_2@

#312 @H_403_2@CcSetDirtyPinnedData(Context,NULL);@H_403_2@

#313 @H_403_2@CcUnpinData(Context);@H_403_2@

#314 @H_403_2@}@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

猜你在找的React相关文章