DeviceIoControl缓冲模式通信

来源:互联网 发布:java修改文件名称 编辑:程序博客网 时间:2024/05/16 06:41

BOOL DeviceIoControl(
  HANDLE
hDevice,              // handle to device
  DWORD dwIoControlCode,       // operation
  LPVOID lpInBuffer,           // input data buffer
  DWORD nInBufferSize,         // size of input data buffer
  LPVOID lpOutBuffer,          // output data buffer
  DWORD nOutBufferSize,        // size of output data buffer
  LPDWORD lpBytesReturned,     // byte count
  LPOVERLAPPED lpOverlapped    // overlapped information
);

hDevice 用CreateFile打开的设备句柄

 HANDLE hDevice =
  CreateFile("////.//HelloDDK", 

  GENERIC_READ | GENERIC_WRITE,
  0,  // share mode none
  NULL, // no security
  OPEN_EXISTING,
  FILE_ATTRIBUTE_NORMAL,
  NULL ); 

 

dwIoControlCode  IO控制码

#define in_code CTL_CODE(FILE_DEVICE_UNKNOWN,  0x891,  METHOD_BUFFERED,FILE_ANY_ACCESS)

CTL_CODE宏完成

 

lpInBuffer .输入的缓冲

size 缓冲大小

lpOutBuffer 由DeviceControl例程返回的缓冲

size 也是大小

 

lpBytesreturned 缓冲实际返回大小

 

LPOVERLAPPED 信息结构

 

---------------------------------------------------

 

关于返回值的问题,

一个由于缓冲区不够大的可以用GetLastError()获取,

详细查看msdn

二,驱动接收到Buffer 但是EXE接收到的大小为0

把程序对比了下发现...驱动详解的DeviceIoControlRoutine下

pIrp->IoStatus.Information=0,所以一直返回0,所以

pIrp->IoStatus.Information这个要设定返回的大小...

原创粉丝点击