📄 scsicmds.c
字号:
/*
* scsicmds.c
*
* Copyright (C) 1999-2000 Michael Cornwell <cornwell@acm.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
* any later version.
*
* You should have received a copy of the GNU General Public License
* (for example COPYING); if not, write to the Free
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include <stdio.h>
#include <string.h>
#include <getopt.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <linux/hdreg.h>
#include <scsi/scsi.h>
#include "scsicmds.h"
UINT8 logsense (int device, UINT8 pagenum, UINT8 *pBuf)
{
struct cdb10hdr *ioctlhdr;
UINT8 tBuf[1024 + CDB_12_HDR_SIZE];
UINT8 status;
memset ( &tBuf, 0, 255);
ioctlhdr = (struct cdb10hdr *) &tBuf;
ioctlhdr->inbufsize = 0;
ioctlhdr->outbufsize = 1024;
ioctlhdr->cdb[0] = LOG_SENSE;
ioctlhdr->cdb[1] = 0x00;
ioctlhdr->cdb[2] = 0x40 | pagenum;
ioctlhdr->cdb[3] = 0x00;
ioctlhdr->cdb[4] = 0x00;
ioctlhdr->cdb[5] = 0x00;
ioctlhdr->cdb[6] = 0x00;
ioctlhdr->cdb[7] = 0x04;
ioctlhdr->cdb[8] = 0x00;
ioctlhdr->cdb[9] = 0x00;
status = ioctl( device, 1 , &tBuf);
memcpy ( pBuf, &tBuf[8], 1024);
return status;
}
UINT8 modesense (int device, UINT8 pagenum, UINT8 *pBuf)
{
UINT8 tBuf[CDB_6_MAX_DATA_SIZE + CDB_6_HDR_SIZE ];
struct cdb6hdr *ioctlhdr;
UINT8 status;
memset ( &tBuf, 0, CDB_6_MAX_DATA_SIZE + CDB_6_HDR_SIZE );
ioctlhdr = (struct cdb6hdr *) &tBuf;
ioctlhdr->inbufsize = 0;
ioctlhdr->outbufsize = 0xff;
ioctlhdr->cdb[0] = MODE_SENSE;
ioctlhdr->cdb[1] = 0x00;
ioctlhdr->cdb[2] = pagenum;
ioctlhdr->cdb[3] = 0x00;
ioctlhdr->cdb[4] = CDB_6_MAX_DATA_SIZE;
ioctlhdr->cdb[5] = 0x00;
status = ioctl( device, 1 , &tBuf);
memcpy ( pBuf, &tBuf[8], 256);
return status;
}
UINT8 modeselect (int device, UINT8 pagenum, UINT8 *pBuf)
{
struct cdb6hdr *ioctlhdr;
UINT8 tBuf[CDB_6_MAX_DATA_SIZE + CDB_6_HDR_SIZE ];
UINT8 status;
memset ( &tBuf, 0, CDB_6_MAX_DATA_SIZE + CDB_6_HDR_SIZE );
ioctlhdr = (struct cdb6hdr *) &tBuf;
ioctlhdr->inbufsize = pBuf[0] + 1;
ioctlhdr->outbufsize = 0;
ioctlhdr->cdb[0] = MODE_SELECT;
ioctlhdr->cdb[1] = 0x11;
ioctlhdr->cdb[2] = 0x00;
ioctlhdr->cdb[3] = 0x00;
ioctlhdr->cdb[4] = pBuf[0] + 1;
ioctlhdr->cdb[5] = 0x00;
tBuf[CDB_6_HDR_SIZE + 3] = 0x08;
tBuf[CDB_6_HDR_SIZE + 10] = 0x02;
memcpy ( &tBuf[ CDB_6_HDR_SIZE + MODE_DATA_HDR_SIZE],
pBuf + MODE_DATA_HDR_SIZE,
pBuf[0] - MODE_DATA_HDR_SIZE + 1);
tBuf[26] &= 0x3f;
status = ioctl( device, 1 , &tBuf);
return status;
}
UINT8 modesense10 (int device, UINT8 pagenum, UINT8 *pBuf)
{
struct cdb10hdr *ioctlhdr;
UINT8 tBuf[1024];
UINT8 status;
memset ( &tBuf, 0, 1024);
ioctlhdr = (struct cdb10hdr *) &tBuf;
ioctlhdr->inbufsize = 0;
ioctlhdr->outbufsize = 0xff;
ioctlhdr->cdb[0] = MODE_SELECT_10;
ioctlhdr->cdb[1] = 0x00;
ioctlhdr->cdb[2] = 0x11;
ioctlhdr->cdb[3] = 0x00;
ioctlhdr->cdb[4] = 0x00;
ioctlhdr->cdb[5] = 0x00;
ioctlhdr->cdb[6] = 0x00;
ioctlhdr->cdb[7] = 0x00;
ioctlhdr->cdb[8] = 0xff;
ioctlhdr->cdb[9] = 0x00;
status = ioctl( device, 1 , &tBuf);
memcpy ( pBuf, &tBuf[8], 0xff);
return status;
}
UINT8 modeselect10 (int device, UINT8 pagenum, UINT8 *pBuf)
{
struct cdb10hdr *ioctlhdr;
UINT8 tBuf[CDB_10_MAX_DATA_SIZE + CDB_10_HDR_SIZE ];
UINT8 status;
memset ( &tBuf, 0, CDB_10_MAX_DATA_SIZE + CDB_10_HDR_SIZE );
ioctlhdr = (struct cdb10hdr *) &tBuf;
ioctlhdr->inbufsize = pBuf[0] + 1;
ioctlhdr->outbufsize = 0;
ioctlhdr->cdb[0] = MODE_SELECT_10;
ioctlhdr->cdb[1] = 0x00;
ioctlhdr->cdb[2] = pagenum;
ioctlhdr->cdb[3] = 0x00;
ioctlhdr->cdb[4] = 0x00;
ioctlhdr->cdb[5] = 0x00;
ioctlhdr->cdb[6] = 0x00;
ioctlhdr->cdb[7] = 0x00;
ioctlhdr->cdb[8] = pBuf[0] + 1;
ioctlhdr->cdb[9] = 0x00;
tBuf[CDB_10_HDR_SIZE + 3] = 0x08;
tBuf[CDB_10_HDR_SIZE + 10] = 0x02;
memcpy ( &tBuf[ CDB_10_HDR_SIZE + MODE_DATA_HDR_SIZE],
pBuf + MODE_DATA_HDR_SIZE,
pBuf[0] - MODE_DATA_HDR_SIZE + 1);
tBuf[26] &= 0x3f;
status = ioctl( device, 1 , &tBuf);
return status;
}
UINT8 stdinquiry ( int device, UINT8 *pBuf)
{
UINT8 tBuf[CDB_6_MAX_DATA_SIZE + CDB_6_HDR_SIZE ];
struct cdb6hdr *ioctlhdr;
UINT8 status;
memset ( &tBuf, 0, CDB_6_MAX_DATA_SIZE + CDB_6_HDR_SIZE );
ioctlhdr = (struct cdb6hdr *) &tBuf;
ioctlhdr->inbufsize = 0;
ioctlhdr->outbufsize = CDB_6_MAX_DATA_SIZE;
ioctlhdr->cdb[0] = INQUIRY;
ioctlhdr->cdb[1] = 0x00;
ioctlhdr->cdb[2] = 0x00;
ioctlhdr->cdb[3] = 0x00;
ioctlhdr->cdb[4] = CDB_6_MAX_DATA_SIZE;
ioctlhdr->cdb[5] = 0x00;
status = ioctl( device, 1, &tBuf );
memcpy ( pBuf, &tBuf[8], 255);
return status;
}
UINT8 inquiry ( int device, UINT8 pagenum, UINT8 *pBuf)
{
UINT8 tBuf[CDB_6_MAX_DATA_SIZE + CDB_6_HDR_SIZE ];
struct cdb6hdr *ioctlhdr;
UINT8 status;
memset ( &tBuf, 0, CDB_6_MAX_DATA_SIZE + CDB_6_HDR_SIZE );
ioctlhdr = (struct cdb6hdr *) &tBuf;
ioctlhdr->inbufsize = 0;
ioctlhdr->outbufsize = 0xff;
ioctlhdr->cdb[0] = INQUIRY;
ioctlhdr->cdb[1] = 0x01;
ioctlhdr->cdb[2] = 0x00;
ioctlhdr->cdb[3] = pagenum;
ioctlhdr->cdb[4] = CDB_6_MAX_DATA_SIZE;
ioctlhdr->cdb[5] = 0x00;
status = ioctl( device, 6 , &tBuf);
/*status = ioctl( device, 1 , &tBuf);*/
memcpy ( pBuf, &tBuf[8], 255);
return status;
}
UINT8 requestsense (int device, UINT8 *pBuf)
{
UINT8 tBuf[CDB_6_MAX_DATA_SIZE + CDB_6_HDR_SIZE ];
struct cdb6hdr *ioctlhdr;
UINT8 status;
memset ( &tBuf, 0, CDB_6_MAX_DATA_SIZE + CDB_6_HDR_SIZE );
ioctlhdr = (struct cdb6hdr *) &tBuf;
ioctlhdr->inbufsize = 0;
ioctlhdr->outbufsize = 0xff;
ioctlhdr->cdb[0] = REQUEST_SENSE;
ioctlhdr->cdb[1] = 0x00;
ioctlhdr->cdb[2] = 0x00;
ioctlhdr->cdb[3] = 0x00;
ioctlhdr->cdb[4] = CDB_6_MAX_DATA_SIZE;
ioctlhdr->cdb[5] = 0x00;
status = ioctl( device, 1 , &tBuf);
memcpy ( pBuf, &tBuf[8], 255);
return status;
}
UINT8 senddiagnostic (int device, UINT8 functioncode, UINT8 *pBuf)
{
UINT8 tBuf[CDB_6_MAX_DATA_SIZE + CDB_6_HDR_SIZE ];
struct cdb6hdr *ioctlhdr;
UINT8 status;
memset ( &tBuf, 0, CDB_6_MAX_DATA_SIZE + CDB_6_HDR_SIZE );
ioctlhdr = (struct cdb6hdr *) &tBuf;
ioctlhdr->inbufsize = 0;
ioctlhdr->outbufsize = 0xff;
ioctlhdr->cdb[0] = SEND_DIAGNOSTIC;
if (functioncode != SCSI_DIAG_SELF_TEST)
ioctlhdr->cdb[1] = ( functioncode <<5 ) | 0x10;
ioctlhdr->cdb[2] = 0x00;
ioctlhdr->cdb[3] = 0x00;
ioctlhdr->cdb[4] = 0x00;
ioctlhdr->cdb[5] = 0x00;
if (pBuf != NULL)
{
ioctlhdr->inbufsize = pBuf[0];
ioctlhdr->cdb[4] = pBuf[0];
memcpy ( &tBuf[CDB_6_HDR_SIZE],
pBuf + 1,
pBuf[0]);
}
status = ioctl( device, 1 , &tBuf);
if (pBuf != NULL)
memcpy ( pBuf, &tBuf[8], 256);
return status;
}
UINT8 receivediagnostic (int device, UINT8 pagenum, UINT8 *pBuf)
{
UINT8 tBuf[CDB_6_MAX_DATA_SIZE + CDB_6_HDR_SIZE ];
struct cdb6hdr *ioctlhdr;
UINT8 status;
memset ( &tBuf, 0, CDB_6_MAX_DATA_SIZE + CDB_6_HDR_SIZE );
ioctlhdr = (struct cdb6hdr *) &tBuf;
ioctlhdr->inbufsize = 0;
ioctlhdr->outbufsize = 0xff;
ioctlhdr->cdb[0] = RECEIVE_DIAGNOSTIC;
ioctlhdr->cdb[1] = 0x01;
ioctlhdr->cdb[2] = pagenum;
ioctlhdr->cdb[3] = 0x00;
ioctlhdr->cdb[4] = 0x00;
ioctlhdr->cdb[5] = 0x00;
status = ioctl( device, 1 , &tBuf);
memcpy ( pBuf, &tBuf[8], 256);
return status;
}
UINT8 testunitready (int device)
{
return ioctl( device, 2 , NULL);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -