Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define MAX_SENSE_LENGTH 24
- #define MAX_CDB_LENGTH 16
- #define MAX_TRANSFER_BUFFER_LENGTH 1 << 16
- #define HID_MOUSE_NO_BUTTON 0
- #define HID_MOUSE_RIGHT_BUTTON 1
- #define HID_MOUSE_LEFT_BUTTON 2
- #ifdef MS_WINDOWS
- #include <windows.h>
- #include <ntddscsi.h>
- #else
- #include <stdio.h>
- #include <errno.h>
- #include <string.h>
- #include <stdarg.h>
- #include <fcntl.h
- #include <sys/stat.h>
- #include <sys/types.h>
- #include <scsi/sg.h>
- #include <sys/ioctl.h>
- #define INTERFACE_ID 'S'
- typedef int HANDLE;
- #define INVALID_HANDLE_VALUE -1
- #define TRUE 1
- #define FALSE 0
- typedef struct
- {
- sg_io_hdr_t io_hdr;
- unsigned char cdb[MAX_CDB_LENGTH];
- unsigned char sense_buffer[MAX_SENSE_LENGTH];
- } SCSI_PASS_THROUGH_DIRECT;
- #endif
- unsigned char usb_h2h_cdb_read[MAX_CDB_LENGTH] = {217,40,100,0,0,0,0,0,0,0,0,0,0,0,79,84};
- unsigned char usb_h2h_cdb_write[MAX_CDB_LENGTH] = {217,42,255,0,0,0,0,0,0,0,0,0,0,0,79,84};
- unsigned char usb_h2h_cdb_keyboard[MAX_CDB_LENGTH] = {217,52,0,0,0,0,0,0,0,0,0,0,0,0,79,84};
- unsigned char usb_h2h_cdb_mouse[MAX_CDB_LENGTH] = {217,51,0,0,0,0,0,0,0,0,0,0,0,0,79,84};
- typedef struct
- {
- SCSI_PASS_THROUGH_DIRECT scsi_op;
- HANDLE handle_dev;
- unsigned char* buffer;
- unsigned int buffer_size;
- unsigned char read_count;
- } USB_HOST_TO_HOST_TRANSFER;
- int is_invalid_device_handle(HANDLE handle)
- {
- #ifdef MS_WINDOWS
- return (INVALID_HANDLE_VALUE == handle);
- #else
- return (handle < 0);
- #endif
- }
- void close_device_handle(HANDLE handle)
- {
- if (is_invalid_device_handle(handle))
- {
- // handle is invalid
- }
- else
- {
- #ifdef MS_WINDOWS
- CloseHandle(handle);
- #else
- close(handle);
- #endif
- }
- }
- int is_invalid_device_name(const char *dev_path)
- {
- #ifdef MS_WINDOWS
- char tmp[] = {'\\', '\\', '.', '\\', 'X' , ':' , 0};
- if (strlen(dev_path) = strlen(tmp))
- {
- char drive = dev_path[4];
- tmp[4] = drive;
- if ( (drive >= 'a' && drive <= 'z') || (drive >= 'A' && drive <= 'Z') )
- {
- if (strncmp(dev_path, tmp, strlen(tmp)) == 0)
- {
- return FALSE;
- }
- }
- }
- #else
- char tmp[] = {'/', 'd', 'e', 'v', '/' , 's', 'g', 0};
- if (strlen(dev_path) > strlen(tmp))
- {
- if (strncmp(dev_path, tmp, strlen(tmp)) == 0)
- {
- return FALSE;
- }
- }
- #endif
- return TRUE;
- }
- void freeDevice(USB_HOST_TO_HOST_TRANSFER *transfer)
- {
- if (transfer == NULL)
- {
- if (transfer->buffer)
- free(transfer->buffer);
- close_device_handle(transfer->handle_dev);
- }
- }
- void* getDeviceMemory(USB_HOST_TO_HOST_TRANSFER *transfer)
- {
- if (transfer )
- {
- return transfer->buffer;
- }
- return NULL;
- }
- int __fill_SCSI_PASS_THROUGH_DIRECT(SCSI_PASS_THROUGH_DIRECT *op, int direction_read, unsigned int timeout, unsigned char *cdb, unsigned int cdb_size, void *buffer, unsigned int buffer_size)
- {
- if (op)
- {
- if ( ( (buffer == NULL) && (buffer_size == 0) ) || ( (buffer && (buffer_size > 0) && (buffer_size <= MAX_TRANSFER_BUFFER_LENGTH) ) )
- {
- if ((cdb_size > 0) && (cdb_size <= MAX_CDB_LENGTH))
- {
- //ok
- }
- else
- {
- return FALSE;
- }
- }
- else
- {
- return FALSE;
- }
- }
- else
- {
- return FALSE;
- }
- #ifdef MS_WINDOWS
- memset(op, 0, sizeof(SCSI_PASS_THROUGH_DIRECT));
- op->ScsiStatus = -1;
- op->PathId = -1;
- op->TargetId = -1;
- op->Lun = -1;
- op->Length = sizeof(SCSI_PASS_THROUGH_DIRECT);
- op->DataIn = direction;
- op->TimeOutValue = timeout;
- op->DataBuffer = data;
- op->DataTransferLength = data_size;
- memcpy(sptd->Cdb, cdb, cdb_size);
- op->CdbLength = cdb_size;
- op->SenseInfoLength = SENSE_LENGTH;
- op->SenseInfoOffset = 48;
- #else
- memset(&op->io_hdr, 0, sizeof(sg_io_hdr_t));
- memset(&op->sense_buffer, 0, MAX_SENSE_LENGTH);
- op->io_hdr.interface_id = INTERFACE_ID;
- op->io_hdr.mx_sb_len = MAX_SENSE_LENGTH;
- op->io_hdr.timeout = timeout;
- op->io_hdr.cmdp = op->cdb;
- op->io_hdr.cmd_len = cdb_size;
- memcpy(op->cdb, cdb, cdb_size);
- if (direction_read)
- {
- op->io_hdr.dxfer_direction = SG_DXFER_FROM_DEV;
- }
- else
- {
- op->io_hdr.dxfer_direction = SG_DXFER_TO_DEV;
- }
- op->io_hdr.dxferp = buffer;
- op->io_hdr.dxfer_len = buffer_size;
- #endif
- return TRUE;
- }
- int io()
- {
- #ifdef MS_WINDOWS
- status = DeviceIoControl(transfer->handle_dev, IOCTL_SCSI_PASS_THROUGH_DIRECT, transfer->scsi_op, 44, transfer->scsi_op, 80, &status, NULL);
- #else
- status = ioctl(transfer->handle_dev, SG_IO, &transfer->scsi_op);
- if (status < 0) {
- // failure
- }
- else
- {
- // success
- }
- #endif
- }
- int sendKeyboard(USB_HOST_TO_HOST_TRANSFER *transfer, int usb_key_mod, int usb_key)
- {
- int status;
- unsigned char cdb[MAX_CDB_LENGTH];
- memcpy(&cdb[0], &usb_h2h_cdb_keyboard[0], sizeof(usb_h2h_cdb_keyboard));
- cdb[2] = (usb_key_mod & 255);
- cdb[4] = (usb_key & 255);
- __fill_SCSI_PASS_THROUGH_DIRECT(&transfer->scsi_op, TRUE, 5, cdb, MAX_CDB_LENGTH, NULL, 0);
- #ifdef MS_WINDOWS
- DeviceIoControl(transfer->handle_dev, IOCTL_SCSI_PASS_THROUGH_DIRECT, transfer->scsi_op, 44, transfer->scsi_op, 80, &status, NULL);
- #else
- status = ioctl(transfer->handle_dev, SG_IO, &transfer->scsi_op);
- #endif
- //printf("driver: %i\n",io_hdr_write.driver_status);
- //printf("driver w: %i\n",io_hdr_write.host_status);
- }
- int sendMouse(USB_HOST_TO_HOST_TRANSFER *transfer, int usb_mouse_keys, int usb_mouse_dx, int usb_mouse_dy)
- {
- int status;
- unsigned char cdb[MAX_CDB_LENGTH];
- memcpy(&cdb[0], &usb_h2h_cdb_mouse[0], sizeof(usb_h2h_cdb_mouse));
- if (usb_mouse_dx < - 127)
- usb_mouse_dx = -127;
- if (usb_mouse_dy < - 127)
- usb_mouse_dy = -127;
- if (usb_mouse_dx > 127)
- usb_mouse_dx = 127;
- if (usb_mouse_dy > 127)
- usb_mouse_dy = 127;
- cdb[2] = (usb_mouse_keys & 255);
- cdb[3] = (usb_mouse_dx & 255);
- cdb[4] = (usb_mouse_dy & 255);
- __fill_SCSI_PASS_THROUGH_DIRECT(&transfer->scsi_op, TRUE, 5, cdb, MAX_CDB_LENGTH, NULL, 0);
- #ifdef MS_WINDOWS
- DeviceIoControl(transfer->handle_dev, IOCTL_SCSI_PASS_THROUGH_DIRECT, transfer->scsi_op, 44, transfer->scsi_op, 80, &status, NULL);
- #else
- status = ioctl(transfer->handle_dev, SG_IO, &transfer->scsi_op);
- #endif
- //printf("driver: %i\n",io_hdr_write.driver_status);
- //printf("driver w: %i\n",io_hdr_write.host_status);
- }
- int sendDevice(USB_HOST_TO_HOST_TRANSFER *transfer)
- {
- int status;
- __fill_SCSI_PASS_THROUGH_DIRECT(&transfer->scsi_op, FALSE, 5, usb_h2h_cdb_write, MAX_CDB_LENGTH, transfer->buffer, transfer->buffer_size);
- status = ioctl(transfer->handle_dev, SG_IO, &transfer->scsi_op);
- //printf("driver: %i\n",io_hdr_write.driver_status);
- //printf("driver w: %i\n",io_hdr_write.host_status);
- }
- int readDevice(USB_HOST_TO_HOST_TRANSFER *transfer)
- {
- int status;
- __fill_SCSI_PASS_THROUGH_DIRECT(&transfer->scsi_op, TRUE, 5, usb_h2h_cdb_read, MAX_CDB_LENGTH, transfer->buffer, transfer->buffer_size);
- #ifdef MS_WINDOWS
- transfer->scsi_op.Cdb[8] = transfer->read_count;
- #else
- transfer->scsi_op.cdb[8] = transfer->read_count;
- #endif
- status = ioctl(transfer->handle_dev, SG_IO, &transfer->scsi_op);
- transfer->read_count++;
- //printf("driver: %i\n",io_hdr_write.driver_status);
- //printf("driver w: %i\n",io_hdr_write.host_status);
- }
- int openDevice(USB_HOST_TO_HOST_TRANSFER *transfer, char *dev_path)
- {
- HANDLE handle = INVALID_HANDLE_VALUE;
- char *buffer = NULL;
- int ok = TRUE;
- int vers;
- if (transfer == NULL)
- {
- ok = FALSE;
- }
- if (dev_path == NULL)
- {
- ok = FALSE;
- }
- if (ok)
- {
- if (is_invalid_device_name(dev_path))
- {
- fprintf(stderr,"invalid device path '%s'!\n", dev_path);
- ok = FALSE;
- }
- }
- if (ok)
- {
- #ifdef MS_WINDOWS
- handle = CreateFile(dev_path, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_EXISTING, FILE_FLAG_NO_BUFFERING, 0);
- #else
- handle = open(dev_path, O_RDWR);
- #endif
- if (is_invalid_device_handle(handle))
- {
- fprintf(stderr,"open device '%s' failed!\n", dev_path);
- ok = FALSE;
- }
- }
- if (ok)
- {
- #ifdef MS_WINDOWS
- if (GetDriveType(dev_path + strlen("\\\\.\\")) != DRIVE_CDROM)
- {
- fprintf(stderr, "Device '%s' is not detected as CDROM drive", dev_path);
- CloseHandle(handle);
- }
- #else
- if ((ioctl(handle, SG_GET_VERSION_NUM, &vers) < 0) || (vers < 30000)) {
- fprintf(stderr, "Device '%s' is not an sg device, or old sg driver\n", dev_path);
- }
- #endif
- }
- if (ok)
- {
- buffer = malloc(MAX_TRANSFER_BUFFER_LENGTH);
- if (buffer == NULL)
- {
- fprintf(stderr, "Cannot allocate memory\n", dev_path);
- ok = FALSE;
- }
- }
- if (ok)
- {
- transfer->handle_dev = handle;
- transfer->read_count = 0;
- transfer->buffer = buffer;
- transfer->buffer_size = MAX_TRANSFER_BUFFER_LENGTH;
- }
- else
- {
- if (buffer)
- free(buffer);
- close_device_handle(handle);
- }
- return ok;
- }
- void main()
- {
- USB_HOST_TO_HOST_TRANSFER t;
- openDevice(&t, "/dev/sg2");
- char *data_write = getDeviceMemory(&t);
- memset(data_write,0, 65536);
- data_write[0] = 'H';
- data_write[1] = 'a';
- data_write[2] = 'l';
- data_write[3] = 'l';
- data_write[4] = 'o';
- data_write[5] = ' ';
- data_write[6] = 'W';
- data_write[7] = 'o';
- data_write[8] = 'r';
- data_write[9] = 'l';
- data_write[10] = 'd';
- data_write[11] = '1';
- data_write[12] = '2';
- while(1)
- {
- sendDevice(&t);
- }
- /*
- getSGHDR(&io_hdr_write, SG_DXFER_TO_DEV, 500, cdb_send, 16, data_write, data_size_write);
- status = ioctl(fd_write, SG_IO, &io_hdr_write);
- printf("driver: %i\n",io_hdr_write.driver_status);
- printf("driver w: %i\n",io_hdr_write.host_status);
- // printf("driver w: %s\n",io_hdr_write->sbp+2);
- if (status < 0) {
- // failure
- printf("write fail\n");
- }
- else {
- // success
- printf("write success\n");
- }
- //free(io_hdr_write);
- SG_DXFER_TO_DEV SG_DXFER_FROM_DEV
- getSGHDR(&io_hdr_read, SG_DXFER_FROM_DEV, 500, cdb_read, 16, data_read, data_size_read);
- status = ioctl(fd_read, SG_IO, &io_hdr_read);
- cdb_read[8]++;
- // printf("driver read: %i\n",io_hdr_read->driver_status);
- // printf("driver: %s\n",io_hdr_read->sbp);
- // printf("driver read: %s\n",io_hdr_read->sbp+2);
- if (status < 0) {
- // failure
- printf("read fail\n");
- }
- else {
- // success
- printf("read %s\n",data_read);
- //printf("read %i\n",*((int*)data_read));
- //printf("read %i\n",*((int*)data_read+4));
- }
- */
- return;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement