Peru Asenna &kaikille käyttäjille Se&laa.. Lisää VeraCrypt ikoni &työpöydälle Lahjoita nyt... Liitä .hc tiedostot &päätteet VeraCrypt-ohjelmalle &Avaa kohde lopuksi Lisää VeraCrypt &Käynnistys menuun Luo Systeemin &Palautus piste &Poista asennus &Pura &Asenna Opastettu VeraCrypt asennus Poista VeraCrypt asennus &Ohje Valitse tai kirjoita kohde sijainti jonne tiedostot puretaan: Valitse tai kirjoita VeraCrypt asennus sijainti. Jos määriteltyä sijaintia ei löydetä se luodaan automaattisesti. Paina Poisto nappia poistaaksesi VeraCrypt:n järjestelmästä. Keskeytä &Suorituskyky &Testi Luo salattu taltio ja alusta se Salattu osio tehty Näytä luodut avaimet (niiden osat) Näytä poolin sisältö Lataa CD/DVD toisto ohjelma Luo salattu tiedostosäilö &Gt &Tt Lisää tietoa Pi&ilotettu VeraCrypt-taltio Lisätietoa piilotetuista taltioista Suoratila Normaalitila &Kt Käytä &Avaintiedostoja Yritä ensin kytkeä tyhjällä salasanalla Satunnainen koko ( 64 <-> 1048576 ) &Avaintiedostot.. Tietoa hash algoritmeista Lisätietoa Tietoa PIM:stä &Mt Lisätietoa Lisätietoa järjestelmän salauksesta Lisätietoa Multi-boot Salaa tavallinen osio/asema &Älä tallenna historiatietoja Avaa Ulkopuolinen Taltio &Tauko Käytä P&IM Käytä PIM Nopea Alustus &Näytä Salasana &Näytä salasana &Näytä PIM Single-boot Standardi VeraCrypt-taltio Pii&lotettu Normaali Salaa järjestelmäasema (osio) tai koko kiintolevy Salaa Windowsin järjestelmäasema/osio Salaa koko asema Opastettu VeraCrypt-taltion luonti Ryhmä TÄRKEÄÄ: Siirrä hiiresi satunnaisesti tässä ikkunassa. Mitä kauemmin siirrät sitä parempi. Tämä merkittävästi kasvattaa salakuvauksen vahvuutta salausavaimelle. Paina 'Seuraava' jatkaaksesi. &Vahvista: Valmis Aseman kirjain: Salausalgoritmi Järjestelmä Luo virtuaalisesti salattulevy tiedoston sisään. Tämä valinta on suositeltava aloittelijalle. Valinnat Hash algoritmi Otsikkoavain: Jäljellä Pääavain: Valitse tämä valinta jos sinulla on kaksi tai useampi käyttöjärjestelmiä asennettuna.\n\nEsimerkiksi:\n- Windows XP ja Windows XP\n- Windows XP ja Windows Vista\n- Windows ja Mac OS X\n- Windows ja Linux\n- Windows, Linux ja Mac OS X Salaa olemassa oleva sisäinen tai ulkoinen asema tai esimerkiksi muistitikku, eli. D:, E: -asema jne. Nykyisen poolin sisältö (osittainen) Läpi Salasana: Taltion PIM: Taltion PIM: Suorittaa: Satunnaisluku: Valitse tämä valinta jos vain yksi käyttöjärjestelmä on asennettuna (vaikka olisikin useampi käyttäjä). Nopeus Tila Avaimet ja muut datat on nyt luotu onnistuneesti. Jos haluat luoda uuden avaimen, paina Takaisin ja sitten Seuraava. Muutoin, paina 'Seuraava' jatkaaksesi. Salaa järjestelmäasema/osio, jolle Windows on asennettu, esim. C:-asema. Tämän jälkeen tietokoneen käynnistys edellyttää aina salasanan antamista. Valitse tämä valinta salataksesi osion missä Windows käyttöjärjestelmä on asennettuna. Taltion Windows Otsikko: Tyhjennys Tila: Sulje Salli esikäynnistys &autentikointi ohitetaan painamalla Esc näppäintä (aktivoi käynnistysmanagerin) Ei tehdä mitään &Automaattisesti yhdistettävä VeraCrypt-taltio (määritelty alla) &Aloita VeraCrypt Auto-&tunnista Kirjasto &Välimuisti esikäynnistys autentikoinnin salasanalle aseman muistissa (ei-järjestelmätaltion kytkemiseksi) Selaa.. Selaa.. Välimuisti salasanat ja avaintie&dostot muistissa Poistu, kun ei ole yhdistettyjä taltioita &Sulje näennäinen yhteys (kirjaudu ulos) kun taltio on onnistuneesti yhdistetty Sisällytä VeraCrypt Taltion Laajennin Sisällytä Opastettu VeraCrypt Taltion Luonti Luo L&uo Taltio älä &näytä tekstiä esikäynnistys autentikointi ikkunassa (paitsi alapuolinen käyttäjän viesti) Poista "Evil Maid" hyökkäyksen tunnistaminen Kiihdytä AES salausta/purkua käyttämällä prosessorin AES ohjeita (jos käytettävissä) Käytä Avaintiedostoa Käytä Avaintiedostoa &Poistu Apua suosikkitaltioille Älä kytke valittua taltiota kun 'Kytke Suosikkitaltiot' &pikanäppäintä on painettu Kytke valittu taltio kun sen isäntä laite &kytkeytyy Kytke valittu taltio kirjautumisen yhteydes&sä Kytke valittu taltio lukutilassa Kytke valittu taltio siirrettä&vänä asemana Siirrä &Alas Siirrä &Ylös Avaa &Resurssinhallinnan ikkuna valitaksesi taltion onnistuneesta kytkennästä &Poista Käytä suosikki-otsikoita kuten resurssinhallinnan aseman otsikoita Yleiset Asetukset Näytä kuplavihje onnistuneesta pikanäppäimen poiskytkennästä Toista järjestelmän ilmoitusääni onnistuneesta pikanäppäimen poiskytkennästä Alt Ctrl Shift Win Määrittele Poista Avaintiedosto.. Älä käytä seuraavia prosessorin numeroita salaukseen/purkuun: Lisätietoa Lisätietoa Lisää Asetuksia.. &Autom. yhdistäminen Yhdistä V&alinta.. Yhdistä taltio vain luku&tilassa Avaintiedostot.. (Tyhjä tai 0 oletus iteraatiolle) (Tyhjä tai 0 oletus iteraatiolle) Päällä Tallenna salasanat aseman muistiin Poista taltion yhdistäminen kun dataa ei ole luettu/kirjoitettu sille Käyttäjän uloskirjautuessa Käyttäjän istunnon lukkiutuessa Siirryttäessä Virransäästötilaan Näytönsäästäjän käynnistyessä Pakotettu autom. poiskytkentä vaikka taltiolla olisi avoimia tiedostoja tai hakemistoja Yhdistä kaikki laiteohjatut VeraCrypt-taltiot Käynnistä VeraCrypt Taustatehtävä Yhdistä taltiot vain luku-tyyppisinä Yhdistä taltiot kuin liikutettavina välineinä Avaa resurssienhallinta onnistuneesti yhdistetyille taltioille Tallenna salasana väliaikaisesti "Yhdistä Suosikkitaltiot" -toimintojen ajaksi Käytä erilaista työkalupalkin kuvaketta kun on yhdistettyjä taltioita Poista välimuistiin tallennetut salasanat automaattisissa poiskytkennöissä Pyyhi välimuistiin tallennetut salasanat poistuttaessa Säilytä tiedostosäilöjen muokkausaikaleima Tyhjennä &Valitse Laite.. Valitse T&iedosto.. Valitse &Kirjasto.. Näytä Salasana Näytä Salasana Avaa &Tutkinta Ikkuna Yhdistetyille taltioille &Välimuistisalasana ajurin muistille TrueCrypt Tila P&oista Yhdistämiset Taltion Ominaisuu&det.. Taltio&n Työkalut.. Tyhjennä &Välimuisti VeraCrypt - Yhdistä Parametrit VeraCrypt - Suosikkitaltiot VeraCrypt - Järjestelmän Pikanäppäimet VeraCrypt Muuta Salasana tai Avaintiedosto Anna VeraCrypt Taltion Salasana VeraCrypt - Suorituskyky ja Ajurin Valinnat VeraCrypt - Ominaisuudet VeraCrypt - Järjestelmän Salaus Asetukset VeraCrypt - Turvallisuustunnisteen Preferenssi VeraCrypt Siirrettävän Levyn Asennus VeraCrypt Taltion Ominaisuudet Tietoa.. Lisää/Poista Avaintiedostot Taltiolle/lta.. Lisää Yhdistetyt Taltiot Suosikkeihin... Lisää Yhdistetyt Taltiot Järjestelmän suosikkeihin... Analysoi Järjestelmän kaatuminen... Varmuuskopioi Taltion Otsikot.. Nopeustesti.. Aseta Otsikkoavaimen Periytyvä algoritmi.. Muuta Taltion Salasana.. Aseta Otsikko Avaimesta Periytyvä algoritmi.. Muuta Salasana.. Tyhjennä Taltion Historia Sulje Kaikki Turvallisuustunnisteiden istunnot Yhteydenotto.. Luo Piilotettu Käyttöjärjestelmä.. Luo Pelastuslevy.. Luo Uusi Taltio.. Pura Pysyvästi... Oletus Avaintiedosto.. Oletus Yhdistä Parametrit... Lahjoita Nyt... Salaa Järjestelmän Osio/Asema.. Usein Kysyttyjä Kysymyksiä Käyttäjäopas Kotisivu Pikanäppäimet.. Avaintiedoston Luonti Kieli (language).. Lisenssitiedot Hallitse Turvallisuustunniste Avaintiedostoja.. Autoyhdistä Kaikki Laiteisännöidyt Taltiot Yhdistä Suosikkitaltiot Yhdistä Ilman esikäynnistys &Autentikointia.. Yhdistä Taltio Yhdistä Taltio Valinnoin Uutiset Online Avustus Aloittelijan Koulutus Järjestele Suosikkitaltiot... Järjestele Järjestelmän Suosikkitaltiot... Suorituskyky/Ajurin Kokoonpano Pysyvästi puretaan Järjestelmän Osion/Aseman salaus Ominaisuudet.. Päivitä Asemakirjaimet Poista Kaikki Avaintiedostot Taltiolta.. Palauta Taltion Otsikot.. Jatka Keskeytynyttä Prosessia Valitse Laite.. Valitse Tiedosto.. Jatka Keskeytetty Prosessi Järjestelmän Salaus.. Ominaisuudet.. Asetukset.. Järjestelmän Suosikkitaltiot.. Lataukset Koevektorit.. Turvallisuustunnisteet.. Siirrettävän Levyn Asennus.. Poista Yhteys Kaikilta Yhdistetyiltä Taltioilta Poista Yhdistetyt Taltio Tarkista Pelastuslevy Tarkista Pelastuslevyn levykuva Julkaistut versiot Taltion Laajennin Taltion Ominaisuudet Opastettu Taltion Luonti VeraCryptin Nettisivut Tyhjennä Välimuisti Salasanat OK Laitteistokiihdytin Pikakuvake Automaattinen käynnistys kokoonpano (autorun.inf) Automaattinen Poiskytkentä Poista Yhdistämiset: Käynnistys Lataus Näyttö Valinnat Vahvista Salasana Nykyinen Näytä tämä käyttäjän sanoma esikäynnistys autentikointi ikkunassa (Maksimi 24 merkkiä): Yhdistämisen oletusasetukset Pikanäppäinten Valinnat Aseman Asetukset Ota käyttöön laajennettu levyohjauskoodit Valitun suosikkitaltion otsikko: Tiedosto Asetukset Määriteltävä näppäin: Processori (CPU) tietokoneesi tukee AES laitteistokiihdytystä: Toiminto suoritetaan kirjautuessa Windowsiin minuuttia Yhdistä taltio kirjaimelle: Yhdistä asetukset Uusi Salasana: Säijepohjainen rinnakkaistaminen PKCS #11 Kirjastopolku PKCS-5 PRF: PKCS-5 PRF: Salasanan Välimuisti Salausvalinnat VeraCrypt Taustatehtävä VeraCrypt-taltion yhteys (liittyy siirrettävän levyn juureen): Siirrettävän levyn sisällyttäminen: Luo siirrettävä levytiedosto (Siirrettävän levyjuuri-hakemistoon): Taltio Windows Lisää P&olku.. &Auto-testi Kaikille &Jatka &Purku &Poista &Salaus &Vienti.. Luo ja Tallenna Avaintiedosto.. &Luo Satunnais-avaintiedosto.. Lataa Käännöspaketteja Laitteisto kiihdytetty AES: &Tuo Avaintiedosto Tunnisteelle.. Lisää &Tiedostoja.. Kä&ytä Avaintiedosto &Avaintiedosto.. &Poista Poista &Kaikki Mikä on piilotettu VeraCrypt taltion salaus? Lisää tietoa avaintiedostoista Yhdistä talti&o siirrettävänä välineenä Yhdistettyä osiota käyttää järjestelmäsala&usta ilman esikäynnistys autentikointia Rinnakkaistaminen: Nopeustesti &Tulosta &Suojaa salattu taltio vaurioilta ulkoisten taltioiden kirjoitusta vastaan &Tyhjennä &Näytä Salasana Lisää Tunniste Tie. Käytä varmistettua otsikko varustusta &asemalle jos mahdollista XTS tila Tietoa VeraCrypt VeraCrypt - Salausalgoritmin Nopeustesti VeraCrypt - Koevektorit Komentorivi avustus VeraCrypt - Avaintiedosto VeraCrypt - Avaintiedoston Luonti VeraCrypt - Kieli (language) VeraCrypt - Yhteysvalinta Uuden Turvallisuustunniste Avaintiedoston Ominaisuudet VeraCrypt - Satunnainen poolin Rikastus Valitse Osio tai Laite VeraCrypt Turvallisuustunniste Avaintiedostot Turvallisuustunniste salasana/PIN vaaditaan Aktiivinen kielipaketti Nopeus vaikuttaa keskusyksikön (CPU) kuormaan ja tallennus aseman ominaisuuksiin.\n\nNämä nopeustesti tehtiin RAM muistissa. Puskurin Koko: Salakirjoitus: S&alasana taltion piilottamiseen:\n(jos tyhjä, käytetään välimuistia) Piilotetun Taltion Salaus Avaimen koko: TÄRKEÄÄ: Siirrä hiirtäsi satunnaisesti (jos mahdollista) tämän ikkunan sisällä. Mitä kauemmin siirrät, sitä parempi. Tämä lisää merkittävästi avaintiedosto salauksen vahvuutta. VAROITUS: Jos hävität avaintiedoston tai jokin ensimmäisen 1024 kilotavua bitti muuttuu, on mahdotonta yhdistää taltiota, joka käyttää tätä avaintiedostoa! bittiä Avaintiedotojen määrä: Avaintiedostojen koko (tavuina): Avaintiedoston perusnimi: Käännös: Ilmitekstin koko: bittiä Nykyinen poolin sisältö Miksattu PRF: TÄRKEÄÄ: Siirrä hiirtäsi satunnaisesti (jos mahdollista) tämän ikkunan sisällä. Mitä kauemmin siirrät, sitä parempi. Tämä lisää merkittävästi turvallisuutta. Kun valmis, paina 'Jatka'. Toissijainen avain (hexadecimal) Turvallisuustunniste: Järjestäminen: Odota hetki. Tämä prosessi voi kestää pitkää... Odota hetki...\nTämä prosessi voi kestää pitkää ja VeraCrypt voi näyttää pysähtyneeltä! Lohko numero: Salakirjoitettu teksti (hexadecimal) Datan yksikkönumero (64-bit hexadecimal, datayksikön koko on 512 tavua) Avain (hexadecimal) Ilmiteksti (hexadecimal) Avaintiedoston nimi: XTS tila J&ärjestelmä &Taltiot Suos&ikit T&yökalut Asetuk&set &Apua Kotisivu &Tietoa.. Vain luku attribuutti vanhalla taltiollasi ei voida muuttaa. Tarkista tiedoston oikeudet. Virhe: Pääsy evätty.\n\nOsio jonne yritit päästä on joko 0 sektoria pitkä, tai se on käynnistyvä laite. Pääkäyttäjä Jotta VeraCrypt ohjaimen lataus olisi mahdollista, sinun on kirjauduttava pääkäyttäjän oikeuksilla. Huomioi, että salataksesi/alustaaksesi osion/laitteen sinun tulee kirjautua koneelle pääkäyttäjän oikeuksin.\n\nTätä ei pyydetty tiedostoisännöidyille taltioille. Luodaksesi Piilotetun VeraCrypt taltion sinun tulee kirjautua koneelle pääkäyttäjän oikeuksin.\n\nJatka? Huomioi, että kun alustat taltion NTFS tyyppiseksi, sinun täytyy kirjautua koneelle pääkäyttäjän oikeuksilla.\n\nIlman pääkäyttäjän oikeuksia voit alustaa taltion FAT tyyppiseksi. FIPS hyväksytty koodaus (Rijndael, julkaistu 1998), jota voidaan käyttää U.S. hallituksen osastojen ja toimistojen luottamuksellisten tietojen suojaukseen huippusalaisella tasolla. 256-bitin avain, 128-bitin lohko, 14 kierrosta (AES-256). Toimenpide tila on XTS. Taltio on jo yhdistetty. VAROITUS: Ainakin yksi salattu tai hash algoritmi epäonnistui sisäänrakennetulla automaattisella testillä!\n\nVeraCrypt asennus saattaa olla viallinen. VAROITUS: Satunnaisnumero kehitinallas ei sisällä tarpeeksi dataa toimittaakseen pyydetyn määrän satunnaisdataa.\n\nSinun ei pidä jatkaa pidemmälle. Valitse 'Vika Raportointi' Ohje menusta, ja raportoi tämä virhe. Asema on vahingoittunut (fyysinen vika löydetty) tai johto on vioittunut, tai muistin toimintahäiriö.\n\nHuomioi, että tämä on ongelma laitteistossasi, ei VeraCrypt-ohjelmassa. Siksi älä raportoi tätä virheenä/ongelmana VeraCrypt-ohjelmassa ja ÄLÄ pyydä apua tähän VeraCrypt Foorumilla. Ota yhteys tietokoneesi toimittajan tekniseen tukeen. Kiitoksia.\n\nTiedote: Jos virhe tapahtuu jatkuvasti samassa paikassa, on todennäköistä että se johtuu virheellisistä levyn lohkoista, jotka on mahdollista korjata käyttäen kolmannen osapuolen ohjelmistoa (huomioi, että monessa tapauksessa 'chkdsk /r' komento ei korjaa sitä koska se toimii ainoastaan tiedostojärjestelmätasolla; joissakin tapauksissa 'chkdsk' työkalu ei voi edes tunnistaa sitä). If you Jos käytät siirrettävää tietovälineen asemaa, varmista, että asemaan on asennettu media. Asema/tallennustila voi myös olla vaurioitunut (saattaa esiintyä fyysistä vikaa) tai kaapeli voi olla vahingoittunut/irrotettu. Järjestelmäsi käyttää asiakaskohtaisia piirisarja ajureita joissa on virhe, mikä estää salauksenpurun koko järjestelmäasemalta.\n\nYritä päivittää tai poistaa asennus joltakin asiakas (ei-Microsoft) piirisarjan ajureilta enne kuin jatkat. jos tämä ei auta, yritä purkaa salaus ainoastaan järjestelmäosiolta. Virheellinen aseman tunnus. Virheellinen Polku. &Peruuta Ei pääsyä laitteelle. Varmista, että valittu laite on olemassa ja ei ole järjestelmän käytössä. Varoitus: Caps Lock on päällä. Tämä voi aiheuttaa virheen salasanaa annettaessa. Taltion Tyyppi Näin voi tapahtua kun olet pakotettu paljastamaan jollekin salatun taltion salasanan. On mahdollisesti monta sellaista tilannetta, jossa et voi kieltäytyä paljastamasta salasanaa (esim. kiristys). Käytä niin kutsuttua piilotettua taltiota, jolloin tällaisia pakotettuja salasanan luovuttamisia ei mahdollisesti tapahdu. Valitse tämä valinta jos haluat luoda tavallisen VeraCrypt-taltion. Huomioi, että jos tahdot käyttöjärjestelmän asennettavan piilotetulle osioisännöidylle asemalle, siten kokonaista järjestelmäasemaa ei voida salata käyttäen yhtä avainta. Ulkoisen Taltion Salauksen Valinnat Piilotetun Taltion Salauksen Valinnat Salauksen Valinnat VAROITUS: Virhe pyyhittäessä viimeksi valitun taltion/avaintiedoston polkua (tiedosto valitsimen muistissa)! Virhe: Säilö on tiivistetty tiedostojärjestelmätasolla. VeraCrypt ei tue tiivistettyjä säilöjä (Huomioi, että tiivistetty salattu data on tehoton ja tarpeeton).\n\nPoista säilön tiivistys seuraavalla tavalla: 1) Hiiren oikea klikkaus Windowsin resurssinhallinnassa (ei VeraCryptissä). 2) Valitse 'Ominaisuudet'. 3) 'Ominaisuudet' ikkunassa paina 'Lisäominaisuudet'. 4) 'Lisäominaisuus' ikkunassa, poista valinta 'Sisällön tiivistys säästää levytilaa' ja paina 'OK'. 5) 'Ominaisuudet' ikkunassa, paina 'OK'. Virhe luodessa %s taltio %s koko on %.2f tavua %s koko on %.2f Kt %s koko on %.2f Mt %s koko on %.2f Gt %s koko on %.2f Tt %s koko on %.2f Pt VAROITUS: Laite/osio on jo käyttöjärjestelmän tai sovelluksen käytössä. Alustamalla nyt laitteen/osion sillä saattaa olla vaikutusta joko datan tuhoutumiselle ja järjestelmän epävakauteen.\n\nJatka? Varoitus: Osion on käyttöjärjestelmän ja sovelluksen käytössä. Sinun tulee sulkea sovellus joka saattaa käyttää osiota (sisältäen virustorjunta ohjelman)).\n\nJatka? Virhe: Laite/osio sisältää tiedostojärjestelmän jolta ei voida poistaa yhteyttä. Tiedostojärjestelmä saattaa olla järjestelmän käytössä. Alustamalla laite/osio suurella todennäköisyydellä aiheuttaa datan vioittumisen ja järjestelmän epävakauden.\n\nRatkaisu: Suosittelemme, että ensiksi poistat osion ja luot sen uudelleen ilman alustusta. Tehtyäsi näin, seuraavaksi: 1) Klikkaa hiiren oikealla 'Tietokone' (tai 'My Computer') ikonia 'Käynnistä' menusta ja valitse 'Hallitse'. 'Tietokone hallinta' ikkuna ilmestyy. 2) 'Tietokoneen hallinta' -ikkunassa, valitse 'Storage' > 'Disk Management'. 3) Klikkaa hiiren oikealla osio jonka haluat salakirjoittaa ja valitse joko 'Poista Osio', tai 'Poista Taltio', tai 'Poista Looginen Asema'. 4) Paina 'Kyllä'. Jos Windows pyytää sinua käynnistämään tietokoneen uudelleen, tee niin. Sitten toista kohdat 1 ja 2 ja jatka kohtaan 5. 5) Klikkaa hiiren oikealla allokoimaton/vapaa tilan alue ja valitse joko 'Uusi Osio', tai 'Uusi Yksinkertainen Taltio', tai 'Uusi Looginen Asema'. 6) 'Uuden Osio Ohjattutoiminto' tai 'Uuden Yksinkertaisen Taltion Ohjattutoiminto' ikkuna pitäisi nyt ilmestyä; seuraamalla ohjeita. Ohjattutoiminto sivulla nimetty 'Alusta Osio', valitse molemmat 'Älä alusta tätä osiota' tai 'Älä alusta tätä taltiota'. Samassa opastuksessa, paina 'Seuraava' ja sitten 'Lopeta'. 7) Huomioi, että laite polku jonka valitsit VeraCrypt voi olla väärä. Siksi, poistu VeraCrypt-ohjelman Opastetusta Taltion Luonnista (jos se edelleen on toiminnassa) ja aloita uudelleen. 8) Yritä salakirjoittaa laite/osio uudelleen.\n\nJos VeraCrypt toistuvasti epäonnistuu laite/osion salakirjoituksessa, saatat harkita haluavasi luoda sen sijaan tiedostosäilön. Virhe: Tiedostojärjestelmä ei voida lukita ja/tai poiskytkeä. Se saattaa olla käytössä käyttöjärjestelmällä tai sovelluksilla (esimerkiksi, virustorjunta ohjelmalla). Salatessasi osion saattaa aiheuttaa korruptoitumisen ja järjestelmän epävakauden.\n\nOle hyvä ja sulje sovellukset jotka saattavat olla tiedostojärjestelmän käytössä (sisältäen virustorjunta ohjelman) ja yritä uudelleen. Jos tämä ei auta, ole hyvä ja seuraa alla olevia ohjeita. VAROITUS: Jotkin yhdistetyt laitteet/osiot ovat jo käytössä!\n\nHylkäämällä tämän saatat aiheuttaa ei toivotun tuloksen sekä epästabiilin järjestelmän.\n\nSuosittelemme että suljet sovelluksen joka saattaa käyttää tätä laitetta/osiota. Valittu laite sisältää osion.\n\nAlustamalla laitteen saattaa aiheutua järjestelmän epävakautta ja/tai tietojen vioittumista. Valitse joko laitteen osio, tai poista kaikki laitteen osiot, jotta VeraCrypt-salausohjelma voi alustaa sen turvallisesti. Valittu ei-järjestelmäasema sisältää osioita.\n\nSalattu laiteisännöity VeraCrypt-taltio voidaan luoda laitteen sisälle jotka eivät sisällä osioita (sisältäen kiintolevyn ja kiinteän aseman). Laite joka sisältää osion voidaan täysin salata (käyttäen yksinkertaista pääavainta) ainoastaan jos se on laite jonne Windows on asennettuna ja josta se myös käynnistyy.\n\nJos haluat salata valitun ei-järjestelmälaitteen käyttäen yksinkertaista pääavainta, sinun tulee poistaa ensin kaikki osiot laitteelta mahdollistaaksesi VeraCrypt-salausohjelman alustaa se turvallisesti (alustaaksesi laitteen, joka sisältää osioita saattaa johtaa järjestelmän epävakauteen ja/tai tietojen korruptoitumiseen). Vaihtoehtoisesti, voit salata jokaisen osion laitteelta yksilöllisesti (jokainen osio salataan käyttäen erilaista pääavainta).\n\nHuomioi: Jos haluat poistaa kaikki osiot GPT levyltä, sinun saattaa tarvita muuntaa MBR levy (käyttäen esim. Computer Management työkalua) poistaaksesi piilotetun osion. Varoitus: Jos salaat koko laitteen (sen sijaan, että salaat vain sen osiota), käyttöjärjestelmät pitävät laitetta uutena, tyhjänä ja muotoilemattomana (koska se ei sisällä ositustaulukkoa) ja voi käynnistää laitteen spontaanisti (tai kysyä, haluatko tehdä sen), mikä voi vahingoittaa taltiota. Liäksi ei ole mahdollista jatkuvasti kytkeä taltiota suosikkina (esim. kun aseman numero muuttuu) tai määrittää sille suosikkitaltion otsikon.\n\nVälttääksesi tämän voit haluta keskittyä luomaan osion laitteelle ja salaamaan sen sijaan osion.\n\nOletko varma, että haluat salata koko laitteen? TÄRKEÄÄ: Muista että tätä taltiota EI voida kytkeä/käyttää käyttämällä asemakirjainta %c:, mikä sille on nykyisellään määritelty!\n\nKytkeäksesi taltion, paina 'Autoyhdistä Laitteet' VeraCrypt-salausohjelman pääikkunassa (vaihtoehtona, VeraCrypt pääikkunassa, paina 'Valitse Laite', ja sitten valitse osio/laite, ja paina 'Yhdistä'). Taltio kytketään eri kirjaimelle, jonka valitsit VeraCrypt pääikkunan listalta.\n\nAlkuperäinen kirjain %c: tulee käyttää vain siinä tapauksessa, että sinun tarvitsee poistaa salauksen osiolta/laitteelta (esim., jos et tarvitse enää salausta). Siinä tapauksessa, paina hiiren oikealla asemakirjainta %c: 'Tietokone' (tai 'My Computer') listalta ja valitse 'Alusta'. Muutoin, asemakirjainta %c: ei tule koskaan käyttää (paitsi jos poistat sen ja uudelleen määrittelet toiselle kirjaimelle osion/laitteen). Paikallisen ei-järjestelmäaseman salausta ei ole tuettu käyttöjärjestelmässäsi (tuettuna ovat ainoastaan Windows Vista ja myöhemmät Windows versiot).\n\nSyy tähän on se ettei Windows tue tiedostojärjestelmän kutistusta (järjestelmäosio tarvitsee kutistaa tehdäkseen tilaa asemaotsikolle ja varmuustallennukselle). Valittu osio ei sisällä NTFS tiedostojärjestelmää. Ainoastaan osiot jotka sisältävät NTFS tiedostojärjestelmän voidaan salata paikallaan.\n\nHuomio: Syy tähän on se, että Windows ei tue kutistamista toisentyyppisillä tiedostojärjestelmillä (tiedostojärjestelmä täytyy kutistaa tehdäkseen tilaa taltion otsikoille ja varmuustallentamiseksi). Valittu osio ei sisällä NTFS tiedostojärjestelmää. Ainoastaan osiot jotka sisältävät NTFS tiedostojärjestelmän voidaan salata paikallaan.\n\nJos haluat luoda salatun VeraCrypt-taltion tälle osiolle, valitse "Luo salattu taltio ja alusta se" (sen sijaan kuin valinta "Salaa osio paikallaan"). Virhe: Osio on liian pieni. VeraCrypt ei voi salata sitä. Salataksesi tietoja tälle osiolle, valitse seuraavat askeleet:\n\n1) Luo VeraCrypt-taltio tyhjälle osiolle/laitteelle ja sitten kytke se.\n\n2) Kopioi kaikki tiedostot osiolta jotka alkuperäisesti halusit salata kytketylle VeraCrypt-taltiolle (tämä luotiin ja kytkettiin kohdassa 1). Tällä tavoin, luot VeraCrypt-salatun varmuustallennetut tiedot.\n\n3) Luo VeraCrypt-taltio osiolle, jonka alkuperäisesti halusit salata. Varmista, että (Opastettu VeraCrypt Taltio) valitset valinnan 'Luo salattu taltio ja alusta se' (sen sijaan että valitsisit 'Salaa osio paikallaan'). Huomioi, että kaikki osiolle tallennetut tiedot poistuvat. Kun taltio on luotu, kytke se päälle.\n\n4) Kopioi kaikki tiedostot tälle kytketylle VeraCrypt varmuustallennustaltiolle (luotu ja kytketty kohdassa 1) kytke VeraCrypt-taltio jonka olet luonut (ja kytketty) kohdassa 3.\n\nKun olet suorittanut nämä kohdat, tiedot salataan ja lisäksi siellä tulee olemaan varmuustallennetut salatut tiedot. VeraCrypt voi salata paikalla ainoastaan osion, dynaamisen taltion tai kokonaisen järjestelmäaseman.\n\nJos haluat luoda salatun VeraCrypt-taltion valitun ei-järjestelmälaitteen sisälle, valitse valinta "Luo salattu taltio ja alusta se" (sen sijaan että valitsisit "Salaa osio paikalla"). Virhe: VeraCrypt voi salata paikalla ainoastaan osion, dynaamisen taltion, tai kokonaisen järjestelmäaseman. Varmista että määritelty polku on olemassa. Virhe: Ei voida kutistaa tiedostojärjestelmää (tiedostojärjestelmä tarvitsee kutistusta tehdäksesi tilaa asemaotsikolle ja varmuustallennukselle).\n\nMahdollinen seuraus ja ratkaisut:\n\n- Ei tarpeeksi tilaa asemalla. Varmista ettei muut sovellukset kirjoita tiedostojärjestelmään.\n\n- Vioittunut tiedostojärjestelmä. Yritä tarkistaa ja korjata virheet (klikkaa hiirenoikella aseman kirjainta 'Tietokone' listalta, sitten valitse Ominaisuudet > Työkalut > 'Tarkista Nyt', varmista että valinta 'Automaattinen korjaus tiedostojärjestelmälle' on päällä ja paina Aloita).\n\nJos aiemmat vaiheet eivät auta, seuraa seuraavia vaiheita. Virhe: Asemalla ei ole tarpeeksi tilaa ja siksi tiedostojärjestelmää ei voitu kutistaa (tiedostojärjestelmää tarvitsee kutistaa tehdäkseen tilaa taltion otsikolle ja varmuustallenteella).\n\nOle hyvä ja poista tarpeettomat tiedostot ja tyhjennä roskakori siten että on vähintään 256 Kt vapaata tilaa ja yritä uudelleen. Huomioi että on Windows asia, vapaan tilan määrä ilmoitettuna Windows Resurssinhallinnassa voi olla virheellinen ennen kuin käyttöjärjestelmä on uudelleen käynnistetty. Jos uudelleen käynnistys ei auta, tiedostojärjestelmä saattaa olla vioittunut. Yritä tarkistaa se ja korjata virheet (hiiren-oikean painallus asemakirjaimen kohdalla 'Tietokone' listalta, sitten valitse Ominaisuudet > Työkalut > 'Tarkista Nyt', varmista että valinta 'Automaattinen korjaus tiedostojärjestelmälle' on päällä ja paina Aloita).\n\nJos aiemmat vaiheet eivät auta, seuraa seuraavia vaiheita. Vapaa tilaa %s asemalla on %.2f tavua. Vapaa tilaa asemalla %s on %.2f Kt Vapaa tilaa asemalla %s on %.2f Mt Vapaa tilaa asemalla %s on %.2f Gt Vapaa tilaa asemalla %s on %.2f Tt Vapaa tilaa asemalla %s on %.2f Pt Levykirjaimien haku epäonnistui. Virhe: VeraCrypt levyä ei löydy.\n\nKopioi tiedosto 'veracrypt.sys' ja 'veracrypt-x64.sys' hakemistoon, jossa VeraCrypt-sovellus (VeraCrypt.exe) sijaitsee. Virhe: VeraCrypt-ohjaimen yhteensopimaton versio on parhaillaan käynnissä.\n\nJos yrität suorittaa VeraCrypt-tietokonetta kannettavassa tilassa (esim. ilman sen asentamista) ja eri VeraCrypt-versio on jo asennettuna, sinun pitää poistaa se ensin (tai päivittää se käyttämään VeraCrypt asentajaa). Poistaaksesi sen, seuraa näitä vaiheita: Windows Vista tai myöhemmät, valitse 'Start Menu' > Computer > 'Uninstall or change a program' > VeraCrypt > Uninstall; Windows XP, valisse 'Start Menu' > Settings > 'Control Panel' > 'Add Or Remove Programs' > VeraCrypt > Remove.\n\nSamoin, jos yrität käyttää VeraCrypt-tietokonetta kannettavassa tilassa (eli asentamatta sitä) ja VeraCryptin toinen versio on jo käynnissä kannettavassa tilassa, sinun on käynnistettävä järjestelmä uudelleen ja suoritettava vain tämä uusi versio. Virhe: Salakirjoitus alustus virhe. Virhe: Heikko tai mahdollinen heikko avain on havaittu. Avain hylätty. Yritä uudelleen. Kriittinen virhe on tapahtunut ja VeraCrypt täytyy keskeyttää. Jos tämä johtui virheestä VeraCrypt-ohjelmassa, haluaisimme korjata sen. Auttaaksesi meitä, voit lähettää automaattisesti generoidun raportin mikä sisältää seuraavat asiat:\n\n- Ohjelma versio\n- Käyttöjärjestelmäverso\n- CPU tyyppi\n- VeraCrypt-komponentin nimi\n- Tarkistussumma tiedot VeraCrypt-salausohjelmasta\n- Symbolinen dialogi-ikkunan nimi\n- Virhe kategoria\n- Virhe osoite\n- VeraCrypt kutsupino\n\nJos valitsit 'Kyllä', seuraava URL (sisältää virheraportin) avataan oletusselaimessasi.\n\n%hs\n\nHaluatko lähettää meille oheisen virheraportin? Kriittinen virhe tapahtunut järjestelmässäsi, mikä vaatii VeraCrypt-ohjelman keskeyttämisen.\n\nHuomioi, että tämä virhe ei ole tapahtunut johtuen VeraCrypt-ohjelmasta (siksi VeraCryptin kehittäjät eivät voi sitä korjata). Ole hyvä ja tarkista järjestelmäsi mahdollisten ongelmien johdosta (esim. järjestelmä asetukset, verkkoyhteys, vioittuneet järjestelmän osat). Järjestelmässäsi on tapahtunut kriittinen virhe, mikä edellyttää VeraCryptin lopettamista.\n\nJos tämä ongelma jatkuu, voit yrittää poistaa sen käytöstä tai poistaa järjestelmästä sovelluksia, jotka saattavat aiheuttaa tämän ongelman, kuten virustentorjuntaohjelmiston tai Internet-tietoturvaohjelmiston, järjestelmän "tehostajat", "optimoijat" tai "tweakers" jne. Jos tämä ei auta, voit yrittää asentaa käyttöjärjestelmäsi uudelleen (tämä ongelma saattaa johtua myös haittaohjelmista). VeraCrypt-salausohjelman Kriittinen Virhe VeraCryp havaitsi, että käyttöjärjestelmäsi kaatui äskettäin. On monia syitä, miksi näin on voinut käydä (esim. virheellinen laitteistokomponentti, vika laiteohjaimessa jne.)\n\nHaluatko VeraCrypt:n tarkistavan, mistä tämä vika olisi voinut johtua? Haluatko, että VeraCrypt jatkaa havaitsemaan järjestelmän kaatumiset? VeraCrypt-ohjelma ei löytänyt järjestelmän kaatumisen minidump-tiedostoa. Haluatko poistaa Windows-kaatopaikan tiedosto vapauttaaksesi levytilan? Järjestelmän kaatumisen analysoimiseksi VeraCryptin on ensin asennettava Microsoftin vianmääritystyökalut Windowsille.\n\nJos olet napsauttanut OK, Windows-asennusohjelma lataa Microsoft Debugging Tools -asennuspaketin (16 Mt) Microsoft-palvelimelta ja asenna sen (Windows-asennusohjelma välitetään veracrypt.org-palvelimelle Microsoft-palvelimen URL-osoitteelle, mikä varmistaa, että tämä ominaisuus toimii, vaikka Microsoft muuttaa asennuspaketin sijaintia). Kun valitset OK, VeraCrypt-ohjelma analysoi järjestelmän kaatumisen. Tämä voi kestää useita minuutteja. Varmista, että ympäristömuuttuja "PATH" sisältää polun "kd.exe" (Kernel Debugger). Vaikuttaa siltä, että VeraCrypt-ohjelma ei todennäköisesti aiheuttanut järjestelmän kaatumista. On monia mahdollisia syitä, miksi järjestelmä olisi voinut kaatua (esimerkiksi virheellinen laitteisto-osa, laiteohjaimen virhe jne.). Analyysin tulokset viittaavat siihen, että seuraavan ajurin päivittäminen saattaa ratkaista ongelman: Voit auttaa meitä määrittämään, onko VeraCrypt:ssä vikaa, voit lähettää automaattisesti generoidun virheraportin, joka sisältää seuraavat kohteet:\n- Ohjelmistoversio\n- Käyttöjärjestelmän versio\n- CPU-tyyppi\n- Virheluokka\n- Ohjaimen nimi ja versio\n- Järjestelmän puhelupino\n\nJos valitset 'Kyllä', seuraavan URL-osoitteen (joka sisältää koko virheraportin) avautuu oletusselaimessasi. Haluatko lähettää meille edellä mainitun virheraportin? &Salaa &Pura Salaus Avattu &Pysyvästi Lopetus Luo looginen asema laajennetulle osiolle ja yritä uudelleen. VeraCrypt-taltio voi sijaita tiedostossa (kutsutaan VeraCrypt-säilöksi), joka voi sijaita esim. kiintolevyllä, USB muistissa. VeraCrypt-säilö on kuin mikä tahansa tavallinen tiedosto (sitä voidaan esimerkiksi, siirtää, kopioida ja tuhota kuten tavallista tiedostoa). Paina 'Valitse Tiedosto' valitaksesi tiedostonimen säilölle sekä sen sijainnin.\n\nVAROITUS: Jos valitset olemassa olevan tiedoston, VeraCrypt EI salaa sitä; tiedosto tuhotaan ja korvataan uudella luodulla VeraCrypt-säilöllä. Sinun on mahdollista salata olemassa oleva tiedosto (jälkikäteen) siirtämällä ne VeraCrypt-säilöön, jota olet nyt luomassa. Valitse luotavan ulkoisen taltion sijainti (se luodaan tälle piilotetulle taltiolle myöhemmin).\n\nVeraCrypt-taltio voi sijaita tiedostossa (kutsutaan VeraCrypt-säilöksi), joka voidaan sisällyttää esim. kiintolevylle tai USB muistiin. VeraCrypt-säilö voidaan siirtää, kopioida ja poistaa kuten mitä tahansa tavallista tiedostoa. Paina 'Valitse Tiedosto' valitaksesi tiedostonimen säilölle ja valitse luotava säilön sijainti. Jos valitset jo olemassa olevan tiedoston, VeraCrypt EI SALAA sitä; tiedosto poistetaan ja korvataan uudella luodulla VeraCrypt-säilöllä. Sinun on mahdollista salata olemassa olevat tiedostot (myöhemmin) siirtämällä ne VeraCrypt-säilöön, jota olet nyt luomassa. Salattu laite isännöity VeraCrypt-taltiot voidaan luoda kiintolevylle osion sisälle, kiinteä tila asemalle, USB muistitikulle, tai mille tahansa tuetulle tallennus asemalle. Osiot voivat olla myös salattuja paikallaan.\n\nLisäksi, salattu laite isännöity VeraCrypt-taltiot voidaan luoda laiteen sisälle jotka sisältävät mitä tahansa osioita (sisältäen kiintolevyn ja kiinteä tilainen asema).\n\nHuomioi: Laite joka sisältää osioita voidaan täysin salata paikallaan (käyttäen yksinkertaista avainta) ainoastaan jos se on asema jossa Windows on asennettuna ja josta se käynnistyy. Laite isännöity VeraCrypt-taltio voi olla luotuna kiintolevyn osiolle, kiinteätilainen asema, USB muistitikku, ja muu talletus laite.\n\nVAROITUS: Huomioi että osio/laite alustetaan ja kaikki nykyiset tallennetut tiedot katoavat. \nValitse luotavan ulkoisen taltion sijainti (tämän taltion sisään luodaan myöhemmin piilotettu VeraCrypt taltio).\n\nUlkoiset taltioit voidaan luoda kiintolevylle osion sisälle, kiinteä tilaiset asemat, USB muistitikut, ja mille tahansa tuetulle ulkoiselle tallennus laitteelle. Ulkoiset taltiot voidaan luoda myös laitteen sisälle mikä ei sisällä osioita (sisältäen kiintolevyn ja kiinteätilainen laite).\n\nVAROITUS: Huomioi että osio/laite alustetaan ja kaikki nykyisin sille tallennetut tiedot katoavat. \nValitse VeraCrypt-ohjelman sijainti taltiolle, jonka tahdot luotavan piilotetulle taltiolle. VAROITUS: Kadonnut tiedosto/asema on jo käytössä!\n\nHylkäämällä tämän voit aiheuttaa järjestelmän epästabiilisuutta. Kaikki sovellukset jotka käyttävät isäntä tiedostoa/asemaa (esimerkiksi, virustorjunta tai varmuustallennus sovellukset) tulee sulkea ennen kuin kytket taltion.\n\nJatkatko kytkemistä? Virhe: Taltiota ei voida yhdistää. Verkkolevyn tiedosto/laite on jo käytössä. Yritys yhdistää ilman rajattuja oikeuksia myös epäonnistui. Tiedostoa ei voida avata. Taltion sijainti Isot Tiedostot Aiotko tallentaa tälle VeraCrypt asemalle tiedoston, joka koko on suurempi kuin 4 GB? Riippuen tekemästäsi valinnasta yllä, VeraCrypt valitsee sopivimman oletus tiedostojärjestelmän VeraCrypt asemalle (sinun on mahdollista valita tiedostojärjestelmä seuraavassa vaiheessa). Kun olet luomassa ulkoisen aseman, sinun täytyy harkita valitsemalla 'Ei'. Jos valitset 'Kyllä', oletus tiedostojärjestelmä tulee olemaan NTFS, mikä ei ole niin sopiva ulkoiselle asemalle kuin FAT (esimerkiksi maksimi mahdollinen koko piilotetulle asemalle on huomattavasti suurempi jos ulkoinen asema on alustettu FAT:ksi). Tavallisesti, FAT on oletuksena sekä piilotetuille ja normaaleille asemille (siksi FAT asemat eivät ole epäilyttäviä). Kuitenkin, jos käyttää osoittaa aikomuksenaan tallentaa suuremman tiedoston kuin 4 Gt (jota FAT tiedostojärjestelmä ei salli), siten FAT ei ole oletuksena. Oletko varma että valitset 'Kyllä' ? Taltion Luontitila Tämä on nopein tapa luoda osio- tai laite isännöity VeraCrypt-taltio (paikalla salaus, mikä on toinen vaihtoehto, on hidas koska jokainen sektorin sisältö pitää lukea ensin, salattu, ja sitten kirjoitettu). Mikä tahansa nykyinen tallennettu tieto valitulla osiolla/laitteella katoavat (tietoja EI salata; ne ylikirjoitetaan satunnaistiedolla). Jos haluat salata olemassa olevan osion datan, valitse toinen vaihtoehto. Kokonainen valittu osio ja kaikki tallennetut tiedot tullaan salaamaan paikallaan. Jos osio on tyhjä, sinun tulee valita toinen vaihtoehto (taltio luodaan paljon nopeammin). Huomioi: &Aloita uudelleen &Lykkää &Aloita &Jatka &Alusta &Pyyhi Keskeytä alustus? Näytä lisää tietoa älä näytä tätä enää Osion/aseman sisältö on onnistuneesti tyhjennetty. Osio sisältö missä alkuperäinen järjestelmä (missä piilotettu järjestelmä on kopio) sijaitsee on onnistuneesti poistettu. Varmista, että Windows-versio, jonka aiot asentaa (pyyhityltä osiolta) on sama kuin Windows-versio, joka sinulla on parhaillaan käynnissä. Tämä on tarpeen johtuu siitä, että molemmat järjestelmät jakavat yhteisen boot-osion. Järjestelmäosio/-asema on onnistuneesti salattu.\n\nHuom: Jos järjestelmään ei ole asennettu VeraCrypt-tiedostoja, jotka sinun on asennettava automaattisesti joka kerta, kun Windows käynnistyy, voit määrittää sen asettamalla ne yhteen ja valitsemalla 'Suosikit' > 'Lisää Yhdistetyt Taltio Järjestelmän suosikkeihin'). Järjestelmäosion/aseman salaus on onnistuneesti avattu. \n\nVeraCrypt-taltio on luotu onnistuneesti ja on valmiina käytettäväksi.\n\nJos haluat luoda toisen VeraCrypt-taltion, paina 'Seuraava'.\n\nMuussa tapauksessa, paina Lopetus. \n\nPiilotettu VeraCrypt-taltio on luotu onnistuneesti (piilotettu käyttöjärjestelmä sijaitsee tämän Piilotetun VeraCrypt taltion sisällä).\n\nPaina 'Seuraava' jatkaaksesi. Taltio Kokonaan Salattu Taltio Kokonaan Purettu TÄRKEÄÄ: KYTKEÄKSESI TÄMÄN UUDEN LUODUN VERACRYPT TALTION JA PÄÄSY TALLENTAMAAN SILLE, PAINA 'Autom. yhdistäminen' VERACRYPT PÄÄIKKUNASSA. Sen jälkeen kun annat oikean salasanan (ja/tai toimitat oikean avaintiedoston), taltio yhdistetään asemakirjaimelle jonka valitsit VeraCrypt-ohjelman pääikkunasta (ja sinun on mahdollista päästä salatuille tiedolle valitun asemakirjaimen kautta).\n\nMUISTA TAI KIRJOITA YLöS ALLA OLEVAT VAIHEET. SINUN TULLE SEURATA NIITÄ AINA KUN HALUAT YHDISTÄÄ TALTION JA PÄÄSTÄ KIINNI TALLENNETTUIHIN TIETOIHIN. Vaihtoehtoisesti, VeraCryptin pääikkunasta, paina 'Valitse Laite', ja sitten valitse osio/taltio, ja paina 'Yhdistä'.\n\nOsio/taltio on onnistuneesti salattu (se sisältää nyt täysin salatun VeraCrypt-taltion) ja on valmis käytettäväksi. VeraCryptin taltio on onnistuneesti purettu. VeraCryptin taltio on poistettu onnistuneesti.\n\nValitse aseman kirjain, jonka haluat määrittää salauksen purkamiseen, ja valitse sitten Valmis.\n\nHyödyllinen: Ennen kuin salakirjoituskirjaan on merkitty salaustaltioon, et pysty käyttämään taltiolle tallennettuja tietoja. Varoitus: Jotta voit käyttää salakirjoitettua dataa, salakirjoitetulle taltiolle on määritettävä aseman kirjain.\n\nKäytä aseman kirjainta (esimerkiksi irrottamalla USB-muistitikku tai ulkoinen kiintolevy jne.) ja paina OK. VeraCrypt-taltio on luotu onnistuneesti. Taltio Luotu TÄRKEÄÄ: Siirrä hiirtäsi satunnaisesti tässä ikkunassa. Mitä kauemmin siirrät sen parempi. Tämä kasvattaa merkittävästi salausavaimen vahvuutta. Paina 'Alusta' luodaksesi taltion. Paina 'Alusta' luodaksesi ulkoisen taltion. Lisätietoa, katso maininnat dokumentoinnista. Ulkoisen Taltion Alustus Piilotetun Taltion Alustus Taltion Alustus Adobe Reader (tai muu yhteensopiva työkalu) on tarpeen näyttämään tai tulostamaan VeraCrypt-salausohjelman Käyttäjäoppaan. Adobe Reader (freeware) voit ladata vapaasti: www.adobe.com\n\nHaluatko nähdä sen sijaan online dokumentaation? Jos valitset tämän valinnan, opastus ensiksi auttaa luomaan tavallisen VeraCrypt-taltion ja sitten piilotetun VeraCrypt-taltion sen sisälle. Aloittelevan käyttäjän tulisi aina valita tämä valinta. Jos valitset tämän valinnan, luot Piilotetun VeraCrypt taltion nykyisen VeraCrypt-taltion sisään. Otaksutaan että olet jo luonut VeraCrypt-taltion, joka on sopiva isännöimään piilotettua taltiota. Taltion Luontitila Piilotettu Taltion Luotu Piilotettu VeraCrypt-taltio on luotu ja on käyttövalmis. Jos kaikkia ohjeita on noudatettu ja noudatettu VeraCryptin käyttöoppaassa olevia 'Suojausvaatimuksia ja varotoimia, jotka liittyvät piilotettuihin taltioihin' luetelluista varotoimista ja vaatimuksista, on mahdotonta todistaa piilotetun taltioiden olemassaolo myös silloin, kun ulkoinen taltio on asennettu.\n\nVAROITUS: JOS ET SUOJAA PIILOTETTUA TALTIOTA (TIETOJA TÄYDENTÄMISESTÄ, TOIMITTAA KOHDAN 'SUOJELUJEN VÄHENTÄMISEN SUOJELUUN VAHINGON VASTAANOTTA' KOHTAAN), ÄLÄ KIRJOITA ULKOISELLE TALTIOLLE. MUUTOIN VOIT YLIKIRJOITAA JA TUHOTA PIILOTETUN TALTION! Olet käynnistänyt piilotetun käyttöjärjestelmän. Kuten olet huomannut, piilotettu käyttöjärjestelmä näyttäisi olevan asennettuna samalla osiolle kuin alkuperäinen käyttöjärjestelmä. Kuitenkin, todellisuudessa, se on asennettuna se takana oleva osion sisään (piilotetulle taltiolle). Kaikki luku ja kirjoitus toiminnot ovat näkymättömiä ohjauksia alkuperäiseltä piilotetulle taltiolle.\n\nKumpikaan käyttöjärjestelmä tai sovellus eivät tiedä tietojen kirjoituksesta sille ja lukemisesta siltä käyttöjärjestelmäosiolta ovat todellisuudessa kirjoitettu ja luettu sen takana olevalta osiolta (piilotetulle/lta taltiolta). Mitään sellaista tietoa on salattu ja purettu salausta lennossa (salatun avain ero siltä käytetään houkutuslintu käyttöjärjestelmänä).\n\n\nOle hyvä ja paina 'Seuraava' jatkaaksesi. Ulkoinen taltio on luotu ja kytketty asemalle %hc:. Tälle ulkoiselle taltiolle sinun tulee kopioida jotakin herkältä näyttäviä tiedostoja joita ET halua piilottaa. Ne ovat siellä koska jos olet pakotettu paljastamaan ensimmäiselle osiolle järjestelmäosion takana, missä ovat sekä ulkoinen taltio että piilotettua taltio (sisältää piilotetun käyttöjärjestelmän) sijaitsevat. Sinun on mahdollista paljastaa salasana ulkoiselle taltiolle ja olemassa olevalle piilotetulle taltiolle (ja piilotetulla käyttöjärjestelmällä) pysyy salassa.\n\nTÄRKEÄÄ: Tiedostot jotka kopioit ulkoiselle taltiolle ei pidä varata enempää kuin %s. Muutoin, siellä ei ole riittävästi tilaa piilotetulle ulkoiselle taltiolle (ja sinun ei ole mahdollista jatkaa). Kun olet lopettanut kopioinnin, paina 'Seuraava' (älä poiskytke taltioita). Ulkoinen taltio on luotu onnistuneesti ja yhdistetty asemalle %hc:. Tälle asemalle sinun pitää nyt kopioida jokin arkaluontoisen näköinen tiedosto jota sinä ET oikeasti tahdo piilottaa. Tiedostot ovat siellä koska kukaan ei pakota sinua paljastamaan salasanaasi. Sinä kerrot ainoastaan salasanan ulkoiselle taltiolle, et piilotetulle. Tiedostot joista todella välität ovat tallennetut piilotetulle taltiolle, joka luodaan myöhemmin. Kun lopetat kopioinnin, paina 'Seuraava'. Älä irrota taltiota.\n\nTiedotus: Kun painat Seuraava näppäintä, ulkoisen taltio ryhmän bittikartta tutkitaan määritettäessä keskeytymättömän vapaan alueen kokoa joka päättyy taltion lopussa. Tämä alue sijaitsee piilotetulla taltiolle, siksi se rajoittaa mahdollisen maksimi koon. Ryhmä bittikartta käydään läpi varmistettaessa sen ettei ulkoinen piilotettu VeraCrypt taltion ole ylikirjoittanut dataa. Ulkoinen Taltio Sisältö \n\nSeuraavassa vaiheessa asetat vaihtoehdot ulkoiselle taltiolle (jonne piilotettu VeraCrypt taltio myöhemmin luodaan). \n\nSeuraavaksi, sinä luot niin kutsutun ulkoisen VeraCrypt-taltion joka on ensimmäisen osion sisällä käyttöjärjestelmän osion takana (kuten selostimme yhdessä edellisissä askeleissa). Ulkoinen Taltio Seuraavissa vaiheissa, sinun tulet valitsemaan vaihtoehdon ja salasanan piilotetulle taltiolle, mikä sisältää piilotetun käyttöjärjestelmän.\n\nMaininta: Klusterin bittikartta ulkoiselle taltiolle on skannattu keskeytymättömän alueen tunnistamiseksi vapaalla alueella mikä on järjestetty ulkoisen taltion loppuun. Tämä alue sisältää Piilotetun VeraCrypt taltion, siksi se rajoittaa mahdollisen maksimi koon. Maksimi mahdollinen koko piilotetulle taltiolle on tunnistettu ja vahvistettu olevaksi isompi kuin järjestelmäosion koko (mikä on vaadittu, koska kokonainen sisältö tarvitaan kopioida piilotetulle taltiolle). Tämä takaa sen että nykyisin ulkoiselle taltiolle tallennettu tietoa ei ylikirjoiteta Piilotetun VeraCrypt taltion kirjoitetulla tiedolla. TÄRKEÄÄ: Muista valitsemasi algoritmi tässä vaiheessa. Sinun tulee valita sama algoritmi houkutuslintu-jäärjestelmälle. Muutoin, piilotettu järjestelmän sisään ei ole pääsyä! (Houkutuslintu-järjestelmä tulee salata samalla salausalgoritmilla kuin piilotettu järjestelmä.)\n\nHuomioi: Syy tähän on se, että houkutuslintu-järjestelmä ja piilotettu järjestelmä jakavat yhden ja saman Käynnistyslataajan, mikä tukee ainoastaan yksinkertaista algoritmia, käyttäjän valitsema (jokaiselle algoritmille, siellä on erityinen versio VeraCrypt-ohjelman Käynnistyslataajasta). \n\nTaltio ryhmän bittikartta on tutkittu ja Piilotetun VeraCrypt taltion suurin mahdollinen koko määritetty. Seuraavaksi valitset vaihtoehdot, koko, ja salasana piilotetulle taltiolle. Piilotettu Taltio Piilotettu taltio on suojattu vaurioita vastaan kunnes ulkoinen taltio on purettu.\n\nVAROITUS: Jos jotakin dataa yritetään tallentaa piilotetulle taltion alueelle, VeraCrypt-ohjelma aloittaa kirjoitus suojauksen taltiolle (sekä ulkoinen että piilotetut osat) ennen kuin sen on purettu. Tämä saattaa aiheuttaa tiedostojärjestelmän vioittumisen ulkoisella taltiolle, joka (jos toistetaan) saattaa todennäköisesti vaikuttaa epäsuotuisasti piilotetulle taltiolle. Siksi, sinun täytyy pyrkiä välttämään kirjoittamista piilotetulle taltion alueelle. Data joka tallennetaan piilotetulle taltion alueelle ei tallenneta ja se häviää. Windows saattaa raportoida tästä kirjoitus virheellä ("Viivästetty Kirjoitus Epäonnistui" tai "Parametrit olivat virheelliset"). Jokainen piilotettu VeraCrypt taltio uudessa yhdistetyssä taltiossa in nyt suojattu vahinkoja vastaan ennen yhteys poistetaan.\n\nVAROITUS: Jos jokin yrittää tallentaa joillekin näistä suojatuista piilotetuista taltioiden alueista, VeraCrypt-ohjelma aloittaa kirjoitus suojauksen koko taltiolle (sekö ulkoiselle että piilotetulle osalle) ennen kuin ne on purettu. Tämä saattaa aiheuttaa tiedostojärjestelmän korruptoitumisen ulkoisella taltiolle, joka (jos toistetaan) saattaa haitallisesti vaikuttaa todennäköisesti kiistanalaisesti piilotetulle taltiolle. Siksi sinun täytyy yrittää välttää kirjoittamasta piilotetulle taltion alueelle. Mikä tahansa data tallennettuna suojatulle piilotetulle taltion alueelle ei tallenneta ja se häviää. Windows saattaa raportoida tästä kirjoitus virheellä ("Viivästetty Kirjoitus Epäonnistui" tai "Parametrit ovat virheelliset"). VAROITUS: Dataa on yritetty tallentaa piilotetulle taltion alueelle joka on yhdistetty nimellä %c:! VeraCrypt-ohjelma torjuu näiden datojen tallennuksen suojatakseen Piilotetun VeraCrypt taltion. Tämä saattaa aiheuttaa tiedostojärjestelmän vioittumisen ulkoisella taltiolle, ja Windows saattaa raportoida kirjoitus virheellä ("Viivästetty Kirjoitus Epäonnistui" tai "Parametrit ovat virheelliset"). Koko taltio (sekä ulkoinen että piilotettu osa) kirjoitus suojataan ennen kuin se puretaan. Jos tämä ei ole ensimmäinen kerta kun VeraCrypt-ohjelma on torjunut datan kirjoittamisen tämän taltion piilotetulle taltio alueelle, tämä taltio saattaa olla todennäköisesti vaikuttanut kiistanalaisesti haitalliselta (mahdollisten epätavallisten ristiriitojen ulkoisella tiedostojärjestelmällä). Siksi, sinun täytyy harkita uuden VeraCrypt-taltion luontia (Nopea Alustus poispäältä) ja siirtää tiedostot tältä taltiolta uudelle taltiolle; tämä taltio täytyy turvallisesi tyhjentää (sekä ulkoinen että piilotettu osa). Vahvasti suosittelemme että nyt uudelleen käynnistät käyttöjärjestelmän. Olet ilmoittanut aikomuksesta tallentaa yli 4 gigatavun tiedostoja taltiolle. Tämä edellyttää, että taltion alustetaan NTFS:ksi, mikä ei kuitenkaan ole mahdollista. Huomaa, että kun piilotettu käyttöjärjestelmä on käynnissä, ei-piilotettuja VeraCrypt-tiedostomuotoja ei voi alustaa NTFS:ksi. Syynä on se, että taltio asennetaan tilapäisesti ilman kirjastosuojausta, jotta käyttöjärjestelmä pystyy alustamaan sen NTFS:ksi (kun taas muotoilua FAT:ssä suoritetaan VeraCrypt-ohjelmalla eikä käyttöjärjestelmällä eikä taltiota kytkettäessä). Katso lisätietoja teknisistä yksityiskohdista. Voit luoda ei-piilotetun NTFS taltion houkuttelevasta käyttöjärjestelmästä. Turvallisuus syistä, kun piilotettu käyttöjärjestelmä on toiminnassa, piilotettu VeraCrypt taltio voidaan luoda ainoastaan 'suora' tilassa (koska ulkoinen taltio täytyy aina yhdistää vain lukutilassa).\n\nLuodaksesi Piilotetun VeraCrypt taltion turvallisesti, seuraa näitä vaiheita:\n\n1) Käynnistä houkutuslintuna oleva järjestelmä.\n\n2) Luo tavallinen VeraCrypt-taltio ja tälle taltiolle, kopioi jotakin herkältä näyttäviä tiedostoja joita ET oikeasti halua piilottaa (taltiosta tulee ulkoinen taltio).\n\n3) Käynnistä piilotettu VeraCrypt-järjestelmä ja käynnistä VeraCrypt-ohjelmam 'Opastettu Taltion Luonti'. Jos taltio on tiedosto pohjainen, siirrä se järjestelmäosiolle tai toiselle piilotetulle taltiolle (muutoin, vasta luotu piilotettu VeraCrypt taltio voidaan yhdistää vain lukutilassa ja sitä ei voida alustaa). Seuraa ohjeita opastetussa tilassa siten että valitse 'suora' piilotettu VeraCrypt taltion luontitila.\n\n4) Opastetussa luonnissa, valitse taltio jonka teit vaiheessa 2 ja sitten seuraa ohjeita luodaksesi Piilotetun VeraCrypt taltion sen sisään. Turvallisuus syistä, kun piilotettu käyttöjärjestelmä on toiminnassa, paikallinen salaamaton tiedostojärjestelmä ja ei-piilotettu VeraCrypt-taltiot ovat yhdistettyinä lukutilassa (dataa ei voida kirjoittaa tällaiselle tiedostojärjestelmälle tai VeraCrypt-taltioille).\n\nTietoa voidaan kirjoittaa mille tahansa tiedostojärjestelmälle mikä sijaitsee piilotetulla VeraCrypt-taltiolla (edellyttäen, että piilotettu VeraCrypt taltio ei sijaitse säilössä talletettuna salaamattomana tiedostojärjestelmälle tai jollekin muulle vain luettavassa olevassa tiedostojärjestelmässä). On kolme pääsyytä miksi tällainen vastatoimenpide on toteutettu:\n\n- Se mahdollistaa luonnin suojatulle alustalle yhdistääkseen piilotetun VeraCrypt-taltiot. Huomioi että me virallisesti suosittelemme piilotetut taltiot ovat yhdistettyinä ainoastaan silloin kun piilotettu käyttöjärjestelmä on toiminnassa. (Lisätietoa, katso aliotsikko 'Turvallisuus Varokeinot Liittyen Piilotettuun Taltioon' dokumentissa.)\n\n- Joissakin tapauksissa, on mahdollista tunnistaa että, määrätty aika , tietty tiedostojärjestelmä ei ole yhdistetty (tai että tietty tiedosto tiedostojärjestelmässä ei ole tallennettu tai siihen ei ole pääsyä) tietty käyttöjärjestelmän esimerkki (esim. analysoi ja vertaa tiedostojärjestelmä julkaisut, tiedoston aikaleimat, sovelluksen lokit, virhe lokit jne.). Tämä saattaa osoittaa että piilotettu käyttöjärjestelmä on asennettuna tälle tietokoneelle. Vastatoimenpiteenä ehkäise nämä ongelmat.\n\n- Se suojaa tiedostojärjestelmän joka on yhdistetty molempien houkutuslintuna olevan järjestelmän alle ja piilotettu järjestelmä kun yksi tai molemmat järjestelmät ovat valmiustilassa. VeraCrypt-ohjelma takaa tämän kirjoitus suojaamalla tiedostojärjestelmän houkutuslintuna ja piilotetulla järjestelmällä. Ilman tällaista suojausta tiedostojärjestelmä vioittuisi kun se olisi jo kytkettynä ja toinen valmiustilassa. Huomioi: Jos tarvitset turvallisesti siirtää tiedostoja houkutuslintuna olevalta järjestelmältä piilotetulle järjestelmälle, seuraa näitä vaiheita: 1) Käynnistä houkutuslintuna oleva järjestelmä. 2) Tallenna tiedostot salaamattomaan taltioon tai ulkoiseen/tavalliseen VeraCrypt-taltioon. 3) Käynnistä piilotettu järjestelmä. 4) Jos et tallenna tiedostoa VeraCrypt-taltiolle, kytke se (automaattinen kytkentä vain lukutilassa). 5) Kopioi tiedostot piilotetulle järjestelmäosiolle tai muulle piilotetulle taltiolle. Tietokone tulee uudelleen käynnistää.\n\nHaluatko käynnistää sen nyt? Virhe tapahtui kun haettiin järjestelmän salakirjoitus arvoa. Komentoriville ei ole määritetty salasanaa. Taltiota ei voida luoda. Taltiolle ei määritelty kokoa komentorivillä. Taltiota ei voida luoda. Komentorivin määrittämä taltion tiedostokoko ei ole yhteensopiva valitun NTFS-tiedostojärjestelmän kanssa. Komentorivin määrittämä taltion tiedostokoko ei ole yhteensopiva valitun FAT32-tiedostojärjestelmän kanssa. Kohdelaitteessa oleva tiedostojärjestelmä ei tue dynaamisten tiedostomäärien edellyttämien harvojen tiedostojen luomista. Vain säilötiedostoja voidaan luoda komentorivin kautta. Komentorivin määrittämä säilökoko on suurempi kuin käytettävissä oleva levytila. Taltiota ei voida luoda. Komentorivin määrittämä taltion koko on liian pieni. Taltiota ei voida luoda. Komentorivillä määritetty taltion koko on liian suuri. Taltiota ei voida luoda. Sovelluksen komponentteja ei voida alustaa järjestelmän salakirjoitusta varten. Satunnaisnumeron luonnin alustus epäonnistui! Windows Crypt-sovellusliittymä epäonnistui!\n\n\n (Jos raportoit tästä virheestä, lisää seuraavat tekniset tiedot vikaraporttiin:\n%hs, Viimeinen virhe = 0x%.8X) Sovellusta ei pystytä alustamaan. Viestiruudun ikkunan rekisteröinti epäonnistui. Virhe: Virhe ladattaessa Rich edit -järjestelmän kirjastoa. Opastettu VeraCrypt Taltion Luonti Suurin mahdollinen piilotettu taltion koko tälle taltiolle on %.2f tavua. Suurin mahdollinen piilotettu taltion koko tälle taltiolle on %.2f Kt. Suurin mahdollinen piilotettu taltion koko tälle taltiolle on %.2f Mt. Suurin mahdollinen piilotettu taltion koko tälle taltiolle on %.2f Gt. Suurin mahdollinen piilotettu taltion koko tälle taltiolle on %.2f Tt. Taltion salasanaa/avaintiedostoa ei voida muuttaa kun taltio on yhdistettynä. Poista yhteys taltiolta. Otsikkoavaimen periytyvää algoritmia ei voida muuttaa kun taltio on yhdistettynä. Poista yhteys taltiolta. Y&hdistä Uusi VeraCrypt-ohjelman versio vaaditaan, jotta tämän taltion yhdistäminen on mahdollista. Virhe: Taltion Luonnin Ohjattuatoimintoa ei löydetty.\n\nOle hyvä ja varmista, että tiedosto 'VeraCrypt Format.exe' on hakemistossa missä 'VeraCrypt.exe' on perustettu. Jos se ei ole, asenna uudelleen VeraCrypt-ohjelma, tai määritä 'VeraCrypt Format.exe' levylläsi ja aja se. Virhe: Taltion Laajenninta ei löytynyt.\n\nOle hyvä ja varmista, että tiedosto 'VeraCryptExpander.exe' on samassa hakemistossa 'VeraCrypt.exe' kanssa. Jos se ei ole, ole hyvä ja asenna uudelleen VeraCrypt, tai paikallista 'VeraCryptExpander.exe' levylläsi ja suorita se. &Seuraava > &Valmis &Asenna P&ura Mahdotonta yhdistää VeraCrypt-ohjelman laiteohjain. VeraCrypt ei voi toimia, jos oikeaa laiteohjainta ei ole käytössä.\n\nHuomioi tämä, Windows ongelmista johtuen, voi olla tarpeen kirjautua ulos tai käynnistää järjestelmä uudelleen ennen laiteohjaimen latausta. Virhe tapahtui kun ladattiin/valmisteltiin fontteja. Aseman kirjainta ei löydetty tai kirjainta ei määritelty Virhe: ei voi määritellä aseman kirjainta.\n\nKun aseman kirjain on osoitettu purettuun taltioon, et voi käyttää taltiolle tallennettua dataa.\n\nYritä uudelleen? Aseman kirjain ei käytettävissä. Ei valittua tiedostoa! Ei vapaita tunnuksia vapaana. Vapaita taltion kirjaintunnuksia ei ole vapaana ulkoiselle taltiolle! Taltion luontia ei voida jatkaa. Ei voida tunnistaa käyttöjärjestelmäsi versiota tai käyttöjärjestelmäsi ei ole tuettu. Ei Polkua Valittuna! Ei Tarpeeksi vapaata tilaa piilotetulle taltiolle! Taltion luontia ei voida jatkaa. Virhe: Tiedosto joka kopioit ulkoiseen asemaan varaa liikaa tilaa. Siksi, ei ole tarpeeksi tilaa ulkoiselle asemalle piilotetulle taltiolle.\n\nHuomioi, että piilotettu VeraCrypt taltio täytyy olla isompi kuin järjestelmäosio (osio missä käyttöjärjestelmä on käytössä ja asennettuna). Syy miksi piilotettu käyttöjärjestelmän tarvitsee olla luotuna kopioimalla sisältö järjestelmäosion piilotetulle taltiolle.\n\n\nPiilotetun käyttöjärjestelmän luontiprosessia ei voida jatkaa. Taltiolta on mahdotonta poistaa yhteyttä. Jotkin tiedostot sijaitsevat taltiolla ja saattavat olla edelleen auki. Taltiota ei voida lukita. Siellä on edelleen avoimia tiedostoja. Siksi yhteyttä ei voida poistaa. VeraCrypt-ohjelma ei voi lukita taltiota koska se on käytössä järjestelmällä tai sovelluksella (taltiolla saattaa olla avoimia tiedostoja).\n\nHaluatko pakotetusti purkaa yhteyden taltiolle? Valitse VeraCrypt Taltio Määrittele Polku ja Tiedostonimi Valitse PKCS #11 Kirjasto Muisti loppui TÄRKEÄÄ: Vahvasti suosittelemme että aloittelijat luovat VeraCrypt-ohjelman tiedostosäilön valitulle laitteelle/osiolle, että sen sijaan yrittäisivät salata kokonaisen laitteen/osion.\n\nKun luot VeraCryptin tiedostosäilön (päinvastoin kuin salaisit laitteen tai osion), esimerkiksi, kun ei ole riskiä tuhota isoa määrää tiedostoja. Huomioi, että VeraCrypt-tiedostosäilö (vaikka sisältäisi virtuaalisen suojatun levyn) on oikeastaan kuin normaali tiedosto. Siksi, se voi olla esimerkiksi helpompi uudelleen nimetä, siirtää, tai kopioida kuten normaali tiedosto. Lisätietoa, katso kappale Aloittelijan Opas VeraCrypt:n Käyttäjäoppaassa.\n\nHaluatko varmasti suojata kokonaisen laitteen/osion? VAROITUS: Tiedosto '%s' on jo olemassa!\n\nTÄRKEÄÄ: VERACRYPT EI SALAA TIEDOSTOA, VAAN SE TUHOTAAN. Oletko varma, että haluat tuhota tiedoston ja korvata sen uudella VeraCrypt-säilöllä? VAROITUS: KAIKKI TIEDOSTOT JOTKA OVAT TALLENNETTUNA VALITULLA %s '%s'%s NE TUHOTAAN JA HÄVITETÄÄN (NIITÄ EI SALATA)!\n\nHaluatko varmasti jatkaa alustusta? VAROITUS: Sinun ei ole mahdollista yhdistää taltiota tai päästä tallennettuihin tiedostoihin käsiksi ennen kuin se on täysin salattu.\n\nOletko varma että haluat aloittaa salauksen valitulle %s '%s'%s? VAROITUS: Et voi asentaa taltiota tai käyttää siihen tallennettuja tiedostoja, ennen kuin se on kokonaan purettu.\n\nHaluat varmasti aloittaa salauksen purkamisen %s '%s'%s? VAROITUS: Huomioi että jos virta yhtäkkiä katkeaa ennen kuin salaus on suoritettu olemassa olevalle tiedoille, tai kun käyttöjärjestelmä keskeytyy virheeseen tai laitteisto vian vuoksi kun VeraCrypt on salaamassa olemassa olevaa tietoa, osa tiedoista korruptoituu tai häviää. Siksi, ennen kuin aloitat salauksen, ole hyvä ja varmista sinulla on varmuustallennus tiedostoista jotka haluat salata.\n\nOnko sinulla tällainen varmuustallenne? VAROITUS: MITKÄ TAHANSA TIEDOSTOT JOTKA OVAT TALLENNETTU OSIOLLE '%s'%s (KUIN TAAS ENSIMMÄISELLE OSIOLLE KÄYTTöJÄRJESTELMÄN TAKAISELLA OSIOLLA) POISTETAAN JA NE HÄVIÄVÄT (NIITÄ EI SALATA)!\n\nOletko varma että haluat jatkaa alustuksella? VAROITUS: VALITTU OSIO SISÄLTÄÄ ISON MÄÄRÄN TIETOA! Mikä tahansa tallennettu tiedosto osiolle pyyhitään ja katoaa (niitä EI salata)! Pyyhi mikä tahansa tallennettu tiedosto osiolta luomalla sen sisään VeraCrypt-taltion Salasana PIM Aseta Otsikkoavaimen Periytyvä algoritmi Lisää/Poista Avaintiedosto Taltiolta(lle) Poista Kaikki Avaintiedostot Taltiolta Salasana, PIM ja/tai avaintiedosto(t) on onnistuneesti vaihdettu.\n\nTÄRKEÄÄ: Varmista, että luet osuuden 'Muuttaa Salasanat ja Avaintiedostot' kappaleesta 'Turvallisuus Varotoimet' VeraCrypt Käyttäjäoppaasta. Tämä taltio on rekisteröity Järjestelmä Suosikkina ja sen PIM on muutettu.\nHaluatko VeraCryptin päivittää automaattisesti Järjestelmän Suosikkien kokoonpanoa (tarvitaan järjestelmänvalvojan oikeudet)?\n\nHuomioi, että jos vastaat ei, sinun on päivitettävä Järjestelmä Suosikit manuaalisesti. TÄRKEÄÄ: Jos et tuhoa VeraCryptin Pelastuslevyä, sinun käyttöjärjestelmäosio/asema voi silti olla salaamaton käyttäen vanhaa salasanaa (käynnistämällä VeraCryptin Pelastuslevy ja antamalla vanhan salasanan). Sinun täytyy luoda uusi VeraCryptin Pelastuslevy ja sitten tuhota vanha.\n\nHaluatko luoda uuden VeraCryptin Pelastuslevyn? Huomioi, että VeraCryptin Pelastuslevy käyttää vielä edellistä algoritmia. Jos harkitset että edellinen algoritmi on turvaton, sinun täytyy luoda ensin uusi VeraCrypt:n Pelastuslevy ja sitten tuhota vanha.\n\nHaluatko luoda uuden VeraCrypt:n Pelastuslevyn? VeraCrypt-avaintiedostona voidaan käyttää mitä tahansa tiedostoa (esimerkiksi .mp3, .jpg, .zip, .avi) kanssa. Huomaa, että VeraCrypt ei koskaan muuta avaintiedoston sisältöä. Voit valita useamman kuin yhden avaintiedoston (järjestyksessä ei ole väliä). Jos lisäät kansion, kaikki sen sisältämät piilotetut tiedostot ovat avaintiedostoja. Napsauta 'Lisää Token-tiedostoja', kun haluat valita turvakoodeihin tai älykortteihin tallennettuja avaintiedostoja (tai tuoda avaintiedoston turvatunnisteisiin tai älykortteihin). Avaintiedosto(t) onnistuneesti lisätty/poistettu. Avaintiedosto viety. Otsikkoavain Periytyvä algoritmin asetus onnistui. Anna salasana ja/tai avaintiedosto(t) ei-järjestelmätaltiolle minne haluat aloittaa uudelleen prosessin paikallaan salaukselle.\n\n\nHuomaa: Sen jälkeen kun painat Seuraava, VeraCrypt yrittää etsiä ei-järjestelmätaltioita missä salausprosessi on keskeytynyt ja missä VeraCrypt-taltio otsikko voi olla salauspurettu käyttäen hankittua salasanaa ja/tai avaintiedostoa(t). Jos enemmin kuin yksi tällainen taltio löydetään, sinun tarvitsee valita yksi niistä seuraavassa askeleessa. Ole hyvä ja valitse yksi listatuista taltioista. Lista sisältää jokaisen helppopääsyisen ei-järjestelmätaltion missä salauksenprosessi on keskeytynyt ja jonka otsikko voi olla salaus on purettuna käyttäen saatavana olevaa salasanaa ja/tai avaintiedostoa(t). Anna salasanasi ja/tai avaintiedosto(t), jotka eivät ole systeemisi VeraCrypt-taltioita, jonka haluat purkaa. On erittäin tärkeää, että valitset hyvän salasanan. Sinun tulee välttää sellaisia sanoja, jotka sisältävät vain yhden sanan ja joka löytyy sanakirjasta (tai yhdistelmää 2, 3, tai 4 vastaavia sanoja). Sen ei pidä sisältää mitään nimeä tai syntymäpäivää. Ei pidä olla helposti arvattavissa. Hyvä salasana on satunnainen yhdistelmä isoja ja pieniä kirjaimia, numeroita, ja erikoismerkkejä kuten @ ^ = $ * + jne. Suosittelemme valitsemaan salasanaan useamman kuin 20 merkkiä (mitä pidempi, sitä parempi). Maksimi pituus on 128 merkkiä. Valitse salasana piilotetulle taltiolle. Valitse salasana piilotetulle käyttöjärjestelmälle (esim. piilotetulle taltiolle). TÄRKEÄÄ: Salasana jonka valitsit piilotetulle käyttöjärjestelmälle tässä kohtaa tulee olla erilainen kuin toiset kaksi salasanaa (näitä ovat ulkoisen taltion salasana ja houkutuslintuna olevan käyttöjärjestelmän salasana). Anna taltiolle salasana jonka haluat luoda Piilotetun VeraCrypt taltion sisälle.\n\nPaina 'Seuraava', VeraCrypt-ohjelma yrittää yhdistää taltion. Hetki kun taltio on yhdistetty, ryhmä bittikartta tutkitaan läpi määritelläkseen vapaan tilan keskeytys alueella (jos on joitakin) mikä loppuu sovitettuun taltion loppuun. Tämä alue sijaitsee piilotetulla taltiolla ja siksi sillä on rajoitettu koko. Ryhmä bittikartan tutkiminen on tarpeen varmistaakseen ettei ulkoisella taltiolla olevaa dataa ylikirjoiteta Piilotetun VeraCrypt taltion toimesta. \nValitse salasana ulkoiselle taltiolle. Tämä tulee olemaan salasana jonka voit paljastaa pakotetussa tilanteessa.\n\nTÄRKEÄÄ: Salasana tulee olla täysin erilainen kuin sen jonka valitsit piilotetulle taltiolle.\n\nHuomioi: Maksimi mahdollinen pituus on 128 merkkiä. Ole hyvä ja valitse salasana ulkoiselle taltiolle. Tämä tulee olemaan salasana jonka voit antaa kenelle tahansa pakotetussa tilanteessa salasanaa ensimmäiselle osiolle käyttöjärjestelmän takan, kun molemmat ulkoinen ja piilotettu VeraCrypt taltion (sisältää piilotetun käyttöjärjestelmän) sijaitsee. Olemassa oleva piilotettu taltio (ja piilotettu käyttöjärjestelmä) pysyvät salattuina. Huomioi, että tämä salasana ei ole houkutuslintuna olevaa käyttöjärjestelmää varten.\n\nTÄRKEÄÄ: Salasana tulee olla täysin erilainen kuin sen jonka valitsit piilotetulle taltiolle (kuin myös piilotetulle käyttöjärjestelmälle). Ulkoisen Taltion Salasana Piilotetun Taltion Salasana Salasana Piilotetulle Käyttöjärjestelmälle VAROITUS: Lyhyt salasana on helppo murtaa brute force tekniikan avulla!\n\nSuosittelemme valitsemaan salasanan, joka sisältää enemmän kuin 20 merkkiä. Haluatko varmasti käyttää lyhyttä salasanaa? Taltion Salasana Väärä salasana tai se ei ole VeraCrypt-taltio. Väärä avaintiedosto(t) ja/tai väärä salasana tai ei ole VeraCrypt-taltio. Väärä yhteys tila, väärä salasana, tai väärä VeraCrypt-taltio. Väärä yhteys tila, väärä avaintiedosto(t) ja/tai salasana, tai väärä VeraCrypt-taltio. Väärä salasana tai VeraCrypt-taltiota ei löydetty. Väärä avaintiedosto(t)/salasana tai VeraCrypt-taltiota ei löydetty. \n\nVaroitus: Caps Lock on päällä. Tämä saattaa johtaa siihen, että salasanasi on virheellinen. Muista Numero Kytketylle Taltiolle Ulkoisen Taltion PIM Piilotetun Taltion PIM Piilotetun Käyttöjärjestelmän PIM PIM (Personal Iterations Multiplier) on arvo, joka ohjaa otsikkotulostuksen käyttämien iterointien lukumäärää seuraavasti:\n Iteraatio = 15000 + (PIM x 1000).\n\nJätetty tyhjäksi tai asetettu arvoksi 0, VeraCrypt käyttää oletusarvoa (485) mikä takaa korkean turvallisuuden.\n\nKun salasana on vähemmin kuin 20 merkkiä, PIM ei voi olla pinempi kuin 485, jotta alin turvallisuustaso säilytetään.\nKun salasana on 20 merkkiä tai enempi, PIM:lle voidaan asettaa mikä tahansa arvo.\n\nJos PIM arvo on suurempi kuin arvo 485, se johtaa hitaampaan taltion kytkemiseen. Pieni PIM arvo (vähempi kuin 485) johtaa nopeaan kykeytymiseen, mutta samalla salasanan turvallisuus heikkenee. PIM (Personal Iterations Multiplier) on arvo, joka ohjaa otsikkotulostuksen käyttämien iterointien lukumäärää seuraavasti: \n Iteraatio = PIM x 2048.\n\nJos jätetään tyhjäksi tai asetetaan arvoon 0, VeraCrypt käyttää oletusarvoa, joka takaa korkean turvallisuuden.\n\nKun salasana on alle 20 merkkiä, PIM ei voi olla pienempi kuin 98, jotta ylläpidetään minimaalinen suojaustaso.\nKun salasana on vähintään 20 merkkiä, PIM voidaan asettaa mihin tahansa arvoon.\n\nA PIM-arvo suurempi kuin 98 johtaa hitaampaan käynnistykseen. Pieni PIM-arvo (alle 98) johtaa nopeampaan käynnistykseen, mutta se voi vähentää suojausta, jos salasana ei ole tarpeeksi vahva. Muista numero käynnistysjärjestelmään Olet valinnut PIM-arvon, joka on suurempi kuin VeraCryptin oletusarvo.\nHuomioi, että tämä johtaa paljon hitaampaan kytkemiseen tai käynnistymiseen. Olet valinnut Personal Iterations Multiplier (PIM), joka on pienempi kuin oletusarvoinen VeraCrypt-arvo. Huomioi, että jos salasanasi ei ole tarpeeksi vahva, se voi heikentää tietoturvaa.\n\nVoit vahvistaa, että käytät vahvaa salasanaa? Järjestelmän salauksen maksimiarvon Personal Iterations Multiplier (PIM) -arvo on 65535. Taltion PIM \n\nVAROITUS: Piilotetut tiedostot on löytynyt avainhakemistosta. Tällaisia piilotettuja tiedostoja ei voi käyttää avaintiedostoina. Jos haluat käyttää niitä avaintiedostoina, poista niiden piilotettu attribuutti (napsauta niitä hiiren kakkospainikkeella, valitse 'Ominaisuudet', poista 'Piilotettu' ja napsauta OK). Huomaa: Piilotetut tiedostot ovat näkyvissä vain, jos vastaava vaihtoehto on käytössä (Tietokone > Järjestä > 'Kansio ja hakuvalinnat' > View). Jos yrität suojata piilotetussa säilössä olevan piilotetun järjestelmän, varmista, että käytät vakio näppäimistöäsi kun kirjoitat salasanan piilotetulle taltiolle. Tämä on vaadittu koska todellisuudessa salasana tulee kirjoittaa esikäynnistys ympäristössä (ennekuin Windows käynnistyy) kun Windows näppäimistösi ei vielä käytettävissä. VeraCrypt ei löytänyt mitään taltiota missä ei-järjestelmä salaus olisi keskeytynyt ja missä taltion otsikko voi olla salaus on purettuna käyttäen saatavana olevalla salasanalla ja/tai avaintiedostolla.\n\nVarmista, että salasana ja/tai avaintiedosto ovat oikein ja ettei osio/taltio ole järjestelmän tai sovelluksien käytössä (sisältäen virustorjunta ohjelmiston). Valittu osio/laite on jo täysin salattu.\nOtsikkoliput = 0x%.8X Valittu osio/laite ei käytä paikalla olevaa salausta.\nHeanOtsikkoliput = 0x%.8X \n\nTiedotus: Jos yrit
/*
 Legal Notice: Some portions of the source code contained in this file were
 derived from the source code of TrueCrypt 7.1a, which is
 Copyright (c) 2003-2012 TrueCrypt Developers Association and which is
 governed by the TrueCrypt License 3.0, also from the source code of
 Encryption for the Masses 2.02a, which is Copyright (c) 1998-2000 Paul Le Roux
 and which is governed by the 'License Agreement for Encryption for the Masses'
 Modifications and additions to the original source code (contained in this file)
 and all other portions of this file are Copyright (c) 2013-2017 IDRIX
 and are governed by the Apache License 2.0 the full text of which is
 contained in the file License.txt included in VeraCrypt binary and source
 code distribution packages. */

