the answer seems to be "don't use IOCTL_SCSI_PASS_THROUGH_DIRECT".
OSStatus CRawDiscReader::GetTrackInfo(IDiscRecorder2Ex *discP, int trackI, CDTrackInfo *trackInfoP)
{
OSStatus err = noErr;
HRESULT resultL = 0;
BYTE *dataP = NULL;
ULONG_IMAPI2_TRACK_INFORMATION outSize = 0;
structclr(*trackInfoP);
resultL = discP->GetTrackInformation(
trackI,
IMAPI_READ_TRACK_ADDRESS_TYPE_TRACK,
&dataP, &outSize);
XTE(TrapError("GetTrackInformation", resultL));
if (!err) {
CDTrackInfo *returnInfoP = (CDTrackInfo *)dataP;
*trackInfoP = *returnInfoP;
CoTaskMemFree(dataP);
dataP = NULL;
SwapTrackInfo(trackInfoP);
}
return err;
}