OpenCore  1.0.4
OpenCore Bootloader
Loading...
Searching...
No Matches
fsw_efi.c
Go to the documentation of this file.
1
6/*-
7 * Copyright (c) 2006 Christoph Pfisterer
8 *
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions are
11 * met:
12 *
13 * * Redistributions of source code must retain the above copyright
14 * notice, this list of conditions and the following disclaimer.
15 *
16 * * Redistributions in binary form must reproduce the above copyright
17 * notice, this list of conditions and the following disclaimer in the
18 * documentation and/or other materials provided with the
19 * distribution.
20 *
21 * * Neither the name of Christoph Pfisterer nor the names of the
22 * contributors may be used to endorse or promote products derived
23 * from this software without specific prior written permission.
24 *
25 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
26 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
27 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
28 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
29 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
30 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
31 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
32 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
33 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
34 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
35 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36 */
37
38#include "fsw_efi.h"
39
40#define DEBUG_LEVEL 0
41
42
43#ifndef FSTYPE
45#define FSTYPE ext2
46#endif
47
49#define FSW_EFI_STRINGIFY(x) #x
51#define FSW_EFI_DRIVER_NAME(t) L"Fsw " FSW_EFI_STRINGIFY(t) L" File System Driver"
52
53// function prototypes
54
55EFI_STATUS EFIAPI fsw_efi_DriverBinding_Supported(IN EFI_DRIVER_BINDING_PROTOCOL *This,
56 IN EFI_HANDLE ControllerHandle,
57 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath);
58EFI_STATUS EFIAPI fsw_efi_DriverBinding_Start(IN EFI_DRIVER_BINDING_PROTOCOL *This,
59 IN EFI_HANDLE ControllerHandle,
60 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath);
61EFI_STATUS EFIAPI fsw_efi_DriverBinding_Stop(IN EFI_DRIVER_BINDING_PROTOCOL *This,
62 IN EFI_HANDLE ControllerHandle,
63 IN UINTN NumberOfChildren,
64 IN EFI_HANDLE *ChildHandleBuffer);
65
66EFI_STATUS EFIAPI fsw_efi_ComponentName_GetDriverName(IN EFI_COMPONENT_NAME_PROTOCOL *This,
67 IN CHAR8 *Language,
68 OUT CHAR16 **DriverName);
69EFI_STATUS EFIAPI fsw_efi_ComponentName_GetControllerName(IN EFI_COMPONENT_NAME_PROTOCOL *This,
70 IN EFI_HANDLE ControllerHandle,
71 IN EFI_HANDLE ChildHandle OPTIONAL,
72 IN CHAR8 *Language,
73 OUT CHAR16 **ControllerName);
74
76 fsw_u32 old_phys_blocksize, fsw_u32 old_log_blocksize,
77 fsw_u32 new_phys_blocksize, fsw_u32 new_log_blocksize);
78fsw_status_t fsw_efi_read_block(struct fsw_volume *vol, fsw_u32 phys_bno, void *buffer);
79
80EFI_STATUS fsw_efi_map_status(fsw_status_t fsw_status, FSW_VOLUME_DATA *Volume);
81
82EFI_STATUS EFIAPI fsw_efi_FileSystem_OpenVolume(IN EFI_FILE_IO_INTERFACE *This,
83 OUT EFI_FILE **Root);
84EFI_STATUS fsw_efi_dnode_to_FileHandle(IN struct fsw_dnode *dno,
85 OUT EFI_FILE **NewFileHandle);
86
87EFI_STATUS fsw_efi_file_read(IN FSW_FILE_DATA *File,
88 IN OUT UINTN *BufferSize,
89 OUT VOID *Buffer);
90EFI_STATUS fsw_efi_file_getpos(IN FSW_FILE_DATA *File,
91 OUT UINT64 *Position);
92EFI_STATUS fsw_efi_file_setpos(IN FSW_FILE_DATA *File,
93 IN UINT64 Position);
94
95EFI_STATUS fsw_efi_dir_open(IN FSW_FILE_DATA *File,
96 OUT EFI_FILE **NewHandle,
97 IN CHAR16 *FileName,
98 IN UINT64 OpenMode,
99 IN UINT64 Attributes);
100EFI_STATUS fsw_efi_dir_read(IN FSW_FILE_DATA *File,
101 IN OUT UINTN *BufferSize,
102 OUT VOID *Buffer);
103EFI_STATUS fsw_efi_dir_setpos(IN FSW_FILE_DATA *File,
104 IN UINT64 Position);
105
106EFI_STATUS fsw_efi_dnode_getinfo(IN FSW_FILE_DATA *File,
107 IN EFI_GUID *InformationType,
108 IN OUT UINTN *BufferSize,
109 OUT VOID *Buffer);
110EFI_STATUS fsw_efi_dnode_fill_FileInfo(IN FSW_VOLUME_DATA *Volume,
111 IN struct fsw_dnode *dno,
112 IN OUT UINTN *BufferSize,
113 OUT VOID *Buffer);
114
115EFI_STATUS fsw_efi_bless_info(IN FSW_VOLUME_DATA *Volume,
116 IN UINT32 type,
117 OUT VOID *Buffer,
118 IN OUT UINTN *BufferSize);
123EFI_DRIVER_BINDING_PROTOCOL fsw_efi_DriverBinding_table = {
127 0x10,
128 NULL,
129 NULL
130};
131
141
152
154
155
162EFI_STATUS EFIAPI fsw_efi_main(IN EFI_HANDLE ImageHandle,
163 IN EFI_SYSTEM_TABLE *SystemTable)
164{
165 EFI_STATUS Status;
166
167 // complete Driver Binding protocol instance
168 fsw_efi_DriverBinding_table.ImageHandle = ImageHandle;
169 fsw_efi_DriverBinding_table.DriverBindingHandle = ImageHandle;
170 // install Driver Binding protocol
171 Status = BS->InstallProtocolInterface(&fsw_efi_DriverBinding_table.DriverBindingHandle,
173 EFI_NATIVE_INTERFACE,
175 if (EFI_ERROR (Status)) {
176 return Status;
177 }
178
179 // install Component Name protocol
180 Status = BS->InstallProtocolInterface(&fsw_efi_DriverBinding_table.DriverBindingHandle,
182 EFI_NATIVE_INTERFACE,
184 if (EFI_ERROR (Status)) {
185 return Status;
186 }
187
188 return EFI_SUCCESS;
189}
190
198EFI_STATUS EFIAPI fsw_efi_DriverBinding_Supported(IN EFI_DRIVER_BINDING_PROTOCOL *This,
199 IN EFI_HANDLE ControllerHandle,
200 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath)
201{
202 EFI_STATUS Status;
203 EFI_DISK_IO *DiskIo;
204
205 // we check for both DiskIO and BlockIO protocols
206
207 // first, open DiskIO
208 Status = BS->OpenProtocol(ControllerHandle,
210 (VOID **) &DiskIo,
211 This->DriverBindingHandle,
212 ControllerHandle,
213 EFI_OPEN_PROTOCOL_BY_DRIVER);
214 if (EFI_ERROR(Status))
215 return Status;
216
217 // we were just checking, close it again
218 BS->CloseProtocol(ControllerHandle,
220 This->DriverBindingHandle,
221 ControllerHandle);
222
223 // next, check BlockIO without actually opening it
224 Status = BS->OpenProtocol(ControllerHandle,
226 NULL,
227 This->DriverBindingHandle,
228 ControllerHandle,
229 EFI_OPEN_PROTOCOL_TEST_PROTOCOL);
230 return Status;
231}
232
246EFI_STATUS EFIAPI fsw_efi_DriverBinding_Start(IN EFI_DRIVER_BINDING_PROTOCOL *This,
247 IN EFI_HANDLE ControllerHandle,
248 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath)
249{
250 EFI_STATUS Status;
251 EFI_BLOCK_IO *BlockIo;
252 EFI_DISK_IO *DiskIo;
253 FSW_VOLUME_DATA *Volume;
254
255#if DEBUG_LEVEL
256 Print(L"fsw_efi_DriverBinding_Start\n");
257#endif
258
259 // open consumed protocols
260 Status = BS->OpenProtocol(ControllerHandle,
262 (VOID **) &BlockIo,
263 This->DriverBindingHandle,
264 ControllerHandle,
265 EFI_OPEN_PROTOCOL_GET_PROTOCOL); // NOTE: we only want to look at the MediaId
266 if (EFI_ERROR(Status)) {
267 Print(L"Fsw ERROR: OpenProtocol(BlockIo) returned %x\n", Status);
268 return Status;
269 }
270
271 Status = BS->OpenProtocol(ControllerHandle,
273 (VOID **) &DiskIo,
274 This->DriverBindingHandle,
275 ControllerHandle,
276 EFI_OPEN_PROTOCOL_BY_DRIVER);
277 if (EFI_ERROR(Status)) {
278 Print(L"Fsw ERROR: OpenProtocol(DiskIo) returned %x\n", Status);
279 return Status;
280 }
281
282 // allocate volume structure
283 Volume = AllocateZeroPool(sizeof(FSW_VOLUME_DATA));
285 Volume->Handle = ControllerHandle;
286 Volume->DiskIo = DiskIo;
287 Volume->MediaId = BlockIo->Media->MediaId;
288 Volume->LastIOStatus = EFI_SUCCESS;
289
290 // mount the filesystem
292 &FSW_FSTYPE_TABLE_NAME(FSTYPE), &Volume->vol),
293 Volume);
294
295 if (!EFI_ERROR(Status)) {
296 // register the SimpleFileSystem protocol
297 Volume->FileSystem.Revision = EFI_FILE_IO_INTERFACE_REVISION;
298 Volume->FileSystem.OpenVolume = fsw_efi_FileSystem_OpenVolume;
299 Status = BS->InstallMultipleProtocolInterfaces(&ControllerHandle,
301 NULL);
302 if (EFI_ERROR(Status))
303 Print(L"Fsw ERROR: InstallMultipleProtocolInterfaces returned %x\n", Status);
304 }
305
306 // on errors, close the opened protocols
307 if (EFI_ERROR(Status)) {
308 if (Volume->vol != NULL)
309 fsw_unmount(Volume->vol);
310 FreePool(Volume);
311
312 BS->CloseProtocol(ControllerHandle,
314 This->DriverBindingHandle,
315 ControllerHandle);
316 }
317
318 return Status;
319}
320
331EFI_STATUS EFIAPI fsw_efi_DriverBinding_Stop(IN EFI_DRIVER_BINDING_PROTOCOL *This,
332 IN EFI_HANDLE ControllerHandle,
333 IN UINTN NumberOfChildren,
334 IN EFI_HANDLE *ChildHandleBuffer)
335{
336 EFI_STATUS Status;
337 EFI_FILE_IO_INTERFACE *FileSystem;
338 FSW_VOLUME_DATA *Volume;
339
340#if DEBUG_LEVEL
341 Print(L"fsw_efi_DriverBinding_Stop\n");
342#endif
343
344 // get the installed SimpleFileSystem interface
345 Status = BS->OpenProtocol(ControllerHandle,
347 (VOID **) &FileSystem,
348 This->DriverBindingHandle,
349 ControllerHandle,
350 EFI_OPEN_PROTOCOL_GET_PROTOCOL);
351 if (EFI_ERROR(Status))
352 return EFI_UNSUPPORTED;
353
354 // get private data structure
355 Volume = FSW_VOLUME_FROM_FILE_SYSTEM(FileSystem);
356
357 // uninstall Simple File System protocol
358 Status = BS->UninstallMultipleProtocolInterfaces(ControllerHandle,
360 NULL);
361 if (EFI_ERROR(Status)) {
362 Print(L"Fsw ERROR: UninstallMultipleProtocolInterfaces returned %x\n", Status);
363 return Status;
364 }
365#if DEBUG_LEVEL
366 Print(L"fsw_efi_DriverBinding_Stop: protocol uninstalled successfully\n");
367#endif
368
369 // release private data structure
370 if (Volume->vol != NULL)
371 fsw_unmount(Volume->vol);
372 FreePool(Volume);
373
374 // close the consumed protocols
375 Status = BS->CloseProtocol(ControllerHandle,
377 This->DriverBindingHandle,
378 ControllerHandle);
379
380 return Status;
381}
382
389EFI_STATUS EFIAPI fsw_efi_ComponentName_GetDriverName(IN EFI_COMPONENT_NAME_PROTOCOL *This,
390 IN CHAR8 *Language,
391 OUT CHAR16 **DriverName)
392{
393 if (Language == NULL || DriverName == NULL)
394 return EFI_INVALID_PARAMETER;
395
396 if (Language[0] == 'e' && Language[1] == 'n' && Language[2] == 'g' && Language[3] == 0) {
397 *DriverName = FSW_EFI_DRIVER_NAME(FSTYPE);
398 return EFI_SUCCESS;
399 }
400 return EFI_UNSUPPORTED;
401}
402
408EFI_STATUS EFIAPI fsw_efi_ComponentName_GetControllerName(IN EFI_COMPONENT_NAME_PROTOCOL *This,
409 IN EFI_HANDLE ControllerHandle,
410 IN EFI_HANDLE ChildHandle OPTIONAL,
411 IN CHAR8 *Language,
412 OUT CHAR16 **ControllerName)
413{
414 return EFI_UNSUPPORTED;
415}
416
423 fsw_u32 old_phys_blocksize, fsw_u32 old_log_blocksize,
424 fsw_u32 new_phys_blocksize, fsw_u32 new_log_blocksize)
425{
426 // nothing to do
427}
428
434fsw_status_t fsw_efi_read_block(struct fsw_volume *vol, fsw_u32 phys_bno, void *buffer)
435{
436 EFI_STATUS Status;
437 FSW_VOLUME_DATA *Volume = (FSW_VOLUME_DATA *)vol->host_data;
438
439 FSW_MSG_DEBUGV((FSW_MSGSTR("fsw_efi_read_block: %d (%d)\n"), phys_bno, vol->phys_blocksize));
440
441 // read from disk
442 Status = Volume->DiskIo->ReadDisk(Volume->DiskIo, Volume->MediaId,
443 (UINT64)phys_bno * vol->phys_blocksize,
444 vol->phys_blocksize,
445 buffer);
446 Volume->LastIOStatus = Status;
447 if (EFI_ERROR(Status))
448 return FSW_IO_ERROR;
449 return FSW_SUCCESS;
450}
451
458EFI_STATUS fsw_efi_map_status(fsw_status_t fsw_status, FSW_VOLUME_DATA *Volume)
459{
460 switch (fsw_status) {
461 case FSW_SUCCESS:
462 return EFI_SUCCESS;
464 return EFI_VOLUME_CORRUPTED;
465 case FSW_IO_ERROR:
466 return Volume->LastIOStatus;
467 case FSW_UNSUPPORTED:
468 return EFI_UNSUPPORTED;
469 case FSW_NOT_FOUND:
470 return EFI_NOT_FOUND;
472 return EFI_VOLUME_CORRUPTED;
473 default:
474 return EFI_DEVICE_ERROR;
475 }
476}
477
485EFI_STATUS EFIAPI fsw_efi_FileSystem_OpenVolume(IN EFI_FILE_IO_INTERFACE *This,
486 OUT EFI_FILE **Root)
487{
488 EFI_STATUS Status;
490
491#if DEBUG_LEVEL
492 Print(L"fsw_efi_FileSystem_OpenVolume\n");
493#endif
494
495 Status = fsw_efi_dnode_to_FileHandle(Volume->vol->root, Root);
496
497 return Status;
498}
499
505EFI_STATUS EFIAPI fsw_efi_FileHandle_Open(IN EFI_FILE *This,
506 OUT EFI_FILE **NewHandle,
507 IN CHAR16 *FileName,
508 IN UINT64 OpenMode,
509 IN UINT64 Attributes)
510{
512
513 if (File->Type == FSW_EFI_FILE_TYPE_DIR)
514 return fsw_efi_dir_open(File, NewHandle, FileName, OpenMode, Attributes);
515 // not supported for regular files
516 return EFI_UNSUPPORTED;
517}
518
524EFI_STATUS EFIAPI fsw_efi_FileHandle_Close(IN EFI_FILE *This)
525{
527
528#if DEBUG_LEVEL
529 Print(L"fsw_efi_FileHandle_Close\n");
530#endif
531
532 fsw_shandle_close(&File->shand);
533 FreePool(File);
534
535 return EFI_SUCCESS;
536}
537
543EFI_STATUS EFIAPI fsw_efi_FileHandle_Delete(IN EFI_FILE *This)
544{
545 EFI_STATUS Status;
546
547 Status = This->Close(This);
548 if (Status == EFI_SUCCESS) {
549 // this driver is read-only
550 Status = EFI_WARN_DELETE_FAILURE;
551 }
552
553 return Status;
554}
555
561EFI_STATUS EFIAPI fsw_efi_FileHandle_Read(IN EFI_FILE *This,
562 IN OUT UINTN *BufferSize,
563 OUT VOID *Buffer)
564{
566
567 if (File->Type == FSW_EFI_FILE_TYPE_FILE)
568 return fsw_efi_file_read(File, BufferSize, Buffer);
569 else if (File->Type == FSW_EFI_FILE_TYPE_DIR)
570 return fsw_efi_dir_read(File, BufferSize, Buffer);
571 return EFI_UNSUPPORTED;
572}
573
579EFI_STATUS EFIAPI fsw_efi_FileHandle_Write(IN EFI_FILE *This,
580 IN OUT UINTN *BufferSize,
581 IN VOID *Buffer)
582{
583 // this driver is read-only
584 return EFI_WRITE_PROTECTED;
585}
586
592EFI_STATUS EFIAPI fsw_efi_FileHandle_GetPosition(IN EFI_FILE *This,
593 OUT UINT64 *Position)
594{
596
597 if (File->Type == FSW_EFI_FILE_TYPE_FILE)
598 return fsw_efi_file_getpos(File, Position);
599 // not defined for directories
600 return EFI_UNSUPPORTED;
601}
602
608EFI_STATUS EFIAPI fsw_efi_FileHandle_SetPosition(IN EFI_FILE *This,
609 IN UINT64 Position)
610{
612
613 if (File->Type == FSW_EFI_FILE_TYPE_FILE)
614 return fsw_efi_file_setpos(File, Position);
615 else if (File->Type == FSW_EFI_FILE_TYPE_DIR)
616 return fsw_efi_dir_setpos(File, Position);
617 return EFI_UNSUPPORTED;
618}
619
625EFI_STATUS EFIAPI fsw_efi_FileHandle_GetInfo(IN EFI_FILE *This,
626 IN EFI_GUID *InformationType,
627 IN OUT UINTN *BufferSize,
628 OUT VOID *Buffer)
629{
631
632 return fsw_efi_dnode_getinfo(File, InformationType, BufferSize, Buffer);
633}
634
640EFI_STATUS EFIAPI fsw_efi_FileHandle_SetInfo(IN EFI_FILE *This,
641 IN EFI_GUID *InformationType,
642 IN UINTN BufferSize,
643 IN VOID *Buffer)
644{
645 // this driver is read-only
646 return EFI_WRITE_PROTECTED;
647}
648
654EFI_STATUS EFIAPI fsw_efi_FileHandle_Flush(IN EFI_FILE *This)
655{
656 // this driver is read-only
657 return EFI_WRITE_PROTECTED;
658}
659
666EFI_STATUS fsw_efi_dnode_to_FileHandle(IN struct fsw_dnode *dno,
667 OUT EFI_FILE **NewFileHandle)
668{
669 EFI_STATUS Status;
670 FSW_FILE_DATA *File;
671
672 // make sure the dnode has complete info
673 Status = fsw_efi_map_status(fsw_dnode_fill(dno), (FSW_VOLUME_DATA *)dno->vol->host_data);
674 if (EFI_ERROR(Status))
675 return Status;
676
677 // check type
678 if (dno->type != FSW_DNODE_TYPE_FILE && dno->type != FSW_DNODE_TYPE_DIR)
679 return EFI_UNSUPPORTED;
680
681 // allocate file structure
682 File = AllocateZeroPool(sizeof(FSW_FILE_DATA));
684 if (dno->type == FSW_DNODE_TYPE_FILE)
686 else if (dno->type == FSW_DNODE_TYPE_DIR)
688
689 // open shandle
690 Status = fsw_efi_map_status(fsw_shandle_open(dno, &File->shand),
691 (FSW_VOLUME_DATA *)dno->vol->host_data);
692 if (EFI_ERROR(Status)) {
693 FreePool(File);
694 return Status;
695 }
696
697 // populate the file handle
698 File->FileHandle.Revision = EFI_FILE_HANDLE_REVISION;
704 File->FileHandle.GetPosition = fsw_efi_FileHandle_GetPosition;
705 File->FileHandle.SetPosition = fsw_efi_FileHandle_SetPosition;
709
710 *NewFileHandle = &File->FileHandle;
711 return EFI_SUCCESS;
712}
713
719 IN OUT UINTN *BufferSize,
720 OUT VOID *Buffer)
721{
722 EFI_STATUS Status;
723 fsw_u32 buffer_size;
724
725#if DEBUG_LEVEL
726 Print(L"fsw_efi_file_read %d bytes\n", *BufferSize);
727#endif
728
729 buffer_size = (fsw_u32) *BufferSize;
730 Status = fsw_efi_map_status(fsw_shandle_read(&File->shand, &buffer_size, Buffer),
731 (FSW_VOLUME_DATA *)File->shand.dnode->vol->host_data);
732 *BufferSize = buffer_size;
733
734 return Status;
735}
736
742 OUT UINT64 *Position)
743{
744 *Position = File->shand.pos;
745 return EFI_SUCCESS;
746}
747
754 IN UINT64 Position)
755{
756 if (Position == 0xFFFFFFFFFFFFFFFFULL)
757 File->shand.pos = File->shand.dnode->size;
758 else
759 File->shand.pos = Position;
760 return EFI_SUCCESS;
761}
762
771EFI_STATUS fsw_efi_dir_open(IN FSW_FILE_DATA *File,
772 OUT EFI_FILE **NewHandle,
773 IN CHAR16 *FileName,
774 IN UINT64 OpenMode,
775 IN UINT64 Attributes)
776{
777 EFI_STATUS Status;
778 FSW_VOLUME_DATA *Volume = (FSW_VOLUME_DATA *)File->shand.dnode->vol->host_data;
779 struct fsw_dnode *dno;
780 struct fsw_dnode *target_dno;
781 struct fsw_string lookup_path;
782
783#if DEBUG_LEVEL
784 Print(L"fsw_efi_dir_open: '%s'\n", FileName);
785#endif
786
787 if (OpenMode != EFI_FILE_MODE_READ)
788 return EFI_WRITE_PROTECTED;
789
790 lookup_path.type = FSW_STRING_TYPE_UTF16;
791 lookup_path.len = (int) StrLen(FileName);
792 lookup_path.size = lookup_path.len * sizeof(fsw_u16);
793 lookup_path.data = FileName;
794
795 // resolve the path (symlinks along the way are automatically resolved)
796 Status = fsw_efi_map_status(fsw_dnode_lookup_path(File->shand.dnode, &lookup_path, '\\', &dno),
797 Volume);
798 if (EFI_ERROR(Status))
799 return Status;
800
801 // if the final node is a symlink, also resolve it
802 Status = fsw_efi_map_status(fsw_dnode_resolve(dno, &target_dno),
803 Volume);
805 if (EFI_ERROR(Status))
806 return Status;
807 dno = target_dno;
808
809 // make a new EFI handle for the target dnode
810 Status = fsw_efi_dnode_to_FileHandle(dno, NewHandle);
812 return Status;
813}
814
820EFI_STATUS fsw_efi_dir_read(IN FSW_FILE_DATA *File,
821 IN OUT UINTN *BufferSize,
822 OUT VOID *Buffer)
823{
824 EFI_STATUS Status;
825 FSW_VOLUME_DATA *Volume = (FSW_VOLUME_DATA *)File->shand.dnode->vol->host_data;
826 struct fsw_dnode *dno;
827
828#if DEBUG_LEVEL
829 Print(L"fsw_efi_dir_read...\n");
830#endif
831
832 // read the next entry
833 Status = fsw_efi_map_status(fsw_dnode_dir_read(&File->shand, &dno),
834 Volume);
835 if (Status == EFI_NOT_FOUND) {
836 // end of directory
837 *BufferSize = 0;
838#if DEBUG_LEVEL
839 Print(L"...no more entries\n");
840#endif
841 return EFI_SUCCESS;
842 }
843 if (EFI_ERROR(Status))
844 return Status;
845
846 // get info into buffer
847 Status = fsw_efi_dnode_fill_FileInfo(Volume, dno, BufferSize, Buffer);
849 return Status;
850}
851
859 IN UINT64 Position)
860{
861 if (Position == 0) {
862 File->shand.pos = 0;
863 return EFI_SUCCESS;
864 } else {
865 // directories can only rewind to the start
866 return EFI_UNSUPPORTED;
867 }
868}
869
871 IN UINT32 BlessType,
872 OUT VOID *Buffer,
873 IN OUT UINTN *BufferSize) {
874 EFI_STATUS Status;
875 UINTN RequiredSize;
876 EFI_DEVICE_PATH_PROTOCOL *devicePathProtocol;
877 struct fsw_string PathStr;
878 UINT16 *PathChars;
879
880#if DEBUG_LEVEL
881 Print(L"fsw_efi_bless_info.1\n");
882#endif
883
884 Status = fsw_efi_map_status(fsw_get_bless_info(Volume->vol, BlessType, &PathStr), Volume);
885 if (Status)
886 return EFI_NOT_FOUND;
887
888 // We assume that PathStr is in UTF16
889 // Reserve one symbol for '\0'
890 RequiredSize = (PathStr.len + 1) * sizeof(UINT16);
891 if ((PathChars = AllocatePool(RequiredSize)) == NULL) {
892 fsw_strfree (&PathStr);
893 return EFI_OUT_OF_RESOURCES;
894 }
895
896 CopyMem(PathChars, PathStr.data, PathStr.size);
897 PathChars[PathStr.len] = 0;
898 fsw_strfree(&PathStr);
899
900#if DEBUG_LEVEL
901 Print(L"fsw_efi_bless_info.2 type=%d, res=%s\n", BlessType, PathChars);
902#endif
903
904 devicePathProtocol = FileDevicePath(Volume->Handle, PathChars);
905 FreePool(PathChars);
906
907 RequiredSize = GetDevicePathSize(devicePathProtocol);
908 if (*BufferSize < RequiredSize)
909 Status = EFI_BUFFER_TOO_SMALL;
910 else {
911 CopyMem(Buffer, devicePathProtocol, RequiredSize);
912 Status = EFI_SUCCESS;
913 }
914
915 *BufferSize = RequiredSize;
916 FreePool(devicePathProtocol);
917
918 return Status;
919}
920
928 IN EFI_GUID *InformationType,
929 IN OUT UINTN *BufferSize,
930 OUT VOID *Buffer)
931{
932 EFI_STATUS Status;
933 FSW_VOLUME_DATA *Volume = (FSW_VOLUME_DATA *)File->shand.dnode->vol->host_data;
934 EFI_FILE_SYSTEM_INFO *FSInfo;
935 UINTN RequiredSize;
936 struct fsw_volume_stat vsb;
937
938 if (CompareGuid(InformationType, &gEfiFileInfoGuid)) {
939#if DEBUG_LEVEL
940 Print(L"fsw_efi_dnode_getinfo: FILE_INFO\n");
941#endif
942
943 Status = fsw_efi_dnode_fill_FileInfo(Volume, File->shand.dnode, BufferSize, Buffer);
944
945 } else if (CompareGuid(InformationType, &gEfiFileSystemInfoGuid)) {
946#if DEBUG_LEVEL
947 Print(L"fsw_efi_dnode_getinfo: FILE_SYSTEM_INFO\n");
948#endif
949
950 // check buffer size
951 RequiredSize = SIZE_OF_EFI_FILE_SYSTEM_INFO + fsw_efi_strsize(&Volume->vol->label);
952 if (*BufferSize < RequiredSize) {
953 *BufferSize = RequiredSize;
954 return EFI_BUFFER_TOO_SMALL;
955 }
956
957 // fill structure
958 FSInfo = (EFI_FILE_SYSTEM_INFO *)Buffer;
959 FSInfo->Size = RequiredSize;
960 FSInfo->ReadOnly = TRUE;
961 FSInfo->BlockSize = Volume->vol->log_blocksize;
962 fsw_efi_strcpy(FSInfo->VolumeLabel, &Volume->vol->label);
963
964 // get the missing info from the fs driver
965 ZeroMem(&vsb, sizeof(struct fsw_volume_stat));
966 Status = fsw_efi_map_status(fsw_volume_stat(Volume->vol, &vsb), Volume);
967 if (EFI_ERROR(Status))
968 return Status;
969 FSInfo->VolumeSize = vsb.total_bytes;
970 FSInfo->FreeSpace = vsb.free_bytes;
971
972 // prepare for return
973 *BufferSize = RequiredSize;
974 Status = EFI_SUCCESS;
975
976 } else if (CompareGuid(InformationType, &gEfiFileSystemVolumeLabelInfoIdGuid)) {
977#if DEBUG_LEVEL
978 Print(L"fsw_efi_dnode_getinfo: FILE_SYSTEM_VOLUME_LABEL\n");
979#endif
980
981 // check buffer size
983 if (*BufferSize < RequiredSize) {
984 *BufferSize = RequiredSize;
985 return EFI_BUFFER_TOO_SMALL;
986 }
987
988 // copy volume label
990
991 // prepare for return
992 *BufferSize = RequiredSize;
993 Status = EFI_SUCCESS;
994 } else if (CompareGuid(InformationType, &gAppleBlessedSystemFileInfoGuid)) {
995 Status = fsw_efi_bless_info(Volume, BLESSED_TYPE_SYSTEM_FILE, Buffer, BufferSize);
996 } else if (CompareGuid(InformationType, &gAppleBlessedSystemFolderInfoGuid)) {
997 Status = fsw_efi_bless_info(Volume, BLESSED_TYPE_SYSTEM_FOLDER, Buffer, BufferSize);
998 } else if (CompareGuid(InformationType, &gAppleBlessedOsxFolderInfoGuid)) {
999 Status = fsw_efi_bless_info(Volume, BLESSED_TYPE_OSX_FOLDER, Buffer, BufferSize);
1000 } else {
1001 Status = EFI_UNSUPPORTED;
1002 }
1003
1004 return Status;
1005}
1006
1013static void fsw_efi_store_time_posix(struct fsw_dnode_stat *sb, int which, fsw_u32 posix_time)
1014{
1015 EFI_FILE_INFO *FileInfo = (EFI_FILE_INFO *)sb->host_data;
1016
1017 if (which == FSW_DNODE_STAT_CTIME)
1018 fsw_efi_decode_time(&FileInfo->CreateTime, posix_time);
1019 else if (which == FSW_DNODE_STAT_MTIME)
1020 fsw_efi_decode_time(&FileInfo->ModificationTime, posix_time);
1021 else if (which == FSW_DNODE_STAT_ATIME)
1022 fsw_efi_decode_time(&FileInfo->LastAccessTime, posix_time);
1023}
1024
1031static void fsw_efi_store_attr_posix(struct fsw_dnode_stat *sb, fsw_u16 posix_mode)
1032{
1033 EFI_FILE_INFO *FileInfo = (EFI_FILE_INFO *)sb->host_data;
1034
1035 if ((posix_mode & S_IWUSR) == 0)
1036 FileInfo->Attribute |= EFI_FILE_READ_ONLY;
1037}
1038
1044 IN struct fsw_dnode *dno,
1045 IN OUT UINTN *BufferSize,
1046 OUT VOID *Buffer)
1047{
1048 EFI_STATUS Status;
1049 EFI_FILE_INFO *FileInfo;
1050 UINTN RequiredSize;
1051 struct fsw_dnode_stat sb;
1052 struct fsw_dnode *target_dno;
1053
1054 // make sure the dnode has complete info
1055 Status = fsw_efi_map_status(fsw_dnode_fill(dno), Volume);
1056 if (EFI_ERROR(Status))
1057 return Status;
1058
1059 // TODO: check/assert that the dno's name is in UTF16
1060
1061 // check buffer size
1062 RequiredSize = SIZE_OF_EFI_FILE_INFO + fsw_efi_strsize(&dno->name);
1063 if (*BufferSize < RequiredSize) {
1064 // TODO: wind back the directory in this case
1065
1066#if DEBUG_LEVEL
1067 Print(L"...BUFFER TOO SMALL\n");
1068#endif
1069 *BufferSize = RequiredSize;
1070 return EFI_BUFFER_TOO_SMALL;
1071 }
1072
1073 // fill structure
1074 ZeroMem(Buffer, RequiredSize);
1075 FileInfo = (EFI_FILE_INFO *)Buffer;
1076
1077 // copy name before symlink resolving
1078 fsw_efi_strcpy(FileInfo->FileName, &dno->name);
1079
1080 // resolve symlink if needed
1081 Status = fsw_efi_map_status (fsw_dnode_resolve (dno, &target_dno), Volume);
1082 if (EFI_ERROR (Status))
1083 return Status;
1084
1085 // make sure the dnode has complete info
1086 Status = fsw_efi_map_status(fsw_dnode_fill(dno), Volume);
1087 if (EFI_ERROR(Status)) {
1088 fsw_dnode_release (target_dno);
1089 return Status;
1090 }
1091
1092 fsw_dnode_release(dno);
1093 dno = target_dno;
1094
1095 FileInfo->Size = RequiredSize;
1096 FileInfo->FileSize = dno->size;
1097 FileInfo->Attribute = 0;
1098 if (dno->type == FSW_DNODE_TYPE_DIR)
1099 FileInfo->Attribute |= EFI_FILE_DIRECTORY;
1100 fsw_efi_strcpy(FileInfo->FileName, &dno->name);
1101
1102 // get the missing info from the fs driver
1103 ZeroMem(&sb, sizeof(struct fsw_dnode_stat));
1104 sb.store_time_posix = fsw_efi_store_time_posix;
1105 sb.store_attr_posix = fsw_efi_store_attr_posix;
1106 sb.host_data = FileInfo;
1107 Status = fsw_efi_map_status(fsw_dnode_stat(dno, &sb), Volume);
1108 if (EFI_ERROR(Status))
1109 return Status;
1110 FileInfo->PhysicalSize = sb.used_bytes;
1111
1112 // prepare for return
1113 *BufferSize = RequiredSize;
1114#if DEBUG_LEVEL
1115 Print(L"...returning '%s'\n", FileInfo->FileName);
1116#endif
1117 return EFI_SUCCESS;
1118}
1119
1120// EOF
EFI_GUID gAppleBlessedOsxFolderInfoGuid
A global variable storing the GUID of the APPLE_BLESSED_OSX_FOLDER_INFO_GUID.
EFI_GUID gAppleBlessedSystemFileInfoGuid
A global variable storing the GUID of the APPLE_BLESSED_SYSTEM_FILE_INFO_GUID.
EFI_GUID gAppleBlessedSystemFolderInfoGuid
A global variable storing the GUID of the APPLE_BLESSED_SYSTEM_FOLDER_INFO_GUID.
cache_type_t type
OC_TYPING_BUFFER_ENTRY Buffer[OC_TYPING_BUFFER_SIZE]
Definition OcTypingLib.h:42
VOID *EFIAPI CopyMem(OUT VOID *DestinationBuffer, IN CONST VOID *SourceBuffer, IN UINTN Length)
BOOLEAN EFIAPI CompareGuid(IN CONST GUID *Guid1, IN CONST GUID *Guid2)
VOID *EFIAPI ZeroMem(OUT VOID *Buffer, IN UINTN Length)
EFI_GUID gEfiFileInfoGuid
EFI_GUID gEfiFileSystemInfoGuid
EFI_GUID gEfiDriverBindingProtocolGuid
EFI_GUID gEfiSimpleFileSystemProtocolGuid
EFI_GUID gEfiComponentNameProtocolGuid
EFI_GUID gEfiFileSystemVolumeLabelInfoIdGuid
EFI_GUID gEfiBlockIoProtocolGuid
EFI_GUID gEfiDiskIoProtocolGuid
#define FSW_MSG_DEBUGV(params)
Definition fsw_base.h:76
fsw_status_t fsw_shandle_read(struct fsw_shandle *shand, fsw_u32 *buffer_size_inout, void *buffer_in)
Definition fsw_core.c:860
fsw_status_t fsw_dnode_stat(struct fsw_dnode *dno, struct fsw_dnode_stat *sb)
Definition fsw_core.c:502
fsw_status_t fsw_dnode_fill(struct fsw_dnode *dno)
Definition fsw_core.c:483
fsw_status_t fsw_dnode_dir_read(struct fsw_shandle *shand, struct fsw_dnode **child_dno_out)
Definition fsw_core.c:669
void fsw_shandle_close(struct fsw_shandle *shand)
Definition fsw_core.c:848
fsw_status_t fsw_dnode_lookup_path(struct fsw_dnode *dno, struct fsw_string *lookup_path, char separator, struct fsw_dnode **child_dno_out)
Definition fsw_core.c:554
fsw_status_t fsw_shandle_open(struct fsw_dnode *dno, struct fsw_shandle *shand)
Definition fsw_core.c:822
fsw_status_t fsw_volume_stat(struct fsw_volume *vol, struct fsw_volume_stat *sb)
Definition fsw_core.c:125
fsw_status_t fsw_get_bless_info(struct fsw_volume *vol, int type, struct fsw_string *out_path)
Definition fsw_core.c:1039
fsw_status_t fsw_dnode_resolve(struct fsw_dnode *dno, struct fsw_dnode **target_dno_out)
Definition fsw_core.c:764
fsw_status_t fsw_mount(void *host_data, struct fsw_host_table *host_table, struct fsw_fstype_table *fstype_table, struct fsw_volume **vol_out)
Definition fsw_core.c:62
void fsw_unmount(struct fsw_volume *vol)
Definition fsw_core.c:107
void fsw_dnode_release(struct fsw_dnode *dno)
Definition fsw_core.c:442
int fsw_status_t
Definition fsw_core.h:153
void fsw_strfree(struct fsw_string *s)
Definition fsw_lib.c:310
@ FSW_DNODE_TYPE_FILE
Definition fsw_core.h:265
@ FSW_DNODE_TYPE_DIR
Definition fsw_core.h:266
#define FSW_FSTYPE_TABLE_NAME(t)
Definition fsw_core.h:53
@ FSW_UNSUPPORTED
Definition fsw_core.h:162
@ FSW_NOT_FOUND
Definition fsw_core.h:163
@ FSW_SUCCESS
Definition fsw_core.h:159
@ FSW_VOLUME_CORRUPTED
Definition fsw_core.h:164
@ FSW_IO_ERROR
Definition fsw_core.h:161
@ FSW_OUT_OF_MEMORY
Definition fsw_core.h:160
#define S_IWUSR
Definition fsw_core.h:494
@ BLESSED_TYPE_SYSTEM_FILE
Definition fsw_core.h:272
@ BLESSED_TYPE_SYSTEM_FOLDER
Definition fsw_core.h:273
@ BLESSED_TYPE_OSX_FOLDER
Definition fsw_core.h:274
@ FSW_DNODE_STAT_ATIME
Definition fsw_core.h:338
@ FSW_DNODE_STAT_CTIME
Definition fsw_core.h:336
@ FSW_DNODE_STAT_MTIME
Definition fsw_core.h:337
@ FSW_STRING_TYPE_UTF16
Definition fsw_core.h:188
EFI_COMPONENT_NAME_PROTOCOL fsw_efi_ComponentName_table
Definition fsw_efi.c:136
EFI_DRIVER_BINDING_PROTOCOL fsw_efi_DriverBinding_table
Definition fsw_efi.c:123
EFI_STATUS EFIAPI fsw_efi_DriverBinding_Start(IN EFI_DRIVER_BINDING_PROTOCOL *This, IN EFI_HANDLE ControllerHandle, IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath)
Definition fsw_efi.c:246
EFI_STATUS EFIAPI fsw_efi_FileSystem_OpenVolume(IN EFI_FILE_IO_INTERFACE *This, OUT EFI_FILE **Root)
Definition fsw_efi.c:485
#define FSW_EFI_DRIVER_NAME(t)
Definition fsw_efi.c:51
EFI_STATUS EFIAPI fsw_efi_ComponentName_GetControllerName(IN EFI_COMPONENT_NAME_PROTOCOL *This, IN EFI_HANDLE ControllerHandle, IN EFI_HANDLE ChildHandle OPTIONAL, IN CHAR8 *Language, OUT CHAR16 **ControllerName)
Definition fsw_efi.c:408
EFI_STATUS EFIAPI fsw_efi_FileHandle_SetPosition(IN EFI_FILE *This, IN UINT64 Position)
Definition fsw_efi.c:608
EFI_STATUS EFIAPI fsw_efi_FileHandle_Delete(IN EFI_FILE *This)
Definition fsw_efi.c:543
EFI_STATUS fsw_efi_dir_read(IN FSW_FILE_DATA *File, IN OUT UINTN *BufferSize, OUT VOID *Buffer)
Definition fsw_efi.c:820
EFI_STATUS fsw_efi_bless_info(IN FSW_VOLUME_DATA *Volume, IN UINT32 type, OUT VOID *Buffer, IN OUT UINTN *BufferSize)
Definition fsw_efi.c:870
EFI_STATUS EFIAPI fsw_efi_main(IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable)
Definition fsw_efi.c:162
#define FSTYPE
Definition fsw_efi.c:45
fsw_status_t fsw_efi_read_block(struct fsw_volume *vol, fsw_u32 phys_bno, void *buffer)
Definition fsw_efi.c:434
EFI_STATUS fsw_efi_dnode_to_FileHandle(IN struct fsw_dnode *dno, OUT EFI_FILE **NewFileHandle)
Definition fsw_efi.c:666
void fsw_efi_change_blocksize(struct fsw_volume *vol, fsw_u32 old_phys_blocksize, fsw_u32 old_log_blocksize, fsw_u32 new_phys_blocksize, fsw_u32 new_log_blocksize)
Definition fsw_efi.c:422
EFI_STATUS EFIAPI fsw_efi_FileHandle_Open(IN EFI_FILE *This, OUT EFI_FILE **NewHandle, IN CHAR16 *FileName, IN UINT64 OpenMode, IN UINT64 Attributes)
Definition fsw_efi.c:505
EFI_STATUS EFIAPI fsw_efi_FileHandle_Flush(IN EFI_FILE *This)
Definition fsw_efi.c:654
EFI_STATUS EFIAPI fsw_efi_ComponentName_GetDriverName(IN EFI_COMPONENT_NAME_PROTOCOL *This, IN CHAR8 *Language, OUT CHAR16 **DriverName)
Definition fsw_efi.c:389
EFI_STATUS fsw_efi_file_getpos(IN FSW_FILE_DATA *File, OUT UINT64 *Position)
Definition fsw_efi.c:741
EFI_STATUS EFIAPI fsw_efi_FileHandle_GetPosition(IN EFI_FILE *This, OUT UINT64 *Position)
Definition fsw_efi.c:592
EFI_STATUS EFIAPI fsw_efi_DriverBinding_Supported(IN EFI_DRIVER_BINDING_PROTOCOL *This, IN EFI_HANDLE ControllerHandle, IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath)
Definition fsw_efi.c:198
EFI_STATUS fsw_efi_dir_setpos(IN FSW_FILE_DATA *File, IN UINT64 Position)
Definition fsw_efi.c:858
EFI_STATUS fsw_efi_map_status(fsw_status_t fsw_status, FSW_VOLUME_DATA *Volume)
Definition fsw_efi.c:458
EFI_STATUS EFIAPI fsw_efi_FileHandle_GetInfo(IN EFI_FILE *This, IN EFI_GUID *InformationType, IN OUT UINTN *BufferSize, OUT VOID *Buffer)
Definition fsw_efi.c:625
EFI_STATUS EFIAPI fsw_efi_FileHandle_Read(IN EFI_FILE *This, IN OUT UINTN *BufferSize, OUT VOID *Buffer)
Definition fsw_efi.c:561
EFI_STATUS EFIAPI fsw_efi_FileHandle_Write(IN EFI_FILE *This, IN OUT UINTN *BufferSize, IN VOID *Buffer)
Definition fsw_efi.c:579
EFI_STATUS fsw_efi_dnode_fill_FileInfo(IN FSW_VOLUME_DATA *Volume, IN struct fsw_dnode *dno, IN OUT UINTN *BufferSize, OUT VOID *Buffer)
Definition fsw_efi.c:1043
EFI_STATUS EFIAPI fsw_efi_FileHandle_Close(IN EFI_FILE *This)
Definition fsw_efi.c:524
EFI_STATUS fsw_efi_dir_open(IN FSW_FILE_DATA *File, OUT EFI_FILE **NewHandle, IN CHAR16 *FileName, IN UINT64 OpenMode, IN UINT64 Attributes)
Definition fsw_efi.c:771
struct fsw_host_table fsw_efi_host_table
Definition fsw_efi.c:146
EFI_STATUS fsw_efi_dnode_getinfo(IN FSW_FILE_DATA *File, IN EFI_GUID *InformationType, IN OUT UINTN *BufferSize, OUT VOID *Buffer)
Definition fsw_efi.c:927
EFI_STATUS EFIAPI fsw_efi_DriverBinding_Stop(IN EFI_DRIVER_BINDING_PROTOCOL *This, IN EFI_HANDLE ControllerHandle, IN UINTN NumberOfChildren, IN EFI_HANDLE *ChildHandleBuffer)
Definition fsw_efi.c:331
EFI_STATUS EFIAPI fsw_efi_FileHandle_SetInfo(IN EFI_FILE *This, IN EFI_GUID *InformationType, IN UINTN BufferSize, IN VOID *Buffer)
Definition fsw_efi.c:640
EFI_STATUS fsw_efi_file_setpos(IN FSW_FILE_DATA *File, IN UINT64 Position)
Definition fsw_efi.c:753
EFI_STATUS fsw_efi_file_read(IN FSW_FILE_DATA *File, IN OUT UINTN *BufferSize, OUT VOID *Buffer)
Definition fsw_efi.c:718
UINTN fsw_efi_strsize(struct fsw_string *s)
#define FSW_EFI_FILE_TYPE_FILE
Definition fsw_efi.h:83
#define FSW_FILE_FROM_FILE_HANDLE(a)
Definition fsw_efi.h:90
#define FSW_VOLUME_DATA_SIGNATURE
Definition fsw_efi.h:64
VOID fsw_efi_strcpy(CHAR16 *Dest, struct fsw_string *src)
#define FSW_EFI_FILE_TYPE_DIR
Definition fsw_efi.h:85
VOID fsw_efi_decode_time(OUT EFI_TIME *EfiTime, IN UINT32 UnixTime)
Definition fsw_efi_lib.c:71
#define FSW_VOLUME_FROM_FILE_SYSTEM(a)
Definition fsw_efi.h:66
#define FSW_FILE_DATA_SIGNATURE
Definition fsw_efi.h:88
UINT16 fsw_u16
UINT32 fsw_u32
#define FSW_MSGSTR(s)
#define EFI_FILE_HANDLE_REVISION
#define EFI_FILE_SYSTEM_VOLUME_LABEL_INFO
#define BS
#define SIZE_OF_EFI_FILE_SYSTEM_VOLUME_LABEL_INFO
EFI_FILE FileHandle
Published EFI protocol interface structure.
Definition fsw_efi.h:75
UINTN Type
File type used for dispatchinng.
Definition fsw_efi.h:77
struct fsw_shandle shand
FSW handle for this file.
Definition fsw_efi.h:78
UINT64 Signature
Used to identify this structure.
Definition fsw_efi.h:73
EFI_DISK_IO * DiskIo
The Disk I/O protocol we use for disk access.
Definition fsw_efi.h:55
UINT32 MediaId
The media ID from the Block I/O protocol.
Definition fsw_efi.h:56
UINT64 Signature
Used to identify this structure.
Definition fsw_efi.h:50
EFI_FILE_IO_INTERFACE FileSystem
Published EFI protocol interface structure.
Definition fsw_efi.h:52
struct fsw_volume * vol
FSW volume structure.
Definition fsw_efi.h:59
EFI_STATUS LastIOStatus
Last status from Disk I/O.
Definition fsw_efi.h:57
EFI_HANDLE Handle
The device handle the protocol is attached to.
Definition fsw_efi.h:54
void(* store_attr_posix)(struct fsw_dnode_stat *sb, fsw_u16 posix_mode)
Callbock for storing a Posix-style file mode.
Definition fsw_core.h:328
void(* store_time_posix)(struct fsw_dnode_stat *sb, int which, fsw_u32 posix_time)
Callback for storing a Posix-style timestamp.
Definition fsw_core.h:327
void * host_data
Hook for a host-specific data structure.
Definition fsw_core.h:329
fsw_u64 used_bytes
Bytes actually used by the file on disk.
Definition fsw_core.h:326
fsw_u64 size
Data size in bytes.
Definition fsw_core.h:253
void * data
Data pointer (may be NULL if type is EMPTY or len is zero)
Definition fsw_core.h:177
int len
Length in characters.
Definition fsw_core.h:175
int size
Total data size in bytes.
Definition fsw_core.h:176
int type
Encoding of the string - empty, ISO-8859-1, UTF8, UTF16.
Definition fsw_core.h:174
fsw_u64 free_bytes
Bytes still available for storing file data.
Definition fsw_core.h:318
fsw_u64 total_bytes
Total size of data area size in bytes.
Definition fsw_core.h:317
fsw_u32 phys_blocksize
Block size for disk access / file system structures.
Definition fsw_core.h:222
struct fsw_string label
Volume label.
Definition fsw_core.h:226
fsw_u32 log_blocksize
Block size for logical file data.
Definition fsw_core.h:223
void * host_data
Hook for a host-specific data structure.
Definition fsw_core.h:233
struct DNODESTRUCTNAME * root
Root directory dnode.
Definition fsw_core.h:225