Zaklady WinCE lowlevel programovania

05.06.2006 04:13 | vid

Nedavno som sa zacal venovat tejto oblasti, a musel som pri tom prekonavat kopec sprostych problemov, takze sa pokusim nieco z tejto oblasti objasnit. Cely clanok popisuje vyvoj pod Win32.

Na uplne pochopenie su potrebne nejake znalosti o PE (Portable Executable, lahko si o tom vyguglite kolko treba), ale aj bez toho sa je dost co dozvediet.

Najprv si treba ujasnit CO je to vlastne Windows CE. Nieje to presne operacny system ako napriklad Win95. Je to skor rodina systemov, ako napr. NT. Presnejsie povedane, je to nejaky zaklad, template, operacneho systemu, z ktoreho je mozne podla nejakych kriterii vygenerovat konkretny operacny system. Prikladom takychto operacnych systemov su Windows Smartphone 2002, Windows PocketPC 2002, Windows PocketPC 2003, Windows Mobile 5.0 atd.

Je na to nastroj, ktory sa vola Platform Builder, kde si clovek "naklika co vsetko tam chce a potom to debuguje". Inak je to nehorazne tazko zohnatelna vecicka, ak to niekto ma, urcite sa ozvite ;) (nech viem odkial ste to zohnali, aj ja si to odtial kupim).

Windows CE existuje vo verziach pre viacero architektur procesora: x86, ARM, MIPS, SH4 (posledne 2 neviem co je...). Inak je to celkom slusne skrotena verzia windofsov, bez picovin navyse, kernel pod 1 MB a zvycajne na systemoch zalozenych na WinCE nieje vela zbytocnosti, ktore inak zajebavaju miesto (ale zvycajne ich aj vela zostane).

No dufam ze je to uz ako-tak jasne. My sa zamierame na architekturu ARM, ktora je bezne vo vsetkych PDAckach. pre winCE su dva typy PDAciek:
- PocketPC - ma dotykove pero, smerove a funkcne klavesy, vecsi monitor.
- Smartphone - je to vlastne telefon, ma ciselnik, nema dotykove pero taky velmi nahrubo popis, ale da sa pochopit o co ide dufam.

Ohladne architektury ARM - je to RISC procesor, ale instrukcna sada je v niektorych ohladoch ovela silnejsia a viac "complete" ako u CISC x86, info napr. na
http://www.arm.com
http://www.arm.com/documentation/
http://www.arm.com/support/assembler.html
ale celkovo je toho na nete pomerne malo, najlepsia cesta je asi stale otravovat niekoho, kto sa rozumie :-]. V podstate je ARM uz asi 5 rokov fungujuci standard pre tieto zariadenia a pochybujem ze sa bude menit, takze tak ako je x86 kod portabilny medzi vsetkymi x86-based platformami, tak je ARM kod portabilny na mobilnych zariadenych.

Dalsia vec, co nas zaujima su tooly ktore budeme pouzivat. vprvomrade treba program skompilovat a zlinkovat. Funkcne asm kompilatory, o ktorych viem su:
- FASMARM: http://board.flatassembler.net/topic.php?t=4191
sam osebe ma malo dokumentacie, v tej su len rozdiely oproti FASM, takze je vhodne spoznat aj ten. Inak len staci spustit FASMWARM.EXE a v menu najdete vsetko co potrebujete.
- MS armasm.exe: mal by byt vo vsetkych SDKckach pre
winCE-based operacne systemy a inak ho najdete v:
Microsoft Visual Studio 8\VC\ce\bin\x86_arm\armasm.exe
K nemu treba aj tzv. WinCE-aware link, je to subor link.exe v tom
istom adresari. Tento link si moze pytat aj kniznicu mspdb80.dll:
Microsoft Visual Studio 8\Common7\IDE\mspdb80.dll

Osobne som skor za FASMARM, kedze jeho predchodza FASM je na poli x86 asi najlepsi assembler (subjektivny nazor, ale zase viem o com hovorim) a tuto jeho verziu pre ARM vyvinul chlapik co si da na svojich projektoch zalezat. A aspon mate od neho aku-taku podporu, narozdiel od MS :). Preto sa budem aj dalet venovat FASMARM-u, je to projekt do ktoreho chalan dal vela usilia a zasluzi si podporu.

Dalsia vec co nas zaujima je ako spustat kod. Asi nie kazdy ma nejake to PDAcko doma, takze prijde vhod emulator od MS. Vola sa originalne: Device Emulator. Zatial sa nemozem stazovat, ked sa to clovek nauci trosku pouzivat tak to vie vsetko co treba.
http://msdn.microsoft.com/mobility/downloads/Emulator/default.aspx
s visual studiom 8, alebo mnohymi SDKckami sa nainstaluje do adresara
Program Files\Microsoft Device Emulator\1.0

