WEB开发网
开发学院操作系统windows 2008 深度剖析WinPcap之(六)——驱动程序的初始化与清除... 阅读

深度剖析WinPcap之(六)——驱动程序的初始化与清除 (3)

 2009-09-11 00:00:00 来源:WEB开发网   
核心提示:1.3.2 getTcpBindings函数函数getTcpBindings返回绑定到TCP/IP的MAC,函数原型如下:PKEY_VALUE_PARTIAL_INFORMATION getTcpBindings(VOID);如果getAdaptersList 函数失败,深度剖析WinPcap之(六)——驱动程序的初始

1.3.2        getTcpBindings函数

函数getTcpBindings返回绑定到TCP/IP的MAC。函数原型如下:

PKEY_VALUE_PARTIAL_INFORMATION getTcpBindings(VOID);

如果getAdaptersList 函数失败,NPF通过该函数试图获取TCP/IP的绑定。函数通过对注册表项HKEY_LOCAL_MACHINE\SYSTEM \CurrentControlSet\Services\Tcpip\Linkage下Bind键值获得TCP-IP绑定的适配器。函数返回指向注册表”Bind”键名的键值的指针,该注册表键值包含绑定了TCP/IP的适配器。

深度剖析WinPcap之(六)——驱动程序的初始化与清除 (3)

图5-3 注册表项Tcpip\Linkage

深度剖析WinPcap之(六)——驱动程序的初始化与清除 (3)

图5-4 Bind键名的键值

函数的主要代码如下:

PKEY_VALUE_PARTIAL_INFORMATION getTcpBindings(void)
{
  PKEY_VALUE_PARTIAL_INFORMATION result = NULL;
  OBJECT_ATTRIBUTES objAttrs;
  NTSTATUS status;
  HANDLE keyHandle;
 
/*
*设置一个OBJECT_ATTRIBUTES类型的参数objAttrs,为了后续调用
*其中NDIS_STRING tcpLinkageKeyName =
* NDIS_STRING_CONST(\\Registry\\Machine\\System
*      L"\\CurrentControlSet\\Services\\Tcpip\\Linkage");
*/
  InitializeObjectAttributes(&objAttrs, &tcpLinkageKeyName,
      OBJ_CASE_INSENSITIVE, NULL, NULL);
 
/*打开注册表表项,返回objAttrs中所描述的注册表表项的句柄*/
  status = ZwOpenKey(&keyHandle, KEY_READ, &objAttrs);
  if (!NT_SUCCESS(status))
  {//打开失败
  }
  else
  {//成功打开
ULONG resultLength;
        KEY_VALUE_PARTIAL_INFORMATION valueInfo;
/*
*对注册表表项进行查询,其中bindValueName的定义为
*NDIS_STRING bindValueName = NDIS_STRING_CONST("Bind");
*/
        status = ZwQueryValueKey(keyHandle, &bindValueName,
                 KeyValuePartialInformation, &valueInfo,
                 sizeof(valueInfo), &resultLength);
      if (!NT_SUCCESS(status) && (status != STATUS_BUFFER_OVERFLOW))
      {//查询失败
      }
      else
      {    /*计算所需的内存大小*/
ULONG valueInfoLength = valueInfo.DataLength +
FIELD_OFFSET(KEY_VALUE_PARTIAL_INFORMATION, Data[0]);
            /*分配内存,用于查询*/
PKEY_VALUE_PARTIAL_INFORMATION valueInfoP =           (PKEY_VALUE_PARTIAL_INFORMATION)ExAllocatePoolWithTag(
PagedPool, valueInfoLength, '2PWA');
 
          if (valueInfoP != NULL)
          {  /*对注册表表项进行查询,获取键名为”Bind”的键值信息*/
              status = ZwQueryValueKey(keyHandle, &bindValueName,
                  KeyValuePartialInformation,
                  valueInfoP,
                  valueInfoLength, &resultLength);
 
              if (!NT_SUCCESS(status))
              {//查询失败
                  ExFreePool(valueInfoP);
              }
              else
              {
                  if (valueInfoLength != resultLength)
                  {//失败,查询结果的长度前后不一致
                      ExFreePool(valueInfoP);
                  }
                  else
                  {
                      if (valueInfoP->Type != REG_MULTI_SZ)
                      {//失败,键名”Bind”的键值类型不是REG_MULTI_SZ
                              ExFreePool(valueInfoP);
                      }
                      else
                      { /*所有的操作正确*/
                          result = valueInfoP;
                      }
                  }
              }
          }
      }
/*关闭注册表*/
      ZwClose(keyHandle);
  }
/*返回查询的数据*/
return result;
}

1 2 3 4  下一页

Tags:深度 剖析 WinPcap

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接