2013-01-16 8 views
0

대용량 저장 장치를 개발했으며 PC 응용 프로그램과 같은 사용자 지정 명령을 송수신하고 싶습니다. 일반적으로이 (MSC + HID) 용 복합 USB 장치를 만들고 HID를 통해 명령을 보냅니다. 그러나 대용량 저장 클래스만으로이 작업을 수행 할 수 있습니까? 내가 생각 몇 가지 :대용량 저장 장치에 사용자 지정 명령 보내기

  • 는 "마법"부문에 데이터를 기록하고, 즉시 장치에 구문 분석 (Vista는이에 대한 관리자 권한이 필요)하지 않는 SCSI 명령의 데이터를 보내기 (특정 Windows 버전에서는 원시 디스크 액세스를 허용하지 않습니다.)
  • 디스크의 .txt 파일에 데이터를 저장하여 전송합니다 (매우 복잡합니다. 장치가 FAT 테이블을 구문 분석하여 파일이며 .txt 파일이 업데이트되면 알림을받을 수있는 방법이 없음)

누군가 다른 해킹을 생각할 수 있습니까?이 목적을 위해 작동할까요? 아니면 HID 장치를 만들 수있는 유일한 옵션입니까?

+0

댓글을 통한 경우를 제외하고는 사용자와 연락 할 수있는 방법이 없었던 것 같습니다. 대용량 저장 장치에 명령/데이터를 보낼 수있는 대답이나 방법을 찾았습니까? 모든 팁을 많이 주시면 감사하겠습니다. 감사합니다 –

답변

1

언급 한 MSC는 "USB"대용량 저장 장치입니까?

그렇다면 SCSI_PATH_THROUGH를 사용하여이 USB MSC와 통신 할 수 있습니다!

Ex.

BOOL LogicalWriteCmd(HANDLE fileHandle,ULONG LBA,ULONG SectorCnt,PVOID DataBuffer) 
{ 
    SCSI_PASS_THROUGH_DIRECT_WITH_BUFFER sptdwb; 
    ULONG returned,length; 
    BOOL status; 

    ZeroMemory(&sptdwb, sizeof(SCSI_PASS_THROUGH_DIRECT_WITH_BUFFER));  

    length = SectorCnt<<SECTOR_SIZE_SHIFT_BIT; 

    sptdwb.sptd.Length = sizeof(SCSI_PASS_THROUGH_DIRECT); 
    sptdwb.sptd.PathId = 0; 
    sptdwb.sptd.TargetId = 0; 
    sptdwb.sptd.Lun = 0; 
    sptdwb.sptd.CdbLength = CDB10GENERIC_LENGTH; 
    sptdwb.sptd.DataIn = SCSI_IOCTL_DATA_OUT; 
    sptdwb.sptd.SenseInfoLength = SPT_SENSE_LENGTH; 
    sptdwb.sptd.DataTransferLength = length; 
    sptdwb.sptd.TimeOutValue = g_ulTimeOut; 
    sptdwb.sptd.DataBuffer = DataBuffer; 
    sptdwb.sptd.SenseInfoOffset = 
     offsetof(SCSI_PASS_THROUGH_DIRECT_WITH_BUFFER,ucSenseBuf); 
    sptdwb.sptd.Cdb[0] = SCSIOP_WRITE; 

    sptdwb.sptd.Cdb[2] = (UCHAR)(LBA>>24); 
    sptdwb.sptd.Cdb[3] = (UCHAR)(LBA>>16); 
    sptdwb.sptd.Cdb[4] = (UCHAR)(LBA>>8); 
    sptdwb.sptd.Cdb[5] = (UCHAR)(LBA); 

    sptdwb.sptd.Cdb[7] = SectorCnt>>8;  
    sptdwb.sptd.Cdb[8] = (UCHAR)SectorCnt; 

    length = sizeof(SCSI_PASS_THROUGH_DIRECT_WITH_BUFFER); 
    status = DeviceIoControl(fileHandle, 
          IOCTL_SCSI_PASS_THROUGH_DIRECT, 
          &sptdwb, 
          length, 
          &sptdwb, 
          length, 
          &returned, 
          FALSE); 


    if ((sptdwb.sptd.ScsiStatus == 0) && (status != 0)) {  
     return TRUE; 
    } 


    return FALSE; 

} 

그리고 당신은 당신의 자신의 업체/사용자 정의 명령은 다음 위의 방법으로 USB의 MSC에 보낼 만들 수 있습니다 : USB의 MSC에 발행 쓰기 명령은 다음 코드에 의해 달성 될 수있다. 그러나 장치가 올바르게 식별해야합니다!

+0

이것이 최선의 방법 일 것이라고 나는 동의하지만 주요 문제는 KB241374입니다. "관리자 그룹의 구성원 만 SCSI 통과 요청을 보낼 수있는 올바른 권한을가집니다." 따라서 항상 내 응용 프로그램을 관리자 권한으로 실행해야합니다. – Muis

+0

예! 그게 ... 전에 ASPI를 사용하여 USB MSD에 액세스하기 전에 (http://en.wikipedia.org/wiki/Advanced_SCSI_Programming_Interface를 확인하십시오) – liaoo