This will be platform specific, so you'll need to duplicate some code to account for the Windows and Unix-specific parts. Here are some knowledgebase articles from MSDN that should help for Windows:
Windows 95 (probably 98 & ME as well):
Windows NT (probably 2000, too):
I think Unix will be a lot more straightforward. You can probably just open and read the "raw" device using the regular POSIX functions (open, read, close). So if your cd-rom is mounted on /dev/cd0, you'll want to access the raw device, which might be /dev/rcd0. The device names will differ across Unices.
You may want to abstract the platform-specific stuff into a class so that code that wants to work with the cd roms doesn't have to know which platform its running on.
class iso_9660_sector {
// components of a single sector
};
class iso_9660 {
public:
iso_9660 &open_device(std::string device_name);
iso_9660 &close_device();
iso_9660_sector read_sector();
// etc.
};
iso_9660 &iso_9660:

pen_device(std::string device_name)
{
#if defined WIN32
// Win9x code
#elif defined WINNT
// WinNT code
#else
// Unix code
#endif
}