#include "Tcdefs.h"
#include <SrRestorePtApi.h>
#include <io.h>
#include <propkey.h>
#include <propvarutil.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <tchar.h>

#include "Apidrvr.h"
#include "BootEncryption.h"
#include "Boot/Windows/BootCommon.h"
#include "Combo.h"
#include "ComSetup.h"
#include "Dlgcode.h"
#include "Language.h"
#include "Registry.h"
#include "Resource.h"

#include "Dir.h"
#include "Setup.h"
#include "SelfExtract.h"
#include "Wizard.h"

#include "../Common/Resource.h"

using namespace VeraCrypt;

#pragma warning( disable : 4201 )
#pragma warning( disable : 4115 )

#include <shlobj.h>

#pragma warning( default : 4201 )
#pragma warning( default : 4115 )

#include <Strsafe.h>

wchar_t InstallationPath[TC_MAX_PATH];
wchar_t SetupFilesDir[TC_MAX_PATH];
wchar_t UninstallBatch[MAX_PATH];

BOOL bUninstall = FALSE;
BOOL bRestartRequired = FALSE;
BOOL bMakePackage = FALSE;
BOOL bDone = FALSE;
BOOL Rollback = FALSE;
BOOL bUpgrade = FALSE;
BOOL bUpdateRescueDisk = FALSE;
BOOL bDowngrade = FALSE;
BOOL SystemEncryptionUpdate = FALSE;
BOOL PortableMode = FALSE;
BOOL bRepairMode = FALSE;
BOOL bReinstallMode = FALSE;
BOOL bChangeMode = FALSE;
BOOL bDevm = FALSE;
BOOL bPossiblyFirstTimeInstall = FALSE;
BOOL bUninstallInProgress = FALSE;
BOOL UnloadDriver = TRUE;

