/third_party/cpp/boost/process/detail/windows/handle_workaround.hpp
https://github.com/VoltDB/voltdb · C++ Header · 262 lines · 194 code · 45 blank · 23 comment · 0 complexity · 7696c47aac79232ff557e88d88bb1379 MD5 · raw file
- // Copyright (c) 2018 Klemens D. Morgenstern
- //
- // Distributed under the Boost Software License, Version 1.0. (See accompanying
- // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
- #ifndef BOOST_PROCESS_DETAIL_WINDOWS_HANDLE_WORKAROUND_HPP_
- #define BOOST_PROCESS_DETAIL_WINDOWS_HANDLE_WORKAROUND_HPP_
- #include <boost/winapi/basic_types.hpp>
- #include <boost/winapi/dll.hpp>
- #include <boost/winapi/access_rights.hpp>
- //#define BOOST_USE_WINDOWS_H 1
- #if defined( BOOST_USE_WINDOWS_H )
- #include <Winternl.h>
- #endif
- namespace boost { namespace process { namespace detail { namespace windows { namespace workaround
- {
- typedef struct _SYSTEM_HANDLE_ENTRY_
- {
- ::boost::winapi::ULONG_ OwnerPid;
- ::boost::winapi::BYTE_ ObjectType;
- ::boost::winapi::BYTE_ HandleFlags;
- ::boost::winapi::USHORT_ HandleValue;
- ::boost::winapi::PVOID_ ObjectPointer;
- ::boost::winapi::ULONG_ AccessMask;
- } SYSTEM_HANDLE_ENTRY_, *PSYSTEM_HANDLE_ENTRY_;
- typedef struct _SYSTEM_HANDLE_INFORMATION_
- {
- ::boost::winapi::ULONG_ Count;
- SYSTEM_HANDLE_ENTRY_ Handle[1];
- } SYSTEM_HANDLE_INFORMATION_, *PSYSTEM_HANDLE_INFORMATION_;
- #if defined( BOOST_USE_WINDOWS_H )
- using UNICODE_STRING_ = ::UNICODE_STRING;
- using GENERIC_MAPPING_ = ::GENERIC_MAPPING;
- using OBJECT_INFORMATION_CLASS_ = ::OBJECT_INFORMATION_CLASS;
- constexpr static OBJECT_INFORMATION_CLASS_ ObjectTypeInformation = ::OBJECT_INFORMATION_CLASS::ObjectTypeInformation;
- 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;
- UCHAR TypeIndex;
- CHAR ReservedByte;
- ULONG PoolType;
- ULONG DefaultPagedPoolCharge;
- ULONG DefaultNonPagedPoolCharge;
- } OBJECT_TYPE_INFORMATION_, *POBJECT_TYPE_INFORMATION_;
- #else
- typedef enum _OBJECT_INFORMATION_CLASS_
- {
- ObjectBasicInformation,
- ObjectNameInformation,
- ObjectTypeInformation,
- ObjectAllInformation,
- ObjectDataInformation
- } OBJECT_INFORMATION_CLASS_, *POBJECT_INFORMATION_CLASS_;
- typedef struct _UNICODE_STRING_ {
- ::boost::winapi::USHORT_ Length;
- ::boost::winapi::USHORT_ MaximumLength;
- ::boost::winapi::LPWSTR_ Buffer;
- } UNICODE_STRING_, *PUNICODE_STRING_;
- typedef struct _GENERIC_MAPPING_ {
- ::boost::winapi::ACCESS_MASK_ GenericRead;
- ::boost::winapi::ACCESS_MASK_ GenericWrite;
- ::boost::winapi::ACCESS_MASK_ GenericExecute;
- ::boost::winapi::ACCESS_MASK_ GenericAll;
- } GENERIC_MAPPING_;
- #endif
- typedef struct _OBJECT_BASIC_INFORMATION {
- ::boost::winapi::ULONG_ Attributes;
- ::boost::winapi::ACCESS_MASK_ GrantedAccess;
- ::boost::winapi::ULONG_ HandleCount;
- ::boost::winapi::ULONG_ PointerCount;
- ::boost::winapi::ULONG_ PagedPoolUsage;
- ::boost::winapi::ULONG_ NonPagedPoolUsage;
- ::boost::winapi::ULONG_ Reserved[3];
- ::boost::winapi::ULONG_ NameInformationLength;
- ::boost::winapi::ULONG_ TypeInformationLength;
- ::boost::winapi::ULONG_ SecurityDescriptorLength;
- ::boost::winapi::LARGE_INTEGER_ CreateTime;
- } OBJECT_BASIC_INFORMATION_, *POBJECT_BASIC_INFORMATION_;
- typedef struct _OBJECT_NAME_INFORMATION {
- UNICODE_STRING_ Name;
- } OBJECT_NAME_INFORMATION_, *POBJECT_NAME_INFORMATION_;
- #if defined( BOOST_USE_WINDOWS_H )
- extern "C"
- {
- using SYSTEM_INFORMATION_CLASS_ = ::SYSTEM_INFORMATION_CLASS;
- constexpr static SYSTEM_INFORMATION_CLASS_ SystemHandleInformation_ = static_cast<SYSTEM_INFORMATION_CLASS_>(16);
- inline ::boost::winapi::NTSTATUS_ nt_system_query_information(
- SYSTEM_INFORMATION_CLASS SystemInformationClass,
- void * SystemInformation,
- ::boost::winapi::ULONG_ SystemInformationLength,
- ::boost::winapi::PULONG_ ReturnLength)
- {
- return ::NtQuerySystemInformation(SystemInformationClass, SystemInformation, SystemInformationLength, ReturnLength);
- }
- inline ::boost::winapi::NTSTATUS_ nt_query_object(
- ::boost::winapi::HANDLE_ Handle,
- OBJECT_INFORMATION_CLASS_ ObjectInformationClass,
- ::boost::winapi::PVOID_ ObjectInformation,
- ::boost::winapi::ULONG_ ObjectInformationLength,
- ::boost::winapi::PULONG_ ReturnLength
- )
- {
- return ::NtQueryObject(Handle, ObjectInformationClass, ObjectInformation, ObjectInformationLength, ReturnLength);
- }
- }
- #else
- //this import workaround is to keep it a header-only library. and enums cannot be imported from the winapi.
- extern "C"
- {
- typedef enum _SYSTEM_INFORMATION_CLASS_
- {
- SystemBasicInformation_ = 0,
- SystemProcessorInformation_ = 1,
- SystemPerformanceInformation_ = 2,
- SystemTimeOfDayInformation_ = 3,
- SystemProcessInformation_ = 5,
- SystemProcessorPerformanceInformation_ = 8,
- SystemHandleInformation_ = 16,
- SystemPagefileInformation_ = 18,
- SystemInterruptInformation_ = 23,
- SystemExceptionInformation_ = 33,
- SystemRegistryQuotaInformation_ = 37,
- SystemLookasideInformation_ = 45
- } SYSTEM_INFORMATION_CLASS_;
- typedef struct _OBJECT_TYPE_INFORMATION_ {
- UNICODE_STRING_ TypeName;
- ::boost::winapi::ULONG_ TotalNumberOfObjects;
- ::boost::winapi::ULONG_ TotalNumberOfHandles;
- ::boost::winapi::ULONG_ TotalPagedPoolUsage;
- ::boost::winapi::ULONG_ TotalNonPagedPoolUsage;
- ::boost::winapi::ULONG_ TotalNamePoolUsage;
- ::boost::winapi::ULONG_ TotalHandleTableUsage;
- ::boost::winapi::ULONG_ HighWaterNumberOfObjects;
- ::boost::winapi::ULONG_ HighWaterNumberOfHandles;
- ::boost::winapi::ULONG_ HighWaterPagedPoolUsage;
- ::boost::winapi::ULONG_ HighWaterNonPagedPoolUsage;
- ::boost::winapi::ULONG_ HighWaterNamePoolUsage;
- ::boost::winapi::ULONG_ HighWaterHandleTableUsage;
- ::boost::winapi::ULONG_ InvalidAttributes;
- GENERIC_MAPPING_ GenericMapping;
- ::boost::winapi::ULONG_ ValidAccessMask;
- ::boost::winapi::BOOLEAN_ SecurityRequired;
- ::boost::winapi::BOOLEAN_ MaintainHandleCount;
- ::boost::winapi::UCHAR_ TypeIndex;
- ::boost::winapi::CHAR_ ReservedByte;
- ::boost::winapi::ULONG_ PoolType;
- ::boost::winapi::ULONG_ DefaultPagedPoolCharge;
- ::boost::winapi::ULONG_ DefaultNonPagedPoolCharge;
- } OBJECT_TYPE_INFORMATION_, *POBJECT_TYPE_INFORMATION_;
- /*
- __kernel_entry NTSTATUS NtQuerySystemInformation(
- IN SYSTEM_INFORMATION_CLASS SystemInformationClass,
- OUT PVOID SystemInformation,
- IN ULONG SystemInformationLength,
- OUT PULONG ReturnLength
- );
- */
- typedef ::boost::winapi::NTSTATUS_ (__kernel_entry *nt_system_query_information_p )(
- SYSTEM_INFORMATION_CLASS_,
- void *,
- ::boost::winapi::ULONG_,
- ::boost::winapi::PULONG_);
- /*
- __kernel_entry NTSYSCALLAPI NTSTATUS NtQueryObject(
- HANDLE Handle,
- OBJECT_INFORMATION_CLASS ObjectInformationClass,
- PVOID ObjectInformation,
- ULONG ObjectInformationLength,
- PULONG ReturnLength
- );
- */
- typedef ::boost::winapi::NTSTATUS_ (__kernel_entry *nt_query_object_p )(
- ::boost::winapi::HANDLE_,
- OBJECT_INFORMATION_CLASS_,
- void *,
- ::boost::winapi::ULONG_,
- ::boost::winapi::PULONG_);
- }
- inline ::boost::winapi::NTSTATUS_ nt_system_query_information(
- SYSTEM_INFORMATION_CLASS_ SystemInformationClass,
- void *SystemInformation,
- ::boost::winapi::ULONG_ SystemInformationLength,
- ::boost::winapi::PULONG_ ReturnLength)
- {
- static ::boost::winapi::HMODULE_ h = ::boost::winapi::get_module_handle(L"Ntdll.dll");
- static nt_system_query_information_p f = reinterpret_cast<nt_system_query_information_p>(::boost::winapi::get_proc_address(h, "NtQuerySystemInformation"));
- return (*f)(SystemInformationClass, SystemInformation, SystemInformationLength, ReturnLength);
- }
- inline ::boost::winapi::BOOL_ nt_query_object(
- ::boost::winapi::HANDLE_ Handle,
- OBJECT_INFORMATION_CLASS_ ObjectInformationClass,
- void *ObjectInformation,
- ::boost::winapi::ULONG_ ObjectInformationLength,
- ::boost::winapi::PULONG_ ReturnLength)
- {
- static ::boost::winapi::HMODULE_ h = ::boost::winapi::get_module_handle(L"Ntdll.dll");
- static nt_query_object_p f = reinterpret_cast<nt_query_object_p>(::boost::winapi::get_proc_address(h, "NtQueryObject"));
- return (*f)(Handle, ObjectInformationClass, ObjectInformation, ObjectInformationLength, ReturnLength);
- }
- #endif
- }}}}}
- #endif /* BOOST_PROCESS_DETAIL_WINDOWS_JOB_WORKAROUND_HPP_ */