singlebird
驱动牛犊
驱动牛犊
  • 注册日期2002-08-13
  • 最后登录2006-03-14
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1376回复:8

Help!!MiniportInitialize怎么不执行??

楼主#
更多 发布于:2003-06-18 10:36
我做了一个NDIS-WDM的驱动,是将一个USB设备虚拟成网卡。
在DriverEntry中,注册微端口已经成功了,但调试时发现
MiniportInitialize根本就没有执行。
那位高手帮帮我,急--急--急--
Thank you!!!!!!!!
antspower
驱动中牛
驱动中牛
  • 注册日期2002-10-17
  • 最后登录2010-08-03
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值2点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-06-18 13:14
具体一点好吗?
放弃瘟草,现吃李草
singlebird
驱动牛犊
驱动牛犊
  • 注册日期2002-08-13
  • 最后登录2006-03-14
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于: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中设置了断点,但程序根本就没有运行到
初始化例程中去。
antspower
驱动中牛
驱动中牛
  • 注册日期2002-10-17
  • 最后登录2010-08-03
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值2点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-06-18 21:04
我想你WDM设备的也许根本就没有和PASSTHRU挂钩啊
把你的CREATEDEVICE的那几行那出来看看啊
IOCREATEDEVICE或NDISMREGISTERDEVICE的实参。
放弃瘟草,现吃李草
singlebird
驱动牛犊
驱动牛犊
  • 注册日期2002-08-13
  • 最后登录2006-03-14
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于: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;
}
antspower
驱动中牛
驱动中牛
  • 注册日期2002-10-17
  • 最后登录2010-08-03
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值2点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-06-18 22:46
在我的passthru 中,passthrude 流程如下:
ptpnphandle=》ptpnpeventreconfigure-》ptopenadaptercomplete
-》mpbundlesearchandsetsecondary-》initializeminiport
。。。。
不之你的是怎么走的
安装了以后还能ping吗?
放弃瘟草,现吃李草
singlebird
驱动牛犊
驱动牛犊
  • 注册日期2002-08-13
  • 最后登录2006-03-14
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2003-06-19 12:20
我认为passthrough怎么调用MiniportInitialize应该是NDIS
的事,我只负责向NDIS注册一个微端口,至于其它的一些调用关系,
应该由NDIS决定。(我做的只是一个NIC驱动程序,没有自己做上层驱动程序)
同时,安装了该驱动程序后,ping程序还可以使用。
antspower
驱动中牛
驱动中牛
  • 注册日期2002-10-17
  • 最后登录2010-08-03
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值2点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2003-06-19 22:44
兄弟你用的PASSTHRU的代码啊.
找你说的好象你没有注册protocol一样,但是那是不可能的:)吧
你注册的函数确实都是在出了driverentry后由NDIS来调用的.
既然能ping说明你程序没问题(或者没有安装上?)
你用softice之类的东西,trace了程序吗?
放弃瘟草,现吃李草
singlebird
驱动牛犊
驱动牛犊
  • 注册日期2002-08-13
  • 最后登录2006-03-14
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2003-06-21 12:51
微端口驱动程序没有必要注册protocol吧!?
我用softice跟踪过,Miniport×××函数都没有被调用。
另外,microsoft的网站上有一篇文章,它说不应该像DDK中
USB bulk驱动中那样注册IRP_MJ_×××例程,我不知道这是
什么意思,也不知道与我的问题有没有关系?

游客

返回顶部