BOOL bSystemRestore = TRUE;
BOOL bDisableSwapFiles = FALSE;
BOOL bForAllUsers = TRUE;
BOOL bRegisterFileExt = TRUE;
BOOL bAddToStartMenu = TRUE;
BOOL bDesktopIcon = TRUE;

BOOL bUserSetLanguage = FALSE;

BOOL bDesktopIconStatusDetermined = FALSE;

HMODULE volatile SystemRestoreDll = 0;

void localcleanup (void)
{
	localcleanupwiz ();
	cleanup ();

	CloseAppSetupMutex ();
}

#define WAIT_PERIOD 3

BOOL StartStopService (HWND hwndDlg, wchar_t *lpszService, BOOL bStart, DWORD argc, LPCWSTR* argv)
{
	SC_HANDLE hManager, hService = NULL;
	BOOL bOK = FALSE, bRet;
	SERVICE_STATUS status = {0};
	int x;
	DWORD dwExpectedState = bStart? SERVICE_RUNNING : SERVICE_STOPPED;

	hManager = OpenSCManager (NULL, NULL, SC_MANAGER_ALL_ACCESS);
	if (hManager == NULL)
		goto error;

	hService = OpenService (hManager, lpszService, SERVICE_ALL_ACCESS);
	if (hService == NULL)
		goto error;

	if (bStart)
		StatusMessageParam (hwndDlg, "STARTING", lpszService);
	else
		StatusMessageParam (hwndDlg, "STOPPING", lpszService);

	if (bStart)
	{
		if (!StartService (hService, argc, argv) && (GetLastError () != ERROR_SERVICE_ALREADY_RUNNING))
			goto error;
	}
	else
		ControlService (hService, SERVICE_CONTROL_STOP, &status);

	for (x = 0; x < WAIT_PERIOD; x++)
	{
		bRet = QueryServiceStatus (hService, &status);
		if (bRet != TRUE)
			goto error;

		if (status.dwCurrentState == dwExpectedState)
			break;

		Sleep (1000);
	}

	bRet = QueryServiceStatus (hService, &status);
	if (bRet != TRUE)
		goto error;

	if (status.dwCurrentState != dwExpectedState)
		goto error;

	bOK = TRUE;

error:

	if (bOK == FALSE && GetLastError () == ERROR_SERVICE_DOES_NOT_EXIST)
	{
		bOK = TRUE;
	}

	if (hService != NULL)
		CloseServiceHandle (hService);

	if (hManager != NULL)
		CloseServiceHandle (hManager);

	return bOK;
}

