Lors du start (manuel ou automatique depuis le panneau de contrôle ou depuis
une application) le driver exécute la fonction DriverEntry qui initialise
le matériel et déclare les fonctions appelées lors du stop, du
DeviceIoControl.
Le driver initialise une structure deviceExtension dans laquelle il doit
ranger toutes ses données locales au driver. (adresses translatées des io,
etc...)
// simpldrvit.c driver it en mode kernel
extern "C"
{
#include "ntddk.h"
#include "stdarg.h"
#include "stdio.h"
}
extern "C"
{
// interfaces externes/interne
#include "interface.h"
}
//******************************************************************************************
// point d'entrée du driver lors de l'installation commande start
// déclaré en C sinon il sera indéfini au link
extern "C" NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,IN PUNICODE_STRING RegistryPath);
NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,IN PUNICODE_STRING RegistryPath)
{
PDEVICE_OBJECT deviceObject = NULL;
NTSTATUS ntStatus;
WCHAR deviceNameBuffer[] = L"\\Device\\MonDriver";
UNICODE_STRING deviceNameUnicodeString;
PDEVICE_EXTENSION deviceExtension;
WCHAR deviceLinkBuffer[] = L"\\DosDevices\\MonDriver";
UNICODE_STRING deviceLinkUnicodeString;
// char *message;
ULONG PortCount; // nombre de ports I/O
PHYSICAL_ADDRESS PortAddress;
KIRQL irql = IRQ;
// init des @ ports
PortCount = NUMBER_PORTS ;
PortAddress.LowPart = BASE_PORT;
PortAddress.HighPart = 0;
// convertit le nom du driver en UNICODE pour le passer à IoCreateDevice
RtlInitUnicodeString (&deviceNameUnicodeString,deviceNameBuffer);
// cree un device object correspondant au périphérique
ntStatus = IoCreateDevice (DriverObject, // device object cree par IO Manager au chargement
du driver
sizeof (DEVICE_EXTENSION), // nb d'octets à allouer en plus du device object
&deviceNameUnicodeString, // nom du device object en UNICODE
FILE_DEVICE_MONDRIVER, // Type de périphérique
0, // caractèristique du périphérique ( amovible, ...)
FALSE, // plusieurs IO à la fois
&deviceObject // pointeur sur device object crée
);
// device object créé
if (NT_SUCCESS(ntStatus))
{
// recupére le point d'entrée du device extension pour initialiser des données
// si besoin est ...
deviceExtension = (PDEVICE_EXTENSION)deviceObject->DeviceExtension;
deviceExtension->DeviceObject = deviceObject;
deviceExtension->DeviceType = FILE_DEVICE_MONDRIVERNT;
deviceExtension->Init(); // init des données globales à la gestion de la carte
// convertit le nom du fichier utilisé par l'application WIN32 en UNICODE
RtlInitUnicodeString (&deviceLinkUnicodeString, deviceLinkBuffer);
// création d'un lien entre le nom du driver et celui du fichier vu par l'application
ntStatus = IoCreateSymbolicLink (&deviceLinkUnicodeString,&deviceNameUnicodeString);
// installe le dispatching
DriverObject->MajorFunction[IRP_MJ_CREATE] = //
fonction à appeller sur le OpenDevice
DriverObject->MajorFunction[IRP_MJ_CLOSE] =
/ fonction à appeller sur le CloseHandle
DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] =
MonDriverNTDispatch;
DriverObject->DriverUnload =
MonDriverNTUnload;
Initialisation du matériel
}
else
{ // problème de création du device object
DbgPrint("can't create device \n");
if (deviceObject)
IoDeleteDevice (deviceObject);
}
return ntStatus;
}