2012-12-05 122 views
1

我有一个代码,我使用NtQuerySystemInformation,NtDuplicateObjectNtQueryObject函数查询打开的句柄。我用这些结构:如何将32位NTDLL结构转换为64位结构?

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位和64位Windows 7,但在Windows XP 64位它的行为古怪。它不能接收正确的ProcessID。我会得到随机的负数。但是,如果我编译我的代码在64位,它工作正常。

是否有可能我只需要改变我使用的结构的一些数据类型,所以它可以正常工作?如果是的话,那么有人可以帮助我如何做到这一点?如果没有,那么我唯一的选择是使用我的代码的64位版本?

谢谢!

+0

您正在检查返回码,对吧?查看API是否对您通过的长度参数有任何抱怨。 –

+0

你会得到什么负数?如果提前使用已知值填充缓冲区,缓冲区内容是否保留,或者API是否向其写入内容? –

+0

当然,我检查它。长度没有问题。这些函数执行成功,它只是不会返回正确的数据:( – kampi

回答

2

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

我的机器上的NtQuerySystemInformation()的MSDN Library文档仍然存在,它的日期从2008年开始,但可能在此之前写得很好。它揭示了一个关于程序员如何看待与美国司法部进行和解的非常有趣的观点。我再也无法联系,所以我就只是复制/粘贴:

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

东西从你们中的大多数通过SystemInformationClass参数线索。自那时以来,这已经变得不那么光鲜,在功能的文档中没有更多的评论。在ntddi版本稳定在Vista的不小部分,不再需要训练轮子。 XP是Windows的第5版。 Vista是Windows 6.0版本,非常重要的内核版本。 Win7是6.1,Win8是6.2。服务包,确实带有足够的用户界面小工具来让用户支付更新费用。不要打扰使它在XP中工作,没有人真正使用它。

+0

Thanky我知道64位版本的XP特别版,但不幸的是,我必须让它工作,因为我们有一些非常特殊的系统在64位XP上运行,99%很可能我们不得不使用它,因为这些应用程序不能在Windows 7 64位下运行,我不知道他们是否会这样做,但现在,他们不会:( – kampi

+0

联系Microsoft支持以寻求帮助。很快就会发现。 –