jimtabor schrieb:
No, this would break compatibility. The way to
verify this. Write a
driver, install it
and send a packet to it, so to activate the test. Have the driver dump
to WinDbg.
Ok, I take my time to go into this, because I *am* interested in
compatibility.
Let's analyze how the conversion between FLOAT and EFLOAT works on XP.
We could simply use some documentation floating around, but let's do it
on our own, just for the fun. We don't need no
itchy-bitchy-kmtest-driver-callback-winpooch-hooky-thingy, because
Windows has already all we need to do this completely in user mode.
DC_ATTR has some EFLOATs and what we need is a function that takes a
FLOAT and stores it as EFLOAT.
SetWorldTransform() seems suitable (In fact the values will be stored
in the DC_ATTR structure only after a following call to
GetWorldTransform()). And we need a windows compatible structure
definition for DC_ATTR, wich we can get from a well known book. For the
code see attachment.
Now let's see what we get with different parameters for the float:
f: 1.000000 (0x3f800000) -> lMant: 0x40000000, lExp: 0x000002
f: -1.000000 (0xbf800000) -> lMant: 0xc0000000, lExp: 0x000002
f: 2.000000 (0x40000000) -> lMant: 0x40000000, lExp: 0x000003
f: -2.000000 (0xc0000000) -> lMant: 0xc0000000, lExp: 0x000003
f: 1.500000 (0x3fc00000) -> lMant: 0x60000000, lExp: 0x000002
f: -1.500000 (0xbfc00000) -> lMant: 0xa0000000, lExp: 0x000002
f: 1235.000000 (0x449a6000) -> lMant: 0x4d300000, lExp: 0x00000c
f: -1235.000000 (0xc49a6000) -> lMant: 0xb2d00000, lExp: 0x00000c
Looks like Feng Yuan was right.
Now let's see what your code would do with f=1.
FtoEF( EFLOAT_S * efp, FLOATL f)
{
...
Exp = EXP(worker.l); // Exp = (((0x3f800000) >> 23L) & 0xFF) = 0x7F
Mant = MANT(worker.l); // Mant = ((0x3f800000) & 0x7FFFFFL) = 0x00000
Mant = ((Mant << 7) | 0x40000000 | SIGN(worker.l));
// Mant = (0 << 7) | 0x40000000 | (0x3f800000 & 0x80000000 )= 0 | 0x40000000 | 0 = 0x40000000
Exp -= (1 - EXCESS); // Exp = 0x7F - (1-126) = 0x7F + 0x7D = 0xFC
efp->lMant = Mant;
efp->lExp = Exp;
...
}
Replace the - by a + and you get
Exp += (1 - EXCESS); // Exp = 0x7F + (1-126L) = 0x7F - 0x7D = 0x2
Wich is what we have discovered windows does.
And it looks like there's another thing, you didn't take into account.
Ok, I give you a hint: It has something todo with the sign bit.
You don't get it? Well, it's all there!
Thanks,
Timo