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;
169 ASSERT ((Data != NULL) || ((Data == NULL) && (*
Size == 0)));
171 Info = (EFI_FILE_INFO *)Data;
175 return EFI_BUFFER_TOO_SMALL;
182 Status = StrCpyS (Path,
MAX_PATH, File->Path);
183 if (EFI_ERROR (Status)) {
184 DEBUG ((DEBUG_INFO,
"NTFS: Could not copy string.\n"));
190 DEBUG ((DEBUG_INFO,
"NTFS: Path is too long.\n"));
191 return EFI_OUT_OF_RESOURCES;
214 if (EFI_ERROR (Status)) {
215 DEBUG ((DEBUG_INFO,
"NTFS: Directory listing failed.\n"));
220 Info->PhysicalSize = 0;
222 if ((Info->Attribute & EFI_FILE_DIRECTORY) == 0) {
224 if (TmpFile == NULL) {
225 return EFI_OUT_OF_RESOURCES;
229 CopyMem (&TmpFile->
EfiFile, &File->FileSystem->EfiFile, sizeof (EFI_FILE_PROTOCOL));
232 DEBUG ((DEBUG_INFO,
"NTFS: FileName is too long.\n"));
234 return EFI_OUT_OF_RESOURCES;
237 CopyMem (&Path[
Length], Info->FileName, StrSize (Info->FileName));
238 TmpFile->
Path = Path;
241 if (EFI_ERROR (Status)) {
251 *
Size = (UINTN)Info->Size;
274 ASSERT ((Data != NULL) || ((Data == NULL) && (*
Size == 0)));
276 Remaining = (File->RootFile.DataAttributeSize > File->Offset) ?
277 File->RootFile.DataAttributeSize - File->Offset : 0;
279 if (*
Size > Remaining) {
280 *
Size = (UINTN)Remaining;
283 BaseMftRecord = &File->RootFile;
286 if (EFI_ERROR (Status)) {
292 File->Offset += *
Size;
300 IN EFI_FILE_PROTOCOL *This,
301 IN OUT UINTN *BufferSize,
308 ASSERT (BufferSize != NULL);
323 IN EFI_FILE_PROTOCOL *This,
324 IN OUT UINTN *BufferSize,
328 return EFI_WRITE_PROTECTED;
334 IN EFI_FILE_PROTOCOL *This
339 return EFI_WARN_DELETE_FAILURE;
345 IN EFI_FILE_PROTOCOL *This
348 return EFI_ACCESS_DENIED;
354 IN EFI_FILE_PROTOCOL *This
371 if (File->
Path != NULL) {
372 FreePool (File->
Path);
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