我有一个代码,我使用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位,它工作正常。
是否有可能我只需要改变我使用的结构的一些数据types,所以它可以正常工作? 如果是的话,那么有人可以帮我怎么做? 如果没有,那么我唯一的select是使用我的代码的64位版本?
谢谢!
XP的64位版本是呃,特别的。 微软获得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下工作,没有人使用它。