Domanda

Prima di buttarmi a capofitto nel C#...

Ho sempre pensato che C, o forse C++, fosse la soluzione migliore per sviluppare driver su Windows.Non mi piace l'idea di sviluppare un driver su una macchina .NET.

Ma .NET sembra essere la strada che MS si sta dirigendo verso lo sviluppo di applicazioni, quindi ora mi chiedo:

  • Le persone utilizzano C# per sviluppare driver?
  • Devi eseguire molti hook API o C# ha le funzionalità per interfacciarsi con il kernel senza troppi hacker?
  • Qualcuno può parlare dell'affidabilità e della sicurezza dell'esecuzione di un programma C# più vicino a Ring 0 di quanto sarebbe normalmente?

Voglio che i miei dispositivi siano utilizzabili in C# e se lo sviluppo dei driver in C# è maturo questa è ovviamente la strada da percorrere, ma non voglio dedicare molti sforzi se non è consigliato.

  • Quali sono alcune buone risorse per iniziare, ad esempio, a sviluppare un semplice driver per porta seriale virtuale?

-Adamo

È stato utile?

Soluzione

Non è possibile creare driver di dispositivo in modalità kernel in C# poiché il runtime non può essere caricato in modo sicuro in ring0 e funzionare come previsto.

Inoltre, C# non crea file binari adatti al caricamento come driver di dispositivo, in particolare per quanto riguarda i punti di ingresso che i driver devono esporre.La dipendenza dal runtime per entrare e analizzare e JIT il binario durante il caricamento impedisce l'accesso diretto necessario al sottosistema del driver per caricare il binario.

Sono in corso lavori, tuttavia, per portare alcuni driver di dispositivo in modalità utente, puoi vedere un'intervista Qui con Peter Wieland del team UDMF (User Mode Driver Framework).

I driver in modalità utente sarebbero molto più adatti per il lavoro gestito, ma dovrai cercare un po' su Google per scoprire se C# e .NET saranno supportati direttamente.Tutto quello che so è che i driver a livello di kernel non sono realizzabili solo in C#.

Tuttavia, probabilmente puoi creare un driver C/C++ e un servizio C# (o simile) e fare in modo che il driver comunichi con il codice gestito, se devi assolutamente scrivere molto codice in C#.

Altri suggerimenti

Questo ti aiuterà in un certo senso: Kit driver Windows

Non è una risposta diretta alla tua domanda, ma se sei interessato potresti dare un'occhiata Progetto Singolarità.

Qualcuno può parlare dell'affidabilità e della sicurezza dell'esecuzione di un programma C# più vicino a Ring 0 di quanto sarebbe normalmente?

C# viene eseguito nella macchina virtuale .NET, non è possibile spostarlo più vicino all'anello 0 rispetto alla VM e la VM viene eseguita nello spazio utente.

Se sei disposto a provare un framework proprietario, Il toolkit WinDriver di Jungo supporta lo sviluppo di driver in modalità utente (anche in codice gestito) per dispositivi USB, PCI e PCI-E.

Microsoft ha una serie di progetti di ricerca per avere un sistema operativo a codice gestito, in altre parole uccidere con l'API Win32.

Vedi l'articolo di Mary Jo Foley: Ricostruire un'eredità

Scrivere driver di dispositivo in .net non ha senso per le versioni attuali di Windows.

<speculazione>
Si dice che MS stia investendo molti soldi per portare Singularity al livello successivo.Basta cercare Midori.Ma questo è il 2015+
</speculazione>

Se ricordo bene, il Progetto Dokan è un driver di file system in modalità utente, che consente anche l'esecuzione del codice .NET da parte di un driver di sistema: https://github.com/dokan-dev/dokan-dotnet.

Quindi, potresti sviluppare un "driver" C# (in realtà un'applicazione in modalità utente), che viene quindi chiamato/invocato da un driver in modalità kernel C++.Il driver del kernel potrebbe semplicemente passare tutto senza manipolare i dati e agire come un semplice wrapper.
Inutile dire che è molto pericoloso e molto probabilmente finiresti con un BSOD (l'ho provato).


Leggermente correlato:

IL Progetto Cosmo è un sistema operativo open source, sviluppato in C# e funzionante
"driver (kernel)" e applicazioni a livello utente scritte completamente in C#/F#/VB.NET/...

Sebbene tecnicamente si tratti di driver a livello di kernel, il sistema operativo non è più Windows ma il tuo, quindi immagino che questa non sia una risposta corretta ......

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top