Ver Mensaje Individual
  #3  
Antiguo 10-01-2007
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Reputación: 24
seoane Va por buen camino
Este ejemplo esta basado en este otro de microsoft:

http://support.microsoft.com/kb/305184

Código Delphi [-]
const
  SPT_SENSE_LENGTH = 32;
  SPTWB_DATA_LENGTH = 512;

  CDB6GENERIC_LENGTH = 6;
  SCSI_IOCTL_DATA_IN = 1;
  SCSIOP_INQUIRY = $12;
  SCSIOP_MODE_SENSE = $1A;
  MODE_PAGE_CAPABILITIES = $2A;
  IOCTL_SCSI_PASS_THROUGH = $04D004;

type
  ULONG_PTR = ULONG;

  SCSI_PASS_THROUGH = record
    Length: Word;
    ScsiStatus: UCHAR;
    PathId: UCHAR;
    TargetId: UCHAR;
    Lun: UCHAR;
    CdbLength: UCHAR;
    SenseInfoLength: UCHAR;
    DataIn: UCHAR;
    DataTransferLength: ULONG;
    TimeOutValue: ULONG;
    DataBufferOffset: ULONG_PTR;
    SenseInfoOffset: ULONG;
    Cdb: array[0..15] of UCHAR;
  end;
  PSCSI_PASS_THROUGH = ^SCSI_PASS_THROUGH;

  SCSI_PASS_THROUGH_WITH_BUFFERS = record
    spt: SCSI_PASS_THROUGH;
    Filler: ULONG;
    ucSenseBuf: array[0..SPT_SENSE_LENGTH-1] of UCHAR;
    ucDataBuf: array[0..SPTWB_DATA_LENGTH-1]of UCHAR;
  end;
  PSCSI_PASS_THROUGH_WITH_BUFFERS = ^SCSI_PASS_THROUGH_WITH_BUFFERS;

function offsetof(a,b: Pointer): integer;
begin
  Result:= Integer(b) - Integer(a);
end;

function BoolToSiNo(Value: Boolean): String;
begin
  if Value then
    Result:= 'Si'
  else
    Result:= 'No';
end;

function GetDeviceProperty(Letra: Char): string;
var
  Disk: THandle;
  Sptwb: SCSI_PASS_THROUGH_WITH_BUFFERS;
  l: ULONG;
  Returned: Cardinal;
begin
  Result:= EmptyStr;
  Disk:= CreateFile(PChar('\\.\' + Letra + ':'),GENERIC_READ or GENERIC_WRITE,
    FILE_SHARE_READ or FILE_SHARE_WRITE,nil,OPEN_EXISTING,0,0);
    
  if Disk <> INVALID_HANDLE_VALUE then
  begin
    FillChar(Sptwb,Sizeof(Sptwb),0);
    Sptwb.Spt.Length:= sizeof(SCSI_PASS_THROUGH);
    Sptwb.Spt.PathId:= 0;
    Sptwb.Spt.TargetId:= 1;
    Sptwb.Spt.Lun:= 0;
    Sptwb.Spt.CdbLength:= CDB6GENERIC_LENGTH;
    Sptwb.Spt.SenseInfoLength:= 24;
    Sptwb.Spt.DataIn:= SCSI_IOCTL_DATA_IN;
    Sptwb.Spt.DataTransferLength:= 192;
    Sptwb.Spt.TimeOutValue:= 2;
    Sptwb.Spt.DataBufferOffset:=
       offsetof(@Sptwb,@Sptwb.ucDataBuf);
    Sptwb.Spt.SenseInfoOffset:=
       offsetof(@Sptwb,@Sptwb.ucSenseBuf);
    Sptwb.Spt.Cdb[0]:= SCSIOP_MODE_SENSE;
    Sptwb.Spt.Cdb[1]:= $08;
    Sptwb.Spt.Cdb[2]:= MODE_PAGE_CAPABILITIES;
    Sptwb.Spt.Cdb[4]:= 192;

    l:= offsetof(@Sptwb,@Sptwb.ucDataBuf) +
       sptwb.Spt.DataTransferLength;

    if DeviceIoControl(Disk,IOCTL_SCSI_PASS_THROUGH,@Sptwb,
      Sizeof(SCSI_PASS_THROUGH),@sptwb,l,Returned,nil) then
    begin
       if ((Sptwb.ucDataBuf[6] and $01) or (Sptwb.ucDataBuf[6] and $02) > 0) then
       begin
         Result:= 'CD Reader: Si';
         Result:= Result + #13#10 + 'CD-R: ' + BoolToSiNo((Sptwb.ucDataBuf[6] and $01)>0);
         Result:= Result + #13#10 + 'CD-RW: ' + BoolToSiNo((Sptwb.ucDataBuf[6] and $02)>0);
         if (Sptwb.ucDataBuf[7] and $01) or (Sptwb.ucDataBuf[7] and $02) > 0 then
         begin
           Result:= Result + #13#10#13#10 + 'CD Writer: Si';
           Result:= Result + #13#10 + 'CD-R: ' + BoolToSiNo((Sptwb.ucDataBuf[7] and $01)>0);
           Result:= Result + #13#10 + 'CD-RW: ' + BoolToSiNo((Sptwb.ucDataBuf[7] and $02)>0);
         end else Result:= Result + #13#10#13#10 + 'CD Writer: No';
       end else Result:= 'CD Reader: No';

       if (Sptwb.ucDataBuf[6] and $08) or (Sptwb.ucDataBuf[6] and $10) or
         (Sptwb.ucDataBuf[6] and $20) > 0 then
       begin
         Result:= Result + #13#10#13#10 + 'DVD Reader: Si';
         Result:= Result + #13#10 + 'DVD-ROM: ' + BoolToSiNo((Sptwb.ucDataBuf[6] and $08)>0);
         Result:= Result + #13#10 + 'DVD-R: ' + BoolToSiNo((Sptwb.ucDataBuf[6] and $10)>0);
         Result:= Result + #13#10 + 'DVD-RAM: ' + BoolToSiNo((Sptwb.ucDataBuf[6] and $20)>0);
         if ((Sptwb.ucDataBuf[7] and $10) or (Sptwb.ucDataBuf[7] and $20) > 0) then
         begin
           Result:= Result + #13#10#13#10 + 'DVD Writer: Si';
           Result:= Result + #13#10 + 'DVD-R: ' + BoolToSiNo((Sptwb.ucDataBuf[7] and $10)>0);
           Result:= Result + #13#10 + 'DVD-RAM: ' + BoolToSiNo((Sptwb.ucDataBuf[7] and $20)>0);
         end else Result:= Result + #13#10#13#10 + 'DVD Writer: No';
       end else Result:= Result + #13#10#13#10 + 'DVD Reader: No';
    end else Result:= SysErrormessage(GetLastError);
    CloseHandle(Disk);
  end else Result:= SysErrormessage(GetLastError);
end;

// Por ejemplo
ShowMessage(GetDeviceProperty('d'));

Última edición por seoane fecha: 10-01-2007 a las 14:33:53.
Responder Con Cita