BigBall
驱动牛犊
驱动牛犊
  • 注册日期2002-03-08
  • 最后登录2002-05-30
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1166回复:6

初学WDM,有问题请教各位

楼主#
更多 发布于:2002-03-15 18:12
初学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,请问我错哪里了?

最新喜欢:

stoneyrstoney...
一个初学者:)
LIUTANG
驱动大牛
驱动大牛
  • 注册日期2001-03-30
  • 最后登录2020-12-27
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望58点
  • 贡献值0点
  • 好评度12点
  • 原创分0分
  • 专家分0分
  • 社区居民
沙发#
发布于:2002-03-15 18:53
    问的好!
    问题在pIrp->IoStatus.Information = 0L,这一值表示返回的长度,也就是你在应用程序中的dwRet的返回值,BUFFER里的数据长度和dwret是相等的,你应该把pIrp->IoStatus.Information赋值为实际长度。
BigBall
驱动牛犊
驱动牛犊
  • 注册日期2002-03-08
  • 最后登录2002-05-30
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-03-15 19: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;  
}
一个初学者:)
guardee
驱动巨牛
驱动巨牛
  • 注册日期2002-11-08
  • 最后登录2010-05-29
  • 粉丝2
  • 关注1
  • 积分2分
  • 威望34点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-03-15 22:16
你使用的BufferLock并没有初始化啊!
KeInitializeSpinLock(
    IN PKSPIN_LOCK  SpinLock
    );
BigBall
驱动牛犊
驱动牛犊
  • 注册日期2002-03-08
  • 最后登录2002-05-30
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-03-17 11:38
谢谢你,我试试
一个初学者:)
Tom_lyd
驱动大牛
驱动大牛
  • 注册日期2001-09-02
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-03-18 11:17
对,初始化!
RtlZeroMemory(*PVOID,sizeof());
Tom_lyd
Tom_lyd
驱动大牛
驱动大牛
  • 注册日期2001-09-02
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-03-18 11:18
对,初始化!除了楼上的SpinLock外,内存外本身好象也要初始化:
RtlZeroMemory(*PVOID,sizeof());
Tom_lyd
游客

返回顶部