1

我有一个我使用的代码NtQuerySystemInformationNtDuplicateObject以及NtQueryObject查询打开的句柄的函数。我使用这些结构:

typedef NTSTATUS ( NTAPI *_NtQuerySystemInformation )
(
ULONG SystemInformationClass,
PVOID SystemInformation,
ULONG SystemInformationLength,
PULONG ReturnLength
);   

typedef NTSTATUS ( NTAPI *_NtDuplicateObject )
(
HANDLE SourceProcessHandle,
HANDLE SourceHandle,
HANDLE TargetProcessHandle,
PHANDLE TargetHandle,
ACCESS_MASK DesiredAccess,
ULONG Attributes,
ULONG Options
);

typedef NTSTATUS ( NTAPI *_NtQueryObject ) 
(
HANDLE ObjectHandle,
ULONG ObjectInformationClass,
PVOID ObjectInformation,
ULONG ObjectInformationLength,
PULONG ReturnLength
);

typedef struct _UNICODE_STRING
{
USHORT Length;
USHORT MaximumLength;
PWSTR Buffer;
} UNICODE_STRING, *PUNICODE_STRING;

typedef struct _SYSTEM_HANDLE
{
ULONG ProcessId;
BYTE ObjectTypeNumber;
BYTE Flags;
USHORT Handle;
PVOID Object;
ACCESS_MASK GrantedAccess;
} SYSTEM_HANDLE, *PSYSTEM_HANDLE;

typedef struct _SYSTEM_HANDLE_INFORMATION
{
ULONG HandleCount;
SYSTEM_HANDLE Handles[ 1 ];
} SYSTEM_HANDLE_INFORMATION, *PSYSTEM_HANDLE_INFORMATION;

typedef enum _POOL_TYPE
{
NonPagedPool,
PagedPool,
NonPagedPoolMustSucceed,
DontUseThisType,
NonPagedPoolCacheAligned,
PagedPoolCacheAligned,
NonPagedPoolCacheAlignedMustS
} POOL_TYPE, *PPOOL_TYPE;

typedef struct _OBJECT_TYPE_INFORMATION
{
UNICODE_STRING Name;
ULONG TotalNumberOfObjects;
ULONG TotalNumberOfHandles;
ULONG TotalPagedPoolUsage;
ULONG TotalNonPagedPoolUsage;
ULONG TotalNamePoolUsage;
ULONG TotalHandleTableUsage;
ULONG HighWaterNumberOfObjects;
ULONG HighWaterNumberOfHandles;
ULONG HighWaterPagedPoolUsage;
ULONG HighWaterNonPagedPoolUsage;
ULONG HighWaterNamePoolUsage;
ULONG HighWaterHandleTableUsage;
ULONG InvalidAttributes;
GENERIC_MAPPING GenericMapping;
ULONG ValidAccess;
BOOLEAN SecurityRequired;
BOOLEAN MaintainHandleCount;
USHORT MaintainTypeList;
POOL_TYPE PoolType;
ULONG PagedPoolUsage;
ULONG NonPagedPoolUsage;
} OBJECT_TYPE_INFORMATION, *POBJECT_TYPE_INFORMATION;

我的应用程序在 Windows XP、Windows 7 32 位和 Windows 7 64 位下运行良好,但在 Windows XP 64 位下却表现得很奇怪。它无法接收正确的 ProcessID。我会得到随机的负数。但是,如果我在 64 位下编译我的代码,它工作正常。

是否有可能 i 只需更改我使用的结构的某些数据类型,就可以正常工作?如果是,那么有人可以帮我怎么做吗?如果不是,那么我唯一的选择是使用 64 位版本的代码吗?

谢谢!

4

1 回答 1

2

64 位版本的 XP 是,呃,特别的。微软获得正确的 64 位版本 Windows 的培训轮,这是一项非常重要的工作。他们在 Vista 上完全做到了这一点,这是第一个一切都正确的真正的 Windows 版本。尽管有仇恨。

我的机器上仍然有旧的 MSDN 库文档 NtQuerySystemInformation(),可以追溯到 2008 年,但可能早在那之前就已经写好了。它揭示了程序员对与美国司法部达成和解的想法的一个非常有趣的观点。我无法再链接它,所以我将复制/粘贴:

返回一个不透明的东西结构,可用于为随机数生成器生成不可预测的种子。

您传递的大多数 SystemInformationClass 参数都暗示了一些东西。从那以后,这已经被缓和了很多,该函数的文档中不再有任何尖锐的评论。ntddi 版本稳定在 Vista 中的大部分启用,不再需要辅助轮。XP 是 Windows 的第 5 版。Vista 是 Windows 6.0 版,非常重要的内核修订版。Win7是6.1,Win8是6.2。服务包,真的,有足够的用户界面小工具让有人为更新付费。不要费心让它在 XP 中工作,实际上没有人使用它。

于 2012-12-05T23:35:21.953 回答