Creați un driver kernel-mode în mediu Borland Delphi

introducere
Cod: de la pornirea motorului
formate de fișier obiect de conflict
conducător auto a scrie
Compilare, asamblare și verificare a conducătorului auto
rezumat

Creați un driver kernel-mode în mediu Borland Delphi

Programare pe sistemele de linie Windows NT poate fi împărțit în două părți fundamental diferite - crearea unui cod de modul de utilizator și codul kernel-mode.

Arhitectura de Windows utilizează doar două inele: 0-a și a 3. Într-un cod de inel ruleaza pe stratul de grad zero de abstractizare hardware (HAL), nucleul sistemului și drivere diferite, inclusiv drivere de dispozitiv. Al 3-lea serviciile de sistem de inel sunt executate, programele care interacționează cu utilizatorul, precum și un cod auxiliar pentru a apela funcțiile de nucleu ale modului de utilizare.

Dezvoltarea driver, Microsoft oferă Kit Driver Development (DDK), care este un set de fișiere antet, utilități, și documentația. Dintre toate documentele din motive interne standardele de conformitate corporative, mostre de cod și de a construi instrumente în DDK axat pe limbi C / C ++. Desigur, pentru dezvoltarea de drivere de majoritatea programatorilor se bucură de o ușor integrabil cu instrumente DDK lansat, desigur, la fel de la Microsoft - cum ar fi Visual C. Pe internet sunt, de asemenea, materiale disponibile legate de dezvoltarea conducătorului auto în limba Assembler, ci ca o instrumente de compilare utilizate din nou Microsoft Macro Assembler și de asamblare inclus cu DDK.

Vorbind despre „gunoi care vine cu DDK“, „colector al Microsoft“, sau pur și simplu un „colector“, ne referim la link.exe. vine cu mai multe produse Microsoft, inclusiv reale DDK, Assembler Macro, Visual C, și altele. Diferențele dintre versiunile programului pentru acest articol nu este fundamental.

Cod: de la pornirea motorului

Se întâmplă ca sistemele de operare Windows sunt scrise în C / C ++. Nu este surprinzător faptul că DDK este axat pe C / C ++ - compilatoare. Pentru aceste limbi, procesul de conversie a codului sursă în cod mașină are loc în două etape, în mod tradițional - compilarea și de asamblare. În procesul de elaborare a programului sursă este convertit în așa-numitele module obiect, care conțin, de obicei, cod nativ, precum și informații privind exportul de variabile și funcții. Cuvântul „obișnuit“ este folosit aici pentru motivul că unele compilatoare oferă o oportunitate de a pune în modulele obiect nu sunt cod nativ, iar codul de intermediar așa-numitul (vag amintind de MSIL și bytecode Java), care permite apoi să optimizeze codul la nivelul întregii aplicații, Nu există module obiect separate. Al doilea pas este adunarea. Asamblarea după compilare generează unul sau mai multe module obiect și biblioteci legate static numit imagine executabil (imagine executabil). imagine executabilă este construit în conformitate cu cerințele sistemului de operare țintă și conține procesorul de cod mașină direct executabil, precum și diverse informații auxiliare.

Creați NT kernel-mode driver de fișier este, de asemenea, obiectul acestui sistem. Asamblare generează imagine executabil, indicând în antetul că este driver-ul NT-kernel-mode, în conformitate cu opțiunile la asamblarea.

formate de fișier obiect de conflict

Pe „kompilyatorostroeniya“ zori de Windows compilatoarelor toate dezvoltatorii să adere la un format comun fișier obiect - obiect Modul fișier (OMF), propus de Intel Corporation. In timp ce era posibil, de exemplu, pentru a crea un fișier obiect în mediul de Borland Turbo Assembler și conectat la proiectul creat în Microsoft C, fără prea mari dificultăți.

Un exemplu frapant al influenței politicii corporative pe probleme tehnice a fost compilatoare de tranziție ale Microsoft Corporation în formatul standard de fișiere obiect COFF (Common Object File Format). Din punctul de vedere al utilizatorilor de compilatoare, și formate OMF Coff practic imposibil de distins, dar cu perspectiva Microsoft a fost justificată de faptul că este de asemenea format standard de fișier obiect COFF într-un mediu UNIX. Astfel, tranziția ar trebui să fie văzută ca o priveliște îndepărtată pe software-ul cross-platform creat.

Borland Corporation, unul dintre cei mai mari producători de compilatoare pentru Windows, a declarat că Microsoft «re-inventat roata“, și că, în produsele Borland va continua să utilizeze Intel format OMF, dar în același timp, a făcut bănuitor sincronă unele modificări în compilatoare. Din păcate, versiunea Delphi de mai sus 3 creează incompatibile cu formatul Intel OMF, deși similare în aparență.

