分享

让程序在U盘中自动运行

 guitarhua 2014-05-16
开发可以自动运行程序的U盘
二.   开发思路

我们知道光驱插入光盘可以自动运行,所以我们可以让U盘的一个区模拟成光盘的形式。这样我们可以利用autorun.inf,让程序自动运行。

三.   开发步骤
1.   让U盘一个区显示成光盘
这个对于开发过U盘的人来说应该很简单,就是在操作系统发送SCSI设备的 INQUIRY 指令的时候,返回的INQUIRY里面指明设备类型,我们设置为CD设备。具体指令可以参考相关资料(spc3r23.pdf)。我开发的时候INQUIRY返回数据的前几个字节如下:0x05,0x80,0x02,0x02仅供参考。

2.   响应操作系统对这光盘区的指令
成光盘后,操作系统可能会发送一些SCSI指令给这个光盘区。应该响应某些指令,有些并不需要响应。后面我会附录一个我弄过的一个U盘的BusHound监测文件,大家可以参考。最好买一个这样的U盘,然后用BusHound监测通讯过程。

3.   向光盘区写入文件
应该可以把光盘区弄成CDRW,这样直接写入就可以了,但这样需要了解很多协议。由于时间关系,我采用了简单的方法,把需要写入光盘的文件用ISO制作工具弄成一个ISO镜像文件,编写一个小程序向这个光盘区写入ISO镜像文件。程序部分代码附在文档后面,仅供参考。写入的程序最终调用DeviceIoControl函数。文件写入后,再重新拔插U盘就可以了。

四.   说明
这里只是简单说明了原理,如果是刚接触这个,还有很多东西要弄清楚,我是在别人一个普通U盘开发板的基础上添加这个功能的,最后弄通了,感觉很不容易,以前也没有弄过硬件的固件程序。希望对新手有帮助。有什么问题,可以邮件联系交流。

附录:
1.   Write ISO程序部分代码:
UINT CWriteIsoFileDlg::ThreadWrite(LPVOID pParam)
{
  CWriteIsoFileDlg * p = (CWriteIsoFileDlg*)pParam;

  CSDsk sd;
  CString str;

  HANDLE fh,hFind;
  WIN32_FIND_DATA FindFileData;
  ULONGLONG fSize = 0;
  CFileFind ff;

  DWORD startAddr = 0;
  DWORD nBytesRead = 0;
  PBYTE buf = new BYTE[20480];
  memset(buf,0,20480);

  try
  {
    if(!ff.FindFile(p->filename))
    {   
        str.Format("找不到文件 %s ",p->filename);
        throw 1;
    }
    ff.FindNextFile();

    fh = CreateFile(ff.GetFilePath(),GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
    if(fh==INVALID_HANDLE_VALUE)
    {
        str.Format("打开文件 %s 失败",p->filename);
        throw 1;
    }

    if(!sd.Open())
        throw 0;

    int index = sd.GetDevNum()-1;

    if(!sd.ReadCapacity(index,0,fSize))
        throw 0;

    if(ff.GetLength()>fSize)
    {
        str = "光盘空间不足,不能写入。";
        throw 1;
    }
    fSize = ff.GetLength();

    if(!sd.GetFlashParam(index,0,1,buf))
        throw 0;
    buf[0]&=0xBF;
    if(!sd.SetFlashParam(index,0,1,buf,false))
        throw 0;

    while(1)
    {
        if(ReadFile(fh,buf,20480,&nBytesRead,NULL))
        {
          if(nBytesRead!=0)
          {
            if(!sd.Write(index,0,startAddr,40,buf))
            {
                throw 0;
            }
            startAddr+=40;
            memset(buf,0,20480);
          }
          else
            break;
        }
        else
        {
          str = "读文件错误!";
          throw 1;
        }
    }
    //p->MessageBox("写入镜像文件成功!",NULL,MB_OK|MB_ICONINFORMATION);
    sd.PlugDisk(index,0,true);

    delete [] buf;
    exit(0);
  }
  catch(int e)
  {
    if(e==0) 
    {
        p->MessageBox(sd.err.GetErrMsg(),NULL,MB_OK|MB_ICONERROR);
    }
    else 
        p->MessageBox(str,NULL,MB_OK|MB_ICONERROR);
  }
  delete [] buf;
  exit(-1);
  return 1;
}

2.   可以自启动U盘的BusHound在windowsXp下的监测文件

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多