Hello, experts.
I use the following code for check 48-lba ide device support.
NTSTATUS
DwAtaGetDeviceParams(
IN PDEVICE_OBJECT DeviceObject,
OUT PIDENTIFY_DEVICE_DATA DeviceData,
IN ULONG cbDeviceData
)
{
ATA_PASS_THROUGH_DIRECT apsd = {0};
PIRP Irp = NULL;
IO_STATUS_BLOCK IoStatus = {0};
KEVENT kevent;
NTSTATUS Status;
PAGED_CODE()
RtlZeroMemory( &apsd, sizeof(ATA_PASS_THROUGH_DIRECT) );
apsd.Length = sizeof(ATA_PASS_THROUGH_DIRECT);
apsd.AtaFlags = ATA_FLAGS_DATA_IN | ATA_FLAGS_DRDY_REQUIRED;
apsd.DataTransferLength = cbDeviceData;
apsd.TimeOutValue = 200;
apsd.DataBuffer = (PVOID)DeviceData;
apsd.CurrentTaskFile[6] = ATA_IDENTIFY_DEVICE;
KeInitializeEvent( &kevent, NotificationEvent, FALSE );
Irp = IoBuildDeviceIoControlRequest( IOCTL_ATA_PASS_THROUGH_DIRECT, DeviceObject->AttachedDevice,
&apsd, sizeof(ATA_PASS_THROUGH_DIRECT), &apsd, sizeof(ATA_PASS_THROUGH_DIRECT),
FALSE, &kevent, &IoStatus );
if( !Irp ) return STATUS_INSUFFICIENT_RESOURCES;
Status = DwIopfCallDriver( DeviceObject->AttachedDevice, Irp );
if( Status == STATUS_PENDING )
{
KeWaitForSingleObject( &kevent, Executive, KernelMode, FALSE, NULL );
Status = IoStatus.Status;
}
if( apsd.CurrentTaskFile[0] != 0 ) {
Status = STATUS_UNSUCCESSFUL;
}
return Status;
}
But in systems with iastor.sys driver (Intell Matrix Storage) I have BSOD in iastor function, that dispatch this request.