能力值:
( LV13,RANK:1050 )
|
-
-
2 楼
好,分析的很透
|
能力值:
( LV12,RANK:1010 )
|
-
-
3 楼
嗯, 设置FILE_FLAG_OVERLAPPED标志后, ZwWriteFile等就可以实现异步调用了.
APC...
呵呵. 顶个~
|
能力值:
( LV13,RANK:530 )
|
-
-
4 楼
只有学习的份。
|
能力值:
( LV12,RANK:460 )
|
-
-
5 楼
学习一下
|
能力值:
( LV9,RANK:490 )
|
-
-
6 楼
还有一份是羡慕
|
能力值:
(RANK:1010 )
|
-
-
7 楼
设置FILE_FLAG_OVERLAPPED,用于实现重叠IO,是基于内核事件对象的,与APC是两回事
|
能力值:
( LV12,RANK:1010 )
|
-
-
8 楼
哦.学习.
俺最近学习APC. 嘿嘿, 混了混了
|
能力值:
( LV2,RANK:10 )
|
-
-
9 楼
不错啊,多谢楼主!!
|
能力值:
( LV3,RANK:20 )
|
-
-
10 楼
学习写驱动....
|
能力值:
( LV9,RANK:200 )
|
-
-
11 楼
晕 我早看见这个程序就好了 我这几天百度 GOOGLE 猛个搜索
|
能力值:
( LV2,RANK:10 )
|
-
-
12 楼
谢谢楼主分享
|
能力值:
( LV3,RANK:30 )
|
-
-
13 楼
其实就是用户层建一个线程在那阻塞着等
|
能力值:
( LV2,RANK:10 )
|
-
-
14 楼
爱死你了LZ。太给力了,竟然是DelphiDE
|
能力值:
( LV2,RANK:10 )
|
-
-
15 楼
这用情况下应该怎么调试应用层程序呢???
|
能力值:
( LV2,RANK:10 )
|
-
-
16 楼
先安装驱动程序,在调试应用层序,要是崩了但是没有来得及关闭驱动程序怎么办?我看还是在虚拟机中安装一个应用层序开发的环境还是保险吧……
|
能力值:
( LV2,RANK:10 )
|
-
-
17 楼
在调试驱动层代码的时候,我发现如下的结果好像有问题?
//当通知要获取数据时,获得异步的irp,然后传输数据
//-----驱动层代码
NTSTATUS COMM_BufferedIo(PIRP Irp, PIO_STACK_LOCATION pIoStackIrp)
{
NTSTATUS status = STATUS_UNSUCCESSFUL;
PVOID pInputBuffer, pOutputBuffer;
ULONG outputLength, inputLength;
DbgPrint("COMM_BufferedIo\r\n");
outputLength = pIoStackIrp->Parameters.DeviceIoControl.OutputBufferLength;
inputLength = pIoStackIrp->Parameters.DeviceIoControl.InputBufferLength;
pOutputBuffer = Irp->AssociatedIrp.SystemBuffer; //输出缓冲区
pInputBuffer = Irp->AssociatedIrp.SystemBuffer; //输入缓冲区
if(pInputBuffer && pOutputBuffer)
{
DbgPrint("COMM_BufferedIo UserModeMessage = '%s'", pInputBuffer);
RtlCopyMemory(pOutputBuffer, pInputBuffer, outputLength);
Irp->IoStatus.Status = STATUS_SUCCESS;
Irp->IoStatus.Information = sizeof(pOutputBuffer);
IoCompleteRequest(Irp,IO_NO_INCREMENT); //设置该irp已经完成
status = STATUS_SUCCESS;
}
return status;
}
//---------------
在上面这段代码中outputLength 和inputLength的值都为0;而输入缓冲和输出缓冲为同一个缓冲区。
这样的话拷贝缓冲的代码
RtlCopyMemory(pOutputBuffer, pInputBuffer, outputLength);
不会执行,或者说执行完后结果不受影响。
|
能力值:
( LV5,RANK:60 )
|
-
-
18 楼
在虚拟机上面放一个debugview,在应用层程序里面用OutputDebugString来输出,用debugview来看结果.这样麻烦一些,但是免去虚拟机安装开发环境了,毕竟那玩意儿很慢
|
能力值:
( LV5,RANK:60 )
|
-
-
19 楼
outputLength = pIoStackIrp->Parameters.DeviceIoControl.OutputBufferLength; //[COLOR=red]为零[/COLOR] inputLength = pIoStackIrp->Parameters.DeviceIoControl.InputBufferLength; //[COLOR=red]为零[/COLOR] if(pInputBuffer && pOutputBuffer)
{
DbgPrint("COMM_BufferedIo UserModeMessage = '%s'", pInputBuffer);
RtlCopyMemory(pOutputBuffer, pInputBuffer, outputLength); //很奇怪为什么它可以复制成功呢
Irp->IoStatus.Status = STATUS_SUCCESS;
Irp->IoStatus.Information = sizeof(pOutputBuffer); [COLOR=red]//指针大小为4,所以返回只能有4个字符.[/COLOR]
还有就是应用程序退出不了是怎么回事儿啊~不知道那个取消IRP的函数什么时候调用
|
能力值:
( LV5,RANK:60 )
|
-
-
20 楼
outputLength = pIoStackIrp->Parameters.DeviceIoControl.OutputBufferLength;
inputLength = pIoStackIrp->Parameters.DeviceIoControl.InputBufferLength;
pIoStackIrp这个是错误的,因为这个应该是IOCL_OVERLAP_NOTIFY的栈顶指针,并不是IOCTL_OVERLAP_BUFFERED_IO的,应该定义一个全局的PIO_STACK_LOCATION,像保存PIRP一样保存起来:gUserMessageIrp = Irp;//保存请求的irp girpStack = irpStack;这样在后面取得的Inbuff和OutBuff的长度才是正确的.
刚学驱动,如果哪里讲错,楼主别介意...都两年了,不知道楼主还看得到不?
|
能力值:
( LV5,RANK:60 )
|
-
-
21 楼
case IOCL_OVERLAP_NOTIFY: //获取数据事件
COMM_BufferedIo(gUserMessageIrp, irpStack); //处理原来的irp,将传进来的数据传输出去
return status;
上面的分支处理有点问题,会导致在应用层无法CloseHandle,原因是这个IRP没有正确处理.改成以下就没有问题了:
case IOCL_OVERLAP_NOTIFY: //获取数据事件
COMM_BufferedIo(gUserMessageIrp, girpStack); //处理原来的irp,将传进来的数据传输出去
[COLOR="Red"]Irp->IoStatus.Status = STATUS_SUCCESS;
Irp->IoStatus.Information = 0;
IoCompleteRequest(Irp, IO_NO_INCREMENT);[/COLOR]
return STATUS_SUCCESS; 希望楼主在帖子上把这些问题改掉
|
能力值:
( LV2,RANK:10 )
|
-
-
22 楼
|
|
|