• 全部
  • 问答

初学WDM,有问题请教各位

Liumy 2002-03-15 09:24:53
初学WDM,有问题请教各位

在sys里,我
pDriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = Dispatch;
ring 3会给sys发一个IOCTL_KNLDRV_SAFE,希望sys收到请求后,返回一个字符串给ring3的进程。
于是我:
static NTSTATUS Dispatch (IN PDEVICE_OBJECT pDeviceObject, IN PIRP pIrp)
{
ULONG ControlCode;
PIO_STACK_LOCATION pISL;
KIRQL irql;
KSPIN_LOCK BufferLock;
ULONG BufferSize = 0;
ULONG BytesTxd = 0;
ULONG OutputLength = 0;
UNREFERENCED_PARAMETER (pDeviceObject);
pISL = IoGetCurrentIrpStackLocation (pIrp);
pISL->Parameters.DeviceIoControl.OutputBufferLength;
KeAcquireSpinLock(&BufferLock,&irql);

switch (pISL->MajorFunction)
{
case IRP_MJ_CREATE:
.....
break;
case IRP_MJ_CLOSE:
.....
break;
case IRP_MJ_DEVICE_CONTROL:

ControlCode = pISL->Parameters.DeviceIoControl.IoControlCode;
if (ControlCode == IOCTL_KNLDRV_SAFE)
{
BytesTxd = OutputLength;
RtlCopyMemory(pIrp->AssociatedIrp.SystemBuffer,"1234567",BytesTxd);
}
break;
}
KeReleaseSpinLock(&BufferLock,irql);
pIrp->IoStatus.Status = STATUS_SUCCESS;
pIrp->IoStatus.Information = 0L;
IoCompleteRequest (pIrp, IO_NO_INCREMENT);
return pIrp->IoStatus.Status;
}

------------------------
ring 3下,我这样发送消息给sys的:
for (;
{
if (DeviceIoControl (hDevice,
IOCTL_KNLDRV_SAFE,
NULL,
0,
OutBuffer,
9,
&dwRet,
NULL))
{
printf ("|%s,%d| ", OutBuffer, dwRet);
}
else
printf ("发送失败!\n");
}

可是我从ring3上收到的OutBuffer全部是空的,dwRet为0,请问我错哪里了?




____________________

一个初学者




LIUTANG




初级会员



回答得分 : 0
贴子数量 : 83
注册日期 : 2001/3/30
在线情况 : 离线
发表于: 2002/3/15 - 10:53
问的好!
问题在pIrp->IoStatus.Information = 0L,这一值表示返回的长度,也就是你在应用程序中的dwRet的返回值,BUFFER里的数据长度和dwret是相等的,你应该把pIrp->IoStatus.Information赋值为实际长度。






BigBall




新手上路



回答得分 : 0
贴子数量 : 6
注册日期 : 2002/3/8
在线情况 : 在线
发表于: 2002/3/15 - 11:54
感谢楼上的,可是我按照你的方法改了,还是不行:
static NTSTATUS Dispatch (IN PDEVICE_OBJECT pDeviceObject, IN PIRP pIrp)
{
ULONG ControlCode;
PIO_STACK_LOCATION pISL;
KIRQL irql;
KSPIN_LOCK BufferLock;
ULONG BufferSize = 0;
ULONG BytesTxd = 0L;
ULONG OutputLength = 0;
NTSTATUS status = STATUS_SUCCESS;
UNREFERENCED_PARAMETER (pDeviceObject);
pISL = IoGetCurrentIrpStackLocation (pIrp);
OutputLength = pISL->Parameters.DeviceIoControl.OutputBufferLength;
KeAcquireSpinLock(&BufferLock,&irql);

switch (pISL->MajorFunction)
{
case IRP_MJ_CREATE:
Loadsys ();
break;
case IRP_MJ_CLOSE:
Unloadsys ();
break;
case IRP_MJ_DEVICE_CONTROL:

ControlCode = pISL->Parameters.DeviceIoControl.IoControlCode;
if (ControlCode == IOCTL_KNLDRV_SAFE)
{
if( OutputLength<BytesTxd)
status = STATUS_INVALID_PARAMETER;
else
{
BytesTxd = sizeof ("1234567");
RtlCopyMemory(pIrp->AssociatedIrp.SystemBuffer,"1234567",BytesTxd);
}
}
break;
}
KeReleaseSpinLock(&BufferLock,irql);
pIrp->IoStatus.Status = status;
pIrp->IoStatus.Information = BytesTxd;
IoCompleteRequest (pIrp, IO_NO_INCREMENT);
return pIrp->IoStatus.Status;
}




____________________

一个初学者

...全文
8 点赞 收藏 回复
写回复
回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复

还没有回复,快来抢沙发~

相关推荐
发帖
.NET技术其他语言
创建于2007-09-28

1817

社区成员

.NET技术 其他语言讨论
申请成为版主
帖子事件
创建了帖子
2002-03-15 09:24
社区公告
暂无公告