阅读:1376回复:8
Help!!MiniportInitialize怎么不执行??
我做了一个NDIS-WDM的驱动,是将一个USB设备虚拟成网卡。
在DriverEntry中,注册微端口已经成功了,但调试时发现 MiniportInitialize根本就没有执行。 那位高手帮帮我,急--急--急-- Thank you!!!!!!!! |
|
沙发#
发布于:2003-06-18 13:14
具体一点好吗?
|
|
|
板凳#
发布于:2003-06-18 14:50
这个驱动程序原来是WDM的,我在它的基础上加了NDIS部分。
在DriverEntry中,我先调用NdisMInitializeWrapper,然后 用NdisMRegisterMiniport注册了一个微端口(DDK中对NDIS-WDM 所要求的Miniport×××例程都注册了),同时,原来WDM部分的 IRP_MJ_×××_×××处理函数都没有做什么改动,例如DispatchPnp、DispatchPower等。 按照DDK里的说明,对于非PNP的微端口,当DriverEntry返回时 MiniportInitialize被调用,而对于PNP的微端口,MiniportInitialize的调用将被延迟到PNP管理器发送一个请求, 也就是在IRP_MN_START_DEVICE期间执行。 在调试时,我拔掉设备然后再插上去。虽然我在MiniportInitialize中设置了断点,但程序根本就没有运行到 初始化例程中去。 |
|
地板#
发布于:2003-06-18 21:04
我想你WDM设备的也许根本就没有和PASSTHRU挂钩啊
把你的CREATEDEVICE的那几行那出来看看啊 IOCREATEDEVICE或NDISMREGISTERDEVICE的实参。 |
|
|
地下室#
发布于:2003-06-18 22:08
CreateDevice的代码如下:
NTSTATUS Ezusb_CreateDeviceObject( IN PDRIVER_OBJECT DriverObject, IN PDEVICE_OBJECT *DeviceObject, LONG Instance ) /*++ Routine Description: Creates a Functional DeviceObject Arguments: DriverObject - pointer to the driver object for device DeviceObject - pointer to DeviceObject pointer to return created device object. Instance - instnace of the device create. Return Value: STATUS_SUCCESS if successful, STATUS_UNSUCCESSFUL otherwise --*/ { NTSTATUS ntStatus; WCHAR deviceLinkBuffer[] = L\"\\\\DosDevices\\\\dtusb-0\"; UNICODE_STRING deviceLinkUnicodeString; WCHAR deviceNameBuffer[] = L\"\\\\Device\\\\dtusb-0\"; UNICODE_STRING deviceNameUnicodeString; PDEVICE_EXTENSION pdx; STRING deviceName; Ezusb_KdPrint((\"enter Ezusb_CreateDeviceObject instance = %d\\n\", Instance)); // // fix up device names based on Instance // deviceLinkBuffer[18] = (USHORT) (\'0\' + Instance); deviceNameBuffer[14] = (USHORT) (\'0\' + Instance); Ezusb_KdPrint((\"Create Device name (%ws)\\n\", deviceNameBuffer)); RtlInitUnicodeString (&deviceNameUnicodeString, deviceNameBuffer); // //Print out the unicode string //NOTE: We must first convert the string to Unicode due to a bug in the Debugger that does not allow // Unicode Strings to be printed to the debug device. // deviceName.Buffer = NULL; ntStatus = RtlUnicodeStringToAnsiString (&deviceName, &deviceNameUnicodeString, TRUE); if (NT_SUCCESS(ntStatus)) { Ezusb_KdPrint((\"Create Device Name (%s)\\n\", deviceName.Buffer)); RtlFreeAnsiString (&deviceName); } else { Ezusb_KdPrint((\"Unicode to Ansi str failed w/ ntStatus: 0x%x\\n\",ntStatus)); } ntStatus = IoCreateDevice (DriverObject, sizeof (DEVICE_EXTENSION), &deviceNameUnicodeString, FILE_DEVICE_UNKNOWN, 0, FALSE, DeviceObject); if (NT_SUCCESS(ntStatus)) { // Initialize our device extension pdx = (PDEVICE_EXTENSION) ((*DeviceObject)->DeviceExtension); RtlCopyMemory(pdx->DeviceLinkNameBuffer, deviceLinkBuffer, sizeof(deviceLinkBuffer)); pdx->OpenHandles = 0; pdx->ConfigurationHandle = NULL; pdx->DeviceDescriptor = NULL; pdx->NeedCleanup = FALSE; pdx->DataRingBuffer = NULL; pdx->DescriptorRingBuffer = NULL; pdx->Started = FALSE; // Initialize our interface pdx->Interface = NULL; RtlInitUnicodeString (&deviceLinkUnicodeString, deviceLinkBuffer); Ezusb_KdPrint((\"Create DosDevice name (%ws)\\n\", deviceLinkBuffer)); ntStatus = IoCreateSymbolicLink (&deviceLinkUnicodeString, &deviceNameUnicodeString); } Ezusb_KdPrint((\"exit Ezusb_CreateDeviceObject (%x)\\n\", ntStatus)); return ntStatus; } |
|
5楼#
发布于:2003-06-18 22:46
在我的passthru 中,passthrude 流程如下:
ptpnphandle=》ptpnpeventreconfigure-》ptopenadaptercomplete -》mpbundlesearchandsetsecondary-》initializeminiport 。。。。 不之你的是怎么走的 安装了以后还能ping吗? |
|
|
6楼#
发布于:2003-06-19 12:20
我认为passthrough怎么调用MiniportInitialize应该是NDIS
的事,我只负责向NDIS注册一个微端口,至于其它的一些调用关系, 应该由NDIS决定。(我做的只是一个NIC驱动程序,没有自己做上层驱动程序) 同时,安装了该驱动程序后,ping程序还可以使用。 |
|
7楼#
发布于:2003-06-19 22:44
兄弟你用的PASSTHRU的代码啊.
找你说的好象你没有注册protocol一样,但是那是不可能的:)吧 你注册的函数确实都是在出了driverentry后由NDIS来调用的. 既然能ping说明你程序没问题(或者没有安装上?) 你用softice之类的东西,trace了程序吗? |
|
|
8楼#
发布于:2003-06-21 12:51
微端口驱动程序没有必要注册protocol吧!?
我用softice跟踪过,Miniport×××函数都没有被调用。 另外,microsoft的网站上有一篇文章,它说不应该像DDK中 USB bulk驱动中那样注册IRP_MJ_×××例程,我不知道这是 什么意思,也不知道与我的问题有没有关系? |
|