diff --git a/Controllers/SeagateController/SeagateController.cpp b/Controllers/SeagateController/SeagateController.cpp index 4a3acb3e6..4488416e8 100644 --- a/Controllers/SeagateController/SeagateController.cpp +++ b/Controllers/SeagateController/SeagateController.cpp @@ -39,7 +39,7 @@ void SeagateController::SetLED | Create buffer to hold RGB control data | \*-----------------------------------------------------------------------------*/ unsigned char data[14] = {0}; - data[0] = 0x0E; // size of data packet + data[0] = 0x0E; /* size of data packet */ data[1] = 0x00; data[2] = 0x01; data[3] = 0x09; @@ -49,7 +49,8 @@ void SeagateController::SetLED data[7] = 0x01; if(save) { - data[8] = 0x03; // 0x00 for no save, 0x03 for save + data[8] = 0x03; /* 0x00 for no save, 0x03 for */ + /* save */ } else { @@ -61,5 +62,27 @@ void SeagateController::SetLED data[12] = 0xFF; data[13] = 0xFF; - scsi_write(dev, data, 14); + /*-----------------------------------------------------------------------------*\ + | Create buffer to hold CDB | + \*-----------------------------------------------------------------------------*/ + unsigned char cdb[12] = {0}; + cdb[0] = 0xD2; + cdb[1] = 0x53; /* S */ + cdb[2] = 0x65; /* e */ + cdb[3] = 0x74; /* t */ + cdb[4] = 0x4C; /* L */ + cdb[5] = 0x65; /* e */ + cdb[6] = 0x64; /* d */ + cdb[7] = 0x00; + cdb[8] = 0x00; + cdb[9] = 0x30; + cdb[10] = 14; /* length of data packet */ + cdb[11] = 0x00; + + /*-----------------------------------------------------------------------------*\ + | Create buffer to hold sense data | + \*-----------------------------------------------------------------------------*/ + unsigned char sense[32] = {0}; + + scsi_write(dev, data, 14, cdb, 12, sense, 32); } diff --git a/scsiapi/scsiapi.h b/scsiapi/scsiapi.h index 6c1a252ce..60e5b5b7f 100644 --- a/scsiapi/scsiapi.h +++ b/scsiapi/scsiapi.h @@ -76,7 +76,7 @@ void scsi_free_enumeration(struct scsi_device_info * devs); struct scsi_device * scsi_open_path(const char *path); -int scsi_write(struct scsi_device * dev, const unsigned char * data, size_t length); +int scsi_write(struct scsi_device * dev, const unsigned char * data, size_t data_length, const unsigned char * cdb, size_t cdb_length, unsigned char * sense, size_t sense_length); #ifdef __cplusplus } diff --git a/scsiapi/scsiapi_linux.c b/scsiapi/scsiapi_linux.c index bc946dc54..052ef7b75 100644 --- a/scsiapi/scsiapi_linux.c +++ b/scsiapi/scsiapi_linux.c @@ -192,13 +192,11 @@ struct scsi_device * scsi_open_path(const char *path) return(device); } -int scsi_write(struct scsi_device * dev, const unsigned char * data, size_t length) +int scsi_write(struct scsi_device * dev, const unsigned char * data, size_t data_length, const unsigned char * cdb, size_t cdb_length, unsigned char * sense, size_t sense_length) { /*-----------------------------------------------------*\ - | Create buffers to hold header, cdb, and sense | + | Create buffer to hold header | \*-----------------------------------------------------*/ - unsigned char cdb[12]; - unsigned char sense[32]; struct sg_io_hdr header; /*-----------------------------------------------------*\ @@ -206,34 +204,22 @@ int scsi_write(struct scsi_device * dev, const unsigned char * data, size_t leng \*-----------------------------------------------------*/ header.interface_id = 'S'; header.dxfer_direction = SG_DXFER_TO_DEV; - header.cmd_len = sizeof(cdb); - header.mx_sb_len = sizeof(sense); + header.cmd_len = cdb_length; + header.mx_sb_len = sense_length; header.iovec_count = 0; - header.dxfer_len = length; + header.dxfer_len = data_length; header.dxferp = data; header.cmdp = cdb; header.sbp = sense; header.timeout = 20000; header.flags = 0; - cdb[0] = 0xD2; - cdb[1] = 0x53; - cdb[2] = 0x65; - cdb[3] = 0x74; - cdb[4] = 0x4C; - cdb[5] = 0x65; - cdb[6] = 0x64; - cdb[7] = 0x00; - cdb[8] = 0x00; - cdb[9] = 0x30; - cdb[10] = length; - cdb[11] = 0x00; - /*-----------------------------------------------------*\ | Send pass through command | \*-----------------------------------------------------*/ ioctl(dev->fd, SG_IO, &header); } + #ifdef __cplusplus } #endif diff --git a/scsiapi/scsiapi_macos.c b/scsiapi/scsiapi_macos.c index 2aef95a1b..6d9cb3d3e 100644 --- a/scsiapi/scsiapi_macos.c +++ b/scsiapi/scsiapi_macos.c @@ -58,7 +58,7 @@ struct scsi_device * scsi_open_path(const char *path) return(NULL); } -int scsi_write(struct scsi_device * dev, const unsigned char * data, size_t length) +int scsi_write(struct scsi_device * dev, const unsigned char * data, size_t data_length, const unsigned char * cdb, size_t cdb_length, unsigned char * sense, size_t sense_length) { } diff --git a/scsiapi/scsiapi_windows.c b/scsiapi/scsiapi_windows.c index 3caea2a35..e96191109 100644 --- a/scsiapi/scsiapi_windows.c +++ b/scsiapi/scsiapi_windows.c @@ -30,14 +30,14 @@ extern "C" { void scsi_close(struct scsi_device * dev) { - + } struct scsi_device_info * scsi_enumerate(const char * vendor, const char * product) { struct scsi_device_info * ret_ptr = NULL; struct scsi_device_info * last_ptr = NULL; - + char buff[DEVBUFSIZE] = ""; int char_count; @@ -178,15 +178,20 @@ struct scsi_device * scsi_open_path(const char *path) return(device); } -int scsi_write(struct scsi_device * dev, const unsigned char * data, size_t length) +int scsi_write(struct scsi_device * dev, const unsigned char * data, size_t data_length, const unsigned char * cdb, size_t cdb_length, unsigned char * sense, size_t sense_length) { /*-----------------------------------------------------*\ | Create buffer to hold SCSI_PASS_THROUGH_DIRECT | | Size must be enough for the SCSI_PASS_THROUGH_DIRECT | - | struct plus the sense data. Size of 80 bytes taken | - | from captured data | + | struct plus the sense data. | \*-----------------------------------------------------*/ - unsigned char buffer[sizeof(SCSI_PASS_THROUGH_DIRECT) + 32] = {0}; + int buffer_length = (sizeof(SCSI_PASS_THROUGH_DIRECT) + sense_length); + unsigned char * buffer = malloc(buffer_length); + + /*-----------------------------------------------------*\ + | Zero out the buffer | + \*-----------------------------------------------------*/ + memset(buffer, 0, buffer_length); /*-----------------------------------------------------*\ | Create PSCSI_PASS_THROUGH_DIRECT pointer and point it | @@ -202,31 +207,34 @@ int scsi_write(struct scsi_device * dev, const unsigned char * data, size_t leng command->PathId = 0x00; command->TargetId = 0x00; command->Lun = 0x00; - command->CdbLength = 0x0C; - command->SenseInfoLength = 0x20; + command->CdbLength = cdb_length; + command->SenseInfoLength = sense_length; command->DataIn = SCSI_IOCTL_DATA_OUT; - command->DataTransferLength = length; + command->DataTransferLength = data_length; command->TimeOutValue = 0x00000014; command->DataBuffer = data; command->SenseInfoOffset = sizeof(SCSI_PASS_THROUGH_DIRECT); - command->Cdb[0] = 0xD2; - command->Cdb[1] = 0x53; - command->Cdb[2] = 0x65; - command->Cdb[3] = 0x74; - command->Cdb[4] = 0x4C; - command->Cdb[5] = 0x65; - command->Cdb[6] = 0x64; - command->Cdb[7] = 0x00; - command->Cdb[8] = 0x00; - command->Cdb[9] = 0x30; - command->Cdb[10] = length; - command->Cdb[11] = 0x00; + /*-----------------------------------------------------*\ + | Copy CDB and sense data into buffer | + \*-----------------------------------------------------*/ + memcpy(command->Cdb, cdb, cdb_length); + memcpy(&buffer[sizeof(SCSI_PASS_THROUGH_DIRECT)], sense, sense_length); /*-----------------------------------------------------*\ | Send pass through command | \*-----------------------------------------------------*/ - DeviceIoControl(dev->fd, IOCTL_SCSI_PASS_THROUGH_DIRECT, command, sizeof(buffer), command, sizeof(buffer), NULL, NULL); + DeviceIoControl(dev->fd, IOCTL_SCSI_PASS_THROUGH_DIRECT, command, buffer_length, command, buffer_length, NULL, NULL); + + /*-----------------------------------------------------*\ + | Copy sense data out of buffer | + \*-----------------------------------------------------*/ + memcpy(sense, &buffer[sizeof(SCSI_PASS_THROUGH_DIRECT)], sense_length); + + /*-----------------------------------------------------*\ + | Free the buffer | + \*-----------------------------------------------------*/ + free(buffer); } #ifdef __cplusplus }