U0 InstallDrive(U8 drv_let)
{
    U8 *st;

    while (!DriveCheck(blkdev.let_to_drive[drv_let - 'A'], FALSE))
        Sleep(1);
    Sleep(1000);

    ExePrint("CopyTree(\"::/\",\"%C:/\");",         drv_let);
    ExePrint("DirMake(\"%C:/Tmp\");",               drv_let);
    ExePrint("DirMake(\"%C:/Tmp/ScreenShots\");",   drv_let);
    ExePrint("DirMake(\"%C:/Home\");",              drv_let);

    st = MStrPrint("%C:/Home/DoDistro.ZC", drv_let);
    if (!FileFind(st))
        Copy("::/Misc/DoDistro.ZC", st);
    Free(st);

    st = MStrPrint("%C:/Home/MakeHome.ZC", drv_let);
    if (!FileFind(st))
        Copy("::/MakeHome.ZC", st);
    Free(st);
}

Bool VMPartDisk(CTask *task, I64 ata_port)
{
    if (ata_port > -1)
    {
        XTalkWait(task, "DiskPart(,1.0);\nC\n%d\nY", ata_port); // DOUBLE CHECK INFILE
        return TRUE;
    }
    else
        return FALSE;
}

U0 VMInstallDrive(CTask *task, U8 drv_let, I64 ata_port, I64 atapi_port)
{// DOUBLE CHECK INFILE
    InstallDrive(drv_let);
    XTalkWait(task, "BootHDIns('%C');\n\nB\n0x20000\n", drv_let);
    if (ata_port > -1)
        XTalkWait(task, "C\n%d\n", ata_port);
    if (atapi_port > -1)
        XTalkWait(task, "T%d\n", atapi_port);
    XTalkWait(task, "\n1024\n768\n\n\n"); //Exit Drives,  set Screen Resolution, skip Disk Cache and Options
}

U0 VMInstallWiz()
{
    CTask       *task;
    I64          i, atapi_port = -1, ata_port = -1;
    CAHCIPort   *port;
    U8          *in_str;

    task = User;
    TaskWait(task);
    task->border_src    = BDS_CONST;
    task->border_attr   = LTGRAY << 4 + DriveTextAttrGet(':') & 15;
    task->text_attr     = LTGRAY << 4 + BLUE;
    task->win_inhibit   = WIG_TASK_DEFAULT - WIF_SELF_BORDER;
    WinHorz(Fs->win_left, Fs->win_right, task);
    WinVert(Fs->win_top,  (Fs->win_top + Fs->win_bottom) >> 2 - 1, task);
    WinVert(task->win_bottom + 3, Fs->win_bottom);
    WinToTop(Fs);


    ////////////////////////////////////
    SATARep;
    for (i = 0; i < AHCI_MAX_PORTS; i++)
    {
        if (Bt(&blkdev.ahci_hba->ports_implemented, i))
        {
            port = &blkdev.ahci_hba->ports[i];
            if (port->signature == AHCI_PxSIG_ATA)
            {
                ata_port = i;
                break;
            }
        }
    }
    for (i = 0; i < AHCI_MAX_PORTS; i++)
    {
        if (Bt(&blkdev.ahci_hba->ports_implemented, i))
        {
            port = &blkdev.ahci_hba->ports[i];
            if (port->signature == AHCI_PxSIG_ATAPI)
            {
                atapi_port = i;
                break;
            }
        }
    }

    if (VMPartDisk(task, ata_port))
    {
        VMInstallDrive(task, 'C', ata_port, atapi_port);
        BootMHDIns('C');
    }

    Copy("::/Misc/Auto/BootMHD2.ZC", "C:/System/Boot/BootMHD2.ZC");

    ////////////////////////////////////

    WinVert(task->win_top, Fs->win_bottom);
    Kill(task);
}

Bool DoInstall(Bool prompt_reboot)
{
    I64 res = FALSE, vm_install = TRUE;

    vm_install = TRUE;
    DocBottom;
    VMInstallWiz();
    res = TRUE;
    OnceDrive('C', "PopUp(\"#include \\\"/Misc/Auto/AutoFullDistro0\\\";\");");
    BootRAM("C:" BOOT_DIR_KERNEL_BIN_C);
    return res;
}

Bool OSInstall(Bool prompt_reboot=TRUE)
{
    return DoInstall(prompt_reboot);
}

#if __CMD_LINE__
OSInstall(TRUE);
#endif