anylin
驱动牛犊
驱动牛犊
  • 注册日期2005-06-07
  • 最后登录2008-11-04
  • 粉丝0
  • 关注0
  • 积分365分
  • 威望45点
  • 贡献值0点
  • 好评度29点
  • 原创分0分
  • 专家分0分
阅读:1002回复:1

DriverNetwork的问题

楼主#
更多 发布于:2005-06-27 22:42
  用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);
}
 

最新喜欢:

wingmanwingma...
anylin
驱动牛犊
驱动牛犊
  • 注册日期2005-06-07
  • 最后登录2008-11-04
  • 粉丝0
  • 关注0
  • 积分365分
  • 威望45点
  • 贡献值0点
  • 好评度29点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2005-06-28 15:58
怎么没人回啊 很急啊???
卡在这里了
游客

返回顶部