grass
驱动牛犊
驱动牛犊
  • 注册日期2001-07-20
  • 最后登录
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1621回复:3

迫切想知道驱动程序的数据如何给应用程序!

楼主#
更多 发布于:2001-10-08 10:40
是不是用DEVICEIOCONTROL()函数,但不知道如何使用参数,从应用程序到驱动程序到是看到了例子,但反过来就不知道了,希望各位高人能指点一二。

最新喜欢:

lmhhlmhhlmhhlm...
Qfwfq
驱动牛犊
驱动牛犊
  • 注册日期2001-04-06
  • 最后登录2002-06-14
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2001-10-09 13:06
关于Windows

在应用程序与驱动程序之间传递数据的一般方法
是,应用程序分配一个缓冲区,将指针传递给驱
动程序,驱动程序向这个缓冲区中写如数据。如
果驱动程序想把自己分配的缓冲区传递给应用程
序的话,就得将这个缓冲区映射到用户空间中

在应用程序与驱动程序之间传递缓冲区指针涉及
用户态与核心态的访问权限及线程上下文的问题,
请参阅驱动程序教程及DDK文档

注意:不同操作系统管理内存的方法各不相同
LitteSW
驱动中牛
驱动中牛
  • 注册日期2001-06-10
  • 最后登录2010-08-16
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2001-10-09 18:56
[QUOTE]原本由 grass 发表
[B]是不是用DEVICEIOCONTROL()函数,但不知道如何使用参数,从应用程序到驱动程序到是看到了例子,但反过来就不知道了,希望各位高人能指点一二。
 [/B][/QUOTE]

1.应用程序和驱动程序共享事件。

2.驱动程序发消息。

3.异步IO。

穿梭于都市高楼之间,总是孜孜不倦地追寻着自由,蓦然回首,去发现已陷入深深的枷锁之中
hong
驱动小牛
驱动小牛
  • 注册日期2001-09-19
  • 最后登录2005-12-16
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2001-10-10 00:07
There are 3 steps to go:

1) in the header file define your io control code and specify as METHOD_BUFFERED method;

#define MY_IO_CONTROL CTL_CODE(FILE_DEVICE_UNKNOWN, 0x800, METHOD_BUFFERED, FILE_ANY_ACCESS)

2) inside your driver, implements this control code;

//

PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION) fdo->DeviceExtension;

NTSTATUS status = IoAcquireRemoveLock(&pdx->RemoveLock, Irp);
if (!NT_SUCCESS(status))
return CompleteRequest(Irp, status, 0);
ULONG info = 0;

PIO_STACK_LOCATION stack = IoGetCurrentIrpStackLocation(Irp);
ULONG cbin = stack->Parameters.DeviceIoControl.InputBufferLength;
ULONG cbout = stack->Parameters.DeviceIoControl.OutputBufferLength;
ULONG code = stack->Parameters.DeviceIoControl.IoControlCode;

switch (code)
{ // process request
case VCR_IO_CONTROL: // code == 0x800
{ // MY_IO_CONTROL

ULONG ulTemp[255]; //data buffer
// TODO insert code here to handle this IOCTL, which uses METHOD_BUFFERED


//copy data back to system buffer
RtlCopyMemory(Irp->AssociatedIrp.SystemBuffer,ulTemp,sizeof(ulTemp[0]));
break;
} // MY_IO_CONTROL
//
}


3) inside your app. program, assign buffer to hold the data from driver

ULONG ulFifoData[255];//data buffer to hold the data from driver
BOOL bResult = DeviceIoControl(
hDevice, //device handle
VCR_IO_CONTROL,//IOCTL_READ_FILE,  //control code
NULL, //if there is no data pass to driver
NULL,  
ulFifoData, //LPVOID lpOutBuffer,
sizeof(ulFifoData), //DWORD nOutBufferSize,
&dwReadCount, //LPDWORD lpBytesReturned,
NULL //LPOVERLAPPED lpOverlapped
);


hope this help
游客

返回顶部