BOOL ForceCopyFile (LPCWSTR szSrcFile, LPCWSTR szDestFile)
{
	BOOL bRet = CopyFileW (szSrcFile, szDestFile, FALSE);
	if (!bRet)
	{
		wstring renamedPath = szDestFile;
		renamedPath += VC_FILENAME_RENAMED_SUFFIX;

		/* rename the locked file in order to be able to create a new one */
		if (MoveFileExW (szDestFile, renamedPath.c_str(), MOVEFILE_REPLACE_EXISTING))
		{
			bRet = CopyFileW (szSrcFile, szDestFile, FALSE);
			if (bRet)
			{
				/* delete the renamed file when the machine reboots */
				MoveFileEx (renamedPath.c_str(), NULL, MOVEFILE_DELAY_UNTIL_REBOOT);
			}
			else
			{
				/* restore the original file name */
				MoveFileEx (renamedPath.c_str(), szDestFile, MOVEFILE_REPLACE_EXISTING);
			}
		}
	}

	return bRet;
}

BOOL ForceDeleteFile (LPCWSTR szFileName)
{
	if (!DeleteFile (szFileName))
	{
		/* delete the renamed file when the machine reboots */
		return MoveFileEx (szFileName, NULL, MOVEFILE_DELAY_UNTIL_REBOOT);
	}
	else
		return TRUE;
}

BOOL StatDeleteFile (wchar_t *lpszFile, BOOL bCheckForOldFile)
{
	struct __stat64 st;

	if (bCheckForOldFile)
	{
		wchar_t szOldPath[MAX_PATH + 1];
		StringCbCopyW (szOldPath, sizeof(szOldPath), lpszFile);
		StringCbCatW  (szOldPath, sizeof(szOldPath), VC_FILENAME_RENAMED_SUFFIX);

		if (_wstat64 (szOldPath, &st) == 0)
		{
			ForceDeleteFile (szOldPath);
		}
	}

	if (_wstat64 (lpszFile, &st) == 0)
		return ForceDeleteFile (lpszFile);
	else
		return TRUE;
}

BOOL StatRemoveDirectory (wchar_t *lpszDir)
{
	struct __stat64 st;

	if (_wstat64 (lpszDir, &st) == 0)
	{
		return DeleteDirectory (lpszDir);
	}
	else
		return TRUE;
}


/* Recursively set the given OWNER security descriptor to the key and its subkeys */
static void RecursiveSetOwner (HKEY hKey, PSECURITY_DESCRIPTOR pSD)
{
	LSTATUS status = 0;
	DWORD dwIndex = 0, dwMaxNameLen = 0, dwNameLen = 0, numberSubKeys = 0;
	HKEY hSubKey;

	if (	(ERROR_SUCCESS == status) && (ERROR_SUCCESS == RegQueryInfoKey(hKey, NULL, NULL, NULL, &numberSubKeys, &dwMaxNameLen, NULL, NULL, NULL, NULL, NULL, NULL))
		&&	(numberSubKeys >= 1)
		)
	{
		dwMaxNameLen++;
		wchar_t* szNameValue = new wchar_t[dwMaxNameLen];
		while (true)
		{
			dwNameLen = dwMaxNameLen;
			status = RegEnumKeyExW (hKey, dwIndex++, szNameValue, &dwNameLen, NULL, NULL, NULL, NULL);
			if (status == ERROR_SUCCESS)
			{
				status = RegOpenKeyExW (hKey, szNameValue, 0, WRITE_OWNER | KEY_READ , &hSubKey);
				if (ERROR_SUCCESS == status)
				{
					RecursiveSetOwner (hSubKey, pSD);
					RegCloseKey(hSubKey);
				}
			}
			else
				break;
		}
		delete [] szNameValue;
	}

	RegSetKeySecurity (hKey, OWNER_SECURITY_INFORMATION, pSD);
}

