阅读:1166回复:6
初学WDM,有问题请教各位
初学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,请问我错哪里了? |
|
最新喜欢:![]()
|
沙发#
发布于:2002-03-15 18:53
问的好!
问题在pIrp->IoStatus.Information = 0L,这一值表示返回的长度,也就是你在应用程序中的dwRet的返回值,BUFFER里的数据长度和dwret是相等的,你应该把pIrp->IoStatus.Information赋值为实际长度。 |
|
板凳#
发布于: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; } |
|
|
地板#
发布于:2002-03-15 22:16
你使用的BufferLock并没有初始化啊!
KeInitializeSpinLock( IN PKSPIN_LOCK SpinLock ); |
|
地下室#
发布于:2002-03-17 11:38
谢谢你,我试试
|
|
|
5楼#
发布于:2002-03-18 11:17
对,初始化!
RtlZeroMemory(*PVOID,sizeof()); |
|
|
6楼#
发布于:2002-03-18 11:18
对,初始化!除了楼上的SpinLock外,内存外本身好象也要初始化:
RtlZeroMemory(*PVOID,sizeof()); |
|
|