#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-8 | 0
|