/* Recursively set the given DACL security descriptor to the key and its subkeys */
static void RecursiveSetDACL (HKEY hKey, const wchar_t* SubKeyName, PSECURITY_DESCRIPTOR pSD)
{
	HKEY hSubKey;
	DWORD dwIndex = 0, dwMaxNameLen = 0, dwNameLen = 0, numberSubKeys = 0;
	LSTATUS status = RegOpenKeyExW(hKey, SubKeyName, 0, WRITE_DAC | KEY_READ /*| ACCESS_SYSTEM_SECURITY*/, &hSubKey);
	if (status == ERROR_SUCCESS)
	{
		status = RegSetKeySecurity (hSubKey, DACL_SECURITY_INFORMATION, pSD);
		if (status == ERROR_SUCCESS)
		{
			RegCloseKey(hSubKey);
			status = RegOpenKeyExW(hKey, SubKeyName, 0, WRITE_DAC | KEY_READ , &hSubKey);
		}

		if ( (ERROR_SUCCESS == status)
			&&	(ERROR_SUCCESS == RegQueryInfoKeyW(hSubKey, NULL, NULL, NULL, &numberSubKeys, &dwMaxNameLen, NULL, NULL, NULL, NULL, NULL, NULL))
			&&	(numberSubKeys >= 1)
			)
		{
			dwMaxNameLen++;
			wchar_t* szNameValue = new wchar_t[dwMaxNameLen];
			while (true)
			{
				dwNameLen = dwMaxNameLen;
				status = RegEnumKeyExW (hSubKey, dwIndex++, szNameValue, &dwNameLen, NULL, NULL, NULL, NULL);
				if (status == ERROR_SUCCESS)
			 	{
					RecursiveSetDACL (hSubKey, szNameValue, pSD);
				}
				else
					break;
			}
			delete [] szNameValue;
		}
	}
}

/* Correct the key permissions to allow its deletion */
static void AllowKeyAccess(HKEY Key,const wchar_t* SubKeyName)
{
	LSTATUS RegResult;
	HKEY SvcKey = NULL;
	DWORD dwLength = 0;
	HANDLE Token = NULL;
	PTOKEN_USER pTokenUser = NULL;
	std::string sNewSD;

	RegResult = RegOpenKeyExW(Key, SubKeyName, 0, WRITE_OWNER | KEY_READ, &SvcKey);
	if (RegResult==ERROR_SUCCESS)
	{
		if (OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &Token))
		{
			if (!GetTokenInformation(Token, TokenUser, pTokenUser, 0, &dwLength))
			{
				if (GetLastError() ==ERROR_INSUFFICIENT_BUFFER)
				{
					pTokenUser = (PTOKEN_USER) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, dwLength);
					if (pTokenUser)
					{
						if (GetTokenInformation(Token, TokenUser, pTokenUser, dwLength, &dwLength))
						{
							SECURITY_DESCRIPTOR SecDesc;
							if (	InitializeSecurityDescriptor(&SecDesc, SECURITY_DESCRIPTOR_REVISION)
								&&	SetSecurityDescriptorDacl(&SecDesc, TRUE, NULL, FALSE) // NULL DACL: full access to everyone
								&& SetSecurityDescriptorOwner(&SecDesc, pTokenUser->User.Sid, FALSE)
								)
							{
								RecursiveSetOwner(SvcKey, &SecDesc);
							}
						}

					}
				}
			}
		}
		RegCloseKey(SvcKey);
	}

	if (pTokenUser)
	{
		PSID pSid = pTokenUser->User.Sid;
		DWORD dwAclSize = sizeof(ACL) + sizeof(ACCESS_ALLOWED_ACE) + ::GetLengthSid(pSid) - sizeof(DWORD);
		PACL pDacl = (PACL) new BYTE[dwAclSize];
		if (pDacl)
		{
			if (TRUE == ::InitializeAcl(pDacl, dwAclSize, ACL_REVISION))
			{
				if (TRUE == AddAccessAllowedAceEx(pDacl, ACL_REVISION, CONTAINER_INHERIT_ACE | OBJECT_INHERIT_ACE, WRITE_DAC | KEY_ALL_ACCESS, pSid))
				{
					SECURITY_DESCRIPTOR SecDesc;
					if (TRUE == ::InitializeSecurityDescriptor(&SecDesc, SECURITY_DESCRIPTOR_REVISION))
					{
						if (TRUE == ::SetSecurityDescriptorDacl(&SecDesc, TRUE, pDacl, FALSE))
						{
							RecursiveSetDACL (Key, SubKeyName, &SecDesc);
						}
					}
				}
			}
			delete [] pDacl;
		}
	}

	if (pTokenUser)
		HeapFree(GetProcessHeap(), 0, pTokenUser);
	if (Token)
		CloseHandle(Token);
}

void SearchAndDeleteRegistrySubString (HKEY hKey, const wchar_t *subKey, const wchar_t *str, BOOL bEnumSubKeys, const wchar_t* enumMatchSubStr)
{
	HKEY hSubKey = 0;
	LSTATUS status = 0;
	DWORD dwIndex = 0, dwType, dwValueNameLen, dwDataLen;
	std::list<std::wstring> subKeysList;
	size_t subStringLength = str? wcslen(str) : 0;

	if (bEnumSubKeys)
	{
         DWORD dwMaxNameLen = 0;
         if (ERROR_SUCCESS == RegQueryInfoKey(hKey, NULL, NULL, NULL, NULL, &dwMaxNameLen, NULL, NULL, NULL, NULL, NULL, NULL))
         {
            dwMaxNameLen++;
            wchar_t* szNameValue = new wchar_t[dwMaxNameLen];
			   dwIndex = 0;
			   while (true)
			   {
				   dwValueNameLen = dwMaxNameLen;
				   status = RegEnumKeyExW (hKey, dwIndex++, szNameValue, &dwValueNameLen, NULL, NULL, NULL, NULL);
				   if (status == ERROR_SUCCESS)
				   {
						if (enumMatchSubStr && !wcsstr(szNameValue, enumMatchSubStr))
							continue;
					std::wstring entryName = szNameValue;
					entryName += L"\\";
					entryName += subKey;
					entryName += L"\\";
					subKeysList.push_back(entryName);
				   }
				   else
					   break;
			   }
            delete [] szNameValue;
         }
	}
	else
	{
		subKeysList.push_back(subKey);
	}

	for (std::list<std::wstring>::iterator ItSubKey = subKeysList.begin(); ItSubKey != subKeysList.end(); ItSubKey++)
	{
		// if the string to search for is empty, delete the sub key, otherwise, look for matching value and delete them
		if (subStringLength == 0)
		{
			if (ERROR_ACCESS_DENIED == DeleteRegistryKey (hKey, ItSubKey->c_str()))
			{
				// grant permission to delete
				AllowKeyAccess (hKey, ItSubKey->c_str());

				// try again
				DeleteRegistryKey (hKey, ItSubKey->c_str());
			}
		}
		else
		{
			if (RegOpenKeyExW (hKey, ItSubKey->c_str(), 0, KEY_ALL_ACCESS, &hSubKey) == ERROR_SUCCESS)
			{
            DWORD dwMaxNameLen = 0, dwMaxDataLen = 0;
            if (ERROR_SUCCESS == RegQueryInfoKey(hSubKey, NULL, NULL, NULL, NULL, NULL, NULL, NULL, &dwMaxNameLen, &dwMaxDataLen, NULL, NULL))
            {
               dwMaxNameLen++;
               wchar_t* szNameValue = new wchar_t[dwMaxNameLen];
               LPBYTE pbData = new BYTE[dwMaxDataLen];

				   std::list<std::wstring> foundEntries;
				   dwIndex = 0;
				   do
				   {
					   dwValueNameLen = dwMaxNameLen;
					   dwDataLen = dwMaxDataLen;
					   status = RegEnumValueW(hSubKey, dwIndex++, szNameValue, &dwValueNameLen, NULL, &dwType, pbData, &dwDataLen);
					   if (status == ERROR_SUCCESS)
					   {
						   if (	(wcslen(szNameValue) >= subStringLength && wcsstr(szNameValue, str))
							   ||	(dwType == REG_SZ && wcslen((wchar_t*) pbData) >= subStringLength && wcsstr((wchar_t*) pbData, str))
							   )
						   {
							   foundEntries.push_back(szNameValue);
						   }
					   }
				   } while ((status == ERROR_SUCCESS) || (status == ERROR_MORE_DATA)); // we ignore ERROR_MORE_DATA errors since
                                                                                   // we are sure to use the correct sizes

				   // delete the entries
				   if (!foundEntries.empty())
				   {
					   for (std::list<std::wstring>::iterator It = foundEntries.begin();
						   It != foundEntries.end(); It++)
					   {
						   RegDeleteValueW (hSubKey, It->c_str());
					   }
				   }

               delete [] szNameValue;
               delete [] pbData;
            }


				RegCloseKey (hSubKey);
			}
		}
	}
}

/*
 * Creates a VT_LPWSTR propvariant.
 * we use our own implementation to use SHStrDupW function pointer
 * that we retreive ourselves to avoid dll hijacking attacks
 */
inline HRESULT VCInitPropVariantFromString(__in PCWSTR psz, __out PROPVARIANT *ppropvar)
{
    ppropvar->vt = VT_LPWSTR;
    HRESULT hr = VCStrDupW(psz, &ppropvar->pwszVal);
    if (FAILED(hr))
    {
        PropVariantInit(ppropvar);
    }
    return hr;
}

HRESULT CreateLink (wchar_t *lpszPathObj, wchar_t *lpszArguments,
	    wchar_t *lpszPathLink, const wchar_t* iconFile, int iconIndex)
{
	HRESULT hres;
	IShellLink *psl;

	/* Get a pointer to the IShellLink interface.  */
	hres = CoCreateInstance (CLSID_ShellLink, NULL,
			       CLSCTX_INPROC_SERVER, IID_IShellLink, (LPVOID *) &psl);
	if (SUCCEEDED (hres))
	{
		IPersistFile *ppf;

		/* Set the path to the shortcut target, and add the
		   description.  */
		psl->SetPath (lpszPathObj);
		psl->SetArguments (lpszArguments);
		if (iconFile)
		{
			psl->SetIconLocation (iconFile, iconIndex);
		}

		// Application ID
		if (_tcsstr (lpszPathObj, _T(TC_APP_NAME) _T(".exe")))
		{
			IPropertyStore *propStore;

			if (SUCCEEDED (psl->QueryInterface (IID_PPV_ARGS (&propStore))))
			{
				PROPVARIANT propVariant;
				if (SUCCEEDED (VCInitPropVariantFromString (TC_APPLICATION_ID, &propVariant)))
				{
					if (SUCCEEDED (propStore->SetValue (PKEY_AppUserModel_ID, propVariant)))
						propStore->Commit();

					PropVariantClear (&propVariant);
				}

				propStore->Release();
			}
		}

		/* Query IShellLink for the IPersistFile interface for saving
		   the shortcut in persistent storage.  */
		hres = psl->QueryInterface (IID_IPersistFile,
						    (void **) &ppf);

		if (SUCCEEDED (hres))
		{
			/* Save the link by calling IPersistFile::Save.  */
			hres = ppf->Save (lpszPathLink, TRUE);
			ppf->Release ();
		}
		psl->Release ();
	}
	return hres;
}

BOOL IsSystemRestoreEnabled ()
{
	BOOL bEnabled = FALSE;
	HKEY hKey;
	DWORD dwValue = 0, cbValue = sizeof (DWORD);
	wchar_t szRegPath[MAX_PATH];
	GetRestorePointRegKeyName (szRegPath, sizeof (szRegPath));
	if (RegOpenKeyEx (HKEY_LOCAL_MACHINE, szRegPath, 0, KEY_READ | KEY_WOW64_64KEY, &hKey) == ERROR_SUCCESS)
	{
		if (IsOSAtLeast (WIN_VISTA))
		{
			if (	(ERROR_SUCCESS == RegQueryValueEx (hKey, L"RPSessionInterval", NULL, NULL, (LPBYTE) &dwValue, &cbValue))
				&&	(dwValue == 1)
				)
			{
				bEnabled = TRUE;
			}
		}
		else
		{
			if (	(ERROR_SUCCESS == RegQueryValueEx (hKey, L"DisableSR", NULL, NULL, (LPBYTE) &dwValue, &cbValue))
				&&	(dwValue == 0)
				)
			{
				bEnabled = TRUE;
			}
		}


		RegCloseKey (hKey);
	}

	return bEnabled;
}

void GetProgramPath (HWND hwndDlg, wchar_t *path)
{
	ITEMIDLIST *i;
	HRESULT res;

	if (bForAllUsers)
        res = SHGetSpecialFolderLocation (hwndDlg, CSIDL_COMMON_PROGRAMS, &i);
	else
        res = SHGetSpecialFolderLocation (hwndDlg, CSIDL_PROGRAMS, &i);

	SHGetPathFromIDList (i, path);
}

void StatusMessage (HWND hwndDlg, char *stringId)
{
	if (Rollback)
		return;

	SendMessageW (GetDlgItem (hwndDlg, IDC_LOG_WINDOW), LB_ADDSTRING, 0, (LPARAM) GetString (stringId));

	SendDlgItemMessage (hwndDlg, IDC_LOG_WINDOW, LB_SETTOPINDEX,
		SendDlgItemMessage (hwndDlg, IDC_LOG_WINDOW, LB_GETCOUNT, 0, 0) - 1, 0);
}

void StatusMessageParam (HWND hwndDlg, char *stringId, const wchar_t *param)
{
	wchar_t szTmp[1024];

	if (Rollback)
		return;

	StringCbPrintfW (szTmp, sizeof(szTmp), L"%s %s", GetString (stringId), param);
	SendMessageW (GetDlgItem (hwndDlg, IDC_LOG_WINDOW), LB_ADDSTRING, 0, (LPARAM) szTmp);

	SendDlgItemMessage (hwndDlg, IDC_LOG_WINDOW, LB_SETTOPINDEX,
		SendDlgItemMessage (hwndDlg, IDC_LOG_WINDOW, LB_GETCOUNT, 0, 0) - 1, 0);
}

void ClearLogWindow (HWND hwndDlg)
{
	SendMessage (GetDlgItem (hwndDlg, IDC_LOG_WINDOW), LB_RESETCONTENT, 0, 0);
}

void RegMessage (HWND hwndDlg, const wchar_t *txt)
{
	StatusMessageParam (hwndDlg, "ADDING_REG", txt);
}

void _cdecl CopyMessage (HWND hwndDlg, const wchar_t *txt)
{
	StatusMessageParam (hwndDlg, "INSTALLING", txt);
}

void RemoveMessage (HWND hwndDlg, const wchar_t *txt)
{
	if (!Rollback)
		StatusMessageParam (hwndDlg, "REMOVING", txt);
}

void IconMessage (HWND hwndDlg, const wchar_t *txt)
{
	StatusMessageParam (hwndDlg, "ADDING_ICON", txt);
}

#ifdef VC_EFI_CUSTOM_MODE
BOOL CheckSecureBootCompatibility (HWND hWnd)
{
	BOOL bRet = FALSE;
	BOOL bDriverAttached = FALSE;
	if (hDriver == INVALID_HANDLE_VALUE)
	{
		int status = DriverAttach();
		if (status || (hDriver == INVALID_HANDLE_VALUE))
			return FALSE;
		bDriverAttached = TRUE;
	}	

	try
	{
		BootEncryption bootEnc (hWnd);
		if (bootEnc.GetDriverServiceStartType() == SERVICE_BOOT_START)
		{
			SystemDriveConfiguration config = bootEnc.GetSystemDriveConfiguration ();
			if (config.SystemPartition.IsGPT)
			{
				BOOL bSecureBootEnabled = FALSE, bVeraCryptKeysLoaded = FALSE;
				bootEnc.GetSecureBootConfig (&bSecureBootEnabled, &bVeraCryptKeysLoaded);
				if (!bSecureBootEnabled || bVeraCryptKeysLoaded)
				{
					bRet = TRUE;
				}
			}
			else
				bRet = TRUE;
		}
		else
			bRet = TRUE;
	}
	catch (...)
	{
	}

	if (bDriverAttached)
	{
		CloseHandle (hDriver);
		hDriver = INVALID_HANDLE_VALUE;
	}
	return bRet;
}
#endif

void DetermineUpgradeDowngradeStatus (BOOL bCloseDriverHandle, LONG *driverVersionPtr)
{
	LONG driverVersion = VERSION_NUM;
	int status = 0;

	if (hDriver == INVALID_HANDLE_VALUE)
		status = DriverAttach();

	if ((status == 0) && (hDriver != INVALID_HANDLE_VALUE))
	{
		DWORD dwResult;
		BOOL bResult = DeviceIoControl (hDriver, TC_IOCTL_GET_DRIVER_VERSION, NULL, 0, &driverVersion, sizeof (driverVersion), &dwResult, NULL);

		if (!bResult)
			bResult = DeviceIoControl (hDriver, TC_IOCTL_LEGACY_GET_DRIVER_VERSION, NULL, 0, &driverVersion, sizeof (driverVersion), &dwResult, NULL);


		bUpgrade = (bResult && driverVersion <= VERSION_NUM);
		bDowngrade = (bResult && driverVersion > VERSION_NUM);
		bReinstallMode = (bResult && driverVersion == VERSION_NUM);

		PortableMode = DeviceIoControl (hDriver, TC_IOCTL_GET_PORTABLE_MODE_STATUS, NULL, 0, NULL, 0, &dwResult, NULL);

		if (bCloseDriverHandle)
		{
			CloseHandle (hDriver);
			hDriver = INVALID_HANDLE_VALUE;
		}
	}

	*driverVersionPtr = driverVersion;
}


static BOOL IsFileInUse (const wstring &filePath)
{
	HANDLE useTestHandle = CreateFile (filePath.c_str(), GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);

	if (useTestHandle != INVALID_HANDLE_VALUE)
		CloseHandle (useTestHandle);
	else if (GetLastError() == ERROR_SHARING_VIOLATION)
		return TRUE;

	return FALSE;
}


