mirror of
https://github.com/hax4dazy/TinWoo.git
synced 2025-02-09 19:25:05 +01:00
fix random crashing when installing xcz/nsz certs
This commit is contained in:
parent
00f42bca05
commit
2b0ce6c7eb
2
Makefile
2
Makefile
@ -44,7 +44,7 @@ DATA := data
|
|||||||
INCLUDES := include include/ui include/data include/install include/nx include/nx/ipc include/util $(CURDIR)/include/Plutonium/Plutonium/include
|
INCLUDES := include include/ui include/data include/install include/nx include/nx/ipc include/util $(CURDIR)/include/Plutonium/Plutonium/include
|
||||||
APP_TITLE := TinWoo Installer
|
APP_TITLE := TinWoo Installer
|
||||||
APP_AUTHOR := MrDude
|
APP_AUTHOR := MrDude
|
||||||
APP_VERSION := 1.0.19
|
APP_VERSION := 1.0.20
|
||||||
ROMFS := romfs
|
ROMFS := romfs
|
||||||
APP_ICON := icon.jpg
|
APP_ICON := icon.jpg
|
||||||
|
|
||||||
|
@ -54,13 +54,13 @@ namespace tin::install
|
|||||||
|
|
||||||
virtual void InstallContentMetaRecords(tin::data::ByteBuffer& installContentMetaBuf, int i);
|
virtual void InstallContentMetaRecords(tin::data::ByteBuffer& installContentMetaBuf, int i);
|
||||||
virtual void InstallApplicationRecord(int i);
|
virtual void InstallApplicationRecord(int i);
|
||||||
virtual void InstallTicketCert() = 0;
|
|
||||||
virtual void InstallNCA(const NcmContentId& ncaId) = 0;
|
virtual void InstallNCA(const NcmContentId& ncaId) = 0;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
virtual ~Install();
|
virtual ~Install();
|
||||||
|
|
||||||
virtual void Prepare();
|
virtual void Prepare();
|
||||||
|
virtual void InstallTicketCert();
|
||||||
virtual void Begin();
|
virtual void Begin();
|
||||||
|
|
||||||
virtual u64 GetTitleId(int i = 0);
|
virtual u64 GetTitleId(int i = 0);
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
namespace inst::config {
|
namespace inst::config {
|
||||||
static const std::string appDir = "sdmc:/switch/tinwoo";
|
static const std::string appDir = "sdmc:/switch/tinwoo";
|
||||||
static const std::string configPath = appDir + "/config.json";
|
static const std::string configPath = appDir + "/config.json";
|
||||||
static const std::string appVersion = "1.0.19";
|
static const std::string appVersion = "1.0.20";
|
||||||
|
|
||||||
extern std::string gAuthKey;
|
extern std::string gAuthKey;
|
||||||
extern std::string sigPatchesUrl;
|
extern std::string sigPatchesUrl;
|
||||||
|
@ -87,6 +87,7 @@ namespace nspInstStuff_B {
|
|||||||
inst::ui::instPage::setInstInfoText("inst.info_page.preparing"_lang);
|
inst::ui::instPage::setInstInfoText("inst.info_page.preparing"_lang);
|
||||||
inst::ui::instPage::setInstBarPerc(0);
|
inst::ui::instPage::setInstBarPerc(0);
|
||||||
installTask->Prepare();
|
installTask->Prepare();
|
||||||
|
installTask->InstallTicketCert();
|
||||||
installTask->Begin();
|
installTask->Begin();
|
||||||
togo = (togo - 1);
|
togo = (togo - 1);
|
||||||
}
|
}
|
||||||
|
@ -160,16 +160,6 @@ namespace tin::install
|
|||||||
|
|
||||||
void Install::Begin()
|
void Install::Begin()
|
||||||
{
|
{
|
||||||
LOG_DEBUG("Installing ticket and cert...\n");
|
|
||||||
try
|
|
||||||
{
|
|
||||||
this->InstallTicketCert();
|
|
||||||
}
|
|
||||||
catch (std::runtime_error& e)
|
|
||||||
{
|
|
||||||
LOG_DEBUG("WARNING: Ticket installation failed! This may not be an issue, depending on your use case.\nProceed with caution!\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
for (nx::ncm::ContentMeta contentMeta : m_contentMeta) {
|
for (nx::ncm::ContentMeta contentMeta : m_contentMeta) {
|
||||||
LOG_DEBUG("Installing NCAs...\n");
|
LOG_DEBUG("Installing NCAs...\n");
|
||||||
for (auto& record : contentMeta.GetContentInfos())
|
for (auto& record : contentMeta.GetContentInfos())
|
||||||
@ -180,6 +170,10 @@ namespace tin::install
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Install::InstallTicketCert() {
|
||||||
|
this->InstallTicketCert();
|
||||||
|
}
|
||||||
|
|
||||||
u64 Install::GetTitleId(int i)
|
u64 Install::GetTitleId(int i)
|
||||||
{
|
{
|
||||||
return m_contentMeta[i].GetContentMetaKey().id;
|
return m_contentMeta[i].GetContentMetaKey().id;
|
||||||
|
@ -75,7 +75,6 @@ namespace tin::install::nsp
|
|||||||
|
|
||||||
CNMTList.push_back({ tin::util::GetContentMetaFromNCA(cnmtNCAFullPath), cnmtContentInfo });
|
CNMTList.push_back({ tin::util::GetContentMetaFromNCA(cnmtNCAFullPath), cnmtContentInfo });
|
||||||
}
|
}
|
||||||
|
|
||||||
return CNMTList;
|
return CNMTList;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -150,18 +149,9 @@ namespace tin::install::nsp
|
|||||||
|
|
||||||
void NSPInstall::InstallTicketCert()
|
void NSPInstall::InstallTicketCert()
|
||||||
{
|
{
|
||||||
u16 ECDSA = 0;
|
|
||||||
u16 RSA_2048 = 0;
|
|
||||||
u16 RSA_4096 = 0;
|
|
||||||
// Read the tik files and put it into a buffer
|
|
||||||
std::vector<const PFS0FileEntry*> tikFileEntries = m_NSP->GetFileEntriesByExtension("tik");
|
std::vector<const PFS0FileEntry*> tikFileEntries = m_NSP->GetFileEntriesByExtension("tik");
|
||||||
std::vector<const PFS0FileEntry*> certFileEntries = m_NSP->GetFileEntriesByExtension("cert");
|
std::vector<const PFS0FileEntry*> certFileEntries = m_NSP->GetFileEntriesByExtension("cert");
|
||||||
|
|
||||||
// https://switchbrew.org/wiki/Ticket#Certificate_chain
|
|
||||||
ECDSA = (0x4 + 0x3C + 0x40 + 0x146);
|
|
||||||
RSA_2048 = (0x4 + 0x100 + 0x3C + 0x146);
|
|
||||||
RSA_4096 = (0x4 + 0x200 + 0x3C + 0x146);
|
|
||||||
|
|
||||||
for (size_t i = 0; i < tikFileEntries.size(); i++)
|
for (size_t i = 0; i < tikFileEntries.size(); i++)
|
||||||
{
|
{
|
||||||
if (tikFileEntries[i] == nullptr) {
|
if (tikFileEntries[i] == nullptr) {
|
||||||
@ -186,8 +176,16 @@ namespace tin::install::nsp
|
|||||||
m_NSP->BufferData(certBuf.get(), m_NSP->GetDataOffset() + certFileEntries[i]->dataOffset, certSize);
|
m_NSP->BufferData(certBuf.get(), m_NSP->GetDataOffset() + certFileEntries[i]->dataOffset, certSize);
|
||||||
|
|
||||||
// try to fix a temp ticket and change it t a permanent one
|
// try to fix a temp ticket and change it t a permanent one
|
||||||
|
// https://switchbrew.org/wiki/Ticket#Certificate_chain
|
||||||
if (inst::config::fixticket) {
|
if (inst::config::fixticket) {
|
||||||
//ECDSA SHA256
|
u16 ECDSA = 0;
|
||||||
|
u16 RSA_2048 = 0;
|
||||||
|
u16 RSA_4096 = 0;
|
||||||
|
|
||||||
|
ECDSA = (0x4 + 0x3C + 0x40 + 0x146);
|
||||||
|
RSA_2048 = (0x4 + 0x100 + 0x3C + 0x146);
|
||||||
|
RSA_4096 = (0x4 + 0x200 + 0x3C + 0x146);
|
||||||
|
|
||||||
if (tikBuf.get()[0x0] == 0x5 && (tikBuf.get()[ECDSA] == 0x10 || tikBuf.get()[ECDSA] == 0x30))
|
if (tikBuf.get()[0x0] == 0x5 && (tikBuf.get()[ECDSA] == 0x10 || tikBuf.get()[ECDSA] == 0x30))
|
||||||
{
|
{
|
||||||
tikBuf.get()[ECDSA] = 0x0;
|
tikBuf.get()[ECDSA] = 0x0;
|
||||||
@ -229,8 +227,6 @@ namespace tin::install::nsp
|
|||||||
tikBuf.get()[RSA_4096 - 1] = 0x10;
|
tikBuf.get()[RSA_4096 - 1] = 0x10;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
//printout the cert and ticket to a file in the tinwoo directory for testing.
|
//printout the cert and ticket to a file in the tinwoo directory for testing.
|
||||||
/*
|
/*
|
||||||
FILE * pFile;
|
FILE * pFile;
|
||||||
@ -242,6 +238,7 @@ namespace tin::install::nsp
|
|||||||
fwrite (tikBuf.get(), sizeof(char), tikSize, pFile);
|
fwrite (tikBuf.get(), sizeof(char), tikSize, pFile);
|
||||||
fclose (pFile);
|
fclose (pFile);
|
||||||
*/
|
*/
|
||||||
|
}
|
||||||
|
|
||||||
// Finally, let's actually import the ticket
|
// Finally, let's actually import the ticket
|
||||||
ASSERT_OK(esImportTicket(tikBuf.get(), tikSize, certBuf.get(), certSize), "Failed to import ticket");
|
ASSERT_OK(esImportTicket(tikBuf.get(), tikSize, certBuf.get(), certSize), "Failed to import ticket");
|
||||||
|
@ -145,21 +145,13 @@ namespace tin::install::xci
|
|||||||
catch (...) {}
|
catch (...) {}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//xci files don't have a ticket or cert - so this is useful when installing a converted nsp to xci
|
||||||
void XCIInstallTask::InstallTicketCert()
|
void XCIInstallTask::InstallTicketCert()
|
||||||
{
|
{
|
||||||
u16 ECDSA = 0;
|
|
||||||
u16 RSA_2048 = 0;
|
|
||||||
u16 RSA_4096 = 0;
|
|
||||||
|
|
||||||
// Read the tik files and put it into a buffer
|
// Read the tik files and put it into a buffer
|
||||||
std::vector<const HFS0FileEntry*> tikFileEntries = m_xci->GetFileEntriesByExtension("tik");
|
std::vector<const HFS0FileEntry*> tikFileEntries = m_xci->GetFileEntriesByExtension("tik");
|
||||||
std::vector<const HFS0FileEntry*> certFileEntries = m_xci->GetFileEntriesByExtension("cert");
|
std::vector<const HFS0FileEntry*> certFileEntries = m_xci->GetFileEntriesByExtension("cert");
|
||||||
|
|
||||||
// https://switchbrew.org/wiki/Ticket#Certificate_chain
|
|
||||||
ECDSA = (0x4 + 0x3C + 0x40 + 0x146);
|
|
||||||
RSA_2048 = (0x4 + 0x100 + 0x3C + 0x146);
|
|
||||||
RSA_4096 = (0x4 + 0x200 + 0x3C + 0x146);
|
|
||||||
|
|
||||||
for (size_t i = 0; i < tikFileEntries.size(); i++)
|
for (size_t i = 0; i < tikFileEntries.size(); i++)
|
||||||
{
|
{
|
||||||
if (tikFileEntries[i] == nullptr)
|
if (tikFileEntries[i] == nullptr)
|
||||||
@ -186,6 +178,15 @@ namespace tin::install::xci
|
|||||||
|
|
||||||
// try to fix a temp ticket and change it t a permanent one
|
// try to fix a temp ticket and change it t a permanent one
|
||||||
if (inst::config::fixticket) {
|
if (inst::config::fixticket) {
|
||||||
|
u16 ECDSA = 0;
|
||||||
|
u16 RSA_2048 = 0;
|
||||||
|
u16 RSA_4096 = 0;
|
||||||
|
|
||||||
|
// https://switchbrew.org/wiki/Ticket#Certificate_chain
|
||||||
|
ECDSA = (0x4 + 0x3C + 0x40 + 0x146);
|
||||||
|
RSA_2048 = (0x4 + 0x100 + 0x3C + 0x146);
|
||||||
|
RSA_4096 = (0x4 + 0x200 + 0x3C + 0x146);
|
||||||
|
|
||||||
//ECDSA SHA256
|
//ECDSA SHA256
|
||||||
if (tikBuf.get()[0x0] == 0x5 && (tikBuf.get()[ECDSA] == 0x10 || tikBuf.get()[ECDSA] == 0x30))
|
if (tikBuf.get()[0x0] == 0x5 && (tikBuf.get()[ECDSA] == 0x10 || tikBuf.get()[ECDSA] == 0x30))
|
||||||
{
|
{
|
||||||
|
@ -69,15 +69,6 @@ namespace tin::install::nsp
|
|||||||
|
|
||||||
size_t fileEntryOffset = sizeof(PFS0BaseHeader) + index * sizeof(PFS0FileEntry);
|
size_t fileEntryOffset = sizeof(PFS0BaseHeader) + index * sizeof(PFS0FileEntry);
|
||||||
|
|
||||||
/*
|
|
||||||
//print fileEntryOffset
|
|
||||||
FILE * fp;
|
|
||||||
fp = fopen ("offset.txt", "a+");
|
|
||||||
size_t debug = fileEntryOffset;
|
|
||||||
fprintf(fp, "%zu\n", debug);
|
|
||||||
fclose(fp);
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (m_headerBytes.size() < fileEntryOffset + sizeof(PFS0FileEntry))
|
if (m_headerBytes.size() < fileEntryOffset + sizeof(PFS0FileEntry))
|
||||||
THROW_FORMAT("Header bytes is too small to get file entry!");
|
THROW_FORMAT("Header bytes is too small to get file entry!");
|
||||||
|
|
||||||
@ -92,7 +83,15 @@ namespace tin::install::nsp
|
|||||||
{
|
{
|
||||||
const PFS0FileEntry* fileEntry = this->GetFileEntry(i);
|
const PFS0FileEntry* fileEntry = this->GetFileEntry(i);
|
||||||
std::string name(this->GetFileEntryName(fileEntry));
|
std::string name(this->GetFileEntryName(fileEntry));
|
||||||
auto foundExtension = name.substr(name.find(".") + 1);
|
|
||||||
|
// fix cert filname extension becoming corrupted when xcz/nsz is installing certs/ticks.
|
||||||
|
FILE* fp;
|
||||||
|
int pos = 0;
|
||||||
|
std::string mystr = name;
|
||||||
|
pos = mystr.find_last_of('.');
|
||||||
|
mystr = mystr.substr(5, pos);
|
||||||
|
//auto foundExtension = name.substr(name.find(".") + 1);
|
||||||
|
auto foundExtension = mystr.substr(mystr.find(".") + 1);
|
||||||
|
|
||||||
if (foundExtension == extension)
|
if (foundExtension == extension)
|
||||||
entryList.push_back(fileEntry);
|
entryList.push_back(fileEntry);
|
||||||
@ -103,14 +102,27 @@ namespace tin::install::nsp
|
|||||||
|
|
||||||
const PFS0FileEntry* NSP::GetFileEntryByName(std::string name)
|
const PFS0FileEntry* NSP::GetFileEntryByName(std::string name)
|
||||||
{
|
{
|
||||||
|
//returns only the .nca and .cnmt.nca filenames
|
||||||
for (unsigned int i = 0; i < this->GetBaseHeader()->numFiles; i++)
|
for (unsigned int i = 0; i < this->GetBaseHeader()->numFiles; i++)
|
||||||
{
|
{
|
||||||
const PFS0FileEntry* fileEntry = this->GetFileEntry(i);
|
const PFS0FileEntry* fileEntry = this->GetFileEntry(i);
|
||||||
std::string foundName(this->GetFileEntryName(fileEntry));
|
std::string foundName(this->GetFileEntryName(fileEntry));
|
||||||
|
|
||||||
if (foundName == name)
|
|
||||||
|
if (foundName == name) {
|
||||||
|
/*
|
||||||
|
//Debug code
|
||||||
|
FILE * fp;
|
||||||
|
fp = fopen ("name.txt", "a+");
|
||||||
|
std::string x = foundName;
|
||||||
|
const char *info = x.c_str();
|
||||||
|
fprintf(fp, "%s\n", info);
|
||||||
|
fclose(fp);
|
||||||
|
*/
|
||||||
|
|
||||||
return fileEntry;
|
return fileEntry;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
@ -140,6 +152,17 @@ namespace tin::install::nsp
|
|||||||
const char* NSP::GetFileEntryName(const PFS0FileEntry* fileEntry)
|
const char* NSP::GetFileEntryName(const PFS0FileEntry* fileEntry)
|
||||||
{
|
{
|
||||||
u64 stringTableStart = sizeof(PFS0BaseHeader) + this->GetBaseHeader()->numFiles * sizeof(PFS0FileEntry);
|
u64 stringTableStart = sizeof(PFS0BaseHeader) + this->GetBaseHeader()->numFiles * sizeof(PFS0FileEntry);
|
||||||
|
|
||||||
|
//check for messed up filenames in our table.... usually when instaling xcz/xci
|
||||||
|
/*
|
||||||
|
FILE * fp;
|
||||||
|
fp = fopen ("st.txt", "a+");
|
||||||
|
std::string x = reinterpret_cast<const char*>(m_headerBytes.data() + stringTableStart + fileEntry->stringTableOffset);
|
||||||
|
const char *info = x.c_str();
|
||||||
|
fprintf(fp, "%s\n", info);
|
||||||
|
fclose(fp);
|
||||||
|
*/
|
||||||
|
|
||||||
return reinterpret_cast<const char*>(m_headerBytes.data() + stringTableStart + fileEntry->stringTableOffset);
|
return reinterpret_cast<const char*>(m_headerBytes.data() + stringTableStart + fileEntry->stringTableOffset);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -155,16 +178,6 @@ namespace tin::install::nsp
|
|||||||
{
|
{
|
||||||
if (m_headerBytes.empty())
|
if (m_headerBytes.empty())
|
||||||
THROW_FORMAT("Cannot get data offset as header is empty. Have you retrieved it yet?\n");
|
THROW_FORMAT("Cannot get data offset as header is empty. Have you retrieved it yet?\n");
|
||||||
|
|
||||||
/*
|
|
||||||
//print size of header
|
|
||||||
FILE * fp;
|
|
||||||
fp = fopen ("file.txt", "a+");
|
|
||||||
u64 debug = m_headerBytes.size();
|
|
||||||
fprintf(fp, "%lu\n", debug);
|
|
||||||
fclose(fp);
|
|
||||||
*/
|
|
||||||
|
|
||||||
return m_headerBytes.size();
|
return m_headerBytes.size();
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -158,7 +158,15 @@ namespace tin::install::xci
|
|||||||
{
|
{
|
||||||
const HFS0FileEntry* fileEntry = this->GetFileEntry(i);
|
const HFS0FileEntry* fileEntry = this->GetFileEntry(i);
|
||||||
std::string name(this->GetFileEntryName(fileEntry));
|
std::string name(this->GetFileEntryName(fileEntry));
|
||||||
auto foundExtension = name.substr(name.find(".") + 1);
|
|
||||||
|
// fix cert filname extension becoming corrupted when xcz/nsz is installing certs/ticks.
|
||||||
|
FILE* fp;
|
||||||
|
int pos = 0;
|
||||||
|
std::string mystr = name;
|
||||||
|
pos = mystr.find_last_of('.');
|
||||||
|
mystr = mystr.substr(5, pos);
|
||||||
|
//auto foundExtension = name.substr(name.find(".") + 1);
|
||||||
|
auto foundExtension = mystr.substr(mystr.find(".") + 1);
|
||||||
|
|
||||||
if (foundExtension == extension)
|
if (foundExtension == extension)
|
||||||
entryList.push_back(fileEntry);
|
entryList.push_back(fileEntry);
|
||||||
|
@ -228,6 +228,7 @@ namespace netInstStuff {
|
|||||||
inst::ui::instPage::setInstInfoText("inst.info_page.preparing"_lang);
|
inst::ui::instPage::setInstInfoText("inst.info_page.preparing"_lang);
|
||||||
inst::ui::instPage::setInstBarPerc(0);
|
inst::ui::instPage::setInstBarPerc(0);
|
||||||
installTask->Prepare();
|
installTask->Prepare();
|
||||||
|
installTask->InstallTicketCert();
|
||||||
installTask->Begin();
|
installTask->Begin();
|
||||||
togo = (togo - 1);
|
togo = (togo - 1);
|
||||||
}
|
}
|
||||||
|
@ -101,6 +101,8 @@ public:
|
|||||||
class SectionContext : public Section
|
class SectionContext : public Section
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
Crypto::Aes128Ctr crypto;
|
||||||
|
|
||||||
SectionContext(const Section& s) : Section(s), crypto(s.cryptoKey, Crypto::AesCtr(Crypto::swapEndian(((u64*)&s.cryptoCounter)[0])))
|
SectionContext(const Section& s) : Section(s), crypto(s.cryptoKey, Crypto::AesCtr(Crypto::swapEndian(((u64*)&s.cryptoCounter)[0])))
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
@ -111,27 +113,27 @@ public:
|
|||||||
|
|
||||||
void decrypt(void* p, u64 sz, u64 offset)
|
void decrypt(void* p, u64 sz, u64 offset)
|
||||||
{
|
{
|
||||||
if (this->cryptoType != 3)
|
if (this->cryptoType == 3 || this->cryptoType == 4)
|
||||||
{
|
{
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
crypto.seek(offset);
|
crypto.seek(offset);
|
||||||
crypto.decrypt(p, p, sz);
|
crypto.decrypt(p, p, sz);
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void encrypt(void* p, u64 sz, u64 offset)
|
void encrypt(void* p, u64 sz, u64 offset)
|
||||||
{
|
{
|
||||||
if (this->cryptoType != 3)
|
if (this->cryptoType == 3 || this->cryptoType == 4)
|
||||||
{
|
{
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
crypto.seek(offset);
|
crypto.seek(offset);
|
||||||
crypto.encrypt(p, p, sz);
|
crypto.encrypt(p, p, sz);
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
Crypto::Aes128Ctr crypto;
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
const bool isValid()
|
const bool isValid()
|
||||||
|
@ -87,7 +87,8 @@ namespace nspInstStuff {
|
|||||||
inst::ui::instPage::setInstInfoText("inst.info_page.preparing"_lang);
|
inst::ui::instPage::setInstInfoText("inst.info_page.preparing"_lang);
|
||||||
inst::ui::instPage::setInstBarPerc(0);
|
inst::ui::instPage::setInstBarPerc(0);
|
||||||
installTask->Prepare();
|
installTask->Prepare();
|
||||||
installTask->Begin();
|
installTask->InstallTicketCert();
|
||||||
|
installTask->Begin(); //install nca files
|
||||||
togo = (togo - 1);
|
togo = (togo - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -137,6 +137,7 @@ namespace usbInstStuff {
|
|||||||
inst::ui::instPage::setInstInfoText("inst.info_page.preparing"_lang);
|
inst::ui::instPage::setInstInfoText("inst.info_page.preparing"_lang);
|
||||||
inst::ui::instPage::setInstBarPerc(0);
|
inst::ui::instPage::setInstBarPerc(0);
|
||||||
installTask->Prepare();
|
installTask->Prepare();
|
||||||
|
installTask->InstallTicketCert();
|
||||||
installTask->Begin();
|
installTask->Begin();
|
||||||
togo = (togo - 1);
|
togo = (togo - 1);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user