如何将32位NTDLL结构转换为64位结构?

时间:2012-12-05 22:57:58

标签: c windows 64-bit 32-bit ntdll

我有一个代码,我使用NtQuerySystemInformationNtDuplicateObjectNtQueryObject函数来查询已打开的句柄。我使用这些结构:

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位版本的代码吗?

谢谢!

1 个答案:

答案 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中工作,没有人真正使用它。