BOOL DoFilesInstall (HWND hwndDlg, wchar_t *szDestDir)
{
	/* WARNING: Note that, despite its name, this function is used during UNinstallation as well. */

	wchar_t szTmp[TC_MAX_PATH];
	BOOL bOK = TRUE;
	int i, x, fileNo;
	wchar_t curFileName [TC_MAX_PATH] = {0};

	if (!bUninstall && !bDevm)
	{
		// Self-extract all files to memory

		GetModuleFileName (NULL, szTmp, ARRAYSIZE (szTmp));

		if (!SelfExtractInMemory (szTmp))
			return FALSE;
	}

	x = wcslen (szDestDir);
	if (x < 2)
		return FALSE;

	if (szDestDir[x - 1] != L'\\')
		StringCbCatW (szDestDir, MAX_PATH, L"\\");

	for (i = 0; i < sizeof (szFiles) / sizeof (szFiles[0]); i++)
	{
		BOOL bResult, driver64 = FALSE, zipFile = FALSE;
		wchar_t szDir[TC_MAX_PATH];

		if (wcsstr (szFiles[i], L"VeraCrypt Setup") != 0)
		{
			if (bUninstall)
				continue;	// Prevent 'access denied' error

			if (bRepairMode)
				continue;	// Destination = target
		}

		if ((*szFiles[i] == L'A') || (*szFiles[i] == L'X'))
			StringCbCopyW (szDir, sizeof(szDir), szDestDir);
		else if (*szFiles[i] == L'D')
		{
			if (Is64BitOs ())
				driver64 = TRUE;

			GetSystemDirectory (szDir, ARRAYSIZE (szDir));

			x = wcslen (szDir);
			if (szDir[x - 1] != L'\\')
				StringCbCatW (szDir, sizeof(szDir), L"\\");

			StringCbCatW (szDir, sizeof(szDir), L"Drivers\\");
		}
		else if (*szFiles[i] == L'W')
			GetWindowsDirectory (szDir, ARRAYSIZE (szDir));

		if (*szFiles[i] == L'I')
			continue;

		if (*szFiles[i] == L'X')
			zipFile = TRUE;

		StringCbPrintfW (szTmp, sizeof(szTmp), L"%s%s", szDir, szFiles[i] + 1);
		if (zipFile)
		{
			// build folder name by removing .zip extension
			wchar_t* ptr = wcsrchr (szTmp, L'.');
			if (ptr)
				*ptr = 0;
		}

		if (bUninstall == FALSE)
			CopyMessage (hwndDlg, szTmp);
		else
			RemoveMessage (hwndDlg, szTmp);

		if (bUninstall == FALSE)
		{
			SetCurrentDirectory (SetupFilesDir);

			if (wcsstr (szFiles[i], L"VeraCrypt Setup") != 0)
			{
				// Copy ourselves (the distribution package) to the destination location as 'VeraCrypt Setup.exe'

				wchar_t mp[MAX_PATH];

				GetModuleFileName (NULL, mp, ARRAYSIZE (mp));
				bResult = TCCopyFile (mp, szTmp);
			}
			else
			{
				StringCchCopyNW (curFileName, ARRAYSIZE(curFileName), szFiles[i] + 1, wcslen (szFiles[i]) - 1);
				curFileName [wcslen (szFiles[i]) - 1] = 0;

				if (Is64BitOs ()
					&& ((wcscmp (szFiles[i], L"Dveracrypt.sys") == 0) || (wcscmp (szFiles[i], L"Averacrypt.sys") == 0)))
				{
					if (IsARM())
						StringCbCopyNW (curFileName, sizeof(curFileName), L"veracrypt-arm64.sys", sizeof(L"veracrypt-arm64.sys"));
					else
						StringCbCopyNW (curFileName, sizeof(curFileName), FILENAME_64BIT_DRIVER, sizeof (FILENAME_64BIT_DRIVER));
				}

				if (Is64BitOs ()
					&& wcscmp (szFiles[i], L"Averacrypt.cat") == 0)
				{
					if (IsARM())
						StringCbCopyNW (curFileName, sizeof(curFileName), L"veracrypt-arm64.cat", sizeof(L"veracrypt-arm64.cat"));
					else
						StringCbCopyNW (curFileName, sizeof(curFileName), L"veracrypt-x64.cat", sizeof (L"veracrypt-x64.cat"));
				}

				if (Is64BitOs ()
					&& wcscmp (szFiles[i], L"AVeraCrypt.exe") == 0)
				{
					if (IsARM())
						StringCbCopyNW (curFileName, sizeof(curFileName), L"VeraCrypt-arm64.exe", sizeof(L"VeraCrypt-arm64.exe"));
					else
						StringCbCopyNW (curFileName, sizeof(curFileName), L"VeraCrypt-x64.exe", sizeof (L"VeraCrypt-x64.exe"));
				}

				if (Is64BitOs ()
					&& wcscmp (szFiles[i], L"AVeraCryptExpander.exe") == 0)
				{
					if (IsARM())
						StringCbCopyNW (curFileName, sizeof(curFileName), L"VeraCryptExpander-arm64.exe", sizeof(L"VeraCryptExpander-arm64.exe"));
					else
						StringCbCopyNW (curFileName, sizeof(curFileName), L"VeraCryptExpander-x64.exe", sizeof (L"VeraCryptExpander-x64.exe"));
				}

				if (Is64BitOs ()
					&& wcscmp (szFiles[i], L"AVeraCrypt Format.exe") == 0)
				{
					if (IsARM())
						StringCbCopyNW (curFileName, sizeof(curFileName), L"VeraCrypt Format-arm64.exe", sizeof(L"VeraCrypt Format-arm64.exe"));
					else
						StringCbCopyNW (curFileName, sizeof(curFileName), L"VeraCrypt Format-x64.exe", sizeof (L"VeraCrypt Format-x64.exe"));
				}

				if (!bDevm)
				{
					bResult = FALSE;

					// Find the correct decompressed file in memory
					for (fileNo = 0; fileNo < NBR_COMPRESSED_FILES; fileNo++)
					{
						// Write the file (stored in memory) directly to the destination location
						// (there will be no temporary files).
						if (wmemcmp (
							curFileName,
							Decompressed_Files[fileNo].fileName,
							min (wcslen (curFileName), (size_t) Decompressed_Files[fileNo].fileNameLength)) == 0)
						{
							// Dump filter driver cannot be installed to SysWOW64 directory
							if (driver64 && !EnableWow64FsRedirection (FALSE))
							{
								handleWin32Error (hwndDlg, SRC_POS);
								bResult = FALSE;
								goto err;
							}
							if (zipFile)
							{
								bResult = DecompressZipToDir (
									Decompressed_Files[fileNo].fileContent,
									Decompressed_Files[fileNo].fileLength,
									szDir,
									CopyMessage,
									hwndDlg);
							}
							else
							{
								bResult = SaveBufferToFile (
									(char *) Decompressed_Files[fileNo].fileContent,
									szTmp,
									Decompressed_Files[fileNo].fileLength,
									FALSE,
									TRUE);
							}

							if (driver64)
							{
								if (!EnableWow64FsRedirection (TRUE))
								{
									handleWin32Error (hwndDlg, SRC_POS);
									bResult = FALSE;
									goto err;
								}

								if (!bResult)
									goto err;

							}

							break;
						}
					}
				}
				else
				{
					if (driver64)
						EnableWow64FsRedirection (FALSE);

					bResult = TCCopyFile (curFileName, szTmp);

					if (driver64)
						EnableWow64FsRedirection (TRUE);
				}

				if (bResult && wcscmp (szFiles[i], L"AVeraCrypt.exe") == 0)
				{
					if (Is64BitOs ())
						EnableWow64FsRedirection (FALSE);

					wstring servicePath = GetServiceConfigPath (_T(TC_APP_NAME) L".exe", false);
					wstring serviceLegacyPath = GetServiceConfigPath (_T(TC_APP_NAME) L".exe", true);
					wstring favoritesFile = GetServiceConfigPath (TC_APPD_FILENAME_SYSTEM_FAVORITE_VOLUMES, false);
					wstring favoritesLegacyFile = GetServiceConfigPath (TC_APPD_FILENAME_SYSTEM_FAVORITE_VOLUMES, true);

					if (bResult && Is64BitOs ()
						&& FileExists (favoritesLegacyFile.c_str())
						&& !FileExists (favoritesFile.c_str()))
					{
						// copy the favorites XML file to the native system directory
						bResult = CopyFile (favoritesLegacyFile.c_str(), favoritesFile.c_str(), FALSE);
					}

					if (bResult)
					{
						// Update the path of the service
						BootEncryption BootEncObj (hwndDlg);

						try
						{
							if (BootEncObj.GetDriverServiceStartType() == SERVICE_BOOT_START)
							{
								uint32 driverFlags = ReadDriverConfigurationFlags ();
								uint32 serviceFlags = BootEncObj.ReadServiceConfigurationFlags ();

								BootEncObj.UpdateSystemFavoritesService ();

								CopyMessage (hwndDlg, (wchar_t *) servicePath.c_str());

								// Tell the service not to update loader on stop
								BootEncObj.SetServiceConfigurationFlag (VC_SYSTEM_FAVORITES_SERVICE_CONFIG_DONT_UPDATE_LOADER, true);

								if (StartStopService (hwndDlg, TC_SYSTEM_FAVORITES_SERVICE_NAME, FALSE, 0, NULL))
								{
									// we tell the service not to load system favorites on startup
									LPCWSTR szArgs[2] = { TC_SYSTEM_FAVORITES_SERVICE_NAME, VC_SYSTEM_FAVORITES_SERVICE_ARG_SKIP_MOUNT};
									if (!CopyFile (szTmp, servicePath.c_str(), FALSE))
										ForceCopyFile (szTmp, servicePath.c_str());

									StartStopService (hwndDlg, TC_SYSTEM_FAVORITES_SERVICE_NAME, TRUE, 2, szArgs);
								}
								else
									ForceCopyFile (szTmp, servicePath.c_str());

								BootEncObj.SetDriverConfigurationFlag (driverFlags, true);

								// remove the service flag if it was set originally
								if (!(serviceFlags & VC_SYSTEM_FAVORITES_SERVICE_CONFIG_DONT_UPDATE_LOADER))
									BootEncObj.SetServiceConfigurationFlag (VC_SYSTEM_FAVORITES_SERVICE_CONFIG_DONT_UPDATE_LOADER, false);
							}
						}
						catch (...) {}
					}

					if (Is64BitOs ())
					{
						// delete files from legacy path
						if (FileExists (favoritesLegacyFile.c_str()))
						{
							RemoveMessage (hwndDlg, (wchar_t *) favoritesLegacyFile.c_str());
							ForceDeleteFile (favoritesLegacyFile.c_str());
						}

						if (FileExists (serviceLegacyPath.c_str()))
						{
							RemoveMessage (hwndDlg, (wchar_t *) serviceLegacyPath.c_str());
							ForceDeleteFile (serviceLegacyPath.c_str());
						}

						EnableWow64FsRedirection (TRUE);
					}
				}
			}
		}
		else
		{
			if (driver64)
				EnableWow64FsRedirection (FALSE);
			if (zipFile)
				bResult = StatRemoveDirectory (szTmp);
			else
				bResult = StatDeleteFile (szTmp, TRUE);
			if (driver64)
				EnableWow64FsRedirection (TRUE);

			if (bResult && wcscmp (szFiles[i], L"AVeraCrypt.exe") == 0)
			{
				if (Is64BitOs ())
					EnableWow64FsRedirection (FALSE);

				wstring servicePath = GetServiceConfigPath (_T(TC_APP_NAME) L".exe", false);
				wstring serviceLegacyPath = GetServiceConfigPath (_T(TC_APP_NAME) L".exe", true);
				wstring favoritesFile = GetServiceConfigPath (TC_APPD_FILENAME_SYSTEM_FAVORITE_VOLUMES, false);
				wstring favoritesLegacyFile = GetServiceConfigPath (TC_APPD_FILENAME_SYSTEM_FAVORITE_VOLUMES, true);

				// delete all files related to system favorites service
				if (FileExists (favoritesFile.c_str()))
				{
					RemoveMessage (hwndDlg, (wchar_t *) favoritesFile.c_str());
					ForceDeleteFile (favoritesFile.c_str());
				}

				if (FileExists (servicePath.c_str()))
				{
					RemoveMessage (hwndDlg, (wchar_t *) servicePath.c_str());
					ForceDeleteFile (servicePath.c_str());
				}

				if (Is64BitOs ())
				{
					if (FileExists (favoritesLegacyFile.c_str()))
					{
						RemoveMessage (hwndDlg, (wchar_t *) favoritesLegacyFile.c_str());
						ForceDeleteFile (favoritesLegacyFile.c_str());
					}

					if (FileExists (serviceLegacyPath.c_str()))
					{
						RemoveMessage (hwndDlg, (wchar_t *) serviceLegacyPath.c_str());
						ForceDeleteFile (serviceLegacyPath.c_str());
					}

					EnableWow64FsRedirection (TRUE);
				}
			}
		}

err:
		if (bResult == FALSE)
		{
			LPVOID lpMsgBuf;
			DWORD dwError = GetLastError ();
			wchar_t szTmp2[700];
			wchar_t szErrorValue[16];
			wchar_t* pszDesc;

			FormatMessage (
					      FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
					      NULL,
					      dwError,
				 MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT),	/* Default language */
					      (wchar_t *) &lpMsgBuf,
					      0,
					      NULL
				);

			if (lpMsgBuf)
				pszDesc = (wchar_t*) lpMsgBuf;
			else
			{
				StringCbPrintfW (szErrorValue, sizeof (szErrorValue), L"0x%.8X", dwError);
				pszDesc = szErrorValue;
			}

			if (bUninstall == FALSE)
				StringCbPrintfW (szTmp2, sizeof(szTmp2), GetString ("INSTALL_OF_FAILED"), szTmp, pszDesc);
			else
				StringCbPrintfW (szTmp2, sizeof(szTmp2), GetString ("UNINSTALL_OF_FAILED"), szTmp, pszDesc);

			if (lpMsgBuf) LocalFree (lpMsgBuf);

			if (!Silent && MessageBoxW (hwndDlg, szTmp2, lpszTitle, MB_YESNO | MB_ICONHAND) != IDYES)
				return FALSE;
		}
	}
	
	if (bUninstall == FALSE)
	{
		WIN32_FIND_DATA f;
		HANDLE h;

		SetCurrentDirectory (szDestDir);

		// remove PDF from previous version if any
		h = FindFirstFile (L"VeraCrypt User Guide*.pdf", &f);

		if (h != INVALID_HANDLE_VALUE)
		{
			do
			{
				StatDeleteFile (f.cFileName, TRUE);
			}
			while (FindNextFile(h, &f) != 0);

			FindClose (h);
		}

		// remove language XML files from previous version if any
		h = FindFirstFile (L"Language*.xml", &f);

		if (h != INVALID_HANDLE_VALUE)
		{
			do
			{
				StatDeleteFile (f.cFileName, TRUE);
			}
			while (FindNextFile(h, &f) != 0);

			FindClose (h);
		}
		
		// remvove legacy files that are not needed anymore
		for (i = 0; i < sizeof (szLegacyFiles) / sizeof (szLegacyFiles[0]); i++)
		{
			StatDeleteFile (szLegacyFiles [i], TRUE);
		}

		SetCurrentDirectory (SetupFilesDir);
	}

	return bOK;
}

#ifndef PORTABLE
BOOL DoRegInstall (HWND hwndDlg, wchar_t *szDestDir, BOOL bInstallType)
{
	wchar_t szDir[TC_MAX_PATH], *key;
	wchar_t szTmp[TC_MAX_PATH*4];
	HKEY hkey = 0;
	BOOL bSlash, bOK = FALSE;
	DWORD dw;
	int x;

	if (SystemEncryptionUpdate)
	{
		if (RegCreateKeyEx (HKEY_LOCAL_MACHINE, L"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\VeraCrypt",
			0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE | KEY_WOW64_32KEY, NULL, &hkey, &dw) == ERROR_SUCCESS)
		{
			StringCbCopyW (szTmp, sizeof(szTmp), _T(VERSION_STRING) _T(VERSION_STRING_SUFFIX));
			RegSetValueEx (hkey, L"DisplayVersion", 0, REG_SZ, (BYTE *) szTmp, (wcslen (szTmp) + 1) * sizeof (wchar_t));

			StringCbCopyW (szTmp, sizeof(szTmp), TC_HOMEPAGE);
			RegSetValueEx (hkey, L"URLInfoAbout", 0, REG_SZ, (BYTE *) szTmp, (wcslen (szTmp) + 1) * sizeof (wchar_t));

			RegCloseKey (hkey);
		}

		return TRUE;
	}

	StringCbCopyW (szDir, sizeof(szDir), szDestDir);
	x = wcslen (szDestDir);
	if (szDestDir[x - 1] == L'\\')
		bSlash = TRUE;
	else
		bSlash = FALSE;

	if (bSlash == FALSE)
		StringCbCatW (szDir, sizeof(szDir), L"\\");

	if (bInstallType)
	{

		key = L"Software\\Classes\\VeraCryptVolume";
		RegMessage (hwndDlg, key);
		if (RegCreateKeyEx (HKEY_LOCAL_MACHINE,
				    key,
				    0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hkey, &dw) != ERROR_SUCCESS)
			goto error;

		StringCbCopyW (szTmp, sizeof(szTmp), L"VeraCrypt Volume");
		if (RegSetValueEx (hkey, L"", 0, REG_SZ, (BYTE *) szTmp, (wcslen (szTmp) + 1) * sizeof (wchar_t)) != ERROR_SUCCESS)
			goto error;

		StringCbPrintfW (szTmp, sizeof(szTmp), L"%ws", TC_APPLICATION_ID);
		if (RegSetValueEx (hkey, L"AppUserModelID", 0, REG_SZ, (BYTE *) szTmp, (wcslen (szTmp) + 1) * sizeof (wchar_t)) != ERROR_SUCCESS)
			goto error;

		RegCloseKey (hkey);
		hkey = 0;

		key = L"Software\\Classes\\VeraCryptVolume\\DefaultIcon";
		RegMessage (hwndDlg, key);
		if (RegCreateKeyEx (HKEY_LOCAL_MACHINE,
				    key,
				    0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hkey, &dw) != ERROR_SUCCESS)
			goto error;

		StringCbPrintfW (szTmp, sizeof(szTmp), L"%sVeraCrypt.exe,1", szDir);
		if (RegSetValueEx (hkey, L"", 0, REG_SZ, (BYTE *) szTmp, (wcslen (szTmp) + 1) * sizeof (wchar_t)) != ERROR_SUCCESS)
			goto error;

		RegCloseKey (hkey);
		hkey = 0;

		key = L"Software\\Classes\\VeraCryptVolume\\Shell\\open\\command";
		RegMessage (hwndDlg, key);
		if (RegCreateKeyEx (HKEY_LOCAL_MACHINE,
				    key,
				    0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hkey, &dw) != ERROR_SUCCESS)
			goto error;

		StringCbPrintfW (szTmp, sizeof(szTmp), L"\"%sVeraCrypt.exe\" /v \"%%1\"", szDir );
		if (RegSetValueEx (hkey, L"", 0, REG_SZ, (BYTE *) szTmp, (wcslen (szTmp) + 1) * sizeof (wchar_t)) != ERROR_SUCCESS)
			goto error;

		RegCloseKey (hkey);
		hkey = 0;

		key = L"Software\\Classes\\.hc";
		BOOL typeClassChanged = TRUE;
		wchar_t typeClass[256];
		DWORD typeClassSize = sizeof (typeClass);

		if (ReadLocalMachineRegistryString (key, L"", typeClass, &typeClassSize) && typeClassSize > 0 && wcscmp (typeClass, L"VeraCryptVolume") == 0)
			typeClassChanged = FALSE;

		RegMessage (hwndDlg, key);
		if (RegCreateKeyEx (HKEY_LOCAL_MACHINE,
				    key,
				    0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hkey, &dw) != ERROR_SUCCESS)
			goto error;

		StringCbCopyW (szTmp, sizeof(szTmp), L"VeraCryptVolume");
		if (RegSetValueEx (hkey, L"", 0, REG_SZ, (BYTE *) szTmp, (wcslen (szTmp) + 1) * sizeof (wchar_t)) != ERROR_SUCCESS)
			goto error;

		RegCloseKey (hkey);
		hkey = 0;

		if (typeClassChanged)
			SHChangeNotify (SHCNE_ASSOCCHANGED, SHCNF_IDLIST, NULL, NULL);
	}

	key = L"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\VeraCrypt";
	RegMessage (hwndDlg, key);
	if (RegCreateKeyEx (HKEY_LOCAL_MACHINE,
		key,
		0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE | KEY_WOW64_32KEY, NULL, &hkey, &dw) != ERROR_SUCCESS)
		goto error;

	/* IMPORTANT: IF YOU CHANGE THIS IN ANY WAY, REVISE AND UPDATE SetInstallationPath() ACCORDINGLY! */
	StringCbPrintfW (szTmp, sizeof(szTmp), L"\"%sVeraCrypt Setup.exe\" /u", szDir);
	if (RegSetValueEx (hkey, L"UninstallString", 0, REG_SZ, (BYTE *) szTmp, (wcslen (szTmp) + 1) * sizeof (wchar_t)) != ERROR_SUCCESS)
		goto error;

	StringCbPrintfW (szTmp, sizeof(szTmp), L"\"%sVeraCrypt Setup.exe\" /c", szDir);
	if (RegSetValueEx (hkey, L"ModifyPath", 0, REG_SZ, (BYTE *) szTmp, (wcslen (szTmp) + 1) * sizeof (wchar_t)) != ERROR_SUCCESS)
		goto error;

	StringCbPrintfW (szTmp, sizeof(szTmp), L"\"%sVeraCrypt Setup.exe\"", szDir);
	if (RegSetValueEx (hkey, L"DisplayIcon", 0, REG_SZ, (BYTE *) szTmp, (wcslen (szTmp) + 1) * sizeof (wchar_t)) != ERROR_SUCCESS)
		goto error;

	StringCbCopyW (szTmp, sizeof(szTmp), _T(VERSION_STRING) _T(VERSION_STRING_SUFFIX));
	if (RegSetValueEx (hkey, L"DisplayVersion", 0, REG_SZ, (BYTE *) szTmp, (wcslen (szTmp) + 1) * sizeof (wchar_t)) != ERROR_SUCCESS)
		goto error;

	StringCbCopyW (szTmp, sizeof(szTmp), L"VeraCrypt");
	if (RegSetValueEx (hkey, L"DisplayName", 0, REG_SZ, (BYTE *) szTmp, (wcslen (szTmp) + 1) * sizeof (wchar_t)) != ERROR_SUCCESS)
		goto error;

	StringCbCopyW (szTmp, sizeof(szTmp), L"IDRIX");
	if (RegSetValueEx (hkey, L"Publisher", 0, REG_SZ, (BYTE *) szTmp, (wcslen (szTmp) + 1) * sizeof (wchar_t)) != ERROR_SUCCESS)
		goto error;

	StringCbCopyW (szTmp, sizeof(szTmp), TC_HOMEPAGE);
	if (RegSetValueEx (hkey, L"URLInfoAbout", 0, REG_SZ, (BYTE *) szTmp, (wcslen (szTmp) + 1) * sizeof (wchar_t)) != ERROR_SUCCESS)
		goto error;

	bOK = TRUE;

error:
	if (hkey != 0)
		RegCloseKey (hkey);

	if (bOK == FALSE)
	{
		handleWin32Error (hwndDlg, SRC_POS);
		Error ("REG_INSTALL_FAILED", hwndDlg);
	}

	// Register COM servers for UAC
	if (IsOSAtLeast (WIN_VISTA))
	{
		if (!RegisterComServers (szDir))
		{
			Error ("COM_REG_FAILED", hwndDlg);
			return FALSE;
		}
	}

	return bOK;
}

BOOL DoApplicationDataUninstall (HWND hwndDlg)
{
	wchar_t path[MAX_PATH];
	wchar_t path2[MAX_PATH];
	BOOL bOK = TRUE;

	StatusMessage (hwndDlg, "REMOVING_APPDATA");

	SHGetFolderPath (NULL, CSIDL_APPDATA, NULL, 0, path);
	StringCbCatW (path, sizeof(path), L"\\VeraCrypt\\");

	// Delete favorite volumes file
	StringCbPrintfW (path2, sizeof(path2), L"%s%s", path, TC_APPD_FILENAME_FAVORITE_VOLUMES);
	RemoveMessage (hwndDlg, path2);
	StatDeleteFile (path2, FALSE);

	// Delete keyfile defaults
	StringCbPrintfW (path2, sizeof(path2), L"%s%s", path, TC_APPD_FILENAME_DEFAULT_KEYFILES);
	RemoveMessage (hwndDlg, path2);
	StatDeleteFile (path2, FALSE);

	// Delete history file
	StringCbPrintfW (path2, sizeof(path2), L"%s%s", path, TC_APPD_FILENAME_HISTORY);
	RemoveMessage (hwndDlg, path2);
	StatDeleteFile (path2, FALSE);

	// Delete configuration file
	StringCbPrintfW (path2, sizeof(path2), L"%s%s", path, TC_APPD_FILENAME_CONFIGURATION);
	RemoveMessage (hwndDlg, path2);
	StatDeleteFile (path2, FALSE);

	// Delete system encryption configuration file
	StringCbPrintfW (path2, sizeof(path2), L"%s%s", path, TC_APPD_FILENAME_SYSTEM_ENCRYPTION);
	RemoveMessage (hwndDlg, path2);
	StatDeleteFile (path2, FALSE);

	SHGetFolderPath (NULL, CSIDL_APPDATA, NULL, 0, path);
	StringCbCatW (path, sizeof(path), L"\\VeraCrypt");
	RemoveMessage (hwndDlg, path);
	if (!StatRemoveDirectory (path))
	{
		handleWin32Error (hwndDlg, SRC_POS);
		bOK = FALSE;
	}

	// remove VeraCrypt under common appdata
	if (SUCCEEDED (SHGetFolderPath (NULL, CSIDL_COMMON_APPDATA | CSIDL_FLAG_CREATE, NULL, 0, path)))
	{
		StringCbCatW (path, sizeof(path), L"\\VeraCrypt");

		// Delete original bootloader
		StringCbPrintfW (path2, sizeof(path2), L"%s\\%s", path, TC_SYS_BOOT_LOADER_BACKUP_NAME);
		RemoveMessage (hwndDlg, path2);
		StatDeleteFile (path2, FALSE);

		// remove VeraCrypt folder
		RemoveMessage (hwndDlg, path);
		StatRemoveDirectory (path);
	}


	return bOK;
}

BOOL DoRegUninstall (HWND hwndDlg, BOOL bRemoveDeprecated)
{
	wchar_t regk [64];
	typedef LSTATUS (WINAPI *RegDeleteKeyExWFn) (HKEY hKey,LPCWSTR lpSubKey,REGSAM samDesired,WORD Reserved);
	RegDeleteKeyExWFn RegDeleteKeyExWPtr = NULL;
	HMODULE hAdvapiDll = LoadLibrary (L"Advapi32.dll");
	if (hAdvapiDll)
	{
		RegDeleteKeyExWPtr = (RegDeleteKeyExWFn) GetProcAddress(hAdvapiDll, "RegDeleteKeyExW");
	}

	// Unregister COM servers
	if (!bRemoveDeprecated && IsOSAtLeast (WIN_VISTA))
	{
		if (!UnregisterComServers (InstallationPath))
			StatusMessage (hwndDlg, "COM_DEREG_FAILED");
	}

	if (!bRemoveDeprecated)
		StatusMessage (hwndDlg, "REMOVING_REG");

	if (RegDeleteKeyExWPtr)
	{
		RegDeleteKeyExWPtr (HKEY_LOCAL_MACHINE, L"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\VeraCrypt", KEY_WOW64_32KEY, 0);
		RegDeleteKeyExWPtr (HKEY_CURRENT_USER, L"Software\\VeraCrypt", KEY_WOW64_32KEY, 0);
	}
	else
	{
		RegDeleteKey (HKEY_LOCAL_MACHINE, L"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\VeraCrypt");
		RegDeleteKey (HKEY_LOCAL_MACHINE, L"Software\\VeraCrypt");
	}
	RegDeleteKey (HKEY_LOCAL_MACHINE, L"Software\\Classes\\VeraCryptVolume\\Shell\\open\\command");
	RegDeleteKey (HKEY_LOCAL_MACHINE, L"Software\\Classes\\VeraCryptVolume\\Shell\\open");
	RegDeleteKey (HKEY_LOCAL_MACHINE, L"Software\\Classes\\VeraCryptVolume\\Shell");
	RegDeleteKey (HKEY_LOCAL_MACHINE, L"Software\\Classes\\VeraCryptVolume\\DefaultIcon");
	RegDeleteKey (HKEY_LOCAL_MACHINE, L"Software\\Classes\\VeraCryptVolume");

	if (!bRemoveDeprecated)
	{
		HKEY hKey;
		GetStartupRegKeyName (regk, sizeof(regk));
		DeleteRegistryValue (regk, L"VeraCrypt");

		DeleteRegistryKey (HKEY_LOCAL_MACHINE, L"Software\\Classes\\.hc");

		// enable the SE_TAKE_OWNERSHIP_NAME privilege for this operation
		SetPrivilege (SE_TAKE_OWNERSHIP_NAME, TRUE);

		// clean MuiCache list from VeraCrypt entries
		SearchAndDeleteRegistrySubString (HKEY_CLASSES_ROOT, L"Local Settings\\Software\\Microsoft\\Windows\\Shell\\MuiCache", L"VeraCrypt", FALSE, NULL);

		// clean other VeraCrypt entries from all users
		SearchAndDeleteRegistrySubString (HKEY_USERS, L"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\FileExts\\.hc", NULL, TRUE, NULL);
		SearchAndDeleteRegistrySubString (HKEY_USERS, L"Software\\Microsoft\\Windows NT\\CurrentVersion\\AppCompatFlags\\Compatibility Assistant\\Persisted", L"VeraCrypt", TRUE, NULL);
		SearchAndDeleteRegistrySubString (HKEY_USERS, L"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\StartPage\\NewShortcuts", L"VeraCrypt", TRUE, NULL);

		if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, L"SYSTEM", 0, KEY_ALL_ACCESS | WRITE_DAC | WRITE_OWNER, &hKey) == ERROR_SUCCESS)
		{
			SearchAndDeleteRegistrySubString (hKey, L"Enum\\Root\\LEGACY_VERACRYPT", NULL, TRUE, L"ControlSet");
			SearchAndDeleteRegistrySubString (hKey, L"services\\veracrypt", NULL, TRUE, L"ControlSet");
			RegCloseKey(hKey);
		}

		// disable the SE_TAKE_OWNERSHIP_NAME privilege for this operation
		SetPrivilege (SE_TAKE_OWNERSHIP_NAME, FALSE);

		SHChangeNotify (SHCNE_ASSOCCHANGED, SHCNF_IDLIST, NULL, NULL);
	}

	if (hAdvapiDll)
		FreeLibrary (hAdvapiDll);

	return TRUE;
}


