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

C 如何将32位NTDLL结构转换为64位结构?,c,windows,64-bit,32-bit,ntdll,C,Windows,64 Bit,32 Bit,Ntdll,我有一个代码,其中我使用NtQuerySystemInformation、NtDuplicateObject和NtQueryObject函数来查询打开的句柄。我使用这些结构: typedef NTSTATUS ( NTAPI *_NtQuerySystemInformation ) ( ULONG SystemInformationClass, PVOID SystemInformation, ULONG SystemInformationLength, PULONG ReturnLength

我有一个代码,其中我使用
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位版本的代码吗


谢谢

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

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

返回可用于为随机数生成器生成不可预测种子的不透明结构


从您传递的大多数SystemInformationClass参数中得到提示。从那时起,这一点变得很缓和,函数的文档中不再有尖锐的注释。ntddi版本在Vista上稳定了不少功能,不再需要训练轮。XP是Windows的第5版。Vista是Windows 6.0版,是非常重要的内核版本。Win7是6.1,Win8是6.2。服务包,真的,有足够的UI小工具让人为更新付费。不要费心让它在XP中工作,实际上没有人使用它。

您正在检查返回码,对吗?查看API是否对您传递的长度参数有任何抱怨。具体得到的负数是多少?如果您提前用已知值填充缓冲区,缓冲区内容是否保留,或者API是否正在向其写入内容?当然,我会检查它。长度没有问题。函数执行成功,但不返回crrect数据:(XP64和Win7-64上的ReturnLength是否相同?@BenVoigt:不,ReturnLength不一样。XP64位上的ReturnLength总是比windows764位大。我忘了告诉你,在XP64位上,只有我的应用程序的PID会返回,每隔一个是0。我不知道我是怎么得到这些负数的。谢谢你的回答!我知道64位版本的XP不是特别的,但不幸的是,我必须让它工作,因为我们有一些非常特殊的系统在64位XP上运行,99%的可能性我们将不得不使用它,因为这些应用程序不在Windows 7 64位下运行。我不知道他们是否会,但现在,他们没有:(请与Microsoft支持部门联系以寻求帮助。不确定是否仍支持XP,您会很快发现。