首页
社区
课程
招聘
[求助]CreateFile不进入驱动中指定的IRP_MJ_CREATE例程
发表于: 2013-3-14 22:04 10105

[求助]CreateFile不进入驱动中指定的IRP_MJ_CREATE例程

2013-3-14 22:04
10105
我用windbg在IRP_MJ_CREATE的例程函数中设置了断点,但是始终没有命中该断点。只好在该例程中添加了DbgPrint输出,但是在Windbg中也没有捕获到任何输出字符串。
然后我用IRPTracer软件测试了一下,显示:CreateFile调用成功返回。
之后,又调用ReadFile和WriteFile函数,在IRPTracer中均显示调用已返回,但是结果是失败的。不知道有什么原因会导致这种情况?
  在网上搜了下, 就看到一个帖子说是“INF文件写的不对导致的”,可是我看了看,也没有发现INF文件有什么不对的地方。(调试的是虚拟网卡的驱动Tap-win32)

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (11)
雪    币: 1
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
我为源程序中的所有函数都添加了断点,结果调用ReadFile和WriteFile函数后,没有一个断点命中。不知道程序跑到哪儿去了。
另外,有没有别的办法捕捉发送的IRP请求?
2013-3-14 22:20
0
雪    币: 2120
活跃值: (73)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
需要使用Dbgview看DbgPrint
2013-3-14 22:36
0
雪    币: 496
活跃值: (301)
能力值: ( LV13,RANK:400 )
在线值:
发帖
回帖
粉丝
4
遇到问题不要只用文字描述,把你的DriverEntry函数贴出来看看你的pDriverObject->MajorFunction是否都正确赋值了。
2013-3-14 23:02
0
雪    币: 1
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
我在microsoft的网站上下载4.81版本的debugview软件,在网上找到了一个“图文教程”,然后按着教程测试。
    在两台电脑上都安装了XP系统,并使用网线将它们连接起来,可以互相看到对方。
    在一台机子上为debugview.exe建立了快捷方式,并在快捷方式的“目标后键入‘空格+/c’”,然后运行该快捷方式,出现“waitting for connecting.....”的对话框。
    在另一台机子上运行debugview.exe,然后通过“connect菜单”连接前一台机子,可是一直提示“在目标机子上找不到debugview客户端...”的对话框。
    全是按照教程做的,而且在快捷方式的后面添加“空格+/?”后,弹出了提示对话框:上面给出了“设置为服务器端和客户端的后缀参数”。可是就是连不上,没辙了,后来就用Windbg。
2013-3-15 07:33
0
雪    币: 1
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
程序中相关的代码(太长了,只是摘了其中一部分,摘自tapdrvr.c文件):
NDIS_HANDLE g_NdisWrapperHandle;

//============================================================
//                         Driver Entry
//============================================================
#pragma NDIS_INIT_FUNCTION (DriverEntry)

NTSTATUS
DriverEntry (IN PDRIVER_OBJECT p_DriverObject,
             IN PUNICODE_STRING p_RegistryPath)
{
       NDIS_STATUS l_Status = NDIS_STATUS_FAILURE;
       NDIS_MINIPORT_CHARACTERISTICS *l_Properties = NULL;

      //========================================================
      // Notify NDIS that a new miniport driver is initializing.
      //========================================================

      NdisMInitializeWrapper (&g_NdisWrapperHandle,
                          p_DriverObject,
                          p_RegistryPath, NULL);

      //======================
      // Global initialization
      //======================

     #if DBG
      MyDebugInit (10000); // Allocate debugging text space
     #endif

     if (!InitInstanceList ())
    {
           DEBUGP (("[TAP] Allocation failed for adapter instance list\n"));
           goto cleanup;
     }

     //=======================================
     // Set and register miniport entry points
     //=======================================

     l_Properties = MemAlloc (sizeof (NDIS_MINIPORT_CHARACTERISTICS), TRUE);

    if (l_Properties == NULL)
    {
          DEBUGP (("[TAP] Allocation failed for miniport entry points\n"));
          goto cleanup;
     }

    l_Properties->MajorNdisVersion = TAP_NDIS_MAJOR_VERSION;
   l_Properties->MinorNdisVersion = TAP_NDIS_MINOR_VERSION;
   l_Properties->InitializeHandler = AdapterCreate;
   l_Properties->HaltHandler = AdapterHalt;
   l_Properties->ResetHandler = AdapterReset;               /* DISPATCH_LEVEL */
   l_Properties->TransferDataHandler = AdapterReceive;      /* DISPATCH_LEVEL */
   l_Properties->SendHandler = AdapterTransmit;             /* DISPATCH_LEVEL */
   l_Properties->QueryInformationHandler = AdapterQuery;    /* DISPATCH_LEVEL */
   l_Properties->SetInformationHandler = AdapterModify;     /* DISPATCH_LEVEL */

    switch (l_Status =
          NdisMRegisterMiniport (g_NdisWrapperHandle, l_Properties,
                                 sizeof (NDIS_MINIPORT_CHARACTERISTICS)))
    {
           .....................
    }

     ......
     return l_Status;
}

