17 IN EFI_FILE_PROTOCOL *This,
18 OUT EFI_FILE_PROTOCOL **NewHandle,
36 ASSERT (NewHandle != NULL);
41 AbsolutePath = (*FileName == L
'\\');
45 if (OpenMode != EFI_FILE_MODE_READ) {
46 DEBUG ((DEBUG_INFO,
"NTFS: File '%s' can only be opened in read-only mode\n", FileName));
47 return EFI_WRITE_PROTECTED;
50 if ((*FileName == 0) || (
CompareMem (FileName, L
".",
sizeof (L
".")) == 0)) {
61 DEBUG ((DEBUG_INFO,
"NTFS: Path is too long.\n"));
62 return EFI_OUT_OF_RESOURCES;
66 if (EFI_ERROR (Status)) {
67 DEBUG ((DEBUG_INFO,
"NTFS: Could not copy string.\n"));
77 if (EFI_ERROR (Status)) {
78 DEBUG ((DEBUG_INFO,
"NTFS: Could not copy FileName `%s`.\n", FileName));
85 if (Path[Index] == L
'\\') {
90 ZeroMem (CleanPath,
sizeof (CleanPath));
92 if (EFI_ERROR (Status)) {
97 if (NewFile == NULL) {
98 return EFI_OUT_OF_RESOURCES;
104 NewFile->
Path = AllocateZeroPool (StrnSizeS (CleanPath,
MAX_PATH));
105 if (NewFile->
Path == NULL) {
106 DEBUG ((DEBUG_INFO,
"NTFS: Could not instantiate path\n"));
108 return EFI_OUT_OF_RESOURCES;
115 DEBUG ((DEBUG_INFO,
"NTFS: CleanPath is too long.\n"));
116 return EFI_OUT_OF_RESOURCES;
122 if (CleanPath[Index] == L
'/') {
123 CleanPath[Index] = 0;
128 DirName = (Index == 0) ? L
"/" : CleanPath;
132 if (EFI_ERROR (Status)) {
133 FreePool (NewFile->
Path);
138 if (!NewFile->
IsDir) {
140 if (EFI_ERROR (Status)) {
141 FreePool (NewFile->
Path);
148 *NewHandle = &NewFile->
EfiFile;
170 ASSERT ((Data != NULL) || ((Data == NULL) && (*
Size == 0)));
173 Status = StrCpyS (Path,
MAX_PATH, File->Path);
174 if (EFI_ERROR (Status)) {
175 DEBUG ((DEBUG_INFO,
"NTFS: Could not copy string.\n"));
181 DEBUG ((DEBUG_INFO,
"NTFS: Path is too long.\n"));
182 return EFI_OUT_OF_RESOURCES;
194 (INT64)File->DirIndex,
200 *
Size = File->FileSystem->CFIDataSize;
201 return EFI_BUFFER_TOO_SMALL;
204 Info = (EFI_FILE_INFO *)Data;
205 *
Size = (UINTN)Info->Size;
211 Info = (EFI_FILE_INFO *)File->FileSystem->CFIData;
216 Status =
NtfsDir (File->FileSystem, L
"/", File->FileSystem->CFIData,
DIR_HOOK);
218 Status =
NtfsDir (File->FileSystem, File->Path, File->FileSystem->CFIData,
DIR_HOOK);
229 if (EFI_ERROR (Status)) {
230 DEBUG ((DEBUG_INFO,
"NTFS: Directory listing failed.\n"));
235 Info->PhysicalSize = 0;
237 if ((Info->Attribute & EFI_FILE_DIRECTORY) == 0) {
239 if (TmpFile == NULL) {
240 return EFI_OUT_OF_RESOURCES;
244 CopyMem (&TmpFile->
EfiFile, &File->FileSystem->EfiFile, sizeof (EFI_FILE_PROTOCOL));
247 DEBUG ((DEBUG_INFO,
"NTFS: FileName is too long.\n"));
249 return EFI_OUT_OF_RESOURCES;
252 CopyMem (&Path[
Length], Info->FileName, StrSize (Info->FileName));
253 TmpFile->
Path = Path;
256 if (EFI_ERROR (Status)) {
268 *
Size = (UINTN)Info->Size;
269 NtfsCfiPush (File->FileSystem, Path, (UINTN)Info->Size, (INT64)File->DirIndex);
270 return EFI_BUFFER_TOO_SMALL;
272 CopyMem (Data, File->FileSystem->CFIData, (UINTN)Info->Size);
275 *
Size = (UINTN)Info->Size;
298 ASSERT ((Data != NULL) || ((Data == NULL) && (*
Size == 0)));
300 Remaining = (File->RootFile.DataAttributeSize > File->Offset) ?
301 File->RootFile.DataAttributeSize - File->Offset : 0;
303 if (*
Size > Remaining) {
304 *
Size = (UINTN)Remaining;
307 BaseMftRecord = &File->RootFile;
310 if (EFI_ERROR (Status)) {
316 File->Offset += *
Size;
324 IN EFI_FILE_PROTOCOL *This,
325 IN OUT UINTN *BufferSize,
332 ASSERT (BufferSize != NULL);
347 IN EFI_FILE_PROTOCOL *This,
348 IN OUT UINTN *BufferSize,
352 return EFI_WRITE_PROTECTED;
358 IN EFI_FILE_PROTOCOL *This
363 return EFI_WARN_DELETE_FAILURE;
369 IN EFI_FILE_PROTOCOL *This
372 return EFI_ACCESS_DENIED;
378 IN EFI_FILE_PROTOCOL *This
395 if (File->
Path != NULL) {
396 FreePool (File->
Path);
INTN NtfsCfiPop(IN EFI_FS *Fs, IN CONST CHAR16 *Path, IN UINTN Size, IN INT64 DirIndex, OUT VOID *Buffer)
VOID NtfsCfiPush(IN EFI_FS *Fs, IN CONST CHAR16 *Path, IN UINTN Size, IN INT64 DirIndex)
EFI_STATUS EFIAPI ReadAttr(IN NTFS_ATTR *Attr, OUT UINT8 *Dest, IN UINT64 Offset, IN UINTN Length)
VOID FreeFile(IN NTFS_FILE *File)
EFI_STATUS NtfsDir(IN EFI_FS *FileSystem, IN CONST CHAR16 *Path, OUT EFI_NTFS_FILE *File, IN FUNCTION_TYPE FunctionType)
VOID FreeAttr(IN NTFS_ATTR *Attr)
EFI_STATUS NtfsOpen(IN EFI_NTFS_FILE *File)
#define MINIMUM_INFO_LENGTH
EFI_STATUS RelativeToAbsolute(OUT CHAR16 *Dest, IN CHAR16 *Source)
DMG_SIZE_DEVICE_PATH Size
OC_TYPING_BUFFER_ENTRY Buffer[OC_TYPING_BUFFER_SIZE]
EFI_STATUS EFIAPI FileClose(IN EFI_FILE_PROTOCOL *This)
EFI_STATUS EFIAPI FileFlush(IN EFI_FILE_PROTOCOL *This)
EFI_STATUS EFIAPI FileDelete(IN EFI_FILE_PROTOCOL *This)
STATIC EFI_STATUS FileReadDir(IN EFI_NTFS_FILE *File, OUT VOID *Data, IN OUT UINTN *Size)
EFI_STATUS EFIAPI FileOpen(IN EFI_FILE_PROTOCOL *This, OUT EFI_FILE_PROTOCOL **NewHandle, IN CHAR16 *FileName, IN UINT64 OpenMode, IN UINT64 Attributes)
EFI_STATUS EFIAPI FileWrite(IN EFI_FILE_PROTOCOL *This, IN OUT UINTN *BufferSize, IN VOID *Buffer)
STATIC EFI_STATUS Read(IN EFI_NTFS_FILE *File, OUT VOID *Data, IN UINTN *Size)
EFI_STATUS EFIAPI FileRead(IN EFI_FILE_PROTOCOL *This, IN OUT UINTN *BufferSize, OUT VOID *Buffer)
INTN EFIAPI CompareMem(IN CONST VOID *DestinationBuffer, IN CONST VOID *SourceBuffer, IN UINTN Length)
VOID *EFIAPI CopyMem(OUT VOID *DestinationBuffer, IN CONST VOID *SourceBuffer, IN UINTN Length)
VOID *EFIAPI ZeroMem(OUT VOID *Buffer, IN UINTN Length)
EFI_FILE_PROTOCOL EfiFile
EFI_FILE_PROTOCOL EfiFile