首页
社区
课程
招聘
[旧帖] 关于<天书夜读>中驱动与应用程序通讯的问题 0.00雪花
发表于: 2011-5-1 21:52 4252

[旧帖] 关于<天书夜读>中驱动与应用程序通讯的问题 0.00雪花

2011-5-1 21:52
4252
书中有关于驱动与应用程序通讯的部分,请红字部分是如何定义的?
NTSTATUS MyDeviceIoCtrlOut(PIRP irp,ULONG out_len)
{
        MY_NODE *node;        ULONG pack_len;
        //获得输出缓冲区
        PVOID buffer = irp->AssociatedIrp.SystemBuffer;

        //从队列中取得第一个。如果为空,则等待直到不为空
        while(node = MyGetPendingHead()) == NULL)
        {
                KeWaitForSingleObject(&g_my_notify_event,//一个用来通知有请求的事件
                        Executive,KernelMode,FALSE,0);
        }
        //有请求了,此时请求是node。获得PACK要多长
        pack_len = MyGetPackLen(node);
        if (out_len <pack_len)
        {
                irp->IoStatus.Information = pack_len;//这里写需要的长度
                irp->IoStatus.Status = STATUS_INVALID_BUFFER_SIZE;
                IoCompleteRequest(irp,IO_NO_INCREMENT);
                return irp->IoStatus.Status;
        }
        //长度足够,填写输出缓冲区
        MyWritePackContent(node,buffer);
        //头节点被发送出去了,可以删除了
        MyPendingHeadRemove();
        //返回成功
        irp->IoStatus.Information = pack_len;//这里写填写的长度
        irp->IoStatus.Status = STATUS_SUCCESS;
        IoCompleteRequest(irp,IO_NO_INCREMENT);
        return irp->IoStatsu.Status;
}

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 107
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
所有的MY开头的东西 都是自己写的程序
不过注释基本都解释了函数的大概功能
2011-5-3 08:29
0
雪    币: 36
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
我知道是自定义的函数,书中表达不全啊
2011-5-5 15:56
0
雪    币: 51
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
不知道算不算回复老帖子啊,
几个函数大概就是下面的实现了。
++++++++++++++++++++++++++
//包含LIST_ENTRY的数据
typedef struct _MY_NODE{
        LIST_ENTRY list_entry;
        UNICODE_STRING dst_ip;
        UNICODE_STRING src_ip;
}MY_NODE;
KEVENT g_my_notify_event;
LIST_ENTRY my_list_head;
//返回队列中的第一个结构
MyGetPendingHead(){
        return CONTAINING_RECORD(&my_list_head,MY_NODE,list_entry);
}
//移除队列的第一个结构
MyPendingHeadRemove(){
        ExInterlockedRemoveHeadList(&my_list_head,&my_list_lock);
}
//拷贝至输入缓存
MyWritePackContent(MY_NODE *node, PVOID buffer){
        RtlCopyUnicodeString(&((MY_NODE *)buffer)->dst_ip,&node->dst_ip);
        RtlCopyUnicodeString(&((MY_NODE *)buffer)->src_ip ,&node->src_ip);
}
//驱动准备写入的长度
ULONG MyGetPackLen(MY_NODE * node)
{
        return node->dst_ip.Length + node->src_ip.Length + 2*sizeof(UNICODE_STRING);
}
2011-12-12 15:38
0
雪    币: 145
活跃值: (105)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
5
刚好看到这个,mark一下
2012-2-28 20:51
0
游客
登录 | 注册 方可回帖
返回
//