1

私が使用するコードとNtQuerySystemInformation、開いているハンドルを照会する関数があります。私はこれらの構造を使用します:NtDuplicateObjectNtQueryObject

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 ビット バージョンを使用する唯一の選択肢はありますか?

ありがとう!

4

1 に答える 1

2

XP の 64 ビット バージョンは、ええと、特別です。Microsoft が Windows の 64 ビット バージョンを適切に取得するための補助輪。これは非常に重要な仕事です。彼らは、Vista でそれを完全に釘付けにしました。これは、すべてを適切に処理した最初の実際の Windows バージョンです。憎しみにもかかわらず。

私のマシンには、NtQuerySystemInformation() の古い MSDN ライブラリ ドキュメントがまだあります。日付は 2008 年ですが、おそらくそれ以前に書かれたものです。これは、プログラマーが米国司法省との和解についてどう考えたかについて、かなり愉快な見方を示しています。もうリンクできないので、コピーして貼り付けます:

乱数ジェネレーターの予測不可能なシードを生成するために使用できる不透明な何かの構造を返します。

あなたが渡したほとんどの SystemInformationClass 引数から何かが得られた場所。それ以来、それはかなりトーンダウンされました. Vista で安定化した ntddi バージョンによって有効になった部分は少なくありません。補助輪はもう必要ありません。XP は Windows のバージョン 5 でした。Vista は Windows バージョン 6.0 であり、非常にメジャーなカーネル リビジョンです。Win7 は 6.1、Win8 は 6.2 です。サービス パックは、実際には、誰かに更新料を支払わせるのに十分な UI ガジェットを備えています。XP で動作するようにする必要はありません。実際に使用する人はいません。

于 2012-12-05T23:35:21.953 に答える