Installer le driver
La fonction ci-dessous utilise la fonction CreateService pour déclarer le
driver (serviceExe = fichierDriver.sys)
A partir de là, le driver apparaît dans la liste des périphériques
(panneau de contrôle, périphérique)
// fonction d'installation du driver
BOOL InstallDriver(IN SC_HANDLE SchSCManager,IN LPCTSTR DriverName,IN LPCTSTR ServiceExe )
{
SC_HANDLE schService;
DWORD err;
// crée un service et le fait connaitre de NT en l'ajoutant dans la registry
// équivalent à créer une clef par "regini nomfichier.ini" qui contient
// \registry\machine\system\currentcontrolset\services\Simpldrv
// Type = REG_DWORD 0x00000001
// Start = REG_DWORD 0x00000003
// Group = Extended base
// ErrorControl = REG_DWORD 0x00000001
schService = CreateService (SchSCManager, // registry
DriverName, // nom du service
DriverName, // nom à afficher
SERVICE_ALL_ACCESS, // type d'accés
SERVICE_KERNEL_DRIVER, // type de driver
SERVICE_DEMAND_START, // type de lancement
SERVICE_ERROR_NORMAL, // type d'ereur de control
ServiceExe,
NULL, // pas d'ordre de chargement
NULL,
NULL,
NULL, // nom de compte dans le domaine
NULL // pas de password
);
if (schService == NULL) {
err=GetLastError();
#ifdef _CONSOLE
if ( err == ERROR_SERVICE_EXISTS)
{ printf ("CreateService, ERROR_SERVICE_EXISTS\n");
}
else
{ printf ("CreateService (0x%02x)\n", err);
}
#endif
return FALSE;
}
#ifdef _CONSOLE
else
{
printf ("CreateService SUCCES\n");
}
#endif
// libère le handle aprés installation du driver
CloseServiceHandle (schService);
return TRUE;
}
Desinstaller le driver
La fonction ci-dessous désinstalle le driver, il n'est plus dans la liste
des périphériques.
// fonction de desinstallation le driver
BOOL RemoveDriver( IN SC_HANDLE SchSCManager,IN LPCTSTR DriverName )
{
SC_HANDLE schService;
BOOL ret;
// recupere un handle sur le driver (service)
schService = OpenService (SchSCManager,DriverName,SERVICE_ALL_ACCESS );
if (schService == NULL) {
#ifdef _CONSOLE
printf ("OpenService (0x%02x)\n", GetLastError());
#endif
return FALSE;
}
// supprime le driver des tables NT
if (ret=DeleteService (schService))
{
#ifdef _CONSOLE
printf ("DeleteService SUCCES\n");
#endif
}
else
{
#ifdef _CONSOLE
printf ("DeleteService (0x%02x)\n",GetLastError() );
#endif
}
// libère le handle
CloseServiceHandle (schService);
return ret;
}
Démarrer le driver
On peut démarrer le driver depuis le panneau de contrôle, périphérique.
Le bouton démarrer démarre le driver, il s'initialise.
Le bouton démarrage permet de choisir un démarrage automatique (au prochain
boot)
La fonction ci-dessous permet de le démarrer depuis un programme
d'application.
// fonction de mise en route du driver
BOOL StartDriver( IN SC_HANDLE SchSCManager,IN LPCTSTR DriverName )
{
SC_HANDLE schService;
BOOL ret;
#ifdef _CONSOLE
DWORD err;
#endif
// recupere le handle sur le driver (service)
schService = OpenService (SchSCManager, DriverName,SERVICE_ALL_ACCESS );
if (schService == NULL) {
#ifdef _CONSOLE
printf ("erreur OpenService (0x%02x)\n", GetLastError());
#endif
return FALSE;
}
// démarre le driver
ret = StartService (schService, // handle sur driver
0, // NB arguments
NULL // arguments
);
#ifdef _CONSOLE
if (ret)
{
printf ("StartService SUCCESS\n");
}
else
{
err = GetLastError();
if (err == ERROR_SERVICE_ALREADY_RUNNING) {
printf ("erreur StartService, ERROR_SERVICE_ALREADY_RUNNING\n"); }
else
{
printf ("erreur StartService (0x%02x)\n",err );
}
}
#endif
// libère le handle
CloseServiceHandle (schService);
return ret;
}
Arrêter un driver
On peut arrêter un driver depuis le panneau de contrôle périphérique
arrêter. S'il est en démarrage automatique, cliquez aussi démarrage puis
manuel pour qu'il ne redémarre plus au prochain boot.
Le sous-programme suivant stop aussi le driver depuis une application.
// fonction de dévalidation du driver
BOOL StopDriver(IN SC_HANDLE SchSCManager,IN LPCTSTR DriverName )
{
SC_HANDLE schService;
BOOL ret;
SERVICE_STATUS serviceStatus;
// recupere un handle sur le driver (service)
schService = OpenService (SchSCManager,DriverName,SERVICE_ALL_ACCESS);
#ifdef _CONSOLE
if (schService == NULL) {
printf ("erreur OpenService (0x%02x)\n", GetLastError());
return FALSE;
}
#endif
// envoi le code de controle standard STOP au driver service
ret = ControlService (schService,SERVICE_CONTROL_STOP,&serviceStatus );
#ifdef _CONSOLE
if (ret) { printf ("StopService SUCCES\n"); }
else { printf ("erreur ControlService (0x%02x)\n",GetLastError());}
#endif
// libère le handle
CloseServiceHandle (schService);
return ret;
}
Ouvrir le fichier/driver
La fonction ci-dessous simplifie l'ouverture de l'accès au driver depuis une
application
// fonction d'utilisation du driver comme un fichier
HANDLE OpenDevice( IN LPCTSTR DriverName )
{
char completeDeviceName[64] = "";
LPCTSTR DeviceName = DriverName;
HANDLE hDevice;
// création du nom \\.\XXX pour createFile
strcat (completeDeviceName,"\\\\.\\");
strcat (completeDeviceName, DeviceName );
// ouverture du driver
hDevice = CreateFile (completeDeviceName,
GENERIC_READ | GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL
);
#ifdef _CONSOLE
if (hDevice == ((HANDLE)-1)) {
printf ("pas de handle fichier sur le driver %s\n", completeDeviceName );
}
else {
printf ("CreateFile SUCCES\n");
}
#endif
return hDevice;
}