STATUS_IN_PAGE_ERROR describes itself as "The instruction at XXX referenced memory at YYY. The required data was not placed into memory because of an I/O error status of ZZZ." What does this mean?
It means that the memory manager needed to read some memory from the disk, but the disk returned an error. (Namely, error ZZZ.) Since it has no way to return an error code to your program—I mean, after all, all your program did was read a variable from memory; there's no way to return an error code from int x = y if y cannot be read off the disk—it is reduced to raising an exception.
When you see this message, and the I/O operation was coming from your hard drive, then you need to go shopping for a new hard drive. (You will also be alerted to a dying drive if your drive supports S.M.A.R.T.)
You can see this error for sources other than hard drives. For example, if you're running a program over the network and the network connection dies, and the memory manager needs to demand-page some code from the program image, then you'll get this error because the code couldn't be loaded off the network. Similarly, if you yank a CD out of the drive while a program is executing from it (or your CD is damaged), there's a good chance that you'll get this error.
Naturally, the loss of a network connection or removal of a CD does not mean that your network card or CD-ROM drive is failing; it's a failure of the underlying connection or medium. But if your hard drive starts generating I/O errors, then there's not much that can be blamed aside from the drive itself. (Okay, it might be a failing controller, but it's more likely to be the drive itself.)