Ring3: Added EFI_FILE_PROTOCOL wrappers.

This commit is contained in:
Mikhail Krichanov 2024-02-23 17:29:17 +03:00
parent 126b21b719
commit 1836c35027

View File

@ -12,7 +12,11 @@ EFI_SIMPLE_FILE_SYSTEM_PROTOCOL mRing3SimpleFileSystemProtocol;
EFI_FILE_PROTOCOL mRing3FileProtocol; EFI_FILE_PROTOCOL mRing3FileProtocol;
EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *mRing3SimpleFileSystemPointer; EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *mRing3SimpleFileSystemPointer;
EFI_FILE_PROTOCOL *mRing3FilePointer;
typedef struct {
EFI_FILE_PROTOCOL Protocol;
EFI_FILE_PROTOCOL *Ring3File;
} RING3_EFI_FILE_PROTOCOL;
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
@ -186,28 +190,30 @@ CoreDriverBindingStop (
return Status; return Status;
} }
EFI_STATUS STATIC
EFIAPI
CoreFileOpen (
IN EFI_FILE_PROTOCOL *This,
OUT EFI_FILE_PROTOCOL **NewHandle,
IN CHAR16 *FileName,
IN UINT64 OpenMode,
IN UINT64 Attributes
)
{
return EFI_UNSUPPORTED;
}
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
CoreFileClose ( CoreFileClose (
IN EFI_FILE_PROTOCOL *This IN EFI_FILE_PROTOCOL *This
) )
{ {
return EFI_UNSUPPORTED; EFI_STATUS Status;
RING3_EFI_FILE_PROTOCOL *File;
File = (RING3_EFI_FILE_PROTOCOL *)This;
Status = GoToRing3 (
1,
(VOID *)mRing3FileProtocol.Close,
File->Ring3File
);
FreePool (This);
return Status;
} }
STATIC
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
CoreFileDelete ( CoreFileDelete (
@ -217,6 +223,7 @@ CoreFileDelete (
return EFI_UNSUPPORTED; return EFI_UNSUPPORTED;
} }
STATIC
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
CoreFileRead ( CoreFileRead (
@ -225,9 +232,56 @@ CoreFileRead (
OUT VOID *Buffer OUT VOID *Buffer
) )
{ {
return EFI_UNSUPPORTED; EFI_STATUS Status;
RING3_EFI_FILE_PROTOCOL *File;
UINTN *Ring3BufferSize;
VOID *Ring3Buffer;
File = (RING3_EFI_FILE_PROTOCOL *)This;
DEBUG ((DEBUG_INFO, "Ring3 Read: check 1\n"));
DisableSMAP ();
Status = CoreAllocatePool (EfiRing3MemoryType, sizeof (UINTN *), (VOID **)&Ring3BufferSize);
if (EFI_ERROR (Status)) {
EnableSMAP ();
return Status;
}
Status = CoreAllocatePool (EfiRing3MemoryType, *BufferSize, (VOID **)&Ring3Buffer);
if (EFI_ERROR (Status)) {
FreePool (Ring3BufferSize);
EnableSMAP ();
return Status;
}
EnableSMAP ();
DEBUG ((DEBUG_INFO, "Ring3 Read: check 2\n"));
Status = GoToRing3 (
3,
(VOID *)mRing3FileProtocol.Read,
File->Ring3File,
Ring3BufferSize,
Ring3Buffer
);
DEBUG ((DEBUG_INFO, "Ring3 Read: check 3\n"));
DisableSMAP ();
if ((!EFI_ERROR (Status)) && (Ring3Buffer != NULL) && (Buffer != NULL)) {
CopyMem (Buffer, Ring3Buffer, *Ring3BufferSize);
FreePool (Ring3Buffer);
}
*BufferSize = *Ring3BufferSize;
DEBUG ((DEBUG_INFO, "Ring3 Read: check 3.5\n"));
FreePool (Ring3BufferSize);
EnableSMAP ();
DEBUG ((DEBUG_INFO, "Ring3 Read: check 4\n"));
return Status;
} }
STATIC
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
CoreFileWrite ( CoreFileWrite (
@ -239,6 +293,7 @@ CoreFileWrite (
return EFI_UNSUPPORTED; return EFI_UNSUPPORTED;
} }
STATIC
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
CoreFileSetPosition ( CoreFileSetPosition (
@ -246,9 +301,19 @@ CoreFileSetPosition (
IN UINT64 Position IN UINT64 Position
) )
{ {
return EFI_UNSUPPORTED; RING3_EFI_FILE_PROTOCOL *File;
File = (RING3_EFI_FILE_PROTOCOL *)This;
return GoToRing3 (
2,
(VOID *)mRing3FileProtocol.SetPosition,
File->Ring3File,
Position
);
} }
STATIC
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
CoreFileGetPosition ( CoreFileGetPosition (
@ -256,9 +321,36 @@ CoreFileGetPosition (
OUT UINT64 *Position OUT UINT64 *Position
) )
{ {
return EFI_UNSUPPORTED; EFI_STATUS Status;
RING3_EFI_FILE_PROTOCOL *File;
UINT64 *Ring3Position;
File = (RING3_EFI_FILE_PROTOCOL *)This;
DisableSMAP ();
Status = CoreAllocatePool (EfiRing3MemoryType, sizeof (UINT64), (VOID **)&Ring3Position);
EnableSMAP ();
if (EFI_ERROR (Status)) {
return Status;
}
Status = GoToRing3 (
2,
(VOID *)mRing3FileProtocol.GetPosition,
File->Ring3File,
Ring3Position
);
DisableSMAP ();
*Position = *Ring3Position;
FreePool (Ring3Position);
EnableSMAP ();
return Status;
} }
STATIC
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
CoreFileGetInfo ( CoreFileGetInfo (
@ -268,9 +360,62 @@ CoreFileGetInfo (
OUT VOID *Buffer OUT VOID *Buffer
) )
{ {
return EFI_UNSUPPORTED; EFI_STATUS Status;
RING3_EFI_FILE_PROTOCOL *File;
EFI_GUID *Ring3InformationType;
UINTN *Ring3BufferSize;
VOID *Ring3Buffer;
File = (RING3_EFI_FILE_PROTOCOL *)This;
DisableSMAP ();
Status = CoreAllocatePool (EfiRing3MemoryType, sizeof (UINTN *), (VOID **)&Ring3BufferSize);
if (EFI_ERROR (Status)) {
EnableSMAP ();
return Status;
}
Status = CoreAllocatePool (EfiRing3MemoryType, *BufferSize, (VOID **)&Ring3Buffer);
if (EFI_ERROR (Status)) {
FreePool (Ring3BufferSize);
EnableSMAP ();
return Status;
}
Status = CoreAllocatePool (EfiRing3MemoryType, sizeof (EFI_GUID), (VOID **)&Ring3InformationType);
if (EFI_ERROR (Status)) {
FreePool (Ring3BufferSize);
FreePool (Ring3Buffer);
EnableSMAP ();
return Status;
}
CopyGuid (Ring3InformationType, InformationType);
EnableSMAP ();
Status = GoToRing3 (
4,
(VOID *)mRing3FileProtocol.GetInfo,
File->Ring3File,
Ring3InformationType,
Ring3BufferSize,
Ring3Buffer
);
DisableSMAP ();
*BufferSize = *Ring3BufferSize;
CopyMem (Buffer, Ring3Buffer, *Ring3BufferSize);
FreePool (Ring3BufferSize);
FreePool (Ring3Buffer);
FreePool (Ring3InformationType);
EnableSMAP ();
return Status;
} }
STATIC
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
CoreFileSetInfo ( CoreFileSetInfo (
@ -283,6 +428,7 @@ CoreFileSetInfo (
return EFI_UNSUPPORTED; return EFI_UNSUPPORTED;
} }
STATIC
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
CoreFileFlush ( CoreFileFlush (
@ -292,6 +438,7 @@ CoreFileFlush (
return EFI_UNSUPPORTED; return EFI_UNSUPPORTED;
} }
STATIC
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
CoreFileOpenEx ( CoreFileOpenEx (
@ -306,6 +453,7 @@ CoreFileOpenEx (
return EFI_UNSUPPORTED; return EFI_UNSUPPORTED;
} }
STATIC
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
CoreFileReadEx ( CoreFileReadEx (
@ -316,6 +464,7 @@ CoreFileReadEx (
return EFI_UNSUPPORTED; return EFI_UNSUPPORTED;
} }
STATIC
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
CoreFileWriteEx ( CoreFileWriteEx (
@ -326,6 +475,7 @@ CoreFileWriteEx (
return EFI_UNSUPPORTED; return EFI_UNSUPPORTED;
} }
STATIC
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
CoreFileFlushEx ( CoreFileFlushEx (
@ -336,6 +486,104 @@ CoreFileFlushEx (
return EFI_UNSUPPORTED; return EFI_UNSUPPORTED;
} }
STATIC
EFI_STATUS
EFIAPI
CoreFileOpen (
IN EFI_FILE_PROTOCOL *This,
OUT EFI_FILE_PROTOCOL **NewHandle,
IN CHAR16 *FileName,
IN UINT64 OpenMode,
IN UINT64 Attributes
)
{
EFI_STATUS Status;
RING3_EFI_FILE_PROTOCOL *File;
RING3_EFI_FILE_PROTOCOL *NewFile;
EFI_FILE_PROTOCOL **Ring3NewHandle;
CHAR16 *Ring3FileName;
File = (RING3_EFI_FILE_PROTOCOL *)This;
DisableSMAP ();
Status = CoreAllocatePool (EfiRing3MemoryType, sizeof (EFI_FILE_PROTOCOL *), (VOID **)&Ring3NewHandle);
if (EFI_ERROR (Status)) {
EnableSMAP ();
return Status;
}
Status = CoreAllocatePool (EfiRing3MemoryType, StrSize (FileName), (VOID **)&Ring3FileName);
if (EFI_ERROR (Status)) {
FreePool (Ring3NewHandle);
EnableSMAP ();
return Status;
}
Status = StrCpyS (Ring3FileName, StrLen (FileName) + 1, FileName);
if (EFI_ERROR (Status)) {
FreePool (Ring3NewHandle);
FreePool (Ring3FileName);
EnableSMAP ();
return Status;
}
EnableSMAP ();
Status = GoToRing3 (
5,
(VOID *)mRing3FileProtocol.Open,
File->Ring3File,
Ring3NewHandle,
Ring3FileName,
OpenMode,
Attributes
);
if (EFI_ERROR (Status)) {
*NewHandle = NULL;
DisableSMAP ();
FreePool (Ring3NewHandle);
FreePool (Ring3FileName);
EnableSMAP ();
return Status;
}
NewFile = AllocatePool (sizeof (RING3_EFI_FILE_PROTOCOL));
if (NewFile == NULL) {
*NewHandle = NULL;
DisableSMAP ();
FreePool (Ring3NewHandle);
FreePool (Ring3FileName);
EnableSMAP ();
return EFI_OUT_OF_RESOURCES;
}
NewFile->Protocol.Revision = mRing3FileProtocol.Revision;
NewFile->Protocol.Open = CoreFileOpen;
NewFile->Protocol.Close = CoreFileClose;
NewFile->Protocol.Delete = CoreFileDelete;
NewFile->Protocol.Read = CoreFileRead;
NewFile->Protocol.Write = CoreFileWrite;
NewFile->Protocol.GetPosition = CoreFileGetPosition;
NewFile->Protocol.SetPosition = CoreFileSetPosition;
NewFile->Protocol.GetInfo = CoreFileGetInfo;
NewFile->Protocol.SetInfo = CoreFileSetInfo;
NewFile->Protocol.Flush = CoreFileFlush;
NewFile->Protocol.OpenEx = CoreFileOpenEx;
NewFile->Protocol.ReadEx = CoreFileReadEx;
NewFile->Protocol.WriteEx = CoreFileWriteEx;
NewFile->Protocol.FlushEx = CoreFileFlushEx;
DisableSMAP ();
NewFile->Ring3File = *Ring3NewHandle;
FreePool (Ring3NewHandle);
FreePool (Ring3FileName);
EnableSMAP ();
*NewHandle = (EFI_FILE_PROTOCOL *)NewFile;
return Status;
}
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
CoreOpenVolume ( CoreOpenVolume (
@ -343,14 +591,15 @@ CoreOpenVolume (
OUT EFI_FILE_PROTOCOL **Root OUT EFI_FILE_PROTOCOL **Root
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
EFI_FILE_PROTOCOL **Ring3Root; EFI_FILE_PROTOCOL **Ring3Root;
RING3_EFI_FILE_PROTOCOL *File;
DisableSMAP (); DisableSMAP ();
Status = CoreAllocatePool (EfiRing3MemoryType, sizeof (EFI_FILE_PROTOCOL *), (VOID **)&Ring3Root); Status = CoreAllocatePool (EfiRing3MemoryType, sizeof (EFI_FILE_PROTOCOL *), (VOID **)&Ring3Root);
EnableSMAP (); EnableSMAP ();
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
return EFI_OUT_OF_RESOURCES; return Status;
} }
Status = GoToRing3 ( Status = GoToRing3 (
@ -367,7 +616,14 @@ CoreOpenVolume (
return Status; return Status;
} }
*Root = AllocatePool (sizeof (EFI_FILE_PROTOCOL)); File = AllocatePool (sizeof (RING3_EFI_FILE_PROTOCOL));
if (File == NULL) {
*Root = NULL;
DisableSMAP ();
FreePool (Ring3Root);
EnableSMAP ();
return EFI_OUT_OF_RESOURCES;
}
DisableSMAP (); DisableSMAP ();
mRing3FileProtocol.Revision = (*Ring3Root)->Revision; mRing3FileProtocol.Revision = (*Ring3Root)->Revision;
@ -386,26 +642,28 @@ CoreOpenVolume (
mRing3FileProtocol.WriteEx = (*Ring3Root)->WriteEx; mRing3FileProtocol.WriteEx = (*Ring3Root)->WriteEx;
mRing3FileProtocol.FlushEx = (*Ring3Root)->FlushEx; mRing3FileProtocol.FlushEx = (*Ring3Root)->FlushEx;
mRing3FilePointer = *Ring3Root; File->Ring3File = *Ring3Root;
FreePool (Ring3Root); FreePool (Ring3Root);
EnableSMAP (); EnableSMAP ();
(*Root)->Revision = mRing3FileProtocol.Revision; File->Protocol.Revision = mRing3FileProtocol.Revision;
(*Root)->Open = CoreFileOpen; File->Protocol.Open = CoreFileOpen;
(*Root)->Close = CoreFileClose; File->Protocol.Close = CoreFileClose;
(*Root)->Delete = CoreFileDelete; File->Protocol.Delete = CoreFileDelete;
(*Root)->Read = CoreFileRead; File->Protocol.Read = CoreFileRead;
(*Root)->Write = CoreFileWrite; File->Protocol.Write = CoreFileWrite;
(*Root)->GetPosition = CoreFileGetPosition; File->Protocol.GetPosition = CoreFileGetPosition;
(*Root)->SetPosition = CoreFileSetPosition; File->Protocol.SetPosition = CoreFileSetPosition;
(*Root)->GetInfo = CoreFileGetInfo; File->Protocol.GetInfo = CoreFileGetInfo;
(*Root)->SetInfo = CoreFileSetInfo; File->Protocol.SetInfo = CoreFileSetInfo;
(*Root)->Flush = CoreFileFlush; File->Protocol.Flush = CoreFileFlush;
(*Root)->OpenEx = CoreFileOpenEx; File->Protocol.OpenEx = CoreFileOpenEx;
(*Root)->ReadEx = CoreFileReadEx; File->Protocol.ReadEx = CoreFileReadEx;
(*Root)->WriteEx = CoreFileWriteEx; File->Protocol.WriteEx = CoreFileWriteEx;
(*Root)->FlushEx = CoreFileFlushEx; File->Protocol.FlushEx = CoreFileFlushEx;
*Root = (EFI_FILE_PROTOCOL *)File;
return Status; return Status;
} }