OpenCore  1.0.4
OpenCore Bootloader
Loading...
Searching...
No Matches
NTFS.c
Go to the documentation of this file.
1
9#include "NTFS.h"
10#include "Helper.h"
11
12#define LANGUAGE_CODE_ENGLISH "eng"
13
14CHAR16 *gNTFSDriverName = L"NTFS Driver";
15
16EFI_COMPONENT_NAME_PROTOCOL
18 .GetDriverName = NTFSCtlDriverName,
19 .GetControllerName = NTFSCtlGetControllerName,
20 .SupportedLanguages = LANGUAGE_CODE_ENGLISH
21};
22
23EFI_DRIVER_BINDING_PROTOCOL
25 .Supported = NTFSSupported,
26 .Start = NTFSStart,
27 .Stop = NTFSStop,
28 .Version = 0x10U,
29 .ImageHandle = NULL,
30 .DriverBindingHandle = NULL
31};
32
33EFI_STATUS
34EFIAPI
36 IN EFI_HANDLE ImageHandle,
37 IN EFI_SYSTEM_TABLE *SystemTable
38 )
39{
40 EFI_STATUS Status;
41 EFI_LOADED_IMAGE_PROTOCOL *LoadedImage;
42
43 Status = gBS->OpenProtocol (
44 ImageHandle,
46 (VOID **)&LoadedImage,
47 ImageHandle,
48 NULL,
49 EFI_OPEN_PROTOCOL_GET_PROTOCOL
50 );
51 if (EFI_ERROR (Status)) {
52 DEBUG ((DEBUG_INFO, "NTFS: Could not open loaded image protocol - %r\n", Status));
53 return Status;
54 }
55
56 gNTFSDriverBinding.ImageHandle = ImageHandle;
57 gNTFSDriverBinding.DriverBindingHandle = ImageHandle;
58
59 Status = gBS->InstallMultipleProtocolInterfaces (
60 &ImageHandle,
65 NULL
66 );
67 if (EFI_ERROR (Status)) {
68 DEBUG ((DEBUG_INFO, "NTFS: Could not bind driver - %r\n", Status));
69 return Status;
70 }
71
72 LoadedImage->Unload = UnloadNTFSDriver;
73
74 return Status;
75}
76
77EFI_STATUS
78EFIAPI
80 IN EFI_HANDLE ImageHandle
81 )
82{
83 EFI_HANDLE *Buffer;
84 UINTN NumOfHandles;
85 UINTN Index;
86 EFI_STATUS Status;
87
88 Status = gBS->LocateHandleBuffer (
89 AllHandles,
90 NULL,
91 NULL,
92 &NumOfHandles,
93 &Buffer
94 );
95 if (EFI_ERROR (Status)) {
96 return Status;
97 }
98
99 for (Index = 0; Index < NumOfHandles; ++Index) {
100 gBS->DisconnectController (Buffer[Index], ImageHandle, NULL);
101 }
102
103 if (Buffer != NULL) {
104 FreePool (Buffer);
105 }
106
107 Status = gBS->UninstallMultipleProtocolInterfaces (
108 ImageHandle,
113 NULL
114 );
115
116 return Status;
117}
118
119EFI_STATUS
120EFIAPI
122 IN EFI_DRIVER_BINDING_PROTOCOL *This,
123 IN EFI_HANDLE Controller,
124 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL
125 )
126{
127 EFI_STATUS Status;
128 EFI_FS *Instance;
129
130 Instance = AllocateZeroPool (sizeof (EFI_FS));
131 if (Instance == NULL) {
132 DEBUG ((DEBUG_INFO, "NTFS: Out of memory.\n"));
133 return EFI_UNSUPPORTED;
134 }
135
136 Status = gBS->OpenProtocol (
137 Controller,
139 (VOID **)&Instance->BlockIo,
140 This->DriverBindingHandle,
141 Controller,
142 EFI_OPEN_PROTOCOL_GET_PROTOCOL
143 );
144 if (EFI_ERROR (Status)) {
145 FreePool (Instance);
146 return Status;
147 }
148
149 Status = gBS->OpenProtocol (
150 Controller,
152 (VOID **)&Instance->DiskIo,
153 This->DriverBindingHandle,
154 Controller,
155 EFI_OPEN_PROTOCOL_BY_DRIVER
156 );
157 if (EFI_ERROR (Status)) {
158 FreePool (Instance);
159 return Status;
160 }
161
162 Status = NtfsMount (Instance);
163 if (EFI_ERROR (Status)) {
164 DEBUG ((DEBUG_INFO, "NTFS: This is not NTFS Volume.\n"));
165 Status = EFI_UNSUPPORTED;
166 } else {
167 FreeAttr (&Instance->RootIndex->Attr);
168 FreeAttr (&Instance->MftStart->Attr);
169 FreePool (Instance->RootIndex->FileRecord);
170 FreePool (Instance->MftStart->FileRecord);
171 FreePool (Instance->RootIndex->File);
172 }
173
174 gBS->CloseProtocol (
175 Controller,
177 This->DriverBindingHandle,
178 Controller
179 );
180
181 FreePool (Instance);
182
183 return Status;
184}
185
186STATIC
187EFI_STATUS
188EFIAPI
190 IN EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *This,
191 OUT EFI_FILE_PROTOCOL **Root
192 )
193{
194 EFI_FS *Instance;
195
196 ASSERT (This != NULL);
197 ASSERT (Root != NULL);
198
199 Instance = (EFI_FS *)This;
200
201 *Root = (EFI_FILE_PROTOCOL *)Instance->RootIndex->File;
202
203 return EFI_SUCCESS;
204}
205
209EFI_STATUS
210EFIAPI
212 IN EFI_DRIVER_BINDING_PROTOCOL *This,
213 IN EFI_HANDLE Controller,
214 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL
215 )
216{
217 EFI_STATUS Status;
218 EFI_FS *Instance;
219
220 Instance = AllocateZeroPool (sizeof (EFI_FS));
221 if (Instance == NULL) {
222 DEBUG ((DEBUG_INFO, "NTFS: Could not allocate a new file system instance\n"));
223 return EFI_OUT_OF_RESOURCES;
224 }
225
226 Instance->FileIoInterface.Revision = EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_REVISION;
227 Instance->FileIoInterface.OpenVolume = OpenVolume;
228
229 Instance->DevicePath = DevicePathFromHandle (Controller);
230 if (Instance->DevicePath == NULL) {
231 DEBUG ((DEBUG_INFO, "NTFS: Could not get Device Path\n"));
232 FreePool (Instance);
233 return EFI_NO_MAPPING;
234 }
235
236 Status = gBS->OpenProtocol (
237 Controller,
239 (VOID **)&Instance->BlockIo,
240 This->DriverBindingHandle,
241 Controller,
242
243 /*
244 * EFI_OPEN_PROTOCOL_BY_DRIVER would return Access Denied here,
245 * because the disk driver has that protocol already open. So use
246 * EFI_OPEN_PROTOCOL_GET_PROTOCOL (which doesn't require us to close it).
247 */
248 EFI_OPEN_PROTOCOL_GET_PROTOCOL
249 );
250 if (EFI_ERROR (Status)) {
251 DEBUG ((DEBUG_INFO, "NTFS: Could not access BlockIO protocol - %r\n", Status));
252 FreePool (Instance);
253 return Status;
254 }
255
256 Status = gBS->OpenProtocol (
257 Controller,
259 (VOID **)&Instance->DiskIo,
260 This->DriverBindingHandle,
261 Controller,
262 EFI_OPEN_PROTOCOL_BY_DRIVER
263 );
264 if (EFI_ERROR (Status)) {
265 DEBUG ((DEBUG_INFO, "NTFS: Could not access DiskIO protocol - %r\n", Status));
266 FreePool (Instance);
267 return Status;
268 }
269
270 Instance->EfiFile.Revision = EFI_FILE_PROTOCOL_REVISION2;
271 Instance->EfiFile.Open = FileOpen;
272 Instance->EfiFile.Close = FileClose;
273 Instance->EfiFile.Delete = FileDelete;
274 Instance->EfiFile.Read = FileRead;
275 Instance->EfiFile.Write = FileWrite;
276 Instance->EfiFile.GetPosition = FileGetPosition;
277 Instance->EfiFile.SetPosition = FileSetPosition;
278 Instance->EfiFile.GetInfo = FileGetInfo;
279 Instance->EfiFile.SetInfo = FileSetInfo;
280 Instance->EfiFile.Flush = FileFlush;
281
282 Status = NtfsMount (Instance);
283 if (EFI_ERROR (Status)) {
284 DEBUG ((DEBUG_INFO, "NTFS: Could not mount file system.\n"));
285 FreePool (Instance);
286 return Status;
287 }
288
289 Status = gBS->InstallMultipleProtocolInterfaces (
290 &Controller,
292 &Instance->FileIoInterface,
293 NULL
294 );
295 if (EFI_ERROR (Status)) {
296 DEBUG ((DEBUG_INFO, "NTFS: Could not install simple file system protocol - %r\n", Status));
297 gBS->CloseProtocol (
298 Controller,
300 This->DriverBindingHandle,
301 Controller
302 );
303
304 FreeAttr (&Instance->RootIndex->Attr);
305 FreeAttr (&Instance->MftStart->Attr);
306 FreePool (Instance->RootIndex->FileRecord);
307 FreePool (Instance->MftStart->FileRecord);
308 FreePool (Instance->RootIndex->File);
309
310 FreePool (Instance);
311 return EFI_UNSUPPORTED;
312 }
313
314 return EFI_SUCCESS;
315}
316
320EFI_STATUS
321EFIAPI
323 IN EFI_DRIVER_BINDING_PROTOCOL *This,
324 IN EFI_HANDLE Controller,
325 IN UINTN NumberOfChildren,
326 IN EFI_HANDLE *ChildHandleBuffer OPTIONAL
327 )
328{
329 EFI_STATUS Status;
330 EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *NTFS;
331 EFI_FS *Instance;
332
333 Status = gBS->OpenProtocol (
334 Controller,
336 (VOID **)&NTFS,
337 This->DriverBindingHandle,
338 Controller,
339 EFI_OPEN_PROTOCOL_GET_PROTOCOL
340 );
341 if (EFI_ERROR (Status)) {
342 DEBUG ((DEBUG_INFO, "NTFS: Could not locate our instance - %r\n", Status));
343 return Status;
344 }
345
346 Status = gBS->UninstallMultipleProtocolInterfaces (
347 Controller,
349 NTFS,
350 NULL
351 );
352 if (EFI_ERROR (Status)) {
353 return Status;
354 }
355
356 //
357 // Close DISK_IO Protocol
358 //
359 Status = gBS->CloseProtocol (
360 Controller,
362 This->DriverBindingHandle,
363 Controller
364 );
365 if (EFI_ERROR (Status)) {
366 return Status;
367 }
368
369 Instance = (EFI_FS *)NTFS;
370
371 FreeAttr (&Instance->RootIndex->Attr);
372 FreeAttr (&Instance->MftStart->Attr);
373 FreePool (Instance->RootIndex->FileRecord);
374 FreePool (Instance->MftStart->FileRecord);
375 FreePool (Instance->RootIndex->File);
376
377 return EFI_SUCCESS;
378}
379
380EFI_STATUS
381EFIAPI
383 IN EFI_COMPONENT_NAME_PROTOCOL *This,
384 IN CHAR8 *Language,
385 OUT CHAR16 **DriverName
386 )
387{
388 *DriverName = gNTFSDriverName;
389 return EFI_SUCCESS;
390}
391
392EFI_STATUS
393EFIAPI
395 IN EFI_COMPONENT_NAME_PROTOCOL *This,
396 IN EFI_HANDLE Controller,
397 IN EFI_HANDLE ChildHandle OPTIONAL,
398 IN CHAR8 *Language,
399 OUT CHAR16 **ControllerName
400 )
401{
402 return EFI_UNSUPPORTED;
403}
VOID FreeAttr(IN NTFS_ATTR *Attr)
Definition Disc.c:792
EFI_STATUS NtfsMount(IN EFI_FS *FileSystem)
Definition Disc.c:94
EFI_STATUS EFIAPI FileSetInfo(IN EFI_FILE_PROTOCOL *This, IN EFI_GUID *InformationType, IN UINTN BufferSize, IN VOID *Buffer)
Definition Info.c:243
EFI_STATUS EFIAPI FileGetInfo(IN EFI_FILE_PROTOCOL *This, IN EFI_GUID *Type, IN OUT UINTN *Len, OUT VOID *Data)
Definition Info.c:104
EFI_STATUS EFIAPI NTFSStart(IN EFI_DRIVER_BINDING_PROTOCOL *This, IN EFI_HANDLE Controller, IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL)
Definition NTFS.c:211
#define LANGUAGE_CODE_ENGLISH
Definition NTFS.c:12
EFI_STATUS EFIAPI NTFSSupported(IN EFI_DRIVER_BINDING_PROTOCOL *This, IN EFI_HANDLE Controller, IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL)
Definition NTFS.c:121
EFI_DRIVER_BINDING_PROTOCOL gNTFSDriverBinding
Definition NTFS.c:24
EFI_STATUS EFIAPI NTFSCtlGetControllerName(IN EFI_COMPONENT_NAME_PROTOCOL *This, IN EFI_HANDLE Controller, IN EFI_HANDLE ChildHandle OPTIONAL, IN CHAR8 *Language, OUT CHAR16 **ControllerName)
Definition NTFS.c:394
EFI_STATUS EFIAPI NTFSCtlDriverName(IN EFI_COMPONENT_NAME_PROTOCOL *This, IN CHAR8 *Language, OUT CHAR16 **DriverName)
Definition NTFS.c:382
EFI_STATUS EFIAPI NTFSStop(IN EFI_DRIVER_BINDING_PROTOCOL *This, IN EFI_HANDLE Controller, IN UINTN NumberOfChildren, IN EFI_HANDLE *ChildHandleBuffer OPTIONAL)
Definition NTFS.c:322
STATIC EFI_STATUS EFIAPI OpenVolume(IN EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *This, OUT EFI_FILE_PROTOCOL **Root)
Definition NTFS.c:189
EFI_COMPONENT_NAME_PROTOCOL gNTFSDriverNames
Definition NTFS.c:17
EFI_STATUS EFIAPI NTFSEntryPoint(IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable)
Definition NTFS.c:35
CHAR16 * gNTFSDriverName
Definition NTFS.c:14
EFI_STATUS EFIAPI UnloadNTFSDriver(IN EFI_HANDLE ImageHandle)
Definition NTFS.c:79
EFI_STATUS EFIAPI FileClose(IN EFI_FILE_PROTOCOL *This)
Definition Open.c:353
EFI_STATUS EFIAPI FileFlush(IN EFI_FILE_PROTOCOL *This)
Definition Open.c:344
EFI_STATUS EFIAPI FileDelete(IN EFI_FILE_PROTOCOL *This)
Definition Open.c:333
EFI_STATUS EFIAPI FileSetPosition(IN EFI_FILE_PROTOCOL *This, IN UINT64 Position)
Definition Position.c:33
EFI_STATUS EFIAPI FileOpen(IN EFI_FILE_PROTOCOL *This, OUT EFI_FILE_PROTOCOL **NewHandle, IN CHAR16 *FileName, IN UINT64 OpenMode, IN UINT64 Attributes)
Definition Open.c:16
EFI_STATUS EFIAPI FileWrite(IN EFI_FILE_PROTOCOL *This, IN OUT UINTN *BufferSize, IN VOID *Buffer)
Definition Open.c:322
EFI_STATUS EFIAPI FileGetPosition(IN EFI_FILE_PROTOCOL *This, OUT UINT64 *Position)
Definition Position.c:14
EFI_STATUS EFIAPI FileRead(IN EFI_FILE_PROTOCOL *This, IN OUT UINTN *BufferSize, OUT VOID *Buffer)
Definition Open.c:299
EFI_BOOT_SERVICES * gBS
OC_TYPING_BUFFER_ENTRY Buffer[OC_TYPING_BUFFER_SIZE]
Definition OcTypingLib.h:42
EFI_GUID gEfiDriverBindingProtocolGuid
EFI_GUID gEfiSimpleFileSystemProtocolGuid
EFI_GUID gEfiComponentNameProtocolGuid
EFI_GUID gEfiBlockIoProtocolGuid
EFI_GUID gEfiDiskIoProtocolGuid
EFI_GUID gEfiLoadedImageProtocolGuid
EFI_DEVICE_PATH_PROTOCOL *EFIAPI DevicePathFromHandle(IN EFI_HANDLE Handle)
Definition UserMisc.c:680
#define ASSERT(x)
Definition coder.h:55
EFI_FILE_PROTOCOL EfiFile
Definition Driver.h:641
EFI_DISK_IO_PROTOCOL * DiskIo
Definition Driver.h:643
EFI_BLOCK_IO_PROTOCOL * BlockIo
Definition Driver.h:642
NTFS_FILE * RootIndex
Definition Driver.h:646
EFI_DEVICE_PATH * DevicePath
Definition Driver.h:644
NTFS_FILE * MftStart
Definition Driver.h:647
EFI_SIMPLE_FILE_SYSTEM_PROTOCOL FileIoInterface
Definition Driver.h:640
NTFS_ATTR Attr
Definition Driver.h:622
UINT8 * FileRecord
Definition Driver.h:615
EFI_NTFS_FILE * File
Definition Driver.h:623