Pre emulaciu konkretnych operacnych systemov, napr. Smartphone 2002 treba mat obraz ROM takehoto zariadenia (blizsie sa vysvetli neskor). Nieco najdete tu:
http://msdn.microsoft.com/mobility/downloads/Emulator/default.aspx
inak su to subory pomenovane napr.
PPC_2003_SE_WWE_ARMv4.bin
a moze su nachadzat napr. v adresari:
Microsoft Visual Studio 8\SmartDevices\Emulators\Images\
teda ak mate zakupene visual studio 8.

Dalej treba programik ActiveSync. Ten sa pouziva aj pri realnych PDAckach a sluzi na umoznenie komunikacie medzi PC a PDA. Ibaze aby taketo zariadenie bolo pripojene k PC, musi byt umiestnene v "cradle", a nic taketo nam emulator defaultne nezarucuje, na to sluzi program dvcemumanager.exe ktory sa moze nachadzat v rovnakom adresari ako Device Emulator. Ten vam umoznuje spustat si emulator pre obrazy ktore mate naistalovane (inak treba DeviceEmulator.exe pustit rucne z command lajnu a ako parameter mu dat ROM obraz) alebo pre uz beziaci emulator, ktoreho GUID (take sproste cislo s pomlckami) najdeme v casti Others, emulovat Cradle. Je to volba Actions->Cradle v menu.

Potom, ako tuto volbu zapneme, sa automaticky spusti ActiveSync, pre nase ucely staci v nasledujucom dialogu vybrat Quest partnership, ktore nam umozni pristup na "disk" emulatoru. Bud cez ActiveSync okno a tlacitko Explore alebo MyComputer->Mobile Device, ako to referencovat z prikazoveho riadku som zatial nezistil. Takto si mozme skopirovat subor do emulatoru. Tam ho staci len spustit.

Zhrnutie emulacie: ked to pochopite naco to vsetko, tak to aj dava zmysel, ale je to stale strasna picovina...

Dalsia vec co nas zaujima je, ako v takom zariadeni vyzera s pametou. Vyborne je to popisane v clanku
http://www.pdagold.com/articles/detail.asp?a=243
a urcite odbornejsie ako by som vedel ja, takze tuto cast prenecham tomuto clanku. Ak bude zaujem aby som z neho vycucol to podstatne tak sa pokusim, dovtedy sa potrapte s anglictinou. Odporucam dokladne prestudovat, hlavne ak nemate sajnu o tom ako to na tom PDA funguje.

A dostaneme sa k samotnemu programovaniu. Tu sa nam zide nejake to SDKcko, aby sme vedeli ake mame API. WinCE je velmi customizovatelne takze sa to moze dost lisit, ak chcete byt portabilny odporucam vyuzivat len zakladne featury. Inak je API presne to iste co na win32, len tam vela veci nieje a je tam zopar veci navyse. V podstate, ak napisete v Ccku program pre WinCE, a nepouzijete winCE-specific veci, tak ten zdrojak bez zmien skompilujete aj pre Win32 a pobezi, cela logika tam zostala. Aj format spustitelneho suboru je takmer totozny (tzv. PE, portable executable, nevola sa to nadarmo portable), len procesor je iny. Ale nebol by to microsoft keby tam nejake veci neboli ine, ale to nieje zatial az tak podstatne.

Treba si uvedomit ze to CE je nieco ako osekany win32api aby to stacilo na graficke oknove srandy. napriklad tam nieje defualtna konzola, co je pre programatorov dost nevyhoda. Dalej su tam len widechar verzie API funkcii, cize na veci ako MessageBoxA zabudnite, radsej studujte konverzie stringov podla lokalizacie systemu :P

Takze najjednoduchsi Hell o' World bude asi pomocou MessageBoxW. Ten tam nastastie je. Najmensie PEcko ake vieme postavit bude obsahovat jednu sekciu na kod a data (nazvanu ".text") a vramci nej budu este import data. (ak ste nevedeli, importy nemusia byt v samostatnej sekcii, staci aby na ne ukazovala premenna z PE hlavicky. ibaze vecsina kompilatorov taketo nieco neumozni, toto jedna z mnohych peknych vlastnosti FASM).

Uz asi k tomu nieje co dalej nakecat, tu je zdrojak. Na jeho pochopenie treba vediet aspon zakladne minimum o ARM instrukciach, to je takzvane "mimo rozsahu tohoto dokumentu". Ohladne toho co robia niektore menej jasne instrukcie z tohoto zdrojaku si pozrite
http://board.flatassembler.net/topic.php?t=4191&start=100#39458

format PE GUI ;vytvarame PE subor, pre Graphical User
       ;interface

entry Start  ;vykonavanie programu zacina na navesti "Start"

;definicia sekcie. vsetko je jasne z popisu
section '.text' data code readable writeable executable 

;zaciatok programu
Start: 

