qaction信号(函数的定义域)

前言:

最近,需要对Windows设备进行编程操作。 其中包含非常重要的函数DeviceIoControl,使用时也很复杂,国内这部分中文资料很少,请学习时顺便翻译参考。 如果有错误的话请指出来。 lcb0281@163点com

MSDN源地址:设备IO控制功能

DeviceIoControl将控制代码直接发送到指定的设备驱动程序,以便适当的设备执行适当的操作。

句法:

oolwinapideviceiocontrol (in _ handlehdevice,_In_ DWORD dwIoControlCode,_In_opt_ LPVOID lpInBuffer,_ in _ ord ) _In_ DWORD nOutBufferSize,_ out _ opt _ lpdwordlpbytesreturned,_inout_opt参数:

hDevice [in]

执行操作的设备句柄。 设备通常是卷、目录、文件或流,并使用CreateFile函数打开设备句柄。 具体备注dwIoControlCode [in]

的操作代码。 此值标识要执行的特定操作以及要执行操作的设备的类型。 有关控制代码的列表,请参阅注释。 每个控制代码的文档包括lpInBuffernInBufferSizelpOutBuffer,http://www.Sina.com/pararalarasnOutBufferSize

(可选)指向输入缓冲区的指针。 这些数据的格式取决于dwIoControlCode参数的值。 如果dwIoControlCode指定不需要输入数据的操作,则此参数可以为空。 http://www.Sina.com/http://www.Sina.com /

输入缓冲区的大小(以字节为单位)。 单位是字节。lpInBuffer [in, optional]

(可选)指向输出缓冲区的指针。 这些数据的格式取决于dwIoControlCode参数的值。 如果指定dwIoControlCode不返回数据的操作,则此参数可以为NULL。nInBufferSize

输出缓冲区的大小(以字节为单位)。 单位是字节。[in]

(可选)指向接收存储在输出缓冲区中的数据大小的变量的指针。 如果输出缓冲区太小,无法接收数据,则GetLastError返回lpOutBuffer [out, optional]。 在这种情况下,3358www.Sina.com/为零。

如果输出缓冲区太小,无法存储所有数据,但可以存储一些条目,一些驱动程序会返回尽可能多的数据。 在这种情况下,调用失败,nOutBufferSize [in]表示lpBytesReturned [out, optional]ERROR_INSUFFICIENT_BUFFER,错误代码122(0x7a)表示已收到的APP应用程序再次以相同的操作进行http://www

如果3lpBytesReturned为空,则http://www.Sina.com/不能为空。 即使操作不返回输出数据,并且3358www.Sina.com/为NULL,GetLastError也使用ERROR_MORE_DATA,错误代码234。 在此类操作后,lpBytesReturned的值没有意义。

如果3DeviceIoControl不是NULL,则http://www.Sina.com/可以是NULL。 此参数不是空的

操作返回数据,则在重叠操作完成之前,lpBytesReturned是无意义的。要检索返回的字节数,请调用GetOverlappedResult,如果hDevice与I / O完成端口相关联,则可以检索通过调用GetQueuedCompletionStatus返回的字节数。
lpOverlapped [in, out, optional]
    (可选)指向OVERLAPPED结构的指针,
  如果在未指定FILE_FLAG_OVERLAPPED的情况下打开hDevice,则忽略lpOverlapped
  如果使用FILE_FLAG_OVERLAPPED标志打开hDevice,则该操作将作为重叠(异步)操作执行。在这种情况下,lpOverlapped必须指向包含事件对象句柄的有效OVERLAPPED结构。 否则,该功能将以不可预知的方式失败。
    对于重叠操作,DeviceIoControl会立即返回,并在操作完成时通知事件对象。 否则,该功能在操作完成或发生错误之前不会返回。

返回值:
    如果操作成功完成,DeviceIoControl将返回一个非零值。

    如果操作失败或正在等待,则DeviceIoControl返回零。 要获得扩展的错误信息,请调用GetLastError。

备注:
    要检索设备句柄,必须使用设备名称或与设备关联的驱动程序名称来调用CreateFile函数。 要指定设备名称,请使用以下格式:
  \\.\DeviceName

DeviceIoControl可以接受特定设备的句柄。 对于硬盘来说,可能为以下几种形式:

  对于物理驱动器x,形式为 \\.\PhysicalDriveX ,编号从0开始,例如:

名称含义\\.\PhysicalDrive0  打开第一个物理驱动器\\.\PhysicalDrive1打开第二个物理驱动器

对于逻辑分区(卷),形式为 \\.\X: ,例如:

名称                         含义\\.\A: 打开A盘(软驱)\\.\C:打开C盘(磁盘逻辑分区)

    调用CreateFile打开设备驱动程序的句柄时,应指定FILE_SHARE_READFILE_SHARE_WRITE访问标志。但是,当您打开通信资源(如串行端口)时,必须指定独占访问权限。 打开设备句柄时使用其他CreateFile参数,如下所示:
     (a)fdwCreate参数必须指定OPEN_EXISTING
     (b)hTemplateFile参数必须为NULL。

    (c)fdwAttrsAndFlags参数可指定FILE_FLAG_OVERLAPPED,以指示返回的句柄可用于重叠(异步)I / O操作。

有关支持的控制代码列表,请参阅以下主题:
    Communications Control Codes
    Device Management Control Codes
    Directory Management Control Codes
    Disk Management Control Codes
    File Management Control Codes
    Power Management Control Codes
    Volume Management Control Codes

实例:
    有关使用DeviceIoControl的示例,请参阅调用DeviceIoControl。

其他链接:

    CreateEvent
    CreateFile
    Device Input and Output Control (IOCTL)
    GetOverlappedResult
    GetQueuedCompletionStatus

    OVERLAPPED

                                                                                                                          Wen Lee

                                                                                                                         2018.04.28

Published by

风君子

独自遨游何稽首 揭天掀地慰生平

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注