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;
}