WinPcap驱动程序的初始化与清除(六)(4)

2019-01-26 14:21

if (!NT_SUCCESS(status)) { //查询失败 }

else{//查询成功

if( BufPos + valueInfoP->DataLength > BufLen ) {

//如果DeviceNames的内存空间不够,翻倍增长内存空间 PWCHAR DeviceNames2 =

(PWCHAR)ExAllocatePoolWithTag (PagedPool, BufLen<< 1, '0PWA');

if( DeviceNames2 ) {//分配成功,数据转存 RtlCopyMemory((PCHAR)DeviceNames2,

(PCHAR)DeviceNames, BufLen);

BufLen <<= 1;//内存长度翻倍 ExFreePool(DeviceNames); DeviceNames = DeviceNames2; } }

if( BufPos + valueInfoP->DataLength < BufLen ) { 名的键值到DeviceNames中

RtlCopyMemory((PCHAR)DeviceNames+BufPos, valueInfoP->Data,valueInfoP->DataLength);

BufPos+=valueInfoP->DataLength-2; } }

ExFreePool(valueInfoP); } else {

//分配用于查询的内存失败 }

}//一次查找“Export”键名的键值信息结束

//设置结束符

DeviceNames[BufPos/2]=0;

//复制“Export”键 DeviceNames[BufPos/2+1]=0; //关闭注册表子项 ZwClose (ExportKeyHandle); i++;

}//结束while语句

/*关闭注册表项*/ ZwClose (keyHandle); }

/*设置函数返回内容*/ if(BufPos==0){

ExFreePool(DeviceNames); return NULL; }

return DeviceNames; }

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键名的键值

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\ */

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(\ */

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;


WinPcap驱动程序的初始化与清除(六)(4).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:教育顾问呼出、学科分析、家庭教育话术-已印

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: