阅读:1004回复:1
DriverNetwork的问题
用DriverNetwork生成的虚拟网卡
第一个函数时注册一个设备 第二个函数时对这个设备的IRP处理例程, 是个静态的方法。 在这个方法中怎么获得当前VNICAdapter的实例的指针 VNICAdapter是从KNdisMiniAdapter继承来的。 请前辈指点啊!!!!! 谢谢! 下面是这两个函数的代码 //////////////////////////////////////////////////////////////////// // VNICAdapter::CreateMyDevice // 创建一个可以从 user mode 访问的I/O设备对象 // Parameters: // none // IRQL: // PASSIVE_LEVEL // Return: // STATUS_SUCCESS 如果设备创建成功 // Note: // 该方法调用的NdisMRegisterDevice()不适用于win98 NDIS_STATUS VNICAdapter::CreateMyDevice() { NDIS_STATUS Status; #if VNIC_WIN2K //WIN2K, XP系统下 static PDRIVER_DISPATCH MajorFunction[IRP_MJ_MAXIMUM_FUNCTION + 1]; //初始化MajorFuction NdisZeroMemory(MajorFunction, sizeof(MajorFunction)); //指定irp处理例程 MajorFunction[IRP_MJ_CREATE] = MajorFunction[IRP_MJ_CLOSE] = MajorFunction[IRP_MJ_CLEANUP] = MajorFunction[IRP_MJ_READ] = MajorFunction[IRP_MJ_WRITE] = MajorFunction[IRP_MJ_DEVICE_CONTROL] = IoDispatch; //注册设备 Status = NdisMRegisterDevice( *KNdisMiniDriver::DriverInstance(), KNDIS_STRING_CONST("\\Device\\VNICDevice"), KNDIS_STRING_CONST("\\DosDevices\\VNICDevice"), MajorFunction, &m_pDeviceObject, &m_DeviceHandle); #else //win98环境 static PDRIVER_OBJECT pDriverObject = KNdisMiniDriver::DriverInstance()->DriverObject(); //指定irp处理例程 pDriverObject->MajorFunction[IRP_MJ_CREATE] = pDriverObject->MajorFunction[IRP_MJ_CLOSE] = pDriverObject->MajorFunction[IRP_MJ_CLEANUP] = pDriverObject->MajorFunction[IRP_MJ_READ] = pDriverObject->MajorFunction[IRP_MJ_WRITE] = pDriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = IoDispatch; //注册设备 Status = IOCreatDevice( pDriverObject, 0, KNDIS_STRING_CONST("\\Device\\VNICDevice"), FILE_DEVICE_NETWORK, 0, FALSE, &m_pDeviceObject); if(STATUS_SUCCESS == Status) m_pDeviceObject->Flags &= ~DO_DEVICE_INITIALIZING; #endif return Status; } //////////////////////////////////////////////////////////////////// // VNICAdapter::IoDispatch // 处理对该驱动的IRP请求. // 静态方法. // Parameters: // DeviceObject - 一个指向设备对象的指针 // Irp - 一个指向IRP请求的指针 // IRQL: // PASSIVE_LEVEL // Return: // STATUS NTSTATUS VNICAdapter::IoDispatch(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp) { NTSTATUS Status = STATUS_SUCCESS; //将IRP指针转化为KIrp类 KIrp I(Irp); //显示调试信息 TRACE("VNICAdapter::IoDispatch func 0x%02x \n", I.MajorFunction()); switch (I.MajorFunction()) { case IRP_MJ_CREATE: // TODO:获取应用程序文件指针 if(m_File == 0) { //没有应用程序打开设备的情况 m_File = I.FileObject(); } else { Status = STATUS_UNSUCCESSFUL; } I.Information() = 0; break; case IRP_MJ_CLOSE: // TODO: 删除应用程序文件指针 I.Information() = 0; if(m_File == I.FileObject()) { m_File = 0; } else { Status = STATUS_UNSUCCESSFUL; } break; case IRP_MJ_CLEANUP: // TODO case IRP_MJ_READ: // TODO case IRP_MJ_WRITE: // TODO case IRP_MJ_DEVICE_CONTROL: // TODO: 处理用户自定义的I/O控制命令 switch(I.IoctlCode()) { case VNIC_IOCTL_SETEVENT: //TODO: 设置事件 //获取应用程序设置的句柄 m_hEvent = *(HANDLE*)I.IoctlBuffer(); case VNIC_IOCTL_READFRAME: //TODO: 读取帧 case VNIC_IOCTL_WRITEFRAME: //TODO: 写帧 default: Status = STATUS_INVALID_PARAMETER; break; } I.Information() = 0; break; default: Status = STATUS_UNSUCCESSFUL; }; return I.Complete(Status); } ![]() |
|
最新喜欢:![]() |
沙发#
发布于:2005-06-28 15:58
怎么没人回啊 很急啊???
卡在这里了 |
|