În momentul de față, ca urmare a „lupta“ un compilator giganți pierde ca, în general, se întâmplă, au fost programatori. Este demn de remarcat faptul că colectorul de curent de la Microsoft are capacitatea de a converti formatul Intel OMF la COFF. compilatoare implicit moderne Borland (fără opțiuni suplimentare) emise de imagine direct executabil, ocolind etapa de generare a unui fișier obiect. Opțiunea de a genera un fișier obiect în compilatoare Borland sunt, dar din cauza modificărilor efectuate de Borland fișiere obiect de format sunt înțelese doar de cele mai multe compilatoare Borland, și Microsoft de asamblare nu le recunosc ca fiind valabile.

Cu toate acestea, există un număr mare de programatori care folosesc în activitatea lor profesională, practic, Borland Delphi. Unii dintre ei în sarcinile lor trece mai devreme sau mai târziu, din interfața vizuală tehnologia de proiectare și de lucru cu tehnologie de baze de date la sarcini de nivel scăzut, cu sistemul de operare, a alerga într-un greu de atins la prima vedere, bariera care separă modul de utilizator și modul de kernel. În mintea majorității programatorilor în acest moment destul de ferm aviz stabilit că înseamnă Borland Delphi pentru a crea un driver NT-kernel-mode nu se poate. Este adevărat?

conducător auto a scrie

Imaginea executabil pentru Windows nativ subsistemului, să-l puneți pur și simplu - NT conducător auto-kernel-mode, codul sursă este scris în Object Pascal (numit acum limba Delphi în sine), puteți crea. Dar, înainte de a face acest lucru, este necesar să se clarifice anumite aspecte importante.

În primul rând, colectorul de la Microsoft până în prezent singurul care este capabil să genereze o astfel de imagine executabil, asa ca nu fac în nici un caz fără ea.

În al doilea rând, colector implicit Delphi built-in injecteaza orice cod executabil al dvs. Run-Time Library (RTL), și apoi compilatorul solicită anumite funcții ale acestui RTL pentru a pune în aplicare unele dintre caracteristicile lingvistice. Deoarece RTL Delphi este proiectat pentru a efectua în modul de utilizare, atunci, în mod evident, și caracteristicile de limbă Delphi, care sunt axate pe funcționalitatea RTL, va trebui să sacrifice. Aceste caracteristici includ, de exemplu, suport pentru matrice dinamice, inclusiv tipuri șir și operații șir, clase de sprijin, Run-Time Type Information (RTTI), etc.

În al treilea rând, numai Win32-versiuni de Delphi, care au creat fișierele obiect care sunt pe deplin compatibile OMF standard sunt Delphi 2 și Delphi 3. Așa că cei care sunt obișnuiți să folosească caracteristicile lingvistice ale versiunilor ulterioare, cum ar fi supraîncărcarea funcțiilor și procedurilor de suprasarcină de directivă, trebuie să dea de la ei.

În al patrulea rând, textul sursă de conducător auto în Delphi va avea, de asemenea, propriile lor specificul. De exemplu, colectorul va trebui să specificați așa-numitul punct de intrare - funcție în corpul conducătorului auto, cauzată de sistemul atunci când conducătorul auto este inițializat. Fișierul obiect care este generat pentru programul de bibliotecă Delphi sau tipul de proiect. nu conține un personaj numit puncte de intrare, astfel încât trebuie să utilizați tipul de unitate de proiect.

Codul care implementează funcționalitatea minimă a conducătorului auto, și anume, posibilitatea de pornire și oprire, exprimate pe.

Fii atent cu așa-numitele „apel convenție» (convențiile de apel)! Ambele funcții driver interne și funcțiile de import nativ API implică acordul stdcall. Cu toate acestea, ar trebui să monitorizeze îndeaproape semnătura fiecărei funcții importate în ntoskrnl.lib. pentru că dacă după numele funcției nu este necesar să se semneze „@“ și numărul de biți în stivă deținute de parametrii funcției, această funcție trebuie să fie importate în cdecl acord. ca mai sus cu DbgPrint funcția. Funcția de apel indicat în mod adecvat de asteptare convenție, aproape întotdeauna duce la un accident de sistem sau BSOD.

Compilare, asamblare și verificare a conducătorului auto

Mai jos este o listă de fișiere care au nevoie pentru a crea un driver.

Borland Delphi 3 de livrare:

  • dcc32.exe - compilator, invocat de la linia de comandă;
  • rlink32.dll - biblioteca de asamblare care pune în aplicare imaginea executabil (deși noi pur și simplu nu este nevoie de această adunare, fără o astfel de compilator bibliotecă nu poate porni);
  • sysinit.dcu și system.dcu - compilate module Delphi RTL.

Livrarea de Microsoft NT DDK:

  • link.exe - colector;
  • mspdb50.dll - să sprijine colector de bibliotecă;
  • ntoskrnl.lib - bibliotecă care descrie funcțiile importate din ntoskrnl.exe - modulul care conține majoritatea modului API kernel.

Compilarea Codul se execută după cum urmează: