`

DeviceIoControl的使用说明

阅读更多

    应用程序和驱动程序的通信过程是:应用程序使用CreateFile函数打开设备,然后用DeviceIoControl与驱动程序进行通信,包括读和写 两种操作。还可以用ReadFile读数据用WriteFile写数据。操作完毕时用CloseHandle关闭设备。我们比较常用的就是用 DeviceIoControl对设备进行读写操作。先看看DeviceIoControl是怎么定义的:

BOOL DeviceIoControl(
  HANDLE hDevice, 
  DWORD dwIoControlCode, 
  LPVOID lpInBuffer, 
  DWORD nInBufferSize, 
  LPVOID lpOutBuffer, 
  DWORD nOutBufferSize, 
  LPDWORD lpBytesReturned, 
  LPOVERLAPPED lpOverlapped
);

Parameters(参数)

hDevice (CreateFile返回的设备句柄)
[in] Handle to the device that is to perform the operation. To obtain a device handle, call the CreateFile function.
dwIoControlCode (应用程序调用驱动程序的控制命令,就是IOCTL_XXX IOCTLs )
[in] IOCTL for the operation. This value identifies the specific operation to perform and the type of device on which to perform the operation. There are no specific values defined for the dwIoControlCode parameter. However, you can define custom IOCTL_XXX IOCTLs with the CTL_CODE macro. You can then advertise these IOCTLs and an application can use these IOCTLs with DeviceIoControl to perform the driver-specific functions.
lpInBuffer (应用程序传递给驱动程序的数据缓冲区地址)
[in] Long pointer to a buffer that contains the data required to perform the operation. Set to NULL if the dwIoControlCode parameter specifies an operation that does not require input data.
nInBufferSize (应用程序传递给驱动程序的数据缓冲区大小,字节数)
[in] Size, in bytes, of the buffer pointed to by lpInBuffer.
lpOutBuffer (驱动程序返回给应用程序的数据缓冲区地址)
[out] Long pointer to a buffer that receives the output data for the operation. Set to NULL if the dwIoControlCode parameter specifies an operation that does not produce output data.
nOutBufferSize (驱动程序返回给应用程序的数据缓冲区大小,字节数)
[out] Size, in bytes, of the buffer pointed to by lpOutBuffer.
lpBytesReturned (驱动程序实际返回给应用程序的数据字节数地址)
[out] Long pointer to a variable that receives the size, in bytes, of the data stored in lpOutBuffer. The DeviceIoControl function may unnecessarily use this parameter. For example, if an operation does not produce data for lpOutBuffer and lpOutBuffer is NULL, the value of lpBytesReturned is meaningless.
lpOverlapped (重叠操作结构)
[in] Ignored; set to NULL.

Return Values(返回值)

Nonzero indicates success. Zero indicates failure. To obtain extended error information, call the GetLastError function. (非0成功,0失败)

具体使用我们看看列子:

1,向设备传递数据,我们定义一个函数来实现

bool CDeviceOperDlg::SendKeyData(HANDLE handle, BYTE *bData, int iSize)
{
ULONG nOutput;
BYTE bTemp[512];

//将数据放置到发送数组
memset(bTemp,0,sizeof(bTemp));
memcpy(bTemp,&bData[0],iSize);
//向设备发送
if (!DeviceIoControl(handle,        
       ATST2004_IOCTL_WRITE,     //根据具体的设备有相关的定义
       bTemp,                                        //向设备传递的数据地址
       iSize,                                            //数据大小,字节数
       NULL,                                          //没有返回的数据,置为NULL
       0,                                                  //没有返回的数据,置为0

       &nOutput,
       NULL)
    )
{
   return false;
}

return true;
}

2,从设备读取数据


bool CDeviceOperDlg::ReviceKeyData(HANDLE handle, BYTE *bData, int iSize)
{

ULONG nOutput;
BYTE bTemp[512];
//数组清零
memset(bTemp,0,sizeof(bTemp));
//向设备发送
if (!DeviceIoControl(handle,
       ATST2004_IOCTL_READ,           //根据具体的设备有相关的定义
       NULL,                                              //没有向设备传递的数据,置为NULL
       0,                                                      //没有向设备传递的数据,置为NULL
       bTemp,                                            //读取设备的数据返回地址
       iSize,                                                //读取数据的字节数
       &nOutput,
       NULL)
    )
{
   return false;
}
//放置到公用数组
memcpy(&bData[0],&bTemp[0],iSize);
return true;
}

分享到:
评论

相关推荐

    实战DeviceIoControl.rar_deviceiocontrol_driver.IoControl_pdiusbd12

    "实战DeviceIoControl.doc"可能是详细解释如何使用DeviceIoControl函数与pdiusbd12驱动交互的文档,可能包含具体的代码示例和步骤说明。而"www.pudn.com.txt"可能是一个链接或资源清单,指向更多关于这个主题的资料...

    实战DeviceIoControl

    #### 驱动开发:DeviceIoControl函数的详细使用说明,附加实例 在驱动开发领域,`DeviceIoControl`函数是一个非常重要的API,它主要用于实现用户模式应用程序与内核模式驱动程序之间的通信。通过这个函数,用户空间...

    读Windows文件 扇区数据的源码简洁注译版一

    `Read扇区.txt`可能是对源代码的注释或解释,提供关于如何使用这些函数和结构体的详细说明。这部分内容可以帮助我们理解代码的工作原理和如何适应不同的使用场景。 在实际应用中,扇区级的读取可能用于磁盘恢复、...

    EZ-USB通用驱动程序说明

    对于用户态的应用,你可以使用任何支持Win 32 功能的编译工具CreateFile()和DeviceIoControl()。所提供的例程就是运行在Microsoft Visual C++5.0 下。 在加载EZ-USB GPD时,本章将要描述一个USB设备驱动是如何加载...

    易语言源码取硬盘序列号.rar

    本压缩包“易语言源码取硬盘序列号.rar”提供了使用易语言获取硬盘序列号的源代码及相关说明。 在计算机硬件中,每个硬盘都有一个独一无二的序列号,用于标识硬盘的身份。获取硬盘序列号在某些软件开发场景中是必要...

    ASP基于USB KEY文件加密工具——USB key管理系统(源代码+设计说明书).zip

    这涉及到Windows API调用,如DeviceIoControl函数,以及可能的低级USB通信协议(如HID或Bulk传输)。 2. **加密算法**:系统可能采用了常见的加密算法,如AES(高级加密标准)、RSA(公钥加密算法)或其他对称/非...

    CyAPI说明文档

    Rather than communicate with the driver via Windows API calls such as SetupDiXxxx and DeviceIoControl, applications can call simpler CyAPI methods such as Open, Close, and XferData to communicate with...

    vb控制usb端口

    附带的说明档应该包含了具体的代码示例和详细解释,帮助你理解如何在VB中实现这些步骤。通过学习和实践这些代码,你可以掌握USB设备的控制方法,并将其应用到你的项目中。 总的来说,VB控制USB端口涉及到底层硬件...

    USB_HID_VC++6.0_入门级例子(图解说明,真详细啊!)

    - **配置设备**:调用`CreateFile()`打开设备,然后可以使用`DeviceIoControl()`进行读写操作。 4. **编写HID报告描述符**:HID设备的核心是报告描述符,它定义了设备的输入、输出和特征报告。你需要根据设备的...

    vc读写usb端口

    4. **设置设备**:如果需要,可以使用`DeviceIoControl`发送控制请求,比如设置设备配置或接口。 5. **读写数据**:同样使用`DeviceIoControl`,但这次传递IOCTL代码来执行读写操作。例如,`IOCTL_USB_USER_REQUEST...

    计算机硬盘序列号的获取

    要使用`DeviceIoControl`,我们需要指定一个设备句柄,这通常通过`CreateFile`函数来完成。对于硬盘,我们可以使用设备名`\\.\PhysicalDrive0`(表示第一块硬盘),然后调用`CreateFile`打开它。之后,我们需要一个...

    vb 硬盘序列号源码

    3. `@PSC_ReadMe_69835_1.txt` - 这通常是ReadMe文件,用于提供关于项目、安装步骤、使用说明或者注意事项等信息。在这个案例中,可能包含有关如何使用这个VB源码的指南。 4. `Project1.vbp` - 这是VB项目的工程文件...

    USB说明文档

    这涉及到`SetupAPI`和`DeviceIoControl`等API的使用。 5. **数据传输**:通过`OVERLAPPED`结构体实现异步传输,提高程序效率。同时,处理USB数据的错误和异常情况也是必不可少的。 6. **设备事件处理**:如设备...

    一个用VB 写的程序,操作USB

    由于涉及到英文文档,这可能意味着开发者或原始作者使用了英文进行注释和说明,因此理解基本的英语词汇和语法对于阅读和应用这些代码是必要的。 在IT领域,USB(Universal Serial Bus)是一种通用串行总线标准,...

    获取计算机的硬盘信息

    `说明.txt`文件可能包含了程序的使用指南或开发细节。而未列出扩展名的`GetHDSN`可能是源代码文件,可能使用C#编写,用于获取硬盘序列号。 开发这样的工具时,需要注意以下几点: - 隐私与合法性:获取硬盘序列号...

    与USB有关的编程.pdf

    - 使用`DeviceIoControl`函数可以获得控制器的驱动程序名以及与其连接的HUB的名称。 2. **枚举USB HUB**: - 打开HUB后,可以进一步获取HUB的相关信息。 - 枚举HUB的各个端口,以获取连接到这些端口上的设备信息...

    一个读取硬盘序列号与CPU序列号的DLL

    标题中的“一个读取硬盘序列号与CPU序列号的DLL”指的是一...使用时,需要遵循“下载说明.txt”中的指导,确保正确导入和使用DLL。不过,由于涉及用户隐私,此类操作必须符合法律法规,且在获取用户同意的情况下进行。

    磁盘分区背景设置_vc开发的程序

    最后,“使用说明.txt”文件提供了解决方案的使用指南,可能包含步骤说明、注意事项和可能遇到的问题及解决方法。用户在使用该程序前应仔细阅读这份文档,以便正确、安全地进行操作,避免误操作导致的数据丢失或系统...

    易语言隐藏硬盘源码

    在"源码使用说明.txt"中,应该包含了具体的代码实现细节和步骤。通常,这个文档会指导开发者如何编译和运行源码,以及解释每个关键函数和变量的作用。在阅读这份说明时,要注意以下几点: 1. **源码结构**:了解...

Global site tag (gtag.js) - Google Analytics