BOOL DoServiceUninstall (HWND hwndDlg, wchar_t *lpszService)
{
	SC_HANDLE hManager, hService = NULL;
	BOOL bOK = FALSE, bRet;
	SERVICE_STATUS status;
	BOOL firstTry = TRUE;
	int x;

	memset (&status, 0, sizeof (status));	/* Keep VC6 quiet */

retry:

	hManager = OpenSCManager (NULL, NULL, SC_MANAGER_ALL_ACCESS);
	if (hManager == NULL)
		goto error;

	hService = OpenService (hManager, lpszService, SERVICE_ALL_ACCESS);
	if (hService == NULL)
		goto error;

	if (wcscmp (L"veracrypt", lpszService) == 0)
	{
		try
		{
			BootEncryption bootEnc (hwndDlg);
			if (bootEnc.GetDriverServiceStartType() == SERVICE_BOOT_START)
			{
				try { bootEnc.RegisterFilterDriver (false, BootEncryption::DriveFilter); } catch (...) { }
				try { bootEnc.RegisterFilterDriver (false, BootEncryption::VolumeFilter); } catch (...) { }
				try { bootEnc.RegisterFilterDriver (false, BootEncryption::DumpFilter); } catch (...) { }
			}
		}
		catch (...) { }

		StatusMessage (hwndDlg, "STOPPING_DRIVER");
	}
	else
		StatusMessageParam (hwndDlg, "STOPPING", lpszService);

	for (x = 0; x < WAIT_PERIOD; x++)
	{
		bRet = QueryServiceStatus (hService, &status);
		if (bRet != TRUE)
			goto error;

		if (status.dwCurrentState != SERVICE_START_PENDING &&
		    status.dwCurrentState != SERVICE_STOP_PENDING &&
		    status.dwCurrentState != SERVICE_CONTINUE_PENDING)
			break;

		Sleep (1000);
	}

	if (status.dwCurrentState != SERVICE_STOPPED)
	{
		bRet = ControlService (hService, SERVICE_CONTROL_STOP, &status);
		if (bRet == FALSE)
			goto try_delete;

		for (x = 0; x < WAIT_PERIOD; x++)
		{
			bRet = QueryServiceStatus (hService, &status);
			if (bRet != TRUE)
				goto error;

			if (status.dwCurrentState != SERVICE_START_PENDING &&
			    status.dwCurrentState != SERVICE_STOP_PENDING &&
			  status.dwCurrentState != SERVICE_CONTINUE_PENDING)
				break;

			Sleep (1000);
		}

		if (status.dwCurrentState != SERVICE_STOPPED && status.dwCurrentState != SERVICE_STOP_PENDING)
			goto error;
	}

try_delete:

	if (wcscmp (L"veracrypt", lpszService) == 0)
		StatusMessage (hwndDlg, "REMOVING_DRIVER");
	else
		StatusMessageParam (hwndDlg, "REMOVING", lpszService);

	if (hService != NULL)
	{
		CloseServiceHandle (hService);
		hService = NULL;
	}

	if (hManager != NULL)
	{
		CloseServiceHandle (hManager);
		hManager = NULL;
	}

	hManager = OpenSCManager (NULL, NULL, SC_MANAGER_ALL_ACCESS);
	if (hManager == NULL)
		goto error;

	hService = OpenService (hManager, lpszService, SERVICE_ALL_ACCESS);
	if (hService == NULL)
		goto error;

	bRet = DeleteService (hService);
	if (bRet == FALSE)
	{
		if (firstTry && GetLastError () == ERROR_SERVICE_MARKED_FOR_DELETE)
		{
			// Second try for an eventual no-install driver instance
			CloseServiceHandle (hService);
			CloseServiceHandle (hManager);
			hService = NULL;
			hManager = NULL;

			Sleep(1000);
			firstTry = FALSE;
			goto retry;
		}

		goto error;
	}

	bOK = TRUE;

error:

	if (bOK == FALSE && GetLastError ()!= ERROR_SERVICE_DOES_NOT_EXIST)
	{
		handleWin32Error (hwndDlg, SRC_POS);
		MessageBoxW (hwndDlg, GetString ("DRIVER_UINSTALL_FAILED"), lpszTitle, MB_ICONHAND);
	}
	else
		bOK = TRUE;

	if (hService != NULL)
		CloseServiceHandle (hService);

	if (hManager != NULL)
		CloseServiceHandle (hManager);

	return bOK;
}


BOOL DoDriverUnload (HWND hwndDlg)
{
	BOOL bOK = TRUE;
	int status;

	status = DriverAttach ();
	if (status != 0)
	{
		if (status == ERR_OS_ERROR && GetLastError () != ERROR_FILE_NOT_FOUND)
		{
			handleWin32Error (hwndDlg, SRC_POS);
			AbortProcess ("NODRIVER");
		}

		if (status != ERR_OS_ERROR)
		{
			handleError (NULL, status, SRC_POS);
			AbortProcess ("NODRIVER");
		}
	}

	if (hDriver != INVALID_HANDLE_VALUE)
	{
		MOUNT_LIST_STRUCT driver;
		LONG driverVersion = VERSION_NUM;
		int refCount;
		DWORD dwResult;
		BOOL bResult;

		// Try to determine if it's upgrade (and not reinstall, downgrade, or first-time install).
		DetermineUpgradeDowngradeStatus (FALSE, &driverVersion);

		// Test for encrypted boot drive
		try
		{
			BootEncryption bootEnc (hwndDlg);
			if (bootEnc.GetDriverServiceStartType() == SERVICE_BOOT_START)
			{
				try
				{
					// Check hidden OS update consistency
					if (IsHiddenOSRunning())
					{
						if (bootEnc.GetInstalledBootLoaderVersion() != VERSION_NUM)
						{
							if (AskWarnNoYes ("UPDATE_TC_IN_DECOY_OS_FIRST", hwndDlg) == IDNO)
								AbortProcessSilent ();
						}
					}
				}
				catch (...) { }

				if (bUninstallInProgress && !bootEnc.GetStatus().DriveMounted)
				{
					try { bootEnc.RegisterFilterDriver (false, BootEncryption::DriveFilter); } catch (...) { }
					try { bootEnc.RegisterFilterDriver (false, BootEncryption::VolumeFilter); } catch (...) { }
					try { bootEnc.RegisterFilterDriver (false, BootEncryption::DumpFilter); } catch (...) { }
					bootEnc.SetDriverServiceStartType (SERVICE_SYSTEM_START);
				}
				else if (bUninstallInProgress || bDowngrade)
				{
					Error (bDowngrade ? "SETUP_FAILED_BOOT_DRIVE_ENCRYPTED_DOWNGRADE" : "SETUP_FAILED_BOOT_DRIVE_ENCRYPTED", hwndDlg);
					return FALSE;
				}
				else
				{
					if (CurrentOSMajor == 6 && CurrentOSMinor == 0 && CurrentOSServicePack < 1)
						AbortProcess ("SYS_ENCRYPTION_UPGRADE_UNSUPPORTED_ON_VISTA_SP0");

					SystemEncryptionUpdate = TRUE;
					PortableMode = FALSE;
				}
			}
		}
		catch (...)	{ }

		if (!bUninstall
			&& (bUpgrade || SystemEncryptionUpdate)
			&& (!bDevm || SystemEncryptionUpdate))
		{
			UnloadDriver = FALSE;
		}

		if (PortableMode && !SystemEncryptionUpdate)
			UnloadDriver = TRUE;

		if (UnloadDriver)
		{
			int volumesMounted = 0;

			// Check mounted volumes
			bResult = DeviceIoControl (hDriver, TC_IOCTL_IS_ANY_VOLUME_MOUNTED, NULL, 0, &volumesMounted, sizeof (volumesMounted), &dwResult, NULL);

			if (!bResult)
			{
				bResult = DeviceIoControl (hDriver, TC_IOCTL_LEGACY_GET_MOUNTED_VOLUMES, NULL, 0, &driver, sizeof (driver), &dwResult, NULL);
				if (bResult)
					volumesMounted = driver.ulMountedDrives;
			}

			if (bResult)
			{
				if (volumesMounted != 0)
				{
					bOK = FALSE;
					MessageBoxW (hwndDlg, GetString ("DISMOUNT_ALL_FIRST"), lpszTitle, MB_ICONHAND);
				}
			}
			else
			{
				bOK = FALSE;
				handleWin32Error (hwndDlg, SRC_POS);
			}
		}

		// Try to close all open TC windows
		if (bOK)
		{
			BOOL TCWindowClosed = FALSE;

			EnumWindows (CloseTCWindowsEnum, (LPARAM) &TCWindowClosed);

			if (TCWindowClosed)
				Sleep (2000);
		}

		// Test for any applications attached to driver
		if (!bUpgrade)
		{
			bResult = DeviceIoControl (hDriver, TC_IOCTL_GET_DEVICE_REFCOUNT, &refCount, sizeof (refCount), &refCount,
				sizeof (refCount), &dwResult, NULL);

			if (bOK && bResult && refCount > 1)
			{
				MessageBoxW (hwndDlg, GetString ("CLOSE_TC_FIRST"), lpszTitle, MB_ICONSTOP);
				bOK = FALSE;
			}
		}

		if (!bOK || UnloadDriver)
		{
			CloseHandle (hDriver);
			hDriver = INVALID_HANDLE_VALUE;
		}
	}
	else
	{
		// Note that the driver may have already been unloaded during this session (e.g. retry after an error, etc.) so it is not
		// guaranteed that the user is installing VeraCrypt for the first time now (we also cannot know if the user has already
		// installed and used VeraCrypt on another system before).
		bPossiblyFirstTimeInstall = TRUE;
	}

	return bOK;
}


BOOL UpgradeBootLoader (HWND hwndDlg)
{
	if (!SystemEncryptionUpdate)
		return TRUE;

	try
	{
		BootEncryption bootEnc (hwndDlg);
		uint64 bootLoaderVersion = bootEnc.GetInstalledBootLoaderVersion();
		if ((bootLoaderVersion < VERSION_NUM) || (bReinstallMode && (bootLoaderVersion == VERSION_NUM)))
		{
			StatusMessage (hwndDlg, "INSTALLER_UPDATING_BOOT_LOADER");

			bootEnc.InstallBootLoader (true);

			if (bootEnc.GetInstalledBootLoaderVersion() <= TC_RESCUE_DISK_UPGRADE_NOTICE_MAX_VERSION)
			{
				bUpdateRescueDisk = TRUE;
				Info (IsHiddenOSRunning() ? "BOOT_LOADER_UPGRADE_OK_HIDDEN_OS" : "BOOT_LOADER_UPGRADE_OK", hwndDlg);
			}
		}
		return TRUE;
	}
	catch (Exception &e)
	{
		e.Show (hwndDlg);
	}
	catch (...) { }

	Error ("BOOT_LOADER_UPGRADE_FAILED", hwndDlg);
	return FALSE;
}


BOOL DoShortcutsUninstall (HWND hwndDlg, wchar_t *szDestDir)
{
	wchar_t szLinkDir[TC_MAX_PATH];
	wchar_t szTmp2[TC_MAX_PATH];
	BOOL bSlash, bOK = FALSE;
	HRESULT hOle;
	int x;
	BOOL allUsers = FALSE;

	hOle = OleInitialize (NULL);

	// User start menu
    SHGetSpecialFolderPath (hwndDlg, szLinkDir, CSIDL_PROGRAMS, 0);
	x = wcslen (szLinkDir);
	if (szLinkDir[x - 1] == L'\\')
		bSlash = TRUE;
	else
		bSlash = FALSE;

	if (bSlash == FALSE)
		StringCbCatW (szLinkDir, sizeof(szLinkDir), L"\\");

	StringCbCatW (szLinkDir, sizeof(szLinkDir), L"VeraCrypt");

	// Global start menu
	{
		struct _stat st;
		wchar_t path[TC_MAX_PATH];

		SHGetSpecialFolderPath (hwndDlg, path, CSIDL_COMMON_PROGRAMS, 0);
		StringCbCatW (path, sizeof(path), L"\\VeraCrypt");

		if (_wstat (path, &st) == 0)
		{
			StringCbCopyW (szLinkDir, sizeof(szLinkDir), path);
			allUsers = TRUE;
		}
	}

	// Start menu entries
	StringCbPrintfW (szTmp2, sizeof(szTmp2), L"%s%s", szLinkDir, L"\\VeraCrypt.lnk");
	RemoveMessage (hwndDlg, szTmp2);
	if (StatDeleteFile (szTmp2, FALSE) == FALSE)
		goto error;

	StringCbPrintfW (szTmp2, sizeof(szTmp2), L"%s%s", szLinkDir, L"\\VeraCryptExpander.lnk");
	RemoveMessage (hwndDlg, szTmp2);
	if (StatDeleteFile (szTmp2, FALSE) == FALSE)
		goto error;

	StringCbPrintfW (szTmp2, sizeof(szTmp2), L"%s%s", szLinkDir, L"\\VeraCrypt Website.url");
	RemoveMessage (hwndDlg, szTmp2);
	if (StatDeleteFile (szTmp2, FALSE) == FALSE)
		goto error;

	StringCbPrintfW (szTmp2, sizeof(szTmp2), L"%s%s", szLinkDir, L"\\VeraCrypt User's Guide.lnk");
	StatDeleteFile (szTmp2, FALSE);

	// Start menu group
	RemoveMessage ((HWND) hwndDlg, szLinkDir);
	if (StatRemoveDirectory (szLinkDir) == FALSE)
		handleWin32Error ((HWND) hwndDlg, SRC_POS);

	// Desktop icon

	if (allUsers)
		SHGetSpecialFolderPath (hwndDlg, szLinkDir, CSIDL_COMMON_DESKTOPDIRECTORY, 0);
	else
		SHGetSpecialFolderPath (hwndDlg, szLinkDir, CSIDL_DESKTOPDIRECTORY, 0);

	StringCbPrintfW (szTmp2, sizeof(szTmp2), L"%s%s", szLinkDir, L"\\VeraCrypt.lnk");

	RemoveMessage (hwndDlg, szTmp2);
	if (StatDeleteFile (szTmp2, FALSE) == FALSE)
		goto error;

	bOK = TRUE;

error:
	OleUninitialize ();

	return bOK;
}

BOOL DoShortcutsInstall (HWND hwndDlg, wchar_t *szDestDir, BOOL bProgGroup, BOOL bDesktopIcon)
{
	wchar_t szLinkDir[TC_MAX_PATH], szDir[TC_MAX_PATH];
	wchar_t szTmp[TC_MAX_PATH], szTmp2[TC_MAX_PATH];
	BOOL bSlash, bOK = FALSE;
	HRESULT hOle;
	int x;

	if (bProgGroup == FALSE && bDesktopIcon == FALSE)
		return TRUE;

	hOle = OleInitialize (NULL);

	GetProgramPath (hwndDlg, szLinkDir);

	x = wcslen (szLinkDir);
	if (szLinkDir[x - 1] == L'\\')
		bSlash = TRUE;
	else
		bSlash = FALSE;

	if (bSlash == FALSE)
		StringCbCatW (szLinkDir, sizeof(szLinkDir), L"\\");

	StringCbCatW (szLinkDir, sizeof(szLinkDir), L"VeraCrypt");

	StringCbCopyW (szDir, sizeof(szDir), szDestDir);
	x = wcslen (szDestDir);
	if (szDestDir[x - 1] == L'\\')
		bSlash = TRUE;
	else
		bSlash = FALSE;

	if (bSlash == FALSE)
		StringCbCatW (szDir, sizeof(szDir), L"\\");

	if (bProgGroup)
	{
		FILE *f;

		if (mkfulldir (szLinkDir, TRUE) != 0)
		{
			if (mkfulldir (szLinkDir, FALSE) != 0)
			{
				wchar_t szTmpW[TC_MAX_PATH];

				handleWin32Error (hwndDlg, SRC_POS);
				StringCbPrintfW (szTmpW, sizeof(szTmpW), GetString ("CANT_CREATE_FOLDER"), szLinkDir);
				MessageBoxW (hwndDlg, szTmpW, lpszTitle, MB_ICONHAND);
				goto error;
			}
		}

		StringCbPrintfW (szTmp, sizeof(szTmp), L"%s%s", szDir, L"VeraCrypt.exe");
		StringCbPrintfW (szTmp2, sizeof(szTmp2), L"%s%s", szLinkDir, L"\\VeraCrypt.lnk");

		IconMessage (hwndDlg, szTmp2);
		if (CreateLink (szTmp, L"", szTmp2, NULL, -1) != S_OK)
			goto error;

		StringCbPrintfW (szTmp, sizeof(szTmp), L"%s%s", szDir, L"VeraCryptExpander.exe");
		StringCbPrintfW (szTmp2, sizeof(szTmp2), L"%s%s", szLinkDir, L"\\VeraCryptExpander.lnk");

		IconMessage (hwndDlg, szTmp2);
		if (CreateLink (szTmp, L"", szTmp2, NULL, -1) != S_OK)
			goto error;

		StringCbPrintfW (szTmp2, sizeof(szTmp2), L"%s%s", szLinkDir, L"\\VeraCrypt Website.url");
		IconMessage (hwndDlg, szTmp2);
		f = _wfopen (szTmp2, L"w");
		if (f)
		{
			fwprintf (f, L"[InternetShortcut]\nURL=%s\n", TC_APPLINK);

			CheckFileStreamWriteErrors (hwndDlg, f, szTmp2);
			fclose (f);
		}
		else
			goto error;

		StringCbPrintfW (szTmp2, sizeof(szTmp2), L"%s%s", szLinkDir, L"\\Uninstall VeraCrypt.lnk");
		StatDeleteFile (szTmp2, FALSE);

		StringCbPrintfW (szTmp2, sizeof(szTmp2), L"%s%s", szLinkDir, L"\\VeraCrypt User's Guide.lnk");
		StatDeleteFile (szTmp2, FALSE);
	}

	if (bDesktopIcon)
	{
		StringCbCopyW (szDir, sizeof(szDir), szDestDir);
		x = wcslen (szDestDir);
		if (szDestDir[x - 1] == L'\\')
			bSlash = TRUE;
		else
			bSlash = FALSE;

		if (bSlash == FALSE)
			StringCbCatW (szDir, sizeof(szDir), L"\\");

		if (bForAllUsers)
			SHGetSpecialFolderPath (hwndDlg, szLinkDir, CSIDL_COMMON_DESKTOPDIRECTORY, 0);
		else
			SHGetSpecialFolderPath (hwndDlg, szLinkDir, CSIDL_DESKTOPDIRECTORY, 0);

		StringCbPrintfW (szTmp, sizeof(szTmp), L"%s%s", szDir, L"VeraCrypt.exe");
		StringCbPrintfW (szTmp2, sizeof(szTmp2), L"%s%s", szLinkDir, L"\\VeraCrypt.lnk");

		IconMessage (hwndDlg, szTmp2);

		if (CreateLink (szTmp, L"", szTmp2, NULL, -1) != S_OK)
			goto error;
	}

	bOK = TRUE;

error:
	OleUninitialize ();

	return bOK;
}


void OutcomePrompt (HWND hwndDlg, BOOL bOK)
{
	if (bOK)
	{
		EnableWindow (GetDlgItem ((HWND) hwndDlg, IDCANCEL), FALSE);

		bDone = TRUE;

		if (bUninstall == FALSE)
		{
			if (bDevm)
				PostMessage (MainDlg, WM_CLOSE, 0, 0);
			else if (bPossiblyFirstTimeInstall || bRepairMode || (!bUpgrade && !bDowngrade))
				Info ("INSTALL_OK", hwndDlg);
			else
				Info ("SETUP_UPDATE_OK", hwndDlg);
		}
		else
		{
			wchar_t str[4096];

			StringCbPrintfW (str, sizeof(str), GetString ("UNINSTALL_OK"), InstallationPath);
			MessageBoxW (hwndDlg, str, lpszTitle, MB_ICONASTERISK);
		}
	}
	else
	{
		if (bUninstall == FALSE)
			Error ("INSTALL_FAILED", hwndDlg);
		else
			Error ("UNINSTALL_FAILED", hwndDlg);
	}
}

static void SetSystemRestorePoint (HWND hwndDlg, BOOL finalize)
{
	static RESTOREPOINTINFO RestPtInfo;
	static STATEMGRSTATUS SMgrStatus;
	static BOOL failed = FALSE;
	static BOOL (__stdcall *_SRSetRestorePoint)(PRESTOREPOINTINFO, PSTATEMGRSTATUS);

	if (!SystemRestoreDll) return;

	_SRSetRestorePoint = (BOOL (__stdcall *)(PRESTOREPOINTINFO, PSTATEMGRSTATUS))GetProcAddress (SystemRestoreDll,"SRSetRestorePointW");
	if (_SRSetRestorePoint == 0)
	{
		FreeLibrary (SystemRestoreDll);
		SystemRestoreDll = 0;
		return;
	}

	if (!finalize)
	{
		StatusMessage (hwndDlg, "CREATING_SYS_RESTORE");

		RestPtInfo.dwEventType = BEGIN_SYSTEM_CHANGE;
		RestPtInfo.dwRestorePtType = bUninstall ? APPLICATION_UNINSTALL : APPLICATION_INSTALL | DEVICE_DRIVER_INSTALL;
		RestPtInfo.llSequenceNumber = 0;
		StringCbCopyW (RestPtInfo.szDescription, sizeof(RestPtInfo.szDescription), bUninstall ? L"VeraCrypt uninstallation" : L"VeraCrypt installation");

		if(!_SRSetRestorePoint (&RestPtInfo, &SMgrStatus))
		{
			StatusMessage (hwndDlg, "FAILED_SYS_RESTORE");
			failed = TRUE;
		}
	}
	else if (!failed)
	{
		RestPtInfo.dwEventType = END_SYSTEM_CHANGE;
		RestPtInfo.llSequenceNumber = SMgrStatus.llSequenceNumber;

		if(!_SRSetRestorePoint(&RestPtInfo, &SMgrStatus))
		{
			StatusMessage (hwndDlg, "FAILED_SYS_RESTORE");
		}
	}
}

