Du skal have fat i NT DDK, eller XP DDK ( driver development kit ), således at du kan benytte de funktioner, der er beskrevet på beyondlogic.org - jeg ved ikke om du kan skaffe de nødvendige, evt. alternative, libraries og headers andre steder - men efter en hurtig søgning på Google ser det ud til, at du skal have fat i Microsoft for at få den. XP DDK kan ikke downloades på MS side, men bestilles gratis på CD - dog tager de 25$ for at sende den til DK.
Når du så er klar med de rigtige libraries og headers, må fremgangsmåden være noget lig flg. : (sådan som jeg læser
http://www.beyondlogic.org/porttalk/porttalk.htm ) :
1) Brug PsGetCurrentProcess til at få fat på dit programs proces ID
2) Brug PsLookupProcessByProcessId til at lave proces ID'et om til en pointer til en proces.
3) Læs IOPM med
void Ke386QueryIoAccessMap(int, IOPM *);
4) Sæt den rigtige bit til 0 i det modtagne IOPM
5) Skriv ny IOPM med
void Ke386QueryIoAccessMap(int, IOPM *);
6) Definér at din proces skal bruge det netop skrevne IOPM med
void Ke386IoSetAccessProcess(PEPROCESS, int);
7) Du kan nu skrive til porten, brug evt. noget lignende trin 2 fra mit forrige svar. (dvs. du får ikke Priviledged Instruction Exception når du udfører 'out dx,al')
8) Sæt evt. IOPM tilbage til det oprindelige før du afslutter dit program - det burde dog ikke være nødvendigt, da hver proces har sit eget IOPM.