Start

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;
}

 

Accueil ] Remonter ] Dispatch ] Arrêt ] Registre ]