向USB设备发送SCSI命令

http://bbs3.driverdevelop.com/simple/?t84347.html

复制代码
{
  BOOL status = 0;
  DWORD accessMode = 0, shareMode = 0;
  HANDLE fileHandle = NULL;
//PUCHAR dataBuffer = NULL;
  SCSI_PASS_THROUGH_WITH_BUFFERS sptwb;
  SCSI_PASS_THROUGH_DIRECT_WITH_BUFFER sptdwb;
  UCHAR buffer[ 2048 ];
  UCHAR string[ 25 ];
  ULONG length = 0, errorCode = 0;
  DWORD returned = 0;

  strcpy(string, "\\\\.\\");
  strcat(string, "I:");

  shareMode = FILE_SHARE_READ | FILE_SHARE_WRITE;//default
  accessMode = GENERIC_WRITE | GENERIC_READ;//default

  fileHandle = CreateFile( string, accessMode, shareMode, NULL, OPEN_EXISTING, 0,
      NULL );

  if (fileHandle == INVALID_HANDLE_VALUE)
  {
    MessageBox(NULL, "Create file fail", "tester", MB_OK);
    return false;
  }

  ZeroMemory(&sptwb, sizeof(SCSI_PASS_THROUGH_WITH_BUFFERS));

  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(SCSI_PASS_THROUGH_WITH_BUFFERS,ucDataBuf);
  sptwb.spt.SenseInfoOffset =
  offsetof(SCSI_PASS_THROUGH_WITH_BUFFERS,ucSenseBuf);
  sptwb.spt.Cdb[0] = SCSI_OPCODE_HWTEST_COMMAND; //SCSI_OPCODE_SIGMATEL_WRITE_COMMAND;//
  sptwb.spt.Cdb[1] = HWTEST_DISPLAY_ID;//ALLOCATE_MEDIA;
  sptwb.spt.Cdb[4] = 192;
  length = offsetof( SCSI_PASS_THROUGH_WITH_BUFFERS, ucDataBuf )
  + sptwb.spt.DataTransferLength;

  status = DeviceIoControl( fileHandle, IOCTL_SCSI_PASS_THROUGH, &sptwb,
      sizeof(SCSI_PASS_THROUGH), &sptwb, length, &returned, FALSE );

  if (!status)
  {
    MessageBox(NULL, "Device I/0 control fail!", "tester", MB_OK);
    errorCode = GetLastError();
    ShowMessage(IntToStr(errorCode));
    PrintError(errorCode);
    CloseHandle(fileHandle);
    return false;
  }

  CloseHandle( fileHandle );
  return true;
}
复制代码

 

posted @   IAmAProgrammer  阅读(4884)  评论(0编辑  收藏  举报
(评论功能已被禁用)
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
点击右上角即可分享
微信分享提示