Ismer valaki olyan Assembler példakódot x86-os PC-re DOS vagy WinXP-Win7 alá, amivel Flash adathordozón (pl. PenDrive) szektoros eléréssel lehet írni viszonylag gyors elérési sebességgel?
Ahhoz kéne, mivel jól jönne majd egy olyan program, amivel saját USB-t tetszőlegesen bármennyiszer felülírhatok - értelemszerűen biztonságos törlésre -, viszont nem nagyon tudok ilyen már meglévő ingyenes programról, így az lehetne egy megoldás, hogy magam megcsinálom.
C#-on megírtam egy ilyet API-t használva ("CreateFile"-t használva a fizikai lemez elérésére), viszont az marha lassú volt, hiába használtam optimalizált eljárást az írásra, így is kb. 100 KB/sec. sebesség volt a max., több óra volt, mire egy 1 GB-os PenDrive-on végigment - igaz, USB1 porton, de szerintem ez ott is lassúnak mondható, egy fájl átmásolása is látványosan gyorsabb volt.
Ezért gondoltam, hogy célszerűbb Assembly-ben megírni, de egyenlőre még nem találtam neten anyagot, amiből ki tudnék indulni. Illetve fájlba írásra persze tudok kódot Win-re, de szektoros elérésre nem, főleg úgy, hogy gyors is legyen.
Ha esetleg valaki tudna ilyet, akár FASM, MASM, vagy bármilyen más assembly szintaxisban, nagyon megköszönném, mert akkor Sphinx C-- -ban már neki tudnék látni.
Az sem gond, ha csak DOS alól működik. Az adathordozó természetesen mindig külső lenne, tehát nem célom, hogy vírust csináljak belőle.
Előre is köszönöm!
A vindows-ok nem nagyon fogják hagyni, hogy közvetlenül férj hozzá a meghajtóhoz, DOS alatt meg finoman szólva körülményes lehet az USB-s meghajtóra alkotni.
Ezzel még tehetnél próbát: [link]
Egy binárisan egyesekből álló kép, majd egy nullákból és akkor jó eséllyel nem hozol vissza adatot arról a pendrive-ról.
Viszont az 1 GB-os pendrive nem egy drága dolog, inkább égesd el. Gyorsabban megvan. :-]
Háááát.... az a helyzet, hogy én is gondoltam ilyesmire... tényleg megfordult a fejemben ez, amikor keresgéltem, hogy esetleg egy képfájlíróval.....
Csak hát egyrészt kb. 0% elegancia van a dologban, másrészről pedig tényleg jó lenne, ha magam tudnám "paraméterezni" a dolgot, márcsak azért is, mert jobb érzéssel töltene el, ha valóban úgy és olyan paranoiás biztonsággal nyírom ki a kompromittáló adataimat a PenDrive-ról, ahogy csak akarom.
Egyébként C#-ból viszonylag könnyen hozzá lehet férni a nem OP-rendszeres meghajtókhoz, csak rohadt lassú.
De azt sem értem, hogy külső adathordozót miért védi annyira a Windows. Egyébként is, jelentett VALAHA nehézséget a Windows védő szelleme a vírusok számára ?! :/
Ha van paranoia, az elegancia szvsz nem lényeg. :-]
Mi volt az optimalizált eljárás az írásra? Egy menetben több adat?
Találtam ilyet: [link]
A C# Nekem távoli, de ha rosszat is linkeltem, valahol az oldalon kell lennie megoldásnak a problémádra, mivel innen találtam oda: [link]
Hátha lenne némi teljesítménye így...
Ha nem jön be, marad a C#-ban megírt GUI a Physdiskwrite -hoz :-D
A windows nem véletlenül védi a külső meghajtót a direkt írástól. A driverekből két féle van egy meghajtóból.
Az egyik típusa: a egy "normál" driver, ami a cpu használatával másolt adatot a winchesterről.
A másik pedig az úgynevezett Direct Memory Acces használatával, azaz a külső/ belső meghajtó saját cpujával közvetlenül írt a számítógép memóriájába
A DMA móddal való írást a windows a lehető legtöbször akarja kerülni. A DMA mód sokkal gyorsabb mint a normál írási lehetőség, bár biztonsági kockázatot is jelent.
Ha pl. valaki megberhel,egy pendrive-ot, és megoldja, hogy pl. írjon a pendrive a kernel módbeli területekre, ahol a windows adatai tárolódnak, akkor a DMA mód miatt ez engedélyezetté válik, noha
Folytatás ( véletlenül kattintottam az elküldés gombra)
így akár a windows jelszót is lehet módosítani.
A thunderbird portal csináltak egy csúnya hackelést, gyak egy titkosított fájlrendszer jelszavát is kiszedték a memóriából vele, szal ez létező fenyegetés. Direkt USB-s kábellel is meg lehet elvben csinálni. Emiat a windows kerüli a DMA módot, bár registryben ennek ellenére, be lehet kapcsolni a DMA engedélyezését.
Hát, az első linkel még nem találkoztam, de így rálátásra ömlesztve van minden összedobálva, nem tudom, hogy van-e új köztük.
A második linkel viszont 1részt nem most találkozok előszőr, 2részt nem jelent igazán újdonságot. Ugyanúgy olyan API-s megoldásról írnak, mint amit én alkalmaztam.
Én egyébként, mint említettem, a CreateFile API-val értem el a drive-ot, és az írásra is egy API-s megoldást kerestem netről, ami a tesztek szerint a leggyorsabbnak bizonyult. Egyébként meg 1 MB-os darabokban írtam.
A linkre még lehet, rá tudok keresni, de a kódot - habár szívesen mellékelném - már nem tudom, mert egy viszonylag régi gépen írtam, amin USB-n és Floppy-n kívül nem volt más hordozható adatolvasó, az OP rendszer meg sajnos behalt rajta, így nem tudok semmit kezdeni vele - nem tudok telepítőt/javítót bootolni róla -, és egyenlőre a merevlemezt se tudom máshova berakni, mivel ATA csatlakozású, és már sajnos mindenhova csak SATA csatlakozót építenek be. =(
Viszont közbe az is eszembe jutott, hogy ASM-nél ahhoz is kéne kódot keresni, hogy lekérdezzem a drive VALÓS méretét.
Mert a C#-os kódnál egyszerűen úgy csináltam, hogy addig ment while(true) ciklusban az írás, ameddig tudott, és amikor hibát észlelt, kikapcsolt. Viszont sejtésem szerint ASM-be már nem ilyen "szelíd" a hibamegszakítás, nemde?
"registryben ennek ellenére, be lehet kapcsolni a DMA engedélyezését"
Szóval először a DMA módot kéne bekapcsolni registry-ben a kóddal, aztán megoldást találni a DMA írásra? Ennek most akkor továbbra is ASM-ben kéne utánanézzek, vagy térjek vissza C#-ra?
Az természetesen nem gond, ha netán vírusírtó jelez registry miatt, mert értelemszerűen én felügyelem a programot, így azt a gépet is, amiben registry módosítás történik, úgyhogy ha ez tényleg a kellő gyorsaságot tudja, akkor egész jó megoldásnak tűnik.
Egyébként ez a DMA mennyiben különbözik a BIOS írási utasításainak használatától? (bár tudtommal utóbbit a Win szinte egyáltalán nem hagyja)
"Folytatás ( véletlenül kattintottam az elküldés gombra)"
Nem baj, legalább egy jó kommenthez két zöld kezet kapsz... XD XD XD
;)
Előbb válaszoltam a windows-os kérdésre, most pedig válaszolok a tényleges kérdésre.
A c# a .NET keretrendszert használja. Emiatt az lassabb mint a normál .exe-re fordító programnyelveknél.
Próbáld meg a c++-t az biztos, gyorsabb lesz főleg az o2-s direktívával fordítod. Elég jól tudja optimalizálni a kódot. A szintax ugyanaz, és próbáld meg először ugyanaz a programot, amit a c#-ban fordítottál c++-ra átportolni. A szintax ugyanaz, és ha API-t használtál, akkor a valszeg a függvény még ugyanaz is lehet mint a windows-os.
Az assambly programnyelven memóriáti írni szerintem egy kicsit erős megoldás lehet őszintén szólva lehet le tudod valahonnan szedni a netről, a kódot, de enyhén nehéz megoldani szerintem a dolgot, amit te szeretnél. Főleg, hogy BIOS-os hívást nem használhatsz windows operációs rendszer mellett.
A DMA mód: a dma-l az eszköz adatátviteli képességét hasznlája ki a rendszer, elvben ki lehet vele tolni a full-os usb 1.1-es szabvány maximális sebességét, a dma módhoz elvben itt van egy kód:
( Ez normál winchesterre van, usb-re át lehet írni ugyanúgy. csak megfeleő címet és hexaértéket kell használni.
Próbáld meg és fordítsd ezt is o2-es direktivával.
Akkor szükség esetén ha még nagyobb adatátviteli sebességet akarsz elérni akkor keress a neten egy usb drivert, és nézd meg mi van benne. Aztán ha találsz véletlenül optimalizálandó részt, vagy netalán közvetlen a driverbe teszel bele kódot amit egy saját dll-ből tudsz hivogatni, akkor azzal elég kemény átviteli sebességet tudsz elérni. ( windows driver kit-et nézd meg, aztán meg
Ehhez segédanyag:
A driver kit-et meg
[link] innen tudod letölteni.
Utóbbi megoldás c nyelven van. De szerintem tuti ki lehet belől csiholni a lehető legtöbbet, főleg ,ha az usb drivert tudod közvetlenül a windows nélkül használni.
Úúú, köszönöm a kimerítő válaszodat!!!
Igyekszem mindegyiket átvizslatni. Bár bevallom, driverekkel eddig még nem igazán szórakoztam, dehát úgyis sejtettem, hogy ez a feladat nem lesz olyan könnyű... majd igyekszem. ;)
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!