//==========================================================
//                            Adapter Initialization
//==========================================================
NDIS_STATUS AdapterCreate
(OUT PNDIS_STATUS p_ErrorStatus,
OUT PUINT p_MediaIndex,
IN PNDIS_MEDIUM p_Media,
IN UINT p_MediaCount,
IN NDIS_HANDLE p_AdapterHandle,
IN NDIS_HANDLE p_ConfigurationHandle)
{
      TapAdapterPointer l_Adapter = NULL;

      NDIS_MEDIUM l_PreferredMedium = NdisMedium802_3; // Ethernet
      BOOLEAN l_MacFromRegistry = FALSE;
      UINT l_Index;
      NDIS_STATUS status;

      #if ENABLE_NONADMIN
      BOOLEAN enable_non_admin = FALSE;
      #endif

      DEBUGP (("[TAP] AdapterCreate called\n"));

      //====================================
      // Make sure adapter type is supported
      //====================================

      for (l_Index = 0;
       l_Index < p_MediaCount && p_Media[l_Index] != l_PreferredMedium;
       ++l_Index);

      if (l_Index == p_MediaCount)
      {
             DEBUGP (("[TAP] Unsupported adapter type [wanted: %d]\n",
               l_PreferredMedium));
            return NDIS_STATUS_UNSUPPORTED_MEDIA;
      }

      *p_MediaIndex = l_Index;

      //=========================================
      // Allocate memory for TapAdapter structure
      //=========================================

      l_Adapter = MemAlloc (sizeof (TapAdapter), TRUE);

      if (l_Adapter == NULL)
      {
            DEBUGP (("[TAP] Couldn't allocate adapter memory\n"));
            return NDIS_STATUS_RESOURCES;
       }

      //==========================================
      // Inform the NDIS library about significant
      // features of our virtual NIC.
     //==========================================

    NdisMSetAttributesEx
    (p_AdapterHandle,
     (NDIS_HANDLE) l_Adapter,
     16,
     NDIS_ATTRIBUTE_DESERIALIZE
     | NDIS_ATTRIBUTE_IGNORE_PACKET_TIMEOUT
     | NDIS_ATTRIBUTE_IGNORE_REQUEST_TIMEOUT
     | NDIS_ATTRIBUTE_NO_HALT_ON_SUSPEND,
     NdisInterfaceInternal);

   //=====================================
   // Initialize simple Adapter parameters
   //=====================================

  l_Adapter->m_Lookahead = DEFAULT_PACKET_LOOKAHEAD;
  l_Adapter->m_Medium = l_PreferredMedium;
  l_Adapter->m_DeviceState = '?';
  l_Adapter->m_MiniportAdapterHandle = p_AdapterHandle;

  //==================================
  // Allocate spinlock for controlling
  // access to multicast address list.
  //==================================
  NdisAllocateSpinLock (&l_Adapter->m_MCLock);
  l_Adapter->m_MCLockAllocated = TRUE;

  //====================================================
  // Register a shutdown handler which will be called
  // on system restart/shutdown to halt our virtual NIC.
  //====================================================

  NdisMRegisterAdapterShutdownHandler (p_AdapterHandle, l_Adapter,
                                       AdapterHalt);
  l_Adapter->m_RegisteredAdapterShutdownHandler = TRUE;

  ..................

   //====================================
  // Initialize TAP device
  //====================================
  {
         NDIS_STATUS tap_status;
         tap_status = CreateTapDevice (&l_Adapter->m_Extension, NAME (l_Adapter));
        if (tap_status != NDIS_STATUS_SUCCESS)
       {
        AdapterFreeResources (l_Adapter);
        DEBUGP (("[TAP] CreateTapDevice failed\n"));
        return tap_status;
       }
  }

......
return NDIS_STATUS_SUCCESS;
}

//========================================================================
//                             Tap Device Initialization
//========================================================================

NDIS_STATUS
CreateTapDevice (TapExtensionPointer p_Extension, const char *p_Name)

