On a vu du point de vue de l'application utilisatrice
on va utiliser surtout la fonction DeviceIoControl qui échange des tampons
mémoire d'entrée et de sortie et un code de fonction. Il nous faut une
interface partagée entre l'application cliente et le driver qui définit ça :
/***************************************************************************
* INTERFACE COMPOSANT : MONDRIVER
***************************************************************************/
#ifndef MONDRIVER
#define MONDRIVER
/***************************************************************************
* code d'identificaton : MONDRIVER
* *
* réutilisabilité : driver sous NT *
* *
* *
* *
* description : interface externe du driver
utilisé pour la construction du driver
mais aussi pour son utilisation depuis une application
*
//
// définition des clefs bases de registre
// nom du device sous SYSTEM\\CurrentControlSet\\Services
#define DRIVER_NAME "DriverName"
#define LDRIVER_NAME L"DriverName"
// contenu des messages
// en entrée (msgin) et en sortie (msgout)
// types de messages communs
#pragma pack(push, 4)
typedef struct{long reserve;} TDriverMsgRien; // pas d'info
typedef struct
{
int card;
}TDriverMsginCard; // seulement un numéro de carte existe en entrée et en sortie
typedef struct
{
int status; // Le code de retour
}TDriverMsgOutSTATUS; // seulement un status en sortie
typedef TMONDRIVERNtMsgCard TDriverNtMsgInSET_CURRENT_CARD;
typedef TMONDRIVERNtMsgOutSTATUS TDriverNtMsgOutSET_CURRENT_CARD;
#pragma pack(pop)
// type du driver
// valeurs entre 0-32767 reservé pour microsoft
// valeurs entre 32768-65535 reservé pour l'utilisateur
// en principe ce numéro doit être unique
#define FILE_DEVICE_MONDRIVERNT 0x00008300
// code de controle pour DEVICEIO
// valeurs entre 0-2047 reservé pour microsoft
// valeurs entre 2048-4095 pour les clients
#define MONDRIVER_IOCTL_INDEX 0x830
#define IOCTL_INITIALIZE CTL_CODE( FILE_DEVICE_MONDRIVERNT, MONDRIVERNT_IOCTL_INDEX,
METHOD_BUFFERED, FILE_ANY_ACCESS )
#define IOCTL_RE_INITIALIZE CTL_CODE( FILE_DEVICE_MONDRIVERNT, MONDRIVERNT_IOCTL_INDEX+1,
METHOD_BUFFERED, FILE_ANY_ACCESS )
#define IOCTL_WRITE_PORT_UCHAR CTL_CODE(FILE_DEVICE_MONDRIVERNT,MONDRIVERNT_IOCTL_INDEX +2, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_SET_CURRENT_CARD CTL_CODE(FILE_DEVICE_MONDRIVERNT,MONDRIVERNT_IOCTL_INDEX +3,
METHOD_BUFFERED, FILE_ANY_ACCESS)
#endif