VOGONS


First post, by bodqhrohro

User metadata
Rank Newbie
Rank
Newbie

I've started getting it on each normal boot, even though it boots well in Safe Mode.

An exception 0E has occurred at 0028:C004A217 in VxD ---. This was
called from 0028:C0063BF5 in VxD ---.

There's enough of information on exception codes, like 0D meaning a general protection fault and 0E meaning a page fault, but I'm not sure how to interpret the rest. I have a shallow understanding of how do x86 CPUs and virtual memory work, but have never dealt with Win9x before.

Is the first part before a colon a memory page number and the second part an address in the page? I found some hints the first number may also be related to I/O port ranges which I can view in the Device Manager. I tried skimming through them to find out which device might be at guilt, but there are lots of them and I'm not sure if that's even worth it. Are those mappings stored in some file or a registry section so I can glance all of them at once?

I'd appreciate any good articles explaining how VxDs deal with memory, how I/O ranges are assigned to drivers, how does all of that work together and with PCI, and how dynamic all of that is.

Also, what happens when I remove a device from the Device Manager? I messed a bit with adding and changing some virtual devices in QEMU, and noticed that all of them are remembered and displayed there, even though they're "unplugged" already, some even are duplicated. AFAIU, Windows 98 has some concept of hardware profiles, akin to device trees in modern Android ROMs, and those can be switchable, so some faulty hardware can be excluded from a profile and ignored on boot. If some existing device is removed from a profile, would Windows prompt with it again on next boot like it does when discovering some new device and asking to install a driver for it? Or, if not, how do I add it again then?

Reply 1 of 2, by Ringding

User metadata
Rank Member
Rank
Member

It’s a segment (selector) : offset pair, which, by adding the segment descriptor’s base, which is probably 0, to the offset, can be converted into a linear address. You will probably need a good debugger to look at the actual instructions in memory.