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;