windows - Win32 EXCEPTION\_INT\_OVERFLOW vs EXCEPTION\_INT\_DIVIDE\_BY\_ZERO

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har et spørgsmål om EXCEPTION\_INT\_OVERFLOW og EXCEPTION\_INT\_DIVIDE\_BY\_ZERO undtagelserne.


Windows vil fælde #DE fejl genereret af IDIV instruktionen og vil ende med at generere og SEH undtagelse med en af ​​de 2 koder.


Spørgsmålet jeg har er, hvordan adskiller det sig mellem de to betingelser? Oplysningerne om idiv i Intel manualen angiver, at det vil generere #DE i både 'divide by zero' og 'underflow cases'.


Jeg tog et hurtigt kig på sektionen om #DE fejlen i Volume 3 i Intel manualen, og det bedste jeg kunne samle er, at operativsystemet skal afkode DIV instruktion, indlæse divisor argumentet og derefter sammenligne det med nul.


Det synes dog lidt skørt for mig selv. Hvorfor ville chipdesignerne ikke bruge et flag af en slags for at skelne mellem de to årsager til fejlen? Jeg har lyst til at mangle noget.


Er der nogen der ved, hvordan operativsystemet skelner mellem de to forskellige årsager til fejl?

Bedste reference


Dine antagelser synes at være korrekte. Den eneste tilgængelige information på #DE er CS og EIP, som giver instruktionen. Da de to statuskoder er forskellige, skal operativsystemet afkodes instruktionen for at bestemme hvilken.


Jeg foreslår også, at chipproducenterne ikke behøver to separate afbrydelser for denne sag, da noget divideret med nul er uendeligt, hvilket er for stort til at passe ind i dit destinationsregister.


Med hensyn til at vide 'hvordan det adskiller', kan alle dem, der kender det, sandsynligvis ikke afsløre det, enten for at forhindre folk i at udnytte det (ikke helt sikker på hvordan, men at hoppe i kernel mode er et godt sted at begynde at se på udnytte) eller gøre antagelser baseret på en implementeringsdetalje, som kan ændre sig uden varsel.





 Efter at have spillet med kd kan jeg i det mindste sige, at jeg havde adgang til (og processoren den kørte på den bestemte version af Windows XP (32-bit)) nt!Ki386CheckDivideByZeroTrap afbryderhåndtereren for at afkode ModRM-værdien af instruktionen om at bestemme, om der skal returneres STATUS\_INTEGER\_DIVIDE\_BY\_ZERO eller STATUS\_INTEGER\_OVERFLOW.


(Det er åbenbart, at dette er original forskning, er ikke garanteret af nogen overalt, og det sker også at matche de fradrag, der kan foretages baseret på Intels manualer.)

Andre referencer 1


Zoobas svar opsummerer Windows, analyserer instruktionen for at finde ud af, hvad der skal hæves.


Men du kan ikke stole på at rutinen korrekt vælger koden.


Jeg observerede følgende på 64 bit Windows 7 med 64 bit DIV instruktioner:



  • Hvis operand (divisor) er en hukommelsesoperation, hæver det altid EXCEPTION\_INT\_DIVIDE\_BY\_ZERO uanset argumentværdien.

  • Hvis operand er et register, og det nederste dword er nul, hæver det EXCEPTION\_INT\_DIVIDE\_BY\_ZERO uanset om den øvre halvdel ikke er 'nul'.



Tog mig en dag for at finde ud af dette ... Håber det hjælper.