pDescriptorspSelector->Index,
X86_DESCRIPTOR_);
fOk = TRUE;
}
else
{
RtlZeroMemory (pDescriptor,
X86_DESCRIPTOR_);
}
}
return fOk;
}
// -----------------------------------------------------------------
PVOID SpyDescriptorBase (PX86_DESCRIPTOR pDescriptor)
{
return (PVOID) ((pDescriptor->Base1 ) |
(pDescriptor->Base2 << 16) |
(pDescriptor->Base3 << 24));
}
// -----------------------------------------------------------------
DWORD SpyDescriptorLimit (PX86_DESCRIPTOR pDescriptor)
{
return (pDescriptor->G ? (pDescriptor->Limit1 << 12) |
(pDescriptor->Limit2 << 28) | 0xFFF
: (pDescriptor->Limit1 ) |
(pDescriptor->Limit2 << 16));
}
// -----------------------------------------------------------------
DWORD SpyDescriptorType (PX86_DESCRIPTOR pDescriptor,
PBOOL pfSystem)
{
if (pfSystem != NULL) *pfSystem = !pDescriptor->S;
return pDescriptor->Type;
}
列表 4-17. 获取描述符的值
如果选择器的 TI 位指定了一个 GDT 描述符,事情就简单了 。再次使用 SGDT 指令来取出 GDT 在线性内存中的位置和大小,如果选择器指定的描述符索引位于适当的范围,pDescriptors 变量将被设置为指向 GDT 的基地址 。对于 LDT 和 GDT 来说,pDescriptors 变量都不会为空 。如果调用者传入的选择器是有效的,64 位的描述符值将被复制到调用者提供的 X86_DESCRIPTOR 结构中 。否则,该结构的所有成员都会被 RtlZeroMemory() 设为 0。
【4 《Undocumented Windows 2000 Secrets》翻译 --- 第四章】我们仍然在讨论 列表 4-15 中的 SpySegment() 函数 。SpySelector() 和 SpyDescriptor() 调用已经解释了 。只剩下最后的 SpyDescriptorBase() 和 SpyDescriptorLimit() 调用,不过你应该已经知道这些函数作了些什么(见 列表 4-17 ) 。如果 SpySelector() 和 SpyDescriptor() 成功,返回的 SPY_SEGMENT 结构将是有效的 。SpyDescriptorBase() 和 SpyDescriptorLimit() 不会返回出错标志 。因为它们不可能失败,如果提供的描述符无效,只是会让它们返回错误的数据而已 。
推荐阅读
- 3 《Undocumented Windows 2000 Secrets》翻译 --- 第四章
- Windows 2000/2003下如何使用组策略禁止用户修改密码
- windows 2000密码破解
- Windows 2000对调试技术的支持
- 永久删除 Windows 2000 默认本地 C, D 盘共享的两个批处理文件
- Windows 2000 无法直接关机解决方案
- 2 《Undocumented Windows 2000 Secrets》翻译 --- 第二章
- 2 《Undocumented Windows 2000 Secrets》翻译 --- 2
- 使用 Windows 2000 中的 IPSec IP 筛选器列表
- 火影忍者是哪一年出的