{
# define SIZEOF_DISPATCH (sizeof(PDRIVER_DISPATCH) * (IRP_MJ_MAXIMUM_FUNCTION + 1))
  PDRIVER_DISPATCH *l_Dispatch = NULL;
  ANSI_STRING l_TapString, l_LinkString;
  UNICODE_STRING l_TapUnicode;
  BOOLEAN l_FreeTapUnicode = FALSE;
  NTSTATUS l_Status, l_Return = NDIS_STATUS_SUCCESS;
  const char *l_UsableName;

  DEBUGP (("[TAP] version [%d.%d] creating tap device: %s\n",
           TAP_DRIVER_MAJOR_VERSION,
           TAP_DRIVER_MINOR_VERSION,
           p_Name));

  NdisZeroMemory (p_Extension, sizeof (TapExtension));

  INIT_MUTEX (&p_Extension->m_OpenCloseMutex);

  l_LinkString.Buffer = NULL;
  l_TapString.Buffer = NULL;

  l_TapString.MaximumLength = l_LinkString.MaximumLength = NAME_BUFFER_SIZE;

  //=======================================
  // Set TAP device entry points
  //=======================================

  if ((l_Dispatch = MemAlloc (SIZEOF_DISPATCH, TRUE)) == NULL)
    {
      DEBUGP (("[%s] couldn't alloc TAP dispatch table\n", p_Name));
      l_Return = NDIS_STATUS_RESOURCES;
      goto cleanup;
    }

  l_Dispatch[IRP_MJ_DEVICE_CONTROL] = TapDeviceHook;
  l_Dispatch[IRP_MJ_READ] = TapDeviceHook;
  l_Dispatch[IRP_MJ_WRITE] = TapDeviceHook;
  l_Dispatch[IRP_MJ_CREATE] = TapDeviceHook;
  l_Dispatch[IRP_MJ_CLOSE] = TapDeviceHook;

  ......
}

//======================================================================
// Hooks for catching TAP device IRP's.
//======================================================================

NTSTATUS
TapDeviceHook (IN PDEVICE_OBJECT p_DeviceObject, IN PIRP p_IRP)

{
TapAdapterPointer l_Adapter = LookupAdapterInInstanceList (p_DeviceObject);
  PIO_STACK_LOCATION l_IrpSp;
  NTSTATUS l_Status = STATUS_SUCCESS;
  BOOLEAN accessible;

  l_IrpSp = IoGetCurrentIrpStackLocation (p_IRP);

  p_IRP->IoStatus.Status = STATUS_SUCCESS;
  p_IRP->IoStatus.Information = 0;

switch (l_IrpSp->MajorFunction)
{
     //===========================================================
      // User mode thread issued a read request on the tap device
      // If there are packets waiting to be read, then the request
      // will be satisfied here. If not, then the request will be
      // queued and satisfied by any packet that is not used to
      // satisfy requests ahead of it.
      //===========================================================
    case IRP_MJ_READ:
   {
       .....
   }

//==============================================================
      // User mode issued a WriteFile request on the TAP file handle.
      // The request will always get satisfied here.  The call may
      // fail if there are too many pending packets (queue full).
      //==============================================================
    case IRP_MJ_WRITE:
{
}

//--------------------------------------------------------------
      //   User mode thread has called CreateFile() on the tap device
      //--------------------------------------------------------------
    case IRP_MJ_CREATE:
  {
}
}

打开设备使用的是:
CreateFile("\\\\.\\{GUID}",......)

IRPTracer显示调用CreatFile成功,但是调用ReadFile时显示IRP请求失败。为所有函数都添加了断点,但是在windbg中也无法命中断点。
上传的附件:
2013-3-15 09:13
0
雪    币: 1
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
找不到原因
2013-3-15 11:23
0
雪    币: 2120
活跃值: (73)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
8
DebugView可以在运行驱动的机子里运行啊 不需要用远程
2013-3-15 17:58
0
雪    币: 1
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
那我再试试,谢谢啊。
2013-3-15 18:50
0
雪    币: 1
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
请教出现这个结果该如何着手分析?
用IRPTracer捕获:
Read
----------------------------------------------------------------
IRP
Major function   IRP_MJ_READ
state                 Completed
status               Error: STATUS_NOT_SUPPORTED
----------------------------------------------------------------
Sent
Process             CommTest.exe(F80H)
----------------------------------------------------------------
Completed
by                     NDIS.SYS!NdisFreeToBlockPool+1C8C
                        (F72A2232)
2013-3-16 11:48
0
雪    币: 1
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
2013-3-18 08:59
0
雪    币: 1
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
解决了,符号连接名写错了。
2013-3-19 17:50
0
游客
登录 | 注册 方可回帖
返回
//