emptily
驱动牛犊
驱动牛犊
  • 注册日期2002-12-11
  • 最后登录2003-11-24
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2625回复:12

使用CreateFile打开Mass storage句柄,请问用DeviceIoControl怎么样发送命令才可以对存储器进行数据通讯?

楼主#
更多 发布于:2003-02-17 17:40
使用CreateFile打开Mass storage句柄,请问用DeviceIoControl怎么样发送命令才可以对USB设备进行数据通讯?用什么命令字?最好能有示例,谢谢大家!

[编辑 -  2/17/03 by  emptily]
emptily
驱动牛犊
驱动牛犊
  • 注册日期2002-12-11
  • 最后登录2003-11-24
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-02-19 09:06
有哪位知道,烦请告知?
swf2003
驱动中牛
驱动中牛
  • 注册日期2003-02-13
  • 最后登录2011-10-28
  • 粉丝1
  • 关注0
  • 积分4分
  • 威望22点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-02-19 09:20
用CreateFile(...) 生成的HANDLE ,调用
BOOL DeviceIoControl(
  HANDLE hDevice,        // handle to device of interest
  DWORD dwIoControlCode,// control code of operation to perform
  LPVOID lpInBuffer,// pointer to buffer to supply input data
  DWORD nInBufferSize,// size, in bytes, of input buffer
  LPVOID lpOutBuffer,// pointer to buffer to receive output data
  DWORD nOutBufferSize, // size, in bytes, of output buffer
  LPDWORD lpBytesReturned,// pointer to variable to receive byte count
  LPOVERLAPPED lpOverlapped // pointer to structure for asynchronous operation
);
 具体参数的意义参考MSDN。
只是 dwIoControlCode 你Driver 中必须支持。其它参数要根据它来定。
你的认可是对我最大的鼓励!
emptily
驱动牛犊
驱动牛犊
  • 注册日期2002-12-11
  • 最后登录2003-11-24
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-02-19 10:10
谢谢您的回复,我知道是这么做,但就是这个dwIoControlCode的控制码我找不到,我用的是mass storage的通用驱动,不知道谁有这方面的资料?
szwilly2002
驱动牛犊
驱动牛犊
  • 注册日期2003-01-31
  • 最后登录2004-10-24
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-02-20 01:39
最苯的方法:枚举
最好的方法:看msdm
emptily
驱动牛犊
驱动牛犊
  • 注册日期2002-12-11
  • 最后登录2003-11-24
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-02-20 08:43
这是DDK的东西,看MSDN有什么用吗?那么多的controlcode用权举?何止是笨,简直是笨得出奇了,这招还是行不通的。
rainysky1224
驱动牛犊
驱动牛犊
  • 注册日期2003-02-16
  • 最后登录2004-10-08
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2003-02-20 14:13
msdn中怎么会没有呢。一堆

dwIoControlCode
Specifies the control code for the operation. This value identifies the specific operation to be performed and the type of device on which the operation is to be performed. The following values are defined: Value Meaning
FSCTL_ALLOW_EXTENDED_DASD_IO Signals the file system driver not to perform any I/O boundary checks on partition read or write calls. Instead, boundary checks are performed by the device driver.  
FSCTL_DELETE_REPARSE_POINT Deletes a reparse point for a file or directory.
FSCTL_DISMOUNT_VOLUME Dismounts a volume.
FSCTL_ENABLE_UPGRADE  Enables or disables upgrading an NTFS volume to NTFS version 5.
FSCTL_GET_COMPRESSION Obtains the compression state of a file or directory
FSCTL_GET_HFS_INFORMATION Returns Macintosh Finder information about the file associated with the input handle.  
FSCTL_GET_REPARSE_POINT Returns reparse point data for a file or directory.
FSCTL_LOCK_VOLUME Locks a volume.
FSCTL_QUERY_ALLOCATED_RANGES Scans a file for ranges of the file for which disk space is allocated.
FSCTL_QUERY_FAT_BPB Returns the first 36 bytes of a FAT16 or FAT12 volume.
FSCTL_READ_COMPRESSION Reserved for future use.
FSCTL_SET_COMPRESSION Sets the compression state of a file or directory.
FSCTL_SET_REPARSE_POINT Sets a reparse point on a file or directory.
FSCTL_SET_SPARSE Marks a file as a sparse file.
FSCTL_SET_ZERO_DATA Sets a range of a files bytes to zeroes.
FSCTL_UNLOCK_VOLUME Unlocks a volume.
FSCTL_WRITE_COMPRESSION Reserved for future use.
IOCTL_DISK_CHECK_VERIFY Obsolete. Use IOCTL_STORAGE_CHECK_VERIFY
IOCTL_DISK_EJECT_MEDIA Obsolete. Use IOCTL_STORAGE_EJECT_MEDIA
IOCTL_DISK_FORMAT_TRACKS Formats a contiguous set of disk tracks.
IOCTL_DISK_GET_DRIVE_GEOMETRY Obtains information on the physical disk\'s geometry.
IOCTL_DISK_GET_DRIVE_LAYOUT Provides information about each partition on a disk.
IOCTL_DISK_GET_MEDIA_TYPES Obsolete. Use IOCTL_STORAGE_GET_MEDIA_TYPES
IOCTL_DISK_GET_PARTITION_INFO Obtains disk partition information.
IOCTL_DISK_LOAD_MEDIA Obsolete. Use IOCTL_STORAGE_LOAD_MEDIA
IOCTL_DISK_MEDIA_REMOVAL Obsolete. Use IOCTL_STORAGE_MEDIA_REMOVAL
IOCTL_DISK_PERFORMANCE Provides disk performance information.
IOCTL_DISK_REASSIGN_BLOCKS Maps disk blocks to spare-block pool.
IOCTL_DISK_SET_DRIVE_LAYOUT Partitions a disk.
IOCTL_DISK_SET_PARTITION_INFO Sets the disk partition type.
IOCTL_DISK_VERIFY Performs logical format of a disk extent.
IOCTL_SERIAL_LSRMST_INSERT Enables or disables placement of a line and modem status data into the data stream.
IOCTL_STORAGE_CHECK_VERIFY Checks for change in a removable-media device.
IOCTL_STORAGE_EJECT_MEDIA Ejects media from a SCSI device.
IOCTL_STORAGE_GET_MEDIA_TYPES Obtains information about media support.
IOCTL_STORAGE_LOAD_MEDIA Loads media into a device.
IOCTL_STORAGE_MEDIA_REMOVAL Enables or disables the media eject mechanism.


