UEFI用のドライバやらのソースコードを読んでいると、EFIAPIとかIN, OUTとかの謎修飾子がコードについていたりします。

EFIAPI

UEFIでのコードは、基本的にEFI_BOOT_SERVICESEFI_RUNTIME_SERVICEから動的に関数やデータ構造を読み込んで使用するという流れになっています。EFIAPIは指定した関数がこういった使われ方をする可能性があるということを明示的に指定する修飾子です。

EFI_STATUS EFIAPI UefiMain (...) { ... }

IN, OUT

INは関数が引数として受け取る値であることを明示する修飾子で、OUTは渡したポインタの指す先が書き換えられる可能性があることを示す修飾子です。

typedef EFI_STATUS (EFIAPI *EFI_WAIT_FOR_EVENT) (
    IN UINTN NumberOfEvents,
    IN EFI_EVENT *Event,
    OUT UINTN *Index
    );

OPTIONAL

OPTIONALは、場合によっては引数がNULLでも構わないことを明示する修飾子です。

typedef EFI_STATUS (EFIAPI *EFI_LOCATE_HANDLE) (
    IN EFI_LOCATE_SEARCH_TYPE SearchType,
    IN EFI_GUID *Protocol OPTIONAL,
    IN VOID *SearchKey OPTIONAL,
    IN OUT UINTN *BufferSize,
    OUT EFI_HANDLE *Buffer
 );

CONST

CONSTは、引数で与えられた値が書き変わることはないということを明示する修飾子です。

typedef UINTN (EFIAPI *EFI_DEVICE_PATH_UTILS_GET_DEVICE_PATH_SIZE) (
    IN CONST EFI_DEVICE_PATH_PROTOCOL *DevicePath
    );