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 to stop");
_beginthread(FDDblink, 0, &interval);
getchar();
InterlockedExchange(&KeepBlinking, 0);
}