locked
Accès mémoire kernel dans windows CE 6.0 RRS feed

  • Question

  • Bonjour,

    Nous utilisons une application "InitCarte.exe" pour initialiser une carte PC104 avant de l'utiliser.
    Cette application fonctionnait jusqu'à présent sous CE5.0. Elle initialise entre autres un registre de la carte PC 104 avec le code suivant :

    "*(PUCHAR)(0x800D0000+0x1200) = (UCHAR)(valeurAEcrire);"

    Dans CE6.0 ceci n'est plus possible, à cause de la séparation des espaces mémoire user et kernel.

    D'après nos recherches, le seul moyen pour notre application de pouvoir écrire ce registre est de passer par une dll en mode Kernel.

    (1) Est-ce bien la direction à prendre ? n'existe t-il pas un moyen moins lourd pour effectuer cette action ?

    Nous avons tenté de réaliser une telle dll... mais nous n'arrivons à la charger que lorsque elle n'est pas définit comme tournant dans le noyau ( flag "K" dans le .bib)... et elle ne peut donc pas accèder à l'adresse voulue...

    Pour l'instant nous avons :

    * 1 sous projet InitCarteDLL (pour le driver) et un sous projet InitCarte (l'application)

    * dans InitCarteDLL :
        - source : InitCarteDLL.cpp définissant les fonctions DllMain et ICD_InitPC104(uchar) : cette dernière fonction contient le code "*(PUCHAR)(0x800D0000+0x1200) = (UCHAR)(valeurAEcrire);"
        - .bib avec les flags "NK K"
        - .def avec "LIBRARY InitCarteDLL    EXPORTS ICD_InitPC104"
        - .reg ajoutant les clés sous HKLM/Drivers/BuiltIn/InitCarteDLL :
            -- Dll = InitCarteDLL.dll
            -- Order = 4
            -- Prefix = ICD

    * dans InitCarte (l'application) :
        - Paramètres>Link>Additionnal Libraries : ajout du chemin vers InitCarteDLL.lib
        - code source : extern ICD_InitPC104 et utilisation.

    En l'état, l'application ne se lance pas.
    Si nous retirons le flag "K" du .bib de la DLL, l'application se lance et la fonction de la dll est bien exécutée mais en mode utilisateur (nous déduisons cette information du fait qu'un appel à VirtualAlloc dans la fonction retourne un pointeur vers une adresse user (0x80000).

    (2) Pouvez confirmer que ceci indique bien que la dll est en mode user ? existe t-il une façon propre de s'en assurer, plutôt qu'appeler VirtualAlloc alors que nous n'en avons à priori pas besoin ?
    (3) que faire pour utiliser une dll en mode kernel depuis une application (user) ?

    Merci pour votre aide.
    lundi 10 janvier 2011 16:30