Quelltext /~heha/hs/glpntdrv.zip/glpntdrv.h

#pragma once

#ifdef DRIVER		// Kopfdatei auch für User-Mode-Programme zugänglich machen

extern "C" {
#include <ntddk.h>
}

#define elemof(x) (sizeof(x)/sizeof(*(x)))
typedef ULONG BOOL;	// Das DDK kennt kein BOOL, BYTE, WORD, DWORD. Leider.

#endif//DRIVER

/******************
 ** glpntdrv.cpp **
 ******************/

#define IOCTL_GALEP CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_NEITHER,FILE_ANY_ACCESS)	// 0x00222003
// Dieser IOCTL ist nicht thread-sicher, ja nicht einmal geräte-sicher.

// Bidirektionaler Kommandopuffer für obiges IOCTL_GALEP
// Enthält Mikrokode zur Ausführung im Kernel-Mode (oder USB-Mikrocontroller) ohne Ringübergänge
// Genau diese Datenstruktur wird beim Aufruf von GLPWOW.DLL:ExecKernelDriver() durchgereicht; nichts weiter.
// Daher kann man (sicherlich) auch durch Ersetzen der GLPWOW.DLL Treiber- und USB-Probleme lösen.
struct CMDBUF{		//sizeof=0x9CA0
 ULONG errorcode;	// Fehlerkode
			// 0 kein Fehler (wird beim DeviceIoControl-Handler zurückgesetzt)
			// 1000 bei SetLptAddress{19} FindAndAllocatePort()
			// 1001 bei Funktionsnummer > 24
			// 1002 bei SetLptAddress{19} HalTranslateBusAddress()
 ULONG retval;		// Returnkode vieler Funktionen (diese können blödsinnigerweise nicht gestapelt werden)
 ULONG BusySpeed;	// Ermittelte BUSY-Geschwindigkeit
 ULONG BAADFOOD[8];	// ungenutzt im Treiber
 struct{		// Liste mit (bis zu) 5000 argn+func-Paaren, gewissermaßen Mikrokode, vergleichbar USB2LPT-API
  ULONG arg;		// Funktionsparameter
  ULONG func;		// Funktionsindex 0..24, die 24 schließt die Liste ab. Siehe kdoio.cpp:Funktionstabelle
 }n[5000];
 ULONG address;		// Zugewiesene Adresse des Parallelports (wie's scheint)
 long loopcount;	// Wiederholungszähler für in-modify-out auf Datenport (unveränderliche Daten! Schwerhörigkeit?)
 long busywaitcount;	// Anzahl verworfener IN bis zum Auswerten von Busy (Spike-Filter)
 long busyloopcount;	// Max. Anzahl von (busywaitcount+1) IN bis zum Akzeptieren von BUSY (svw. TimeOut)
 bool flag_9C7C;	// KrnlInterfaceHdw::ResetL1_Q00() testet und setzt es auf <false>, niemand auf <true>
 UCHAR flag_9C7D;	// Parameter für ResetL1 (unklar)
 UCHAR flag_9C7E;	// Parameter für SetL1 (unklar)
 UCHAR flag_9C7F;	// KrnlInterfaceHdw::SetL1_Q11() testet und setzt es auf 0x10, niemand löscht es
 ULONG DEADBEEF[7];	// ungenutzt im Treiber
 bool interfacemode;	// SetL1 und ResetL1 setzen auf <true>, viele andere Funktionen auf <false>
 UCHAR unused[3];	// zur DWORD-Ausrichtung
};

#ifdef DRIVER		// Der Rest interessiert User-Mode-Programme nicht

// Eigentlich sollte ein Treiber gar keine statischen Daten benötigen,
// und wenn doch, dann nur treiber-spezifische, nicht geräte- oder gar thread-spezifische.
// Bei Conitec ist das aber damals wohl noch nicht durch die Gehirnwindungen gesickert,
// da wurde wohl mal mit heißer Nadel ein wildes DOS-Programm konvertiert.
// Mal C++- und mal C-Linkage, wie in glpntdrv.sys vorgefunden.
extern CMDBUF *pCmdBuf;
extern "C" NTSTATUS doio_error;
extern ULONG i;
extern ULONG IsIrplHigh;
extern ULONG DisableCallCount;

extern "C" {
UCHAR READ(UCHAR offset);
void WRITE(UCHAR offset, UCHAR data);
void SetIrqlHigh();
void ResetIrql();
void SetLPTAddress(CMDBUF*cmdbuf);
void ExternFreePort();
void ExternalDelay(ULONG us);
}

/***************
 ** kdoio.cpp **
 ***************/

void Enable();
extern "C" bool doio(CMDBUF*);

/**************************
 ** KrnlInterfaceHdw.cpp **
 **************************/

// Im Gegensatz zur Conitec-Implementation sind die Memberfunktionen
// hier ausnahmsweise nicht "__thiscall" sondern "static".
// Spart Kode um das Herumschleppen von ECX.
// Richtiger wäre deren Vererbung von DEVEXT.

// Die Klassenmember müssen sowieso alle <public> sein,
// also erspare ich mir das Schlüsselwort <class>.
struct BasicIO {
 static UCHAR Busy();
 static void DataOut(UCHAR b);
};

struct KrnlInterfaceHdw:BasicIO {
 static ULONG WaitForNotBusy();
 static void SwitchInterfaceMode(bool);
 static void SetL1_Q11();
 static void ResetL1_Q00();
 static void SetReadbackChannel(UCHAR);
 static USHORT ReadDatenRegByte();
 static USHORT ReadDatenRegWord();
 static ULONG ReadDatenRegPin1_20();
 static ULONG ReadDatenRegPin21_40();
 static USHORT CalcTimerWert(ULONG);
 static void LoadTimerSerReg(USHORT);
 static void StartPgmImpuls();
 static BOOL MeasureBusySpeed();
};

extern KrnlInterfaceHdw io;
// Wegen 100% "static" eine Dummyvariable, laut C++-Standard ein Byte (sizeof(io)==1, nicht 0)

#endif//DRIVER
Vorgefundene Kodierung: UTF-80