IRQ_NOT_LESS_OR_EQUAL ou Freez

Résolu
deck_bsd Messages postés 1243 Date d'inscription jeudi 31 mars 2005 Statut Membre Dernière intervention 3 août 2016 - 6 avril 2009 à 11:41
deck_bsd Messages postés 1243 Date d'inscription jeudi 31 mars 2005 Statut Membre Dernière intervention 3 août 2016 - 7 avril 2009 à 10:10
Yop à tous,

Voila je suis en plain dans la conception d'un driver, tout vas nickel apart les évènement. En fait je veu que mon driver signal a mon processus en user-mode qu'il doit aller chercher des information. Hors voila , lorsque le driver envoie fait KeSetEvent(pkEvent,0,FALSE); soit j'ai un bel écran bleu avec IRQ_NOT_LESS_OR_EQUAL ou alors le pc bloque :s . Voici les partie de code intéressentante :

Application USER MODE :

#define

IOCTL_EVENT CTL_CODE(40000, 0x804, METHOD_NEITHER, FILE_ANY_ACCESS)
HANDLE hEvent;

/* Handle de l'évènement (est passer au driver). variable global*/

Création de l'event et envoie au driver :

BOOL MakeEvent(){

DWORD dwSize = 0;

hEvent = CreateEvent(NULL,FALSE,FALSE,

"dckApEvent");

if(hEvent == NULL){

return FALSE;}

else{

char szBuffer[50];wsprintf(szBuffer,

"Handle cree : %X",hEvent);MessageBox(NULL,szBuffer,

"Handle",MB_OK);}

if(DeviceIoControl( haDevice,IOCTL_EVENT,(LPVOID)hEvent,0,NULL,0,&dwSize, NULL)){

OutputDebugString(

"(DeviceIoControl) Reussite envoie");

return TRUE;}

CloseHandle(hEvent);

return FALSE;}

DRIVER :
device extension :

typedef struct _my_device_extension{
 KEVENT kEvent;
 char cEvent;
 HANDLE hProcessId;
} MY_DEVICE_EXTENSION;

variables :
HANDLE hSend;
KEVENT kEventT;
MY_DEVICE_EXTENSION* pDeviceX;
OBJECT_HANDLE_INFORMATION objHandleInfo;

Référencement :

hSend = (HANDLE) IrpStackPointeur->Parameters.DeviceIoControl.Type3InputBuffer;
         KdPrint(("(Handle reçu) %X",hSend));
         pDeviceX = g_pDeviceDck->DeviceExtension;
         if(ObReferenceObjectByHandle(hSend,GENERIC_ALL,NULL/**ExEventObjectType*/,
                KernelMode,&kEventT,&objHandleInfo) != STATUS_SUCCESS){
          KdPrint(("(ObReferenceObjectByHandle) Error."));
         }else{
          KdPrint(("(ObReferenceObjectByHandle) OK."));
          pDeviceX->kEvent = kEventT;
          pDeviceX->cEvent = 1;
          KeClearEvent(&kEventT);
          if(KeReadStateEvent(&kEventT))
           KdPrint(("Ob (0) EVENT SIGNALED"));
 }

envoie event c'est quand ce bloc s'éxécute que ça "foire" :
MY_DEVICE_EXTENSION* pDeviceX;
 PKEVENT pkEvent;
 
 pkEvent = NULL;
 pDeviceX = g_pDeviceDck->DeviceExtension;

...

if(pDeviceX->cEvent){
   KdPrint(("\n dckAlarm - Envoie signal (SIM)"));
   pkEvent = &pDeviceX->kEvent;
   if(KeReadStateEvent(pkEvent))
    KdPrint(("dckAlarm (1) EVENT SIGNALED"));
   KeSetEvent(pkEvent,0,FALSE);
   KdPrint(("\n dckAlarm - KeSetEvent OK"));
   if(KeReadStateEvent(pkEvent))
    KdPrint(("dckAlarm (2) EVENT SIGNALED"));
   KeClearEvent(pkEvent);
   KdPrint(("\n dckAlarm - KeClearEvent OK"));
  }

Merci d'avance pour votre aide.
++
deck_bsd
___________________________________
[http://deck-bsd.eurower.net]

7 réponses

cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
6 avril 2009 à 16:08
Ah pardon.

Deuxième éssai.

Le paramètre Object de ObReferenceObjectByHandle est un PVOID*, autrement dit un pointeur sur un pointeur.

typedef struct _KEVENT {
  DISPATCHER_HEADER  Header;
} KEVENT, *PKEVENT, *RESTRICTED_POINTER PRKEVENT;

Mais tu lui passe l'adresse d'un KEVENT, autrement dit, un PKEVENT. Alors que lui attend un PKEVENT*, l'adresse d'un pointeur sur un event. Bilan plus bas dans le code, ça fait n'importe quoi.

A ta place je changerais ma structure :

typedef struct _my_device_extension{
 KEVENT pkEvent;
 char cEvent;
 HANDLE hProcessId;

Et je la passerais directement, pas la peine de multiplier les copies :

if(ObReferenceObjectByHandle(hSend,GENERIC_ALL,NULL/**ExEventObjectType*/,
                KernelMode,&pDeviceX->pkEvent,&objHandleInfo) != STATUS_SUCCESS){

Et enfin, tout simplement :

if(pDeviceX->cEvent){
   KdPrint(("\n dckAlarm - Envoie signal (SIM)"));
   if(KeReadStateEvent(pDeviceX->pkEvent))

Toi aussi tu travailles sans filet sur les drivers ? Pas de débogueur ni rien ? Ca fait mal au fesse quand même hein ?
 kd faut deux PCs, SoftIce payant et extrèmement difficile à installer sous XP, rasta ring 0 que tu te demande si ça peut marcher... Mais j'aimerais quand même bien trouver une solution pour le prochain.
3
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
6 avril 2009 à 16:11
Et erratum :

typedef struct _my_device_extension{
 PKEVENT pkEvent;
 char cEvent;
 HANDLE hProcessId;
3
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
6 avril 2009 à 14:00
Salut,

Tu as appelé KeInitializeEvent avant ton KeSetEvent ?
0
deck_bsd Messages postés 1243 Date d'inscription jeudi 31 mars 2005 Statut Membre Dernière intervention 3 août 2016 2
6 avril 2009 à 14:45
Non, mais aparement je n'en ai pas besoin vu que j'ai créé l'event dans l'application utilisateur et que j'utilise ObReferenceObjectByHandle . Faut-il tout de même l'utiliser ?

++
deck_bsd
___________________________________
[http://deck-bsd.eurower.net]
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
6 avril 2009 à 16:11
Au fait, exemple ici.
0
deck_bsd Messages postés 1243 Date d'inscription jeudi 31 mars 2005 Statut Membre Dernière intervention 3 août 2016 2
6 avril 2009 à 16:33
Oulalaaaa bien joué le coup du pointeur de pointeur , je l'avait vraiment pas vu :s C'est rare ce genre de paramètre ^^ . Bon je peux pas tester la tout de suite car suis sous ubuntu et pas chez moi, mais dés que je rentre, je dit quoi :D

++
deck_bsd
___________________________________
[http://deck-bsd.eurower.net]
0
deck_bsd Messages postés 1243 Date d'inscription jeudi 31 mars 2005 Statut Membre Dernière intervention 3 août 2016 2
7 avril 2009 à 10:10
Yop,

Merci beaucoup c'était bien ça :p

++
deck_bsd
___________________________________
[http://deck-bsd.eurower.net]
0
Rejoignez-nous