我有一个代码,我使用NtQuerySystemInformation
,NtDuplicateObject
和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位下编译我的代码,它工作正常。
我是否可能只需改变我使用的结构的某些数据类型,因此它可以正常工作?如果是,那么有人可以帮助我如何做到这一点?如果没有,那么我唯一的选择是使用64位版本的代码吗?
谢谢!
答案 0 :(得分:2)
64位版本的XP是特别的。微软获得64位版本Windows的培训轮,这是一项非常重要的工作。他们完全将它钉在Vista上,这是第一个真正的Windows版本,它将所有正确。尽管讨厌。
我的机器上仍然有NtQuerySystemInformation()的旧MSDN Library文档,可追溯到2008年,但可能在此之前编写得很好。它揭示了一个非常热闹的观点,即程序员对DOJ在美国的解决方案的看法。我再也无法链接了,所以我只是复制/粘贴:
返回一个不透明的某种结构,可用于为随机数生成器生成不可预测的种子。
从您传递的大多数SystemInformationClass参数中提取某些内容。从那时起,这种情况有所缓和,在该函数的文档中没有更多的评论。在ntddi版本稳定在Vista的推动下,不再需要训练轮。 XP是Windows的第5版。 Vista是Windows 6.0版,非常重要的内核版本。 Win7是6.1,Win8是6.2。实际上,Service Pack具有足够的UI小工具,可以让某人为更新付费。不要打扰它在XP中工作,没有人真正使用它。