/*
 * COPYRIGHT:       See COPYING.ARM in the top level directory
 * PROJECT:         ReactOS UEFI Boot Library
 * FILE:            boot/environ/lib/io/io.c
 * PURPOSE:         Boot Library I/O Management Routines
 * PROGRAMMER:      Alex Ionescu (alex.ionescu@reactos.org)
 */

/* INCLUDES ******************************************************************/

#include "bl.h"

/* DATA VARIABLES ************************************************************/

ULONG IoMgrRoutineEntries;
PVOID* IoMgrDestroyRoutineTable;

/* FUNCTIONS *****************************************************************/

NTSTATUS
BlpIoRegisterDestroyRoutine (
    _In_ PBL_IO_DESTROY_ROUTINE DestroyRoutine
    )
{
    ULONG Id;

    return BlTblSetEntry(&IoMgrDestroyRoutineTable,
                         &IoMgrRoutineEntries,
                         DestroyRoutine,
                         &Id,
                         TblDoNotPurgeEntry);
}

NTSTATUS
BlpIoInitialize (
    VOID
    )
{
    NTSTATUS Status;
    ULONG Size;

    /* Allocate the I/O table */
    IoMgrRoutineEntries = 4;
    Size = IoMgrRoutineEntries * sizeof(PVOID);
    IoMgrDestroyRoutineTable = BlMmAllocateHeap(Size);
    if (IoMgrDestroyRoutineTable)
    {
        /* Zero it out */
        RtlZeroMemory(IoMgrDestroyRoutineTable, Size);

        /* Initialize the device manager */
        Status = BlpDeviceInitialize();

        /* Initialize the file manager */
        if (NT_SUCCESS(Status))
        {
            Status = BlpFileInitialize();
        }
    }
    else
    {
        /* No memory */
        Status = STATUS_NO_MEMORY;
    }

    /* Return initialization status */
    return Status;
}