首页
社区
课程
招聘
[旧帖] 与驱动通讯 Buffer 太小要如何返回给应用层实际大小? 0.00雪花
发表于: 2016-9-19 17:49 2743

[旧帖] 与驱动通讯 Buffer 太小要如何返回给应用层实际大小? 0.00雪花

2016-9-19 17:49
2743
我自己写过也在最近看了一个开源的例子,里面与驱动通讯使用到了ReadFile,驱动中实现了IRP_MJ_READ的方法。

当我在应用层使用 ReadFile 时,第一次想获取要读取的大小,所以Buffer传递了NULL,长度传递了0。



当驱动收到Buffer时,判断如果过小就设置返回值为STATUS_BUFFER_TOO_SMALL,并将传出的Irp->IoStatus.Information为实际数据的长度。



可这样操作时我遇到了问题,即使给Irp->IoStatus.Information设置了实际数据的长度,可到了应用层返回的还是0。不知道为什么,请大家指点。


[课程]FART 脱壳王!加量不加价!FART作者讲授!

上传的附件:
收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 18
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
DO_BUFFERED_IO,读写时,如何传递参数指针NULL,则对应DispatchRead/DispatchWrite不会有任何处理,你可以通过打印信息测试一下;其他方式没有试过。
2016-9-19 22:22
0
雪    币: 69
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
感谢回复,我用过 DeviceIoControl 也是一样的。
2016-9-20 09:12
0
雪    币: 18
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
case IOCTL_GET_READSIZE:
                {
                        DbgPrint("IOCTL_GET_READSIZE\r\n");

                        pIrp->IoStatus.Status = STATUS_SUCCESS;
                        pIrp->IoStatus.Information = (wcslen(L"Read Something...") + 1) * sizeof(WCHAR);

                        ntStatus = STATUS_SUCCESS;
                }
                break;
        case IOCTL_READ_CONTENT:
                {
                        ULONG                                uMin                = 0;

                        DbgPrint("IOCTL_READ_CONTENT\r\n");
                        //KdBreakPoint();
                        pBuffRead = pIrp->AssociatedIrp.SystemBuffer;
                        pStack = IoGetCurrentIrpStackLocation(pIrp);
                        uLenRead = pStack->Parameters.Read.Length;

                        uMin = (wcslen(L"Read Something...") + 1) * sizeof(WCHAR);
                        uMin = (uMin>uLenRead) ? uLenRead : uMin;
                        RtlCopyMemory(pBuffRead, L"Read Something...", uMin);

                        pIrp->IoStatus.Status = STATUS_SUCCESS;
                        pIrp->IoStatus.Information = uMin;                       

                        ntStatus = STATUS_SUCCESS;
                }
                break;

DWORD dwSize = 0, dwRed = 0;
                if (::DeviceIoControl(systool.GetDevice(),
                        IOCTL_GET_READSIZE,
                        NULL,
                        0,
                        NULL,
                        0,
                        &dwRed,
                        NULL))
                {       
                        printf("%d\r\n", dwRed);
                        memset(szCurrent, 0, MAX_PATH);
                        if (::DeviceIoControl(systool.GetDevice(),
                                IOCTL_READ_CONTENT,
                                NULL,
                                0,
                                szCurrent,
                                dwRed,
                                &dwRed,
                                NULL))
                        {       
                                printf("%S\r\n", szCurrent);
                        }
                }

我试了下,可以分次取长度和内容呀,你再检查一下?代码看看?

36
Read Something...

一个ctrlcode,
                        if (!pBuffRead)
                        {
                                //get size
                                pIrp->IoStatus.Status = STATUS_SUCCESS;
                                pIrp->IoStatus.Information = (wcslen(L"Read Something...") + 1) * sizeof(WCHAR);
                        }
                        else
                        {
                                //get content
                                uMin = (wcslen(L"Read Something...") + 1) * sizeof(WCHAR);
                                uMin = (uMin>uLenRead) ? uLenRead : uMin;
                                RtlCopyMemory(pBuffRead, L"Read Something...", uMin);

                                pIrp->IoStatus.Status = STATUS_SUCCESS;
                                pIrp->IoStatus.Information = uMin;
                        }
2016-9-20 11:49
0
雪    币: 69
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
我晚上回家试试,我在驱动返回的是 BUFFER_TOO_SMALL 不是 SUATUS_SUCCESS

2016-9-20 18:24
0
游客
登录 | 注册 方可回帖
返回
//