Skrev visserligen att jag lagt ner diskussionen, men eftersom Reza verkar ha avslutat tråden från sitt håll och du framhärdar, så är jag väl inte sämre än att jag kan ta upp den igen. :)
PeW skrev:
Nja... vissa saker kan inte utföras i enbart C.
Jaha? Exempel vore trevligt? De relevanta sakerna i det här fallet är att läsa, skriva, och ta över interrupts. Vilka av dessa görs inte enklast i C mot Kernel-API:et? WRITE_PORT_UCHAR, READ_PORT_UCHAR, HalGetInterruptVector låter som lämpliga anrop i mina öron ..
Huvudsyftet med HAL, som du talar om, är ju just att erbjuda ett arkitektursoberoende interface/API mot hårdvaran så att man slipper använda assembler.
PeW skrev:
det som jag dock inte håller med om är att man nödvändigtvis måste använda systemanrop för en sån här sak.
Systemanrop? Var? Reza anropar usermodefunktioner i en dll (io.dll) som i sin tur mappar mot kernelmodefunktioner i en driver (io.sys). Vilka av dessa ska ersättas med icke-systemanrop i assembler? I usermode går det inte. Och i kernelmode finns det ingen anledning. På den här punkten är du väldigt svävande ..
PeW skrev:
Det jag är ute efter är att skriva direkt till porten från appsen.
Ja. Och det är ju exakt det som inte går. Man kan inte skriva direkt till porten från en app i NT/2000/XP oavsett om den är skriven i maskinkod, assembler, C, JavaScript, HTML eller något annat. (I alla fall inte om man inte använder odokumenterade features/buggar i operativet som kan sluta att fungera med nästa service pack.) Antingen gör man det via en befintlig driver (den lösning du hävdar är krånglig och ger problem) eller så skriver man en egen driver (som du tycks föreslå). Det finns inget tredje sätt.
PeW skrev:
så varför inte endast läsa port och hämta tecken direkt?
Från usermode? Isåf se ovan!
PeW skrev:
Vill man absolut använda systemcalls och förmå windows till detta så är inte mitt förslag gångbart.
Återigen: Begränsningen består inte i att man använder "systemcalls". Begränsningen ligger helt och hållet i det faktum att man befinner sig i usermode. Så länge man befinner sig i usermode (på fel sida om IRQ-gate:n) kan man inte göra vissa saker oavsett om man skriver i assembler, eller inte. För att göra det Reza vill så måste man befinna sig i kernelmode dvs kod som ligger inne i en driver.
PeW skrev:
Kändes bara som overkill för en sån här uppgift eftersom det tydligen ger problem
Problem? Läsningar och skrivningar fungerar. Problemet är att det är svårt att hitta en gratis lösning som tillhandahåller interrupthantering. Alternativet att skriva en egen driver, vilket i praktiken blir vad du föreslår, är nog väldigt mycket krångligare. Vi talar veckor/månader med blåskärmar och buggar (helt beroende på hur erfaren man är och vilken typ av driver man skriver). Sen får ju även den nya drivern en installationsfas som du talar om tidigare. Den måste insertas på rätt ställe i driverstacken (om man inte helt avser att ersätta den befintliga).