2016-08-23 3 views
0

開いているファイルハンドルを一覧表示するプログラムを作成しています。私は実際にはあまりにも多くの結果を得ています。私のリストにはウイルススキャナのようなものが含まれています。私は、私が望むように見えないオブジェクトタイプ43の束を得ています。これらの値のリストはどこにありますか?SYSTEM_HANDLE_ENTRY.ObjectTypeの可能な値のリストはありますか?

+1

を取得しますMSFTによって。あなたのオプションは、型情報のためにNt/ZwQueryObject()を呼び出すか、列挙について他の人の前提を信用することです。 Process Hackerプロジェクトのソースコードを見てください。 –

答えて

2

NtQueryObjectには、ObjectTypesInformation情報クラスを指定して電話をかけることができます。これにより、現在システムに登録されているすべてのオブジェクトタイプに関する情報が得られます。対応するオブジェクト型に関する情報を取得するには、返された配列のインデックスとしてSYSTEM_HANDLE_ENTRY.ObjectTypeを使用します。または、NtQueryObjectObjectTypeInformationを使用して、指定されたオブジェクト(ハンドルで指定)に関する型情報を取得できます。

このコードは、すべての型オブジェクトに関する情報を取得する必要があります。

typedef enum _OBJECT_INFORMATION_CLASS { 
    ObjectBasicInformation, 
    ObjectNameInformation, 
    ObjectTypeInformation, 
    ObjectTypesInformation, 
    ObjectHandleFlagInformation, 
    ObjectSessionInformation, 
} OBJECT_INFORMATION_CLASS; 

typedef struct _OBJECT_TYPE_INFORMATION { 
    UNICODE_STRING TypeName; 
    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 ValidAccessMask; 
    BOOLEAN SecurityRequired; 
    BOOLEAN MaintainHandleCount; 
    ULONG PoolType; 
    ULONG DefaultPagedPoolCharge; 
    ULONG DefaultNonPagedPoolCharge; 
} OBJECT_TYPE_INFORMATION, *POBJECT_TYPE_INFORMATION; 

typedef struct _OBJECT_TYPES_INFORMATION { 
    LONG NumberOfTypes; 
// OBJECT_TYPE_INFORMATION TypeInformation [1]; 
} OBJECT_TYPES_INFORMATION, *POBJECT_TYPES_INFORMATION; 

NTSTATUS QueryObjectTypesInfo(POBJECT_TYPES_INFORMATION *TypesInfo) 
{ 
    ULONG StartBufferLength = 28; 
    ULONG BufferLength = 0; 
    NTSTATUS status = 0xC0000001; 

    status = STATUS_SUCCESS; 
    *TypesInfo = (POBJECT_TYPES_INFORMATION)malloc(StartBufferLength); 
    if (*TypesInfo != NULL) { 
    status = NtQueryObject(NULL, ObjectTypesInformation, TypesInfo, StartBufferLength, &BufferLength); 
    if (status == STATUS_INFO_LENGTH_MISMATCH) { 
     *TypesInfo = NULL; 
     while (status == STATUS_INFO_LENGTH_MISMATCH) { 
     if (*TypesInfo != NULL) 
      free(*TypesInfo); 

     *TypesInfo = (POBJECT_TYPES_INFORMATION)malloc(BufferLength); 
     if (*TypesInfo != NULL) 
      status = NtQueryObject(NULL, ObjectTypesInformation, *TypesInfo, BufferLength, &BufferLength); 
     else status = STATUS_INSUFFICIENT_RESOURCES; 
     } 

     if (!NT_SUCCESS(status)) { 
     if (*TypesInfo != NULL) { 
      free(*TypesInfo); 
      *TypesInfo = NULL; 
     } 
     } 
    } 
    } else status = STATUS_INSUFFICIENT_RESOURCES; 

    return status; 
} 

上記のコメントに記載されているとおり、このようなものは全く文書化されていません。しかし、上記のコード(若干の変更を加えて、例えば、NtQueryObjectルーチンのアドレスを取得し、いくつかのNTSTATUS contantsを定義する必要があります)は、64ビット版Windows 8.1で動作します。完全なコードについては

(それはかなり古いとチェコにコメントしている)、私(チェコ)のウェブサイトからこのプロジェクトをダウンロードします。 https://jadro-windows.cz/download/ntqueryobject.zip

使用qo.exe --list-typesコマンドこれらは文書化されていない種類の情報

関連する問題