Echipa ItAssistant va ofera un tutorial la sfarsitul caruia veti putea intelege mai bine modelul de dezvoltare a Windows-ului si chiar veti putea compila singuri kernel-ul acestuia.
Introducere
In cadrul Windows Academic Program exista posibilitatea accesului la codul sursa a kernel-ului de Windows NT, prin intermediul initiativei Windows Research Kernel (WRK).
Codul sursa prezinta componentele cele mai importante din cadrul nuclelui (managementul memoriei, procese, thread-uri, scheduling, I/O manager) si poate fi folosit si modificat In scopuri non-comerciale. Se pot astfel urmari diversele mecanisme de implementare si design care stau la baza kernel-ului si se pot testa diverse alte solutii prin modificarea surselor. Accesul la sursele kernel-ului este limitat, anumite subdomenii (cum ar fi networking-ul) fiind absente.
Accesul la codul sursa pentru nucleul de Windows NT inseamna posibilitatea de modificare a acestuia si, evident, de compilare a kernel-ului si de boot-are.
Din pacate, kernel-ul de Windows nu vine cu optiuni de configurare, astfel incat procesul se rezuma la rularea comenzii de compilare si la instalarea noului kernel.
Daca se doreste un tip special de functionalitate vor trebui alterate sursele.
De asemenea, kernel-ul poate fi compilat numai pe un sistem Windows 2003 SP1 sau Windows XP x64. Versiunea curenta (WRK-1.2) nu poate fi compilata pe un sistem Windows XP x86.
Etapele de compilare sunt prezentate si In fisierul README.txt din radacina surselor.
Compilare kernel
Pentru compilarea surselor se parcurg urmatorii pasi (vom utiliza de acum inainte %wrk% ca radacina surselor de kernel de Windows):
C:\>set wrk=C:\cygwin\home\Administrator\itassistant\WRK\WRK-v1.2 C:\>set arch=x86 C:\>set path=%wrk%\tools\%arch%;%path% C:\>cd %wrk%\base C:\cygwin\home\Administrator\itassistant\WRK\WRK-v1.2\base>cd ntos C:\cygwin\home\Administrator\itassistant\WRK\WRK-v1.2\base\ntos>nmake -nologo %arch%=
Imaginea de kernel obtinuta se va regasi in %wrk%basentosBUILDEXE si va purta numele wrkx86.exe pentru un sistem cu arhitectura x86. Imaginea obtinuta este doar nucleul; modulele de kernel folosite vor fi cele existente in sistem in acel moment.
Instalare kernel
Procesul de instalare presupune copierea imaginii kernel-ului in %SystemRoot%system32:
C:\>copy %wrk%\base\ntos\BUILD\EXE\wrkx86.exe %SystemRoot%\system32\
Totusi, in afara imaginii de kernel, va trebui precizata imaginea de HAL (Hardware Abstraction Layer) care va fi utilizata.
Va trebui gasita imaginea corecta de HAL; exista trei imagini de HAL disponibile in %wrk%WS03SP1HALSx86. Pentru a afla care imagine este cea corecta va trebui utilizat linker-ul (folosind comanda link si analizata imaginea de HAL existenta In acest moment In sistem).
C:\>"C:\Program Files\Microsoft Visual Studio 8\VC\vcvarsall.bat" Setting environment for using Microsoft Visual Studio 2005 x86 tools. C:\>link -dump -all %SystemRoot%\system32\hal.dll | findstr pdb 80011530: 68 61 6C 2E 70 64 62 00 00 00 00 00 00 00 00 00 hal.pdb......... 42435B3A cv 20 00001518 918 Format: RSDS, {2ECB059A-3F06-4 285-8E30-3FDE64119692}, 1, hal.pdb
Asocierea dintre iesirea comenzii de mai sus si imaginile disponibile in %wrk%WS03SP1HALSx86 este (dupa cum este precizat si In README.txt):
halacpi.dll -> halacpim.dll halaacpi.dll -> halmacpi.dll halapic.dll -> halmps.dll
De obicei, imaginea cautata va fi halmacpi.dll.
Imaginea corecta de HAL va fi copiata tot in %SystemRoot%system32:
C:\>copy %wrk%\WS03SP1HALS\x86\halmacpi\halmacpi.dll %SystemRoot%\System32\
Configurare boot.ini
Pentru a boota proaspatul kernel va trebui adaugata o intrare in C:boot.ini, fisierul de configurare pentru loader-ul de Windows NT.
Se recomanda copierea unei linii de bootare existente si modificarea ei pentru a boota noul kernel si noua imagine de HAL, ca mai jos:
[boot loader] timeout=30 default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS [operating systems] multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Windows Server 2003, Standard" /fastdetect /NoExecute=OptOut multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Windows Server 2003, Standard - WRK-1.2 compiled kernel" /kernel=wrkx86.exe /hal=halmacpi.dll /fastdetect /NoExecute=OptOut
Pentru vizualizarea boot.ini In Windows Explorer, va trebui sa accesati Tools -> Folder Options -> View -> Hide protected operating system files (Recommended). Fisierul este implicit read-only; pentru editare va trebui sa anulati aceasta optiune.
Alternativ puteti face acest lucru din linia de comanda:
C:\>attrib -h -s -r boot.ini
Dupa configurarea boot.ini, sistemul poate boota in noul kernel compilat.
- How to manually edit the Boot.ini file in a Windows Server 2003 environment
- Available switch options for the Windows XP and the Windows Server 2003 Boot.ini files
Windows Research Kernel (WRK)
Windows Research Kernel (WRK) este parte a Windows Academic Program si ofera accesul la codul sursa pentru kernel-ul de Windows in medii academice. Din aceeasi initiativa Microsoft mai fac parte si Windows OS Internals Curriculum Resource Kit si Project Oz.
WRK contine partile importante din nucleul pentru Windows XP x64 si Windows 2003 SP1 impreuna cu utilitare necesare pentru compilarea si testarea unor versiuni proprii de nucleu. Sursele incluse se refera la subsisteme precum procese, thread-uri, planificator, I/O manager, memorie virtuala.
Sursele si utilitare pot fi folosite numai in scopuri non-comerciale conform licentei.
In acest moment, sursele nucleului pus la dispozitie pot fi compilate si testare numai pe sisteme cu Windows 2003 x86/x64 sau Windows XP x64.
LiveKd (Windows)
Asemanator cu gdb, pe Windows exista posibilitatea analizei dinamice a kernel-ului folosind Live Kernel Debugger – LiveKd. Pachetul este oferit de SysInternals.
Pentru lucrul cu acesta aveti nevoie de pachetul Debugging Tools de la Microsoft. Acesta contine debugger-e peste care lucreaza livekd, cum ar fi kd sau WinDbg. Aceste debugger-e sunt, de obicei, folosite in cadrul unui sistem de doua calculatoare legate printr-un cablu serial: un calculator pe care se face debug iar altul care realizeaza debug-ul. LiveKd permite inspectia kernel-ului In timp ce acesta ruleaza.
LiveKd foloseste ca backend kd, WinDbg sau Dumpchk (kd este implicit). Inainte de pornire, Live Kd va inspecta configuratia curenta pentru a detecta prezenta simbolurilor de debug ale sistemului de operare; daca acestea nu sunt prezente se va cere sa fie descarcate.
Deosebirea intre kd si WinDbg este aceea ca WinDbg permite configurare prin interfata grafica; setul de comenzi de depanare este, insa, apropiat.
Un exemplu de sesiune LiveKd este prezentata mai jos:
C:\Documents and Settings\Administrator>livekd LiveKd v3.0 - Execute i386kd/windbg/dumpchk on a live system Sysinternals - www.sysinternals.com Copyright (C) 2000-2005 Mark Russinovich Launching C:\program files\Debugging Tools for Windows\kd.exe: ... kd> dd nt!ExAllocatePool 80809627 8b55ff8b 6f4e68ec 75ff656e 0875ff0c 80809637 08be3ee8 08c25d00 50535300 01f08fe8 80809647 5a09e900 c0330000 0059b8e9 90909000 80809657 ffffff90 94d861ff 94d87480 90909080 80809667 ffffff90 96410cff 96411f80 90909080 80809677 ffffff90 96427cff 96429280 90909080 80809687 ffffff90 9642d9ff 9642ec80 90909080 80809697 ff8b9090 80ec8b55 89f7cc3d 840f0080 kd> u nt!ExAllocatePool nt!ExAllocatePool: 80809627 8bff mov edi,edi 80809629 55 push ebp 8080962a 8bec mov ebp,esp 8080962c 684e6f6e65 push 656E6F4Eh 80809631 ff750c push dword ptr [ebp+0Ch] 80809634 ff7508 push dword ptr [ebp+8] 80809637 e83ebe0800 call nt!ExAllocatePoolWithTag (8089547a) 8080963c 5d pop ebp kd> dd nt!KiTimerExpireDpc 808a81c0 00200113 00000000 00000000 8081fc62 808a81d0 00000000 00000000 00000000 00000000 808a81e0 808a81e0 808a81e0 00000000 00000000 808a81f0 808a81f0 808a81f0 00000000 00000000 808a8200 00000000 00000000 808a8208 808a8208 808a8210 817a62c0 00000000 00000000 00000000 808a8220 00040001 00000000 817a6368 817a6368 808a8230 00000000 00000000 00000000 00000000 kd> dt nt!_KDPC +0x000 Type : UChar +0x001 Importance : UChar +0x002 Number : UChar +0x003 Expedite : UChar +0x004 DpcListEntry : _LIST_ENTRY +0x00c DeferredRoutine : Ptr32 +0x010 DeferredContext : Ptr32 Void +0x014 SystemArgument1 : Ptr32 Void +0x018 SystemArgument2 : Ptr32 Void +0x01c DpcData : Ptr32 Void kd> dt nt!_KDPC 808a81c0 +0x000 Type : 0x13 '' +0x001 Importance : 0x1 '' +0x002 Number : 0x20 ' ' +0x003 Expedite : 0 '' +0x004 DpcListEntry : _LIST_ENTRY [ 0x0 - 0x0 ] +0x00c DeferredRoutine : 0x8081fc62 nt!KiTimerExpiration+0 +0x010 DeferredContext : (null) +0x014 SystemArgument1 : (null) +0x018 SystemArgument2 : (null) +0x01c DpcData : (null) kd> dd nt!KiTimerExpiration 8081fc62 8b55ff8b 94ec81ec fa000000 18a100eb 8081fc72 8bffdf00 df00140d 1c053bff 89ffdf00 8081fc82 4d89e445 07850fe0 a10000c7 ffdf000c 8081fc92 00080d8b 053bffdf ffdf0010 89ec4589 8081fca2 850fe84d 0000c6f1 e7fc0d8b 8bfb8089 8081fcb2 d18b1045 fa81d02b 00000200 5a3d830f 8081fcc2 65830003 565300f4 01ffe181 8d570000 8081fcd2 4d89ff70 f845c7cc 00000018 04fc45c7 kd> u nt!KiTimerExpiration nt!KiTimerExpiration: 8081fc62 8bff mov edi,edi 8081fc64 55 push ebp 8081fc65 8bec mov ebp,esp 8081fc67 81ec94000000 sub esp,94h 8081fc6d fa cli 8081fc6e eb00 jmp nt!KiTimerExpiration+0x10 (8081fc70) 8081fc70 a11800dfff mov eax,dword ptr ds:[FFDF0018h] 8081fc75 8b0d1400dfff mov ecx,dword ptr ds:[0FFDF0014h] kd> q quit: Execute Kd again? (y/n) n Exiting LiveKd. C:\Documents and Settings\Administrator>
Comenzile utilizate in cadrul acestei sesiuni de debug sunt:
- dt (dump using type information) – permite analiza tipurilor de date din sistem (cum este spre exemplu KDPC)
- dd (dump memory) – permite analiza diverselor variabile, precizând continutul unei anumite locatii de memorie; poate primi ca parametru o adresa sau un simbol (asemanator cu comanda x de la gdb)
- u (unassemble) – permite dezasamblarea codului unei functii
Un simbol poate fi parte a unui domeniu. Simbolurile de kernel sunt precedate de nt! pentru a se specifica faptul ca sunt simboluri de kernel.
Informatii complete despre functionarea depanatorului si comenzile utilizate gasiti In documentatia asociata (Debugging Help.chm).
Integrare LiveKd In WinDbg
Una dintre cele mai usoare forme de utilizare a LiveKd este prin intermediul WinDbg, care ofera interfata grafica pentru depanarea nucleului Windows.
Folosirea LiveKd In WinDbg Inseamna activarea optiunii Local Debugging. Pentru aceasta se acceseaza secventa de meniuri: File -> Kernel Debug (CTRL+K) -> Local.
Documentatie
Dezvoltarea kernel-ului are un grad sporit de dificultate raportat la programarea din user space. API-ul diferit, necesitatea cunoasterii amanuntite a sistemului pe care se lucreaza si a structurii kernel-ului necesita o etapa de pregatire suplimentara. Documentatia asociata este destul de eterogena, fiind nevoie de inspectia mai multor surse pentru a avea o intelegere completa a unui aspect.
Documentatie Windows
Documentatia principala de Windows este cea care vine cu Windows DDK (Driver Development Kit). Alternativ ea poate fi accesata de pe site-ul Microsoft. Informatii si utilitare se pot regasi si la SysInternals, site creat de Mark Russinovich (unul din autorii Inside Windows, 4th Edition) sau la Code Project. Desi cu mai putine resurse de documentatie decat kernel-ul Linux, Internet-ul ofera multe informatii.
In mod evident, nu trebuie ignorat accesul la codul sursa, care poate oferi informatii acolo unde documentatia nu este suficienta.
Sursa tutorial: http://elf.cs.pub.ro/so2/wiki/
Related posts:
- Compilarea si Instalarea kernel-ului Linux
- Prezentare RSS Gadget din Windows 7/Vista
- WinToFlash – Cum instalezi Windows de pe USB
- Instalare Microsoft Windows 8 Developer Preview
- Cum se instaleaza corect Windows XP – Partea I



Marfӑ tutorial!!!
Foarte interesant… Astazi am invatat ceva nou
Ma bucur ca v-a fost de folos