-
-
[旧帖]
关于<天书夜读>中驱动与应用程序通讯的问题
0.00雪花
-
发表于:
2011-5-1 21:52
4252
-
[旧帖] 关于<天书夜读>中驱动与应用程序通讯的问题
0.00雪花
书中有关于驱动与应用程序通讯的部分,请红字部分是如何定义的?
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直播授课