guocaijian
驱动牛犊
驱动牛犊
  • 注册日期2005-04-06
  • 最后登录2006-02-15
  • 粉丝0
  • 关注0
  • 积分137分
  • 威望21点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
阅读:2138回复:11

请问高手在drivernetworks中间层驱动里用ndisMregisterdevice安装时系统从起?

楼主#
更多 发布于:2005-06-03 20:07
 :(想在中间层过滤器驱动与应用程序通信,用driverstudio工具。在初始化函数里注册设备,编译没错,可为什么安装驱动系统会从起?static PDRIVER_DISPATCH MajorFunction[IRP_MJ_MAXIMUM_FUNCTION + 1];
    NdisZeroMemory(MajorFunction, sizeof(MajorFunction));
    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\\MyNdisDevice\"),
                    KNDIS_STRING_CONST(\"\\DosDevices\\MyNdisDevice\"),
                    MajorFunction,
                    &m_pDeviceObject,
                    &m_DeviceHandle);


zhaock
驱动太牛
驱动太牛
  • 注册日期2002-01-26
  • 最后登录2018-06-02
  • 粉丝3
  • 关注2
  • 积分73328分
  • 威望362317点
  • 贡献值1点
  • 好评度226点
  • 原创分0分
  • 专家分0分
  • 社区居民
沙发#
发布于:2005-06-04 10:12
:(想在中间层过滤器驱动与应用程序通信,用driverstudio工具。在初始化函数里注册设备,编译没错,可为什么安装驱动系统会从起?static PDRIVER_DISPATCH MajorFunction[IRP_MJ_MAXIMUM_FUNCTION + 1];
    NdisZeroMemory(MajorFunction, sizeof(MajorFunction));
    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\\MyNdisDevice\"),
                    KNDIS_STRING_CONST(\"\\DosDevices\\MyNdisDevice\"),
                    MajorFunction,
                    &m_pDeviceObject,
                    &m_DeviceHandle);


 

没有用过DS,而且个人觉得,对于做驱动,还是先从ddk学起,DS做了太多的封装,不利于搞清楚最基本的概念,而这确是做驱动必须的。

NdisMRegisterDevice第一个参数对不对?
softice可不可以截住,是执行NdisMRegisterDevice出的问题吗?
guocaijian
驱动牛犊
驱动牛犊
  • 注册日期2005-04-06
  • 最后登录2006-02-15
  • 粉丝0
  • 关注0
  • 积分137分
  • 威望21点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2005-06-04 19:35
zhaock版主救救我!
   我之前是用的ddk,我想绕过IP/TCP层数据直接从应用程序传输到中间层驱动,然后用ndissend,发送,(用MAC地址加上数据自己构造数据包),可是程序一道ndissend,就蓝屏.ndissend里面有个绑定句丙参数,我用全局变量传过来,就是ndisopenadapter里面返回的绑定句丙.这样对吗?
zhaock
驱动太牛
驱动太牛
  • 注册日期2002-01-26
  • 最后登录2018-06-02
  • 粉丝3
  • 关注2
  • 积分73328分
  • 威望362317点
  • 贡献值1点
  • 好评度226点
  • 原创分0分
  • 专家分0分
  • 社区居民
地板#
发布于:2005-06-04 20:22
zhaock版主救救我!
   我之前是用的ddk,我想绕过IP/TCP层数据直接从应用程序传输到中间层驱动,然后用ndissend,发送,(用MAC地址加上数据自己构造数据包),可是程序一道ndissend,就蓝屏.ndissend里面有个绑定句丙参数,我用全局变量传过来,就是ndisopenadapter里面返回的绑定句丙.这样对吗?

那个参数没有错。

我不知道你做的是什么,如果不是防火墙,仅仅想自己直接发包,直接用protocol的例子ndisuio就可以,imd驱动比protocol驱动复杂多了

如果是在imd中自己构造发包,就要注意NDIS_PACKET等结构的分配释放,最重要的是PtSendComplete,要区分,是来自上边协议的包,还是自己的包,做不同的处理。你这个考虑了没有?
guocaijian
驱动牛犊
驱动牛犊
  • 注册日期2005-04-06
  • 最后登录2006-02-15
  • 粉丝0
  • 关注0
  • 积分137分
  • 威望21点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2005-06-05 20:15
十分感谢ZHAOCK的回复!!
   我是想在几台计算机之间,不用IP,直接在链路层传输,只在数据前加6字节的目的MAC地址然后发送。我们的电脑都有两个网卡,一个是以太网卡,一个光纤通道(FC)网卡。请问怎么知道ndissend把数据发送到哪个网卡????ndisopenadapter帮定到哪个网卡?
   我就是在昨晚仅仅实现了以太网卡的只用MAC地址,不用IP的单向传输,为什么光纤通道的传送不了?但我的目的是在光钎通道网卡上传送。这是不是绑定问题?
    接收数据是在ptreceivepacket还是在ptreceive里面复制包内容,好象我的网卡两个函数都调用。而且ndisgetreceivepacket==NULL
zhaock
驱动太牛
驱动太牛
  • 注册日期2002-01-26
  • 最后登录2018-06-02
  • 粉丝3
  • 关注2
  • 积分73328分
  • 威望362317点
  • 贡献值1点
  • 好评度226点
  • 原创分0分
  • 专家分0分
  • 社区居民
5楼#
发布于:2005-06-06 09:48
十分感谢ZHAOCK的回复!!
   我是想在几台计算机之间,不用IP,直接在链路层传输,只在数据前加6字节的目的MAC地址然后发送。我们的电脑都有两个网卡,一个是以太网卡,一个光纤通道(FC)网卡。请问怎么知道ndissend把数据发送到哪个网卡????ndisopenadapter帮定到哪个网卡?
   我就是在昨晚仅仅实现了以太网卡的只用MAC地址,不用IP的单向传输,为什么光纤通道的传送不了?但我的目的是在光钎通道网卡上传送。这是不是绑定问题?
    接收数据是在ptreceivepacket还是在ptreceive里面复制包内容,好象我的网卡两个函数都调用。而且ndisgetreceivepacket==NULL

我建议你用ddk里ndis下面的ndisuio的例子。NdisOpenAdapter可以控制,绑定的类型,也可以知道网卡的名字,你可以区分哪个是
你需要绑定的。
ptreceivepacket,ptreceive的处理,详见ndisuio的例子就可以了
xh428
驱动牛犊
驱动牛犊
  • 注册日期2002-12-19
  • 最后登录2005-11-25
  • 粉丝0
  • 关注0
  • 积分11分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2005-06-10 23:53
兄弟,请问你编译的时候,安装的是NTDDK,还是XPDDK,
如果你上XPDDK的话,你安装的时候一定蓝屏,呵呵,你将XPDDK
换成NTDDK就可以了,还有你的驱动名字有问题啊,你这样能注册成功吗?
KNDIS_STRING_CONST(\"\\Device\\MyNdisDevice\"),
KNDIS_STRING_CONST(\"\\DosDevices\\MyNdisDevice\"),
我好象记得应该是:
KNDIS_STRING_CONST(\"\\\\Device\\\\MyNdisDevice\"),
KNDIS_STRING_CONST(\"\\\\DosDevices\\\\MyNdisDevice\"),

呵呵,兄弟是不是在做虚拟网卡啊?
guocaijian
驱动牛犊
驱动牛犊
  • 注册日期2005-04-06
  • 最后登录2006-02-15
  • 粉丝0
  • 关注0
  • 积分137分
  • 威望21点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2005-06-15 19:05
不是做虚拟网卡,我只是在中间层绕过IP/TCP层直接在链路层传输.我用的是2000系统的NTDDK,但我也想用Driverstudio的drivernetwork,但我不会在它的中间层注册设备???NdisMRegisterDevice的第一个参数看来有问题??
xh428
驱动牛犊
驱动牛犊
  • 注册日期2002-12-19
  • 最后登录2005-11-25
  • 粉丝0
  • 关注0
  • 积分11分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2005-06-16 22:04
让我看看你的入口,如果入口driverentry不对,你就完了
guocaijian
驱动牛犊
驱动牛犊
  • 注册日期2005-04-06
  • 最后登录2006-02-15
  • 粉丝0
  • 关注0
  • 积分137分
  • 威望21点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2005-06-17 00:20
2000系统的NTDDK里用NdisMRegisterDevice我是成功的.但Driverstudio的drivernetwork,里面用不行啊,我是在初始化例程里面用,关键是第一个参数不能像在DDK里面那样为返回的代表NDIS的句柄.因为drivernetwork的driverentry例程封装太大,怎么找哪个句柄,所以就只能让第一个参数为*KNdisMiniDriver:riverInstance(),但会不会就是它出的问题,使一安装中间层驱动的时候,系统就从新启动,且一定是因为NdisMRegisterDevice这个函数
wuer7
驱动牛犊
驱动牛犊
  • 注册日期2005-04-03
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分25分
  • 威望132点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2005-06-17 10:53
NDIS_STATUS CreateIRPDevice()
{//注册设备
NDIS_STATUS Status;

//定义进程方法数组
static PDRIVER_DISPATCH MajorFunction[IRP_MJ_MAXIMUM_FUNCTION+1];
NdisZeroMemory(MajorFunction,sizeof(MajorFunction));
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;

//定义设备名称
    UNICODE_STRING                  ntDeviceName;
    UNICODE_STRING                  win32DeviceName;
RtlInitUnicodeString(&ntDeviceName,    IRPFilter_WDM_DEVICE_NAME_W);
RtlInitUnicodeString(&win32DeviceName, IRPFilter_WDM_SYMBOLIC_LINK_W);

//注册设备
Status = NdisMRegisterDevice(
*KNdisMiniDriver::DriverInstance(),
&ntDeviceName,
&win32DeviceName,
MajorFunction,
&m_pDeviceObject,
&m_DeviceHandle);

if (Status==NDIS_STATUS_SUCCESS){//注册成功
m_pDeviceObject->Flags |=DO_BUFFERED_IO;
DbgPrint(\"注册设备成功!\\n\");
}
else//注册失败
DbgPrint(\"注册设备失败!\\n\");

return Status;
}

//入口函数是这样写的没有
NTSTATUS StlFilterDriver::DriverEntry(IN PVOID)
{
TRACE(\"StlFilterDriver::DriverEntry\\n\");
KNDIS_FILTERDRIVER_CHARACTERISTICS<StlFilterAdapter, StlFilterBinding> Chars;
NTSTATUS Status=Chars.Register(*this, L\"StlFilter\");

if (Status==NDIS_STATUS_SUCCESS)//驱动注册成功则注册设备
return CreateIRPDevice();

return Status;

}
xh428
驱动牛犊
驱动牛犊
  • 注册日期2002-12-19
  • 最后登录2005-11-25
  • 粉丝0
  • 关注0
  • 积分11分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2005-06-17 12:47
傻孩子,你这么肯定是不行的,呵呵
你要从你的driverentry带的参数的object中获得一个NDIS_HANDLE
这样把这个带到第一个参数就可以了。
游客

返回顶部