Direktes Port I/O unter NT-Systemen
Lust, das FDD led blinken zu lassen? Win NT erlaubt leider kein direktes Port I/O fuer Programme in Ring 3, also braucht man einen Ring 0 – Treiber zum Ansteuern der I/O Ports. Hierfuer eignet sich unter Anderem
der Treiber PortTalk, welcher unter http://www.beyondlogic.org/porttalk/porttalk.htm erhaeltlich ist.
Mit diesem Treiber ist das Ganze dann kein Problem mehr:
Wir gehen auf Port-Adresse 0x3F2
und toggeln das 5. Bit.
Simples Beispiel, was ich gecodet hab (benötigt pt_ioctl.c aus besagtem Paket):
#include "windows.h"
#include "stdio.h"
#include "process.h"
#include "pt_ioctl.c"
#define DOR 0x3F2 /\* motor drive control bits \*/
#define ENABLE_INT 0x0C /\* used for setting DOR port \*/
int KeepBlinking;
void FDDlight(BYTE drive, BYTE status) {
BYTE value = drive | ENABLE_INT;
value|=status<<(4|drive); /\* Set Motor bit \*/
outportb(DOR, value);
}
void FDDblink(DWORD *interval) {
OpenPortTalk();
KeepBlinking=1;
while(1) {
FDDlight(0, 1);
Sleep(*interval);
FDDlight(0, 0);
Sleep(*interval);
if (!KeepBlinking) break;
}
ClosePortTalk();
}
int main(void) {
DWORD interval=500;
printf("Watch your FDD led blinking :) Press
_beginthread(FDDblink, 0, &interval);
getchar();
InterlockedExchange(&KeepBlinking, 0);
}