Wie Ports unter MS-Win auslesen/beschreiben?

Gast #540623
Lesenswert?

Ich habe versucht ein einfaches C-Programm, das auf ein paar Ports 
liest/schreibt und unter Linux problemlos arbeitet, unter MS-Win 
(Cygwin) mit dem gcc zu compilieren, aber dort fehlen die üblichen 
Port-Befehle und die Linux-spezifischen Include-Dateien (speziell 
<sys/io.h>).
Wie kann man denn die Ports unter MS-Win auslesen und beschreiben?

Als Workaround könnte man die Assembler-Definitionen der 
Port-Funktionien nehmen, aber es sollte doch auch einfacher gehen.
#541708
Lesenswert?

Nimm einfach meinen Code, der braucht nur eine einzige include Datei:
1
#include <windows.h>
2

3

4
uint8_t inb( uint16_t portaddr )
5
{
6
  uint8_t value;
7

8
  asm volatile
9
  (
10
    "in %1, %0" :
11
    "=a" (value) :
12
    "d" (portaddr)
13
  );
14

15
  return value;
16
}
17

18
void outb( uint8_t value, uint16_t portaddr )
19
{
20
  asm volatile
21
  (
22
    "out %1, %0" ::
23
    "d" (portaddr), "a" (value)
24
  );
25
}
26

27
bool iopl()
28
{
29
  bool ret;
30

31
  HANDLE h;
32
  h = CreateFile("\\\\.\\giveio", GENERIC_READ,
33
    0, NULL, OPEN_EXISTING,
34
    FILE_ATTRIBUTE_NORMAL, NULL);
35

36
  ret = h != INVALID_HANDLE_VALUE;
37
  CloseHandle(h);
38

39
  return ret;
40
}

  
Gast #541849
Lesenswert?

Ok, also mit diesem Beispiel-Programm scheint es zu funktionieren:

#include <windows.h>
#include <stdint.h>
#include <stdio.h>

uint8_t inb( uint16_t portaddr )
{
  uint8_t value;

  asm volatile
  (
    "in %1, %0" :
    "=a" (value) :
    "d" (portaddr)
  );

  return value;
}

void outb( uint8_t value, uint16_t portaddr )
{
  asm volatile
  (
    "out %1, %0" ::
    "d" (portaddr), "a" (value)
  );
}

int iopl()
{
  int ret;

  HANDLE h;
  h = CreateFile("\\\\.\\giveio", GENERIC_READ,
    0, NULL, OPEN_EXISTING,
    FILE_ATTRIBUTE_NORMAL, NULL);

  ret = h != INVALID_HANDLE_VALUE;
  CloseHandle(h);

  return ret;
}

int main ()
{
  uint8_t u8=0;

  iopl();
  u8 = inb(888); // read from the parallel port
  fprintf(stdout,  "Read %hu from port 888.\n");
  return 0;
}
#541986
Lesenswert?

Wieso hast Du den Rückgabewert von iopl nach int gewechselt? Ich habe 
mir ursprünglich dabei gedacht, dass diese Funktione den Erfolg mit true 
signalisiert.

So zu benutzen:
1
int main()
2
{
3
  if ( !iopl() )
4
  {
5
    // giveio.sys ist auf diesem system nicht installiert
6
    error( "giveio.sys nicht installiert!" );
7
    return -1;
8
  }
9

10
  return 0;
11
}

  

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren