123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264 |
- // 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/process/v1/detail/config.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 { BOOST_PROCESS_V1_INLINE namespace v1 { 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_;
- /*
- NTSTATUS NtQuerySystemInformation(
- IN SYSTEM_INFORMATION_CLASS SystemInformationClass,
- OUT PVOID SystemInformation,
- IN ULONG SystemInformationLength,
- OUT PULONG ReturnLength
- );
- */
- typedef ::boost::winapi::NTSTATUS_ (*nt_system_query_information_p )(
- SYSTEM_INFORMATION_CLASS_,
- void *,
- ::boost::winapi::ULONG_,
- ::boost::winapi::PULONG_);
- /*
- NTSYSCALLAPI NTSTATUS NtQueryObject(
- HANDLE Handle,
- OBJECT_INFORMATION_CLASS ObjectInformationClass,
- PVOID ObjectInformation,
- ULONG ObjectInformationLength,
- PULONG ReturnLength
- );
- */
- typedef ::boost::winapi::NTSTATUS_ (*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_ */
|