For more detailed information on each control code, see its topic. In particular, each topic provides details on the usage of the lpInBuffer, nInBufferSize, lpOutBuffer, nOutBufferSize, and lpBytesReturned parameters.

just do it
rainysky1224
驱动牛犊
驱动牛犊
  • 注册日期2003-02-16
  • 最后登录2004-10-08
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2003-02-20 14:35
DWORD CUsbIo::SetConfiguration(const USBIO_SET_CONFIGURATION* Conf)
{
  DWORD Status;

  Status = IoctlSync(
              IOCTL_USBIO_SET_CONFIGURATION,
              Conf,
              sizeof(USBIO_SET_CONFIGURATION),
              NULL,
              0,
              NULL
              );

  return Status;
}

DWORD CUsbIo::IoctlSync(
        DWORD IoctlCode,
        const void *InBuffer,
        DWORD InBufferSize,
        void *OutBuffer,
        DWORD OutBufferSize,
        DWORD *BytesReturned
        )
{
  DWORD Status;
  DWORD BytesRet = 0;
  BOOL succ;

  // check if the driver was opened
  if ( FileHandle == NULL ) {
    return USBIO_ERR_DEVICE_NOT_OPEN;
  }

  // IOCTL requests must be serialized
  // bec. there is only one event object per instance
  EnterCriticalSection(&CritSect);

  // call the device driver
  succ = DeviceIoControl(
            FileHandle,         // driver handle
            IoctlCode,          // IOCTL code
            (void*)InBuffer,    // input buffer
            InBufferSize,       // input buffer size
            OutBuffer,          // output buffer
            OutBufferSize,      // output buffer size
            &BytesRet,          // number of bytes returned
            &Overlapped         // overlapped structure (async.)
            );
  if ( succ ) {
    // ioctl completed successfully
    Status = USBIO_ERR_SUCCESS;
  } else {
    Status = GetLastError();
    if ( Status == ERROR_IO_PENDING ) {
      // the operation is pending, wait for completion
      succ = GetOverlappedResult(
                FileHandle,
                &Overlapped,
                &BytesRet,  // byte count
                TRUE        // wait flag
                );
      if ( succ ) {
        // completed successfully
        Status = USBIO_ERR_SUCCESS;
      } else {
        Status = GetLastError();
      }
    }
  }

  LeaveCriticalSection(&CritSect);

  if ( BytesReturned != NULL ) {
    *BytesReturned = BytesRet;
  }

  return Status;
}
这个例程在VC下运行成功的。
just do it
emptily
驱动牛犊
驱动牛犊
  • 注册日期2002-12-11
  • 最后登录2003-11-24
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2003-02-20 15:44
请问有没有完整的示例呢?请邮至emptily@163.com,非常感谢!
panxz
驱动牛犊
驱动牛犊
  • 注册日期2002-04-04
  • 最后登录2007-04-12
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2003-02-20 17:20
能否给我一份?,我也糊里糊涂. 谢谢!
tony@yofun.com
rainysky1224
驱动牛犊
驱动牛犊
  • 注册日期2003-02-16
  • 最后登录2004-10-08
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2003-02-21 18:19
我这里的例子的所有控制码都是公司自定义的。
即控制码以0x800为基址,我们可以具体问题具体分析。
just do it
szwilly2002
驱动牛犊
驱动牛犊
  • 注册日期2003-01-31
  • 最后登录2004-10-24
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2003-02-22 01:25
其实我所说的枚举并不是枚举所有的DeviceType和Access、Method,而是枚举Function,因为devicetype是已经知道的,access设置为0,method设置为0,这样调用DeviceIoControl一般都能成功,有些Function在没有找到资料时,这个方法确实可以帮上不少的忙啊。
emptily
驱动牛犊
驱动牛犊
  • 注册日期2002-12-11
  • 最后登录2003-11-24
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2003-02-22 09:14
我可能理解错误了,在这个方面花费了很多心思,但可能是走了弯路,现提出来让各位帮我想想。我的意思是想直接向我的USB设备发送一个命令字并附带部分信息,也就是说我要发送12345的字符给USB设备并且从设备直接取得它返回给我的值,这要通过哪一层的驱动它才会直接发送给设备?而不是驱动进行内部处理,可是我找了很多资料到最后才发现Mass storage驱动是建立在这层驱动之上的一个针对磁盘对象的管理,它所操作的是一个磁盘对象,而不是一个实际的USB设备。不知道是不是这样讲的?而我现在只是要发送信息给设备并从设备取得信息,相当于直接的通讯。不知谁有这方面资料或示例?
游客

返回顶部