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
___________________________________
[
[ Lien ]]