void DoUninstall (void *arg)
{
	HWND hwndDlg = (HWND) arg;
	BOOL bOK = TRUE;
	BOOL bTempSkipSysRestore = FALSE;

	if (!Rollback)
		EnableWindow (GetDlgItem ((HWND) hwndDlg, IDC_UNINSTALL), FALSE);

	WaitCursor ();

	if (!Rollback)
	{
		ClearLogWindow (hwndDlg);
	}

	if (DoDriverUnload (hwndDlg) == FALSE)
	{
		bOK = FALSE;
		bTempSkipSysRestore = TRUE;		// Volumes are possibly mounted; defer System Restore point creation for this uninstall attempt.
	}
	else
	{
		if (!Rollback && bSystemRestore && !bTempSkipSysRestore)
			SetSystemRestorePoint (hwndDlg, FALSE);

		if (DoServiceUninstall (hwndDlg, L"veracrypt") == FALSE)
		{
			bOK = FALSE;
		}
		else if (DoRegUninstall ((HWND) hwndDlg, FALSE) == FALSE)
		{
			bOK = FALSE;
		}
		else if (DoFilesInstall ((HWND) hwndDlg, InstallationPath) == FALSE)
		{
			bOK = FALSE;
		}
		else if (DoShortcutsUninstall (hwndDlg, InstallationPath) == FALSE)
		{
			bOK = FALSE;
		}
		else if (!DoApplicationDataUninstall (hwndDlg))
		{
			bOK = FALSE;
		}
		else
		{
			wchar_t temp[MAX_PATH];
			FILE *f;

			// Deprecated service
			DoServiceUninstall (hwndDlg, L"VeraCryptService");

			GetTempPath (ARRAYSIZE (temp), temp);
			StringCbPrintfW (UninstallBatch, sizeof (UninstallBatch), L"%sVeraCrypt-Uninstall.bat", temp);

			UninstallBatch [ARRAYSIZE(UninstallBatch)-1] = 0;

			// Create uninstall batch
			f = _wfopen (UninstallBatch, L"w");
			if (!f)
				bOK = FALSE;
			else
			{
				fwprintf (f,L":loop\n"
					L"del \"%s%s\"\n"
					L"if exist \"%s%s\" goto loop\n"
					L"rmdir \"%s\"\n"
					L"del \"%s\"",
					InstallationPath, L"VeraCrypt Setup.exe",
					InstallationPath, L"VeraCrypt Setup.exe",
					InstallationPath,
					UninstallBatch
					);

				CheckFileStreamWriteErrors (hwndDlg, f, UninstallBatch);
				fclose (f);
			}
		}
	}

	NormalCursor ();

	if (Rollback)
		return;

	if (bSystemRestore && !bTempSkipSysRestore)
		SetSystemRestorePoint (hwndDlg, TRUE);

	if (bOK)
		PostMessage (hwndDlg, TC_APPMSG_UNINSTALL_SUCCESS, 0, 0);
	else
		bUninstallInProgress = FALSE;

	EnableWindow (GetDlgItem ((HWND) hwndDlg, IDC_UNINSTALL), TRUE);
	OutcomePrompt (hwndDlg, bOK);
}

void DoInstall (void *arg)
{
	HWND hwndDlg = (HWND) arg;
	BOOL bOK = TRUE;
	wchar_t path[MAX_PATH];

	BootEncryption bootEnc (hwndDlg);

	// Refresh the main GUI (wizard thread)
	InvalidateRect (MainDlg, NULL, TRUE);

	ClearLogWindow (hwndDlg);

	if (mkfulldir (InstallationPath, TRUE) != 0)
	{
		if (mkfulldir (InstallationPath, FALSE) != 0)
		{
			wchar_t szTmp[TC_MAX_PATH];

			handleWin32Error (hwndDlg, SRC_POS);
			StringCbPrintfW (szTmp, sizeof(szTmp), GetString ("CANT_CREATE_FOLDER"), InstallationPath);
			MessageBoxW (hwndDlg, szTmp, lpszTitle, MB_ICONHAND);
			Error ("INSTALL_FAILED", hwndDlg);
			PostMessage (MainDlg, TC_APPMSG_INSTALL_FAILURE, 0, 0);
			return;
		}
	}

	UpdateProgressBarProc(2);

	if (DoDriverUnload (hwndDlg) == FALSE)
	{
		NormalCursor ();
		PostMessage (MainDlg, TC_APPMSG_INSTALL_FAILURE, 0, 0);
		return;
	}

	if (bUpgrade
		&& (IsFileInUse (wstring (InstallationPath) + L'\\' + _T(TC_APP_NAME) L".exe")
			|| IsFileInUse (wstring (InstallationPath) + L'\\' + _T(TC_APP_NAME) L"-x86.exe")
			|| IsFileInUse (wstring (InstallationPath) + L'\\' + _T(TC_APP_NAME) L"-x64.exe")
			|| IsFileInUse (wstring (InstallationPath) + L'\\' + _T(TC_APP_NAME) L" Format.exe")
			|| IsFileInUse (wstring (InstallationPath) + L'\\' + _T(TC_APP_NAME) L" Format-x86.exe")
			|| IsFileInUse (wstring (InstallationPath) + L'\\' + _T(TC_APP_NAME) L" Format-x64.exe")
			|| IsFileInUse (wstring (InstallationPath) + L'\\' + _T(TC_APP_NAME) L"Expander.exe")
			|| IsFileInUse (wstring (InstallationPath) + L'\\' + _T(TC_APP_NAME) L"Expander-x86.exe")
			|| IsFileInUse (wstring (InstallationPath) + L'\\' + _T(TC_APP_NAME) L"Expander-x64.exe")
			|| IsFileInUse (wstring (InstallationPath) + L'\\' + _T(TC_APP_NAME) L" Setup.exe")
			)
		)
	{
		NormalCursor ();
		Error ("CLOSE_TC_FIRST", hwndDlg);
		PostMessage (MainDlg, TC_APPMSG_INSTALL_FAILURE, 0, 0);
		return;
	}

	UpdateProgressBarProc(12);

	if (bSystemRestore)
		SetSystemRestorePoint (hwndDlg, FALSE);

	UpdateProgressBarProc(48);

	if (bDisableSwapFiles
		&& IsPagingFileActive (FALSE))
	{
		if (!DisablePagingFile())
		{
			handleWin32Error (hwndDlg, SRC_POS);
			Error ("FAILED_TO_DISABLE_PAGING_FILES", hwndDlg);
		}
		else
			bRestartRequired = TRUE;
	}

	UpdateProgressBarProc(50);

	// Remove deprecated
	DoServiceUninstall (hwndDlg, L"VeraCryptService");

	UpdateProgressBarProc(55);

	if (!SystemEncryptionUpdate)
		DoRegUninstall ((HWND) hwndDlg, TRUE);

	UpdateProgressBarProc(61);

	GetWindowsDirectory (path, ARRAYSIZE (path));
	StringCbCatW (path, sizeof (path), L"\\VeraCrypt Setup.exe");
	StatDeleteFile (path, FALSE);

	if (UpdateProgressBarProc(63) && UnloadDriver && DoServiceUninstall (hwndDlg, L"veracrypt") == FALSE)
	{
		bOK = FALSE;
	}
	else if (UpdateProgressBarProc(72) && DoFilesInstall ((HWND) hwndDlg, InstallationPath) == FALSE)
	{
		bOK = FALSE;
	}
	else if (UpdateProgressBarProc(80) && DoRegInstall ((HWND) hwndDlg, InstallationPath, bRegisterFileExt) == FALSE)
	{
		bOK = FALSE;
	}
	else if (UpdateProgressBarProc(85) && UnloadDriver && DoDriverInstall (hwndDlg) == FALSE)
	{
		bOK = FALSE;
	}
	else if (UpdateProgressBarProc(90) && SystemEncryptionUpdate && UpgradeBootLoader (hwndDlg) == FALSE)
	{
		bOK = FALSE;
	}
	else if (UpdateProgressBarProc(93) && DoShortcutsInstall (hwndDlg, InstallationPath, bAddToStartMenu, bDesktopIcon) == FALSE)
	{
		bOK = FALSE;
	}

	if (!UnloadDriver)
		bRestartRequired = TRUE;

	try
	{
		bootEnc.RenameDeprecatedSystemLoaderBackup();
	}
	catch (...)	{ }

	if (bOK)
		UpdateProgressBarProc(97);

	if (bSystemRestore)
		SetSystemRestorePoint (hwndDlg, TRUE);

	if (bOK)
	{
		UpdateProgressBarProc(100);
		UninstallBatch[0] = 0;
		StatusMessage (hwndDlg, "INSTALL_COMPLETED");
	}
	else
	{
		UpdateProgressBarProc(0);

		if (!SystemEncryptionUpdate)
		{
			bUninstall = TRUE;
			Rollback = TRUE;
			Silent = TRUE;

			DoUninstall (hwndDlg);

			bUninstall = FALSE;
			Rollback = FALSE;
			Silent = FALSE;

			StatusMessage (hwndDlg, "ROLLBACK");
		}
		else
		{
			Warning ("SYS_ENC_UPGRADE_FAILED", hwndDlg);
		}
	}

	OutcomePrompt (hwndDlg, bOK);

	if (bOK && !bUninstall && !bDowngrade && !bRepairMode && !bDevm)
	{
		BOOL bHibernateEnabled = FALSE, bHiberbootEnabled = FALSE;
		if (GetHibernateStatus (bHibernateEnabled, bHiberbootEnabled))
		{
			if (bHiberbootEnabled)
			{
				bPromptFastStartup = TRUE;
			}
		}

		if (!IsHiddenOSRunning())	// A hidden OS user should not see the post-install notes twice (on decoy OS and then on hidden OS).
		{
			if (bRestartRequired || SystemEncryptionUpdate)
			{
				// Restart required

				if (bUpgrade)
				{
					SavePostInstallTasksSettings (TC_POST_INSTALL_CFG_RELEASE_NOTES);
					if (bUpdateRescueDisk)
					{
						SavePostInstallTasksSettings (TC_POST_INSTALL_CFG_RESCUE_DISK);
					}
				}
				else if (bPossiblyFirstTimeInstall)
				{
					SavePostInstallTasksSettings (TC_POST_INSTALL_CFG_TUTORIAL);
				}
			}
			else
			{
				// No restart will be required

				if (bUpgrade)
				{
					bPromptReleaseNotes = TRUE;
				}
				else if (bPossiblyFirstTimeInstall)
				{
					bPromptTutorial = TRUE;
				}
			}
		}
	}

	PostMessage (MainDlg, bOK ? TC_APPMSG_INSTALL_SUCCESS : TC_APPMSG_INSTALL_FAILURE, 0, 0);
}


void SetInstallationPath (HWND hwndDlg)
{
	BOOL bInstallPathDetermined = FALSE;
	
	GetInstallationPath (hwndDlg, InstallationPath, ARRAYSIZE (InstallationPath), &bInstallPathDetermined);

	if (bInstallPathDetermined)
	{
		wchar_t mp[MAX_PATH];

		// Determine whether we were launched from the folder where VeraCrypt is installed
		GetModuleFileName (NULL, mp, ARRAYSIZE (mp));
		if (wcsncmp (InstallationPath, mp, min (wcslen(InstallationPath), wcslen(mp))) == 0)
		{
			// We were launched from the folder where VeraCrypt is installed

			if (!IsNonInstallMode() && !bDevm)
				bChangeMode = TRUE;
		}
	}
}


// Handler for uninstall only (install is handled by the wizard)
BOOL CALLBACK UninstallDlgProc (HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
{
	WORD lw = LOWORD (wParam);

	switch (msg)
	{
	case WM_INITDIALOG:

		MainDlg = hwndDlg;

		if (!CreateAppSetupMutex ())
			AbortProcess ("TC_INSTALLER_IS_RUNNING");

		InitDialog (hwndDlg);
		LocalizeDialog (hwndDlg, NULL);

		SetWindowTextW (hwndDlg, lpszTitle);

		// System Restore
		SetCheckBox (hwndDlg, IDC_SYSTEM_RESTORE, bSystemRestore);
		if (SystemRestoreDll == 0)
		{
			SetCheckBox (hwndDlg, IDC_SYSTEM_RESTORE, FALSE);
			EnableWindow (GetDlgItem (hwndDlg, IDC_SYSTEM_RESTORE), FALSE);
		}

		SetFocus (GetDlgItem (hwndDlg, IDC_UNINSTALL));

		return 1;

	case WM_SYSCOMMAND:
		if (lw == IDC_ABOUT)
		{
			DialogBoxW (hInst, MAKEINTRESOURCEW (IDD_ABOUT_DLG), hwndDlg, (DLGPROC) AboutDlgProc);
			return 1;
		}
		return 0;

	case WM_COMMAND:
		if (lw == IDC_UNINSTALL)
		{
			if (bDone)
			{
				bUninstallInProgress = FALSE;
				PostMessage (hwndDlg, WM_CLOSE, 0, 0);
				return 1;
			}

			bUninstallInProgress = TRUE;

			WaitCursor ();

			if (bUninstall)
				_beginthread (DoUninstall, 0, (void *) hwndDlg);

			return 1;
		}

		if (lw == IDC_SYSTEM_RESTORE)
		{
			bSystemRestore = IsButtonChecked (GetDlgItem (hwndDlg, IDC_SYSTEM_RESTORE));
			return 1;
		}

		if (lw == IDCANCEL)
		{
			PostMessage (hwndDlg, WM_CLOSE, 0, 0);
			return 1;
		}

		return 0;

	case TC_APPMSG_UNINSTALL_SUCCESS:
		SetWindowTextW (GetDlgItem ((HWND) hwndDlg, IDC_UNINSTALL), GetString ("FINALIZE"));
		NormalCursor ();
		return 1;

	case WM_CLOSE:
		if (bUninstallInProgress)
		{
			NormalCursor();
			if (AskNoYes("CONFIRM_EXIT_UNIVERSAL", hwndDlg) == IDNO)
			{
				return 1;
			}
			WaitCursor ();
		}
		EndDialog (hwndDlg, IDCANCEL);
		return 1;
	}

	return 0;
}
#endif

typedef struct
{
	LPCWSTR name;
	int resourceid;
	WORD langid;
	LPCSTR internalId;
	LPCWSTR langtag;
} tLanguageEntry;

static tLanguageEntry g_languagesEntries[] = {
	{L"العربية", IDR_LANG_AR, LANG_ARABIC, "ar", NULL},
	{L"Čeština", IDR_LANG_CS, LANG_CZECH, "cs", NULL},
	{L"Deutsch", IDR_LANG_DE, LANG_GERMAN, "de", NULL},
	{L"English", IDR_LANGUAGE, LANG_ENGLISH, "en", NULL},
	{L"Español", IDR_LANG_ES, LANG_SPANISH, "es", NULL},
	{L"Français", IDR_LANG_FR, LANG_FRENCH, "fr", NULL},
	{L"Italiano", IDR_LANG_IT, LANG_ITALIAN, "it", NULL},
	{L"日本語", IDR_LANG_JA, LANG_JAPANESE, "ja", NULL},
	{L"Nederlands", IDR_LANG_NL, LANG_DUTCH, "nl", NULL},
	{L"Polski", IDR_LANG_PL, LANG_POLISH, "pl", NULL},
	{L"Română", IDR_LANG_RO, LANG_ROMANIAN, "ro", NULL},
	{L"Русский", IDR_LANG_RU, LANG_RUSSIAN, "ru", NULL},
	{L"Tiếng Việt", IDR_LANG_VI, LANG_VIETNAMESE, "vi", NULL},
	{L"简体中文", IDR_LANG_ZHCN, LANG_CHINESE, "zh-cn", L"zh-CN"},
	{L"繁體中文", IDR_LANG_ZHHK, LANG_CHINESE, "zh-hk", L"zh-HK"},
};

typedef int (WINAPI *LCIDToLocaleNameFn)(
    LCID     Locale,
    LPWSTR  lpName,
    int      cchName,
    DWORD    dwFlags);

static void UpdateSelectLanguageDialog (HWND hwndDlg)
{
	HWND hLangList = GetDlgItem (hwndDlg, IDC_LANGUAGES_LIST);
	LPARAM nIndex = SendMessage (hLangList, CB_GETCURSEL, 0, 0);
	int resourceid = (int) SendMessage (hLangList, CB_GETITEMDATA, nIndex, 0);
	BOOL bVal;

	LoadLanguageFromResource (resourceid, TRUE, TRUE);

	bVal = LocalizationActive;
	LocalizationActive = TRUE;
	LocalizeDialog (hwndDlg, "IDD_INSTL_DLG");
	InvalidateRect (hwndDlg, NULL, FALSE);
	LocalizationActive = bVal;
}

BOOL CALLBACK SelectLanguageDialogProc (HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
	WORD lw = LOWORD (wParam);

	switch (uMsg)
	{
	case WM_INITDIALOG:
		{
			char* preferredLanguage = GetPreferredLangId ();
			if (strlen (preferredLanguage))
			{
				// language already selected by user in current install
				// use it for the setup
				for (size_t i = 0; i < ARRAYSIZE (g_languagesEntries); i++)
				{
					if (0 == strcmp (preferredLanguage, g_languagesEntries[i].internalId))
					{
						LoadLanguageFromResource (g_languagesEntries[i].resourceid, FALSE, TRUE);
						break;
					}
				}
				EndDialog (hwndDlg, IDCANCEL);
				return FALSE;
			}
			else
			{
				// Get the default UI language
				LCIDToLocaleNameFn LCIDToLocaleNamePtr = (LCIDToLocaleNameFn) GetProcAddress (GetModuleHandle (L"kernel32.dll"), "LCIDToLocaleName");
				WCHAR langtag[256];
				LANGID defaultLanguage = GetUserDefaultUILanguage ();
				WORD langid = (WORD) (defaultLanguage & 0x03FF); // primary language ID

				InitDialog (hwndDlg);

				LCIDToLocaleNamePtr (MAKELCID (defaultLanguage, 0), langtag, ARRAYSIZE (langtag), 0); // language tag (e.g. "en-US")
				int resourceid = IDR_LANGUAGE;
				for (size_t i = 0; i < ARRAYSIZE (g_languagesEntries); i++)
				{
					if (g_languagesEntries[i].langid == langid)
					{
						if (!g_languagesEntries[i].langtag || (0 == _wcsicmp (g_languagesEntries[i].langtag, langtag)))
						{
							resourceid = g_languagesEntries[i].resourceid;
							break;
						}
					}
				}

				for (size_t i = 0; i < ARRAYSIZE (g_languagesEntries); i++)
				{
					AddComboPair (GetDlgItem (hwndDlg, IDC_LANGUAGES_LIST), g_languagesEntries[i].name, g_languagesEntries[i].resourceid);
				}

				SelectAlgo (GetDlgItem (hwndDlg, IDC_LANGUAGES_LIST), &resourceid);

				UpdateSelectLanguageDialog (hwndDlg);
			}

		}
		return TRUE;

	case WM_COMMAND:
		if (CBN_SELCHANGE == HIWORD (wParam))
		{
			UpdateSelectLanguageDialog (hwndDlg);
			return 1;
		}

		if (lw == IDOK)
		{
			bUserSetLanguage = TRUE;
			EndDialog (hwndDlg, IDOK);
			return 1;
		}

		if (lw == IDCANCEL)
		{
			SetPreferredLangId ("");
			EndDialog (hwndDlg, IDCANCEL);
			return 1;
		}
		return 0;
	}

	return 0;
}


int WINAPI wWinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, wchar_t *lpszCommandLine, int nCmdShow)
{
	atexit (localcleanup);

	SelfExtractStartupInit();

#ifdef PORTABLE
	lpszTitle = L"VeraCrypt Portable";
#else
	lpszTitle = L"VeraCrypt Setup";
#endif
	/* Call InitApp to initialize the common code */
	InitApp (hInstance, NULL);

#ifndef PORTABLE
	if (IsAdmin () != TRUE)
		if (MessageBoxW (NULL, GetString ("SETUP_ADMIN"), lpszTitle, MB_YESNO | MB_ICONQUESTION) != IDYES)
		{
			FinalizeApp ();
			exit (1);
		}
#endif
	/* Setup directory */
	{
		wchar_t *s;
		GetModuleFileName (NULL, SetupFilesDir, ARRAYSIZE (SetupFilesDir));
		s = wcsrchr (SetupFilesDir, L'\\');
		if (s)
			s[1] = 0;
	}

	/* Parse command line arguments */

	if (lpszCommandLine[0] == L'/')
	{
#ifndef PORTABLE
		if (lpszCommandLine[1] == L'u')
		{
			// Uninstall:	/u

			bUninstall = TRUE;
		}
		else if (lpszCommandLine[1] == L'c')
		{
			// Change:	/c

			bChangeMode = TRUE;
		}
		else
#endif
		if (lpszCommandLine[1] == L'p')
		{
			// Create self-extracting package:	/p

			bMakePackage = TRUE;
		}
		else if (lpszCommandLine[1] == L'd')
		{
			// Dev mode:	/d
			bDevm = TRUE;
		}
	}

	if (bMakePackage)
	{
		/* Create self-extracting package */

		MakeSelfExtractingPackage (NULL, SetupFilesDir);
	}
	else
	{
#ifndef PORTABLE
		SetInstallationPath (NULL);
#endif
		if (bUninstall)
		{
			wchar_t path [TC_MAX_PATH];

			GetModuleFileName (NULL, path, ARRAYSIZE (path));
			if (!VerifyModuleSignature (path))
			{
				Error ("DIST_PACKAGE_CORRUPTED", NULL);
				exit (1);
			}
		}
		else
		{
			if (IsSelfExtractingPackage())
			{
				if (!VerifySelfPackageIntegrity())
				{
					// Package corrupted
					exit (1);
				}
				bDevm = FALSE;
			}
			else if (!bDevm)
			{
#ifndef PORTABLE
				MessageBox (NULL, L"Error: This installer file does not contain any compressed files.\n\nTo create a self-extracting installation package (with embedded compressed files), run:\n\"VeraCrypt Setup.exe\" /p", L"VeraCrypt", MB_ICONERROR | MB_SETFOREGROUND | MB_TOPMOST);
#else
				MessageBox (NULL, L"Error: This portable installer file does not contain any compressed files.\n\nTo create a self-extracting portable installation package (with embedded compressed files), run:\n\"VeraCrypt Portable.exe\" /p", L"VeraCrypt", MB_ICONERROR | MB_SETFOREGROUND | MB_TOPMOST);
#endif
				FinalizeApp ();
				exit (1);
			}

#ifndef PORTABLE
			if (bChangeMode)
			{
				/* VeraCrypt is already installed on this system and we were launched from the Program Files folder */

				char *tmpStr[] = {0, "SELECT_AN_ACTION", "REPAIR_REINSTALL", "UNINSTALL", "EXIT", 0};

				// Ask the user to select either Repair or Unistallation
				switch (AskMultiChoice ((void **) tmpStr, FALSE, NULL))
				{
				case 1:
					bRepairMode = TRUE;
					break;
				case 2:
					bUninstall = TRUE;
					break;
				default:
					FinalizeApp ();
					exit (1);
				}
			}
#endif
		}

#ifndef PORTABLE
		// System Restore
		if (IsSystemRestoreEnabled ())
		{
			wchar_t dllPath[MAX_PATH];
			if (GetSystemDirectory (dllPath, MAX_PATH))
			{
				StringCbCatW(dllPath, sizeof(dllPath), L"\\srclient.dll");
			}
			else
				StringCbCopyW(dllPath, sizeof(dllPath), L"C:\\Windows\\System32\\srclient.dll");
			SystemRestoreDll = LoadLibrary (dllPath);
		}
		else
			SystemRestoreDll = 0;
#endif

		if (!bUninstall)
		{
			if (!bDevm && !LocalizationActive && (nCurrentOS >= WIN_VISTA))
			{
				BOOL bHasPreferredLanguage = (strlen (GetPreferredLangId ()) > 0)? TRUE : FALSE;
				if ((IDCANCEL == DialogBoxParamW (hInstance, MAKEINTRESOURCEW (IDD_INSTALL_LANGUAGE), NULL, (DLGPROC) SelectLanguageDialogProc, (LPARAM) 0 ))
					&& !bHasPreferredLanguage
					)
				{
					// Language dialog cancelled by user: exit the installer
					FinalizeApp ();
					exit (1);
				}
			}
			/* Create the main dialog for install */

			DialogBoxParamW (hInstance, MAKEINTRESOURCEW (IDD_INSTL_DLG), NULL, (DLGPROC) MainDialogProc,
				(LPARAM)lpszCommandLine);
		}
#ifndef PORTABLE
		else
		{
			/* Create the main dialog for uninstall  */

			DialogBoxW (hInstance, MAKEINTRESOURCEW (IDD_UNINSTALL), NULL, (DLGPROC) UninstallDlgProc);

			if (UninstallBatch[0])
			{
				STARTUPINFO si;
				PROCESS_INFORMATION pi;

				ZeroMemory (&si, sizeof (si));
				si.cb = sizeof (si);
				si.dwFlags = STARTF_USESHOWWINDOW;
				si.wShowWindow = SW_HIDE;

				if (!CreateProcess (UninstallBatch, NULL, NULL, NULL, FALSE, IDLE_PRIORITY_CLASS, NULL, NULL, &si, &pi))
					DeleteFile (UninstallBatch);
				else
				{
					CloseHandle (pi.hProcess);
					CloseHandle (pi.hThread);
				}
			}
		}
#endif
	}
	FinalizeApp ();
	return 0;
}