阅读:1621回复:3
迫切想知道驱动程序的数据如何给应用程序!
是不是用DEVICEIOCONTROL()函数,但不知道如何使用参数,从应用程序到驱动程序到是看到了例子,但反过来就不知道了,希望各位高人能指点一二。
|
|
最新喜欢:lmhhlm... |
沙发#
发布于:2001-10-09 13:06
关于Windows
在应用程序与驱动程序之间传递数据的一般方法 是,应用程序分配一个缓冲区,将指针传递给驱 动程序,驱动程序向这个缓冲区中写如数据。如 果驱动程序想把自己分配的缓冲区传递给应用程 序的话,就得将这个缓冲区映射到用户空间中 在应用程序与驱动程序之间传递缓冲区指针涉及 用户态与核心态的访问权限及线程上下文的问题, 请参阅驱动程序教程及DDK文档 注意:不同操作系统管理内存的方法各不相同 |
|
板凳#
发布于:2001-10-09 18:56
[QUOTE]原本由 grass 发表
[B]是不是用DEVICEIOCONTROL()函数,但不知道如何使用参数,从应用程序到驱动程序到是看到了例子,但反过来就不知道了,希望各位高人能指点一二。 [/B][/QUOTE] 1.应用程序和驱动程序共享事件。 2.驱动程序发消息。 3.异步IO。 |
|
|
地板#
发布于: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 |
|