不幸的是,没有针对该特定查询的单一 API。您必须直接访问 NT 对象管理器并在其已知句柄列表中找到所需的句柄,然后您可以检索句柄的对象类型(除其他外)。
更新:我忘记了NtQueryObject()。您可以查询 aHANDLE
的ObjectTypeInformation
类,该类返回一个PUBLIC_OBJECT_TYPE_INFORMATION
结构:
typedef struct __PUBLIC_OBJECT_TYPE_INFORMATION {
UNICODE_STRING TypeName;
ULONG Reserved [22]; // reserved for internal use
} PUBLIC_OBJECT_TYPE_INFORMATION, *PPUBLIC_OBJECT_TYPE_INFORMATION;
Run Code Online (Sandbox Code Playgroud)
例如:
std::wstring GetHandleTypeName(HANDLE hHandle)
{
typedef NTSTATUS (NTAPI *NtQueryObjectPtr)(
HANDLE Handle,
OBJECT_INFORMATION_CLASS ObjectInformationClass,
PVOID ObjectInformation,
ULONG ObjectInformationLength,
PULONG ReturnLength);
HMODULE hMod = LoadLibrary(_T("NtDll.dll"));
NtQueryObjectPtr QueryObj = (NtQueryObjectPtr) ::GetProcAddress(hMod, "NtQueryObject");
ASSERT(QueryObj);
ULONG OutSize = 0;
NTSTATUS NtStatus = QueryObj(hHandle, ObjectTypeInformation, NULL, 0, &OutSize);
std::vector<BYTE> buffer(OutSize);
PPUBLIC_OBJECT_TYPE_INFORMATION TypeInfo = (PPUBLIC_OBJECT_TYPE_INFORMATION) &buffer[0];
ULONG InSize = OutSize;
NtStatus = QueryObj(hHandle, ObjectTypeInformation, TypeInfo, InSize, &OutSize);
return std::wstring(TypeInfo->TypeName.Buffer, TypeInfo->TypeName.Length);
}
Run Code Online (Sandbox Code Playgroud)
std::wstring cs = GetHandleTypeName((HANDLE)TheDesiredSocket);
MessageBoxW(cs.c_str());
Run Code Online (Sandbox Code Playgroud)
NtQueryObject()
有关使用套接字的更多信息,请参阅以下内容:
归档时间: |
|
查看次数: |
335 次 |
最近记录: |