深度剖析WinPcap之(六)——驱动程序的初始化与清除 (3)
2009-09-11 00:00:00 来源:WEB开发网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的适配器。
图5-3 注册表项Tcpip\Linkage
图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;
}
- ››深度解释攻击linux服务器的四种级别
- ››剖析java.util.concurrent锁
- ››剖析Android智能手机系统的更多功能
- ››深度分析地方社区网站的内容定位
- ››剖析Windows Azure Platform框架与组成
- ››剖析使用 ObjectOutputStream 可能引起的内存泄漏...
- ››剖析EWebEditor编辑器漏洞攻击案例
- ››剖析开源云:构建 Infrastructure as a Service 块...
- ››深度剖析 Android 和 iPhone OS
- ››深度分析:HTML5能否成为Flash终结者
- ››深度挖掘 更多Windows 7快捷模式
- ››深度挖掘 Windows 7快捷模式
更多精彩
赞助商链接