static int _InjectFiles()

in lsvmutils/initrd.c [133:353]


static int _InjectFiles(
    const void* cpioDataIn,
    UINTN cpioSizeIn,
    const void* bootkeyData,
    UINTN bootkeySize,
    const void* rootkeyData,
    UINTN rootkeySize,
    void** cpioDataOut,
    UINTN* cpioSizeOut)
{
    int rc = -1;
    void *cpioData = NULL;
    UINTN cpioSize = 0;

    /* Check parameters */
    if (!cpioDataIn || !cpioSizeOut || !bootkeyData || !bootkeySize ||
        !rootkeyData || !rootkeySize || !cpioDataOut || !cpioDataOut)
    {
        goto done;
    }

    /* Initialize output parameters */
    *cpioDataOut = NULL;
    *cpioSizeOut = 0;

    /* Make an in-memory copy of the archive */
    {
        if (!(cpioData = Memdup(cpioDataIn, cpioSizeIn)))
            goto done;

        cpioSize = cpioSizeIn;
    }

    /* Create 'etc' directory */
    if (CPIOIsDir(cpioData, cpioSize, "etc") == FALSE)
    {
        void* p = NULL;
        UINTN n;

        if (CPIOAddFile(
            cpioData,
            cpioSize,
            "etc",
            NULL,
            0,
            CPIO_MODE_IFDIR | 0755,
            &p,
            &n) != 0)
        {
            goto done;
        }

        Free(cpioData);
        cpioData = p;
        cpioSize = n;
    }

    /* Create 'etc/lsvmload' directory */
    if (CPIOIsDir(cpioData, cpioSize, "etc/lsvmload") == FALSE)
    {
        void* p = NULL;
        UINTN n;

        if (CPIOAddFile(
            cpioData,
            cpioSize,
            "etc/lsvmload",
            NULL,
            0,
            CPIO_MODE_IFDIR | 0755,
            &p,
            &n) != 0)
        {
            goto done;
        }

        Free(cpioData);
        cpioData = p;
        cpioSize = n;
    }

    /* Remove 'etc/lsvmload/bootkey' if it already exists */
    if (CPIOIsFile(cpioData, cpioSize, "etc/lsvmload/bootkey") == TRUE)
    {
        void* p = NULL;
        UINTN n;

        if (CPIORemoveFile(
            cpioData,
            cpioSize,
            "etc/lsvmload/bootkey",
            &p,
            &n) != 0)
        {
            goto done;
        }

        Free(cpioData);
        cpioData = p;
        cpioSize = n;
    }

    /* Create 'etc/lsvmload/bootkey' file */
    {
        void* p = NULL;
        UINTN n;

        if (CPIOAddFile(
            cpioData,
            cpioSize,
            "etc/lsvmload/bootkey",
            bootkeyData,
            bootkeySize,
            CPIO_MODE_IFREG | 0755,
            &p,
            &n) != 0)
        {
            goto done;
        }

        Free(cpioData);
        cpioData = p;
        cpioSize = n;
    }

    /* Remove 'etc/lsvmload/rootkey' if it already exists */
    if (CPIOIsFile(cpioData, cpioSize, "etc/lsvmload/rootkey") == TRUE)
    {
        void* p = NULL;
        UINTN n;

        if (CPIORemoveFile(
            cpioData,
            cpioSize,
            "etc/lsvmload/rootkey",
            &p,
            &n) != 0)
        {
            goto done;
        }

        Free(cpioData);
        cpioData = p;
        cpioSize = n;
    }

    /* Create 'etc/lsvmload/rootkey' file */
    {
        void* p = NULL;
        UINTN n;

        if (CPIOAddFile(
            cpioData,
            cpioSize,
            "etc/lsvmload/rootkey",
            rootkeyData,
            rootkeySize,
            CPIO_MODE_IFREG | 0755,
            &p,
            &n) != 0)
        {
            goto done;
        }

        Free(cpioData);
        cpioData = p;
        cpioSize = n;
    }

    /* Remove 'etc/lsvmload/specialize' if it already exists */
    if (CPIOIsFile(cpioData, cpioSize, "etc/lsvmload/specialize") == TRUE)
    {
        void* p = NULL;
        UINTN n;

        if (CPIORemoveFile(
            cpioData,
            cpioSize,
            "etc/lsvmload/specialize",
            &p,
            &n) != 0)
        {
            goto done;
        }

        Free(cpioData);
        cpioData = p;
        cpioSize = n;
    }

    /* Delete the Hyper-V keyboard driver */
    {
        void* p = NULL;
        UINTN n;

        if (_DeleteKeyboardDriver(
            cpioData,
            cpioSize,
            &p,
            &n) != 0)
        {
            goto done;
        }

        Free(cpioData);
        cpioData = p;
        cpioSize = n;
    }

    rc = 0;

    *cpioDataOut = cpioData;
    *cpioSizeOut = cpioSize;

done:

    if (rc != 0)
        Free(cpioData);

    return rc;
}