[C] Vage dll crash

Pagina: 1
Acties:

  • Gerco
  • Registratie: Mei 2000
  • Laatst online: 14-09 17:42

Gerco

Professional Newbie

Topicstarter
Ik heb een kleine dll geprogd (in MSVC++, maar eigenlijk alleen C) om een system-wide mousehook te maken voor een anti-RSI progje.

Werkt prima, maar zodra de muispointer over de taskbar gaat verdwijnt de hook in Win2k en in Win9x crasht explorer met een mooie page fault (oid).

Enig idee wat er aan de hand kan zijn? De code van de mouseHookProc staat hieronder:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
LRESULT (__stdcall CALLBACK CheckMouse(int nCode, WPARAM wParam, LPARAM lParam))
{   

    int _nCode=nCode;
    WPARAM _wParam;
    LPARAM _lParam;
    MOUSEHOOKSTRUCT mhs;
    
    if (_nCode == HC_ACTION)
    {   
        _wParam=lParam;
        _lParam=wParam;
        memcpy(&mhs, (void*)lParam, sizeof(MOUSEHOOKSTRUCT));
    }

    LRESULT res = CallNextHookEx(g_hMouseHook, nCode, wParam, lParam);

    if (_nCode == HC_ACTION)
    {   
        g_MouseCallBack(_wParam, &mhs);
    }

    return res;
}

- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!


  • Crazy D
  • Registratie: Augustus 2000
  • Laatst online: 08:12

Crazy D

I think we should take a look.

Kan het zijn dat windows op het moment dat je over de taskbar gaat, stiekum lParam (de MOUSEHOOKSTRUCT dus) verandert?
Da's eigenlijk het enigste wat ik kan verzinnen. Iig is dat hetgeen wat ik zou controleren, misschien wat proberen te loggen zodat je misschien kan uitvogelen waar precies de boel crasht.
En als je je mousecallback niet aanroept (maar wel de hook zet dus), kun je dan wel de muis bewegen waar je maar wilt zonder crash? Weet je iig of het aan je hook op zich ligt, of alleen aan de callback routine.
Just a thought, hoe langer ik erover na probeer te denken, hoe vager ik 't vind dat ie alleen crasht als je over de taskbar heen gaat...

Exact expert nodig?


  • Gerco
  • Registratie: Mei 2000
  • Laatst online: 14-09 17:42

Gerco

Professional Newbie

Topicstarter
Ik vind het ook erg vaag... Aan de callback ligt het niet, zelfs als de callback functie leeg is (gelijk returnd)crasht 'ie.

Ik zal de boel eens loggen, maar ik weet niet of het systeem dat leuk gaat vinden met die honderden events per seconde :)

- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!


  • Crazy D
  • Registratie: Augustus 2000
  • Laatst online: 08:12

Crazy D

I think we should take a look.

Op donderdag 22 november 2001 17:27 schreef Gerco het volgende:
Ik zal de boel eens loggen, maar ik weet niet of het systeem dat leuk gaat vinden met die honderden events per seconde :)
:D langzaaaaaam je muis bewegen :P
Naja misschien kun je 'm pas laten loggen als de muis 2 pixels boven de taskbar is (of onder, of naast, afhankelijk van waar jij je taskbar verstopt :P), scheelt weer iets ;)

Wat doet ie als je de callnexthook even weglaat?
Als ik MSDN goed begrijp, moet je die voornamelijk aanroepen om andere hooks ook ff te melden dat er wat met de muis aan de hand was. Kan me niet voorstellen dat dat echt mag uitmaken, het lijkt me dat windows wel zo sneaky is om eerst intern met het muisevent wat te doen voordat ie de hooks af gaat lopen, maar je moet toch wat proberen ;)

Hmm nog even verder zitten lezen in MSDN (wel intressant trouwens :)), ik neem aan dat jij het stukje over Monitoring System Events (waar ook een vrij groot voorbeeld bij staat) ook gelezen hebt. Daar returnen ze direct de returnwaarde van CallNextHookEx als ncode kleiner dan 0 is, anders doen ze eerst wat app-specifieke dingen, en als laatste returnen ze CallnextHookEx (wat jij dus halverwege de functie doet).
Als je dat omdraait? (dus eerst je callback aanroepen, en dan pas callnexthook) Maakt dat nog wat uit?

Exact expert nodig?


  • Gerco
  • Registratie: Mei 2000
  • Laatst online: 14-09 17:42

Gerco

Professional Newbie

Topicstarter
Op donderdag 22 november 2001 17:56 schreef CrazyD_at_work het volgende:
Als je dat omdraait? (dus eerst je callback aanroepen, en dan pas callnexthook) Maakt dat nog wat uit?
Dat had ik eerst staan, maar ik wilde niet dat de VB code(ja, de callback is een VB prog) de boel kon vern*uken door die vars te veranderen of een te lang vertraging te maken. Daarom doe ik EERST de callnexthook en dan pas de callback. Het moet puur een monitor zijn, niet iets om de events ook te veranderen.

- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!


  • Crazy D
  • Registratie: Augustus 2000
  • Laatst online: 08:12

Crazy D

I think we should take a look.

Op donderdag 22 november 2001 18:22 schreef Gerco het volgende:
Dat had ik eerst staan, maar ik wilde niet dat de VB code(ja, de callback is een VB prog) de boel kon vern*uken door die vars te veranderen of een te lang vertraging te maken. Daarom doe ik EERST de callnexthook en dan pas de callback. Het moet puur een monitor zijn, niet iets om de events ook te veranderen.
Maar nu bewaar je ook even de originele params, roept de nexthook aan, en daarna de callback met de originele wparam.
Als je dan ook een kopietje maakt van de mousehook struct (of alleen de waardes daaruit die nodig zijn voor je callback) kan er toch ook niks mee gebeuren?
(of is mijn C kennis nou dusdanig ver onder het stof komen te zitten, dat ik iets over het hoofd zie (wat niet zo vreemd zou zijn hoor :P ;))
De vertraging is wel een goed argument trouwens ;) Was het een vertraging die merkbaar was? Als je een hoop moet doen in je VB code in een event, zou je de boel anders een beetje kunnen faken met een timertje, of een ActiveX exe te gebruiken waarmee je wel kan multithreaden.
Naja misschien maakt het ook wel helemaal geen moer uit en crasht ie net zo hard, en zit ik alleen maar moeilijk te denken :P (maar probeer het eens zou ik zeggen, als ie dan niet crashed (misschien doet de nexthook wel iets met de mousehook struct waardoor daarna de callback een ongeldige referentie krijgt of zo :?) is het vroeg genoeg om verder te denken :))

Exact expert nodig?

Pagina: 1