阅读:2137回复:11
请问高手在drivernetworks中间层驱动里用ndisMregisterdevice安装时系统从起?
:(想在中间层过滤器驱动与应用程序通信,用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); |
|
沙发#
发布于:2005-06-17 12:47
傻孩子,你这么肯定是不行的,呵呵
你要从你的driverentry带的参数的object中获得一个NDIS_HANDLE 这样把这个带到第一个参数就可以了。 |
|
板凳#
发布于: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; } |
|
地板#
发布于:2005-06-17 00:20
2000系统的NTDDK里用NdisMRegisterDevice我是成功的.但Driverstudio的drivernetwork,里面用不行啊,我是在初始化例程里面用,关键是第一个参数不能像在DDK里面那样为返回的代表NDIS的句柄.因为drivernetwork的driverentry例程封装太大,怎么找哪个句柄,所以就只能让第一个参数为*KNdisMiniDriver:riverInstance(),但会不会就是它出的问题,使一安装中间层驱动的时候,系统就从新启动,且一定是因为NdisMRegisterDevice这个函数
|
|
地下室#
发布于:2005-06-16 22:04
让我看看你的入口,如果入口driverentry不对,你就完了
|
|
5楼#
发布于:2005-06-15 19:05
不是做虚拟网卡,我只是在中间层绕过IP/TCP层直接在链路层传输.我用的是2000系统的NTDDK,但我也想用Driverstudio的drivernetwork,但我不会在它的中间层注册设备???NdisMRegisterDevice的第一个参数看来有问题??
|
|
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\"), 呵呵,兄弟是不是在做虚拟网卡啊? |
|
7楼#
发布于:2005-06-06 09:48
十分感谢ZHAOCK的回复!! 我建议你用ddk里ndis下面的ndisuio的例子。NdisOpenAdapter可以控制,绑定的类型,也可以知道网卡的名字,你可以区分哪个是 你需要绑定的。 ptreceivepacket,ptreceive的处理,详见ndisuio的例子就可以了 |
|
8楼#
发布于:2005-06-05 20:15
十分感谢ZHAOCK的回复!!
我是想在几台计算机之间,不用IP,直接在链路层传输,只在数据前加6字节的目的MAC地址然后发送。我们的电脑都有两个网卡,一个是以太网卡,一个光纤通道(FC)网卡。请问怎么知道ndissend把数据发送到哪个网卡????ndisopenadapter帮定到哪个网卡? 我就是在昨晚仅仅实现了以太网卡的只用MAC地址,不用IP的单向传输,为什么光纤通道的传送不了?但我的目的是在光钎通道网卡上传送。这是不是绑定问题? 接收数据是在ptreceivepacket还是在ptreceive里面复制包内容,好象我的网卡两个函数都调用。而且ndisgetreceivepacket==NULL |
|
9楼#
发布于:2005-06-04 20:22
zhaock版主救救我! 那个参数没有错。 我不知道你做的是什么,如果不是防火墙,仅仅想自己直接发包,直接用protocol的例子ndisuio就可以,imd驱动比protocol驱动复杂多了 如果是在imd中自己构造发包,就要注意NDIS_PACKET等结构的分配释放,最重要的是PtSendComplete,要区分,是来自上边协议的包,还是自己的包,做不同的处理。你这个考虑了没有? |
|
10楼#
发布于:2005-06-04 19:35
zhaock版主救救我!
我之前是用的ddk,我想绕过IP/TCP层数据直接从应用程序传输到中间层驱动,然后用ndissend,发送,(用MAC地址加上数据自己构造数据包),可是程序一道ndissend,就蓝屏.ndissend里面有个绑定句丙参数,我用全局变量传过来,就是ndisopenadapter里面返回的绑定句丙.这样对吗? |
|
11楼#
发布于:2005-06-04 10:12
:(想在中间层过滤器驱动与应用程序通信,用driverstudio工具。在初始化函数里注册设备,编译没错,可为什么安装驱动系统会从起?static PDRIVER_DISPATCH MajorFunction[IRP_MJ_MAXIMUM_FUNCTION + 1]; 没有用过DS,而且个人觉得,对于做驱动,还是先从ddk学起,DS做了太多的封装,不利于搞清楚最基本的概念,而这确是做驱动必须的。 NdisMRegisterDevice第一个参数对不对? softice可不可以截住,是执行NdisMRegisterDevice出的问题吗? |
|