;MessageBox ma 4 argumeny. tie sa odovzdavaju v ARM
;registroch r0, r1, r2 a r3, takze ich treba naplnit
mov r0,0   ;window owner (NULL)  
add r1,pc,Text-$-8   ;the text  
add r2,pc,Caption-$-8   ;the caption  
mov r3,0    ;style (MB_OK)  
ldr pc,[pc,MessageBoxW-$-8]    ;display message and exit  

;dalej treba zadefinovat import sekciu. Presne rovnako ako pre 
;win32, rozdiel je asi len v tom, ze cast "core_data" musi byt
;pri winCE pritomna (pri win32 nie)... aspon tak sa zatial zda.
;pre blizsie pochopenie si pozrite nejaku PE specifikaciu
data import ;tato direktiva nasmeruje na nasledujuce data
;pointer na importy v PE hlavicke

dw RVA core_data,0,0,RVA core_name,RVA core_imports
dw 0,0,0,0,0  

core_data:
dw 0x8000035A  ;winCE ordinal pre MessageBoxW
dw 0  

core_imports:
MessageBoxW dw 0x8000035A  ;winCE ordinal pre MessageBoxW
dw 0  

core_name db 'COREDLL.DLL',0
align 4

end data  

;a tu su texty ktore sme pouzili v okne
Text du 'Hello WinCE world',0  
Caption du 'ARM small PE',0  

align 4

a ako to asi vyzera v praxi:
http://student.fiit.stuba.sk/~mocko04/hello-wince-world.bmp

to je asi vsetko k teme, dajte vediet ci sa pacilo, ak ste nieco nechapali tak sa kludne pytajte, vecsinou je to chyba toho kto to vysvetluje (alebo nepozorne precitanie), atd atd. Nic moc zatial, viem, ale dajako zacat treba :]

a este pozdravujem DreVyho, CiernoDiera, brho, 42448, neologizma, a reporterov z Markizy...

vid

PS: zaujimave "studium" k teme je aj prvy winCE virus od legendarnych 29A. vyguglite lahko - "first winCE virus" napr.

PS2: Este pre x86 urcite davam do pozornosti FASM, ktory som tu dost spominal:
flatassembler.net
naozaj je to asi najlepsi soft s akym som kedy prisiel do styku ;)

    • AMR 07.06.2006 | 22:35
      Avatar blackhole_ventYl   Používateľ

      ked uz by som si to amr zohnal, windowsy by boli urcite posledne, co by som skusal programovat :)

      ---
      Riadit pracu programatorov je ako past macky.

      --- Cuchat s nadchou, to je ako sniffovat bez promiscu.
      • business 08.06.2006 | 05:26
        Avatar WooDy   Používateľ

        keby si to robil pre zivobytie tak by si si asi ideologicke veci rozmyslel

        • mne nejde o ideologiu, som 12.06.2006 | 16:33
          Avatar blackhole_ventYl   Používateľ

          mne nejde o ideologiu, som sice linuxak a viem si to vychutnat, ale neviem, preco furt kazdy keca o ideologii a sektach. ja pouzivam linux preto, ze mi je to vhodnejsie, pre pracu vyhodnejsie prostredie a podla skusenosti sa mi programuje lepsie na linuxe, ako na windowse, aj ked musim priznat, ze najlepsie sa mi programovalo svojho casu out-of-operating-system, ked som pisal nejake low level vecicky a objavoval hardware PC, popripade pri programovani mikrokontrollerov. skor by som povedal, ze sa mi paci jeho vnutorna filozofia, preto ho pouzivam.

          ---
          Riadit pracu programatorov je ako past macky.

          --- Cuchat s nadchou, to je ako sniffovat bez promiscu.
          • lepe bych to nenapsal... 13.06.2006 | 18:58
            damien   Návštevník

            lepe bych to nenapsal...

      • a este jedna vec - nieco ine 08.06.2006 | 09:37
        Avatar vid   Používateľ

        nieco ine je programovat to, to sa mozes hrajkat aj v C++ alebo .NETe ktore mas vsade silne podporovane, ale tu je velky nepreskumany potencial na vselijake internal srandicky, umoznit ludom spravat sa k tej masinke akoby patrila im a nie tomu od koho ju kupili atd....
        no a prave tymto smerom ide ten clanok, polozit zaklady pre takyto "vyskum"

        a este - keby si si takuto vecicku kupil, windowsy by boli prve co by si tam objavil

    • odporucam prestudovat 23.06.2006 | 19:46
      aqwarel   Návštevník

      odporucam prestudovat forum
      http://www.spv-developers.com
      je tam dost vela dost hustych ludi ...
      a tiez
      http://forum.xda-developers.com/

      ta prva najma smartphony a ta druhe pda-cka

      osobne si myslim ze spvdevelopers je omnoho lepsia bo mam tiez smartphone a dost som cerpal s tadial veci