Chris@16: ////////////////////////////////////////////////////////////////////////////// Chris@16: // Chris@16: // (C) Copyright Ion Gaztanaga 2005-2012. Distributed under the Boost Chris@16: // Software License, Version 1.0. (See accompanying file Chris@16: // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) Chris@16: // Chris@16: // See http://www.boost.org/libs/interprocess for documentation. Chris@16: // Chris@16: ////////////////////////////////////////////////////////////////////////////// Chris@16: Chris@101: #ifndef BOOST_INTERPROCESS_WIN32_API_HPP Chris@101: #define BOOST_INTERPROCESS_WIN32_API_HPP Chris@101: Chris@101: #ifndef BOOST_CONFIG_HPP Chris@101: # include Chris@101: #endif Chris@101: # Chris@101: #if defined(BOOST_HAS_PRAGMA_ONCE) Chris@101: # pragma once Chris@101: #endif Chris@16: Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: Chris@101: #ifdef BOOST_USE_WINDOWS_H Chris@101: #include Chris@101: #include Chris@101: #include Chris@101: #include Chris@101: #endif Chris@16: Chris@101: #if defined(_MSC_VER) Chris@16: # pragma once Chris@16: # pragma comment( lib, "Advapi32.lib" ) Chris@16: # pragma comment( lib, "oleaut32.lib" ) Chris@16: # pragma comment( lib, "Ole32.lib" ) Chris@16: # pragma comment( lib, "Psapi.lib" ) Chris@101: # pragma comment( lib, "Shell32.lib" ) //SHGetSpecialFolderPathA Chris@16: #endif Chris@16: Chris@101: #if defined (BOOST_INTERPROCESS_WINDOWS) Chris@16: # include Chris@16: # include Chris@16: #else Chris@16: # error "This file can only be included in Windows OS" Chris@16: #endif Chris@16: Chris@101: ////////////////////////////////////////////////////////////////////////////// Chris@101: // Chris@101: // Declaration of Windows structures or typedefs if BOOST_USE_WINDOWS_H is used Chris@101: // Chris@101: ////////////////////////////////////////////////////////////////////////////// Chris@16: Chris@101: //Ignore -pedantic errors here (anonymous structs, etc.) Chris@101: #if defined(BOOST_GCC) && (BOOST_GCC >= 40600) Chris@101: # pragma GCC diagnostic push Chris@101: # pragma GCC diagnostic ignored "-pedantic" Chris@101: #endif Chris@101: Chris@101: namespace boost { Chris@101: namespace interprocess { Chris@101: namespace winapi { Chris@101: Chris@101: //Own defines Chris@101: static const unsigned long MaxPath = 260; Chris@101: Chris@101: #ifndef BOOST_USE_WINDOWS_H Chris@101: Chris@101: struct GUID_BIPC Chris@101: { Chris@101: unsigned long Data1; Chris@101: unsigned short Data2; Chris@101: unsigned short Data3; Chris@101: unsigned char Data4[8]; Chris@101: }; Chris@101: Chris@101: #if defined(_MSC_VER) Chris@101: #pragma warning (push) Chris@101: #pragma warning (disable : 4201) // nonstandard extension used Chris@101: #endif Chris@101: Chris@101: struct decimal Chris@101: { Chris@101: unsigned short wReserved; Chris@101: union { Chris@101: struct { Chris@101: unsigned char scale; Chris@101: unsigned char sign; Chris@101: }; Chris@101: unsigned short signscale; Chris@101: }; Chris@101: unsigned long Hi32; Chris@101: union { Chris@101: struct { Chris@101: unsigned long Lo32; Chris@101: unsigned long Mid32; Chris@101: }; Chris@101: ::boost::ulong_long_type Lo64; Chris@101: }; Chris@101: }; Chris@101: Chris@101: typedef unsigned short *bstr; Chris@101: Chris@101: Chris@101: struct wchar_variant Chris@101: { Chris@101: union Chris@101: { Chris@101: struct Chris@101: { Chris@101: unsigned short vt; Chris@101: unsigned short wReserved1; Chris@101: unsigned short wReserved2; Chris@101: unsigned short wReserved3; Chris@101: union Chris@101: { Chris@101: bstr bstrVal; Chris@101: struct Chris@101: { Chris@101: void* pvRecord; Chris@101: void* pRecInfo; Chris@101: }; Chris@101: }; Chris@101: }; Chris@101: decimal decVal; Chris@101: }; Chris@101: }; Chris@101: Chris@101: #if defined(_MSC_VER) Chris@101: #pragma warning (pop) Chris@101: #endif Chris@101: Chris@101: Chris@101: Chris@101: Chris@101: Chris@101: Chris@101: Chris@101: Chris@101: Chris@101: Chris@101: Chris@101: Chris@101: Chris@101: Chris@101: Chris@101: Chris@101: Chris@101: struct IUnknown_BIPC Chris@101: { Chris@101: public: Chris@101: virtual long __stdcall QueryInterface( Chris@101: const GUID_BIPC &riid, // [in] Chris@101: void **ppvObject) = 0; // [iid_is][out] Chris@101: Chris@101: virtual unsigned long __stdcall AddRef (void) = 0; Chris@101: virtual unsigned long __stdcall Release(void) = 0; Chris@101: }; Chris@101: Chris@101: struct IWbemClassObject_BIPC : public IUnknown_BIPC Chris@101: { Chris@101: public: Chris@101: virtual long __stdcall GetQualifierSet( Chris@101: /* [out] */ void **ppQualSet) = 0; Chris@101: Chris@101: virtual long __stdcall Get( Chris@101: /* [string][in] */ const bstr wszName, Chris@101: /* [in] */ long lFlags, Chris@101: /* [unique][in][out] */ wchar_variant *pVal, Chris@101: /* [unique][in][out] */ long *pType, Chris@101: /* [unique][in][out] */ long *plFlavor) = 0; Chris@101: Chris@101: virtual long __stdcall Put( Chris@101: /* [string][in] */ const bstr wszName, Chris@101: /* [in] */ long lFlags, Chris@101: /* [in] */ wchar_variant *pVal, Chris@101: /* [in] */ long Type) = 0; Chris@101: Chris@101: virtual long __stdcall Delete( Chris@101: /* [string][in] */ const bstr wszName) = 0; Chris@101: Chris@101: virtual long __stdcall GetNames( Chris@101: /* [string][in] */ const bstr wszQualifierName, Chris@101: /* [in] */ long lFlags, Chris@101: /* [in] */ wchar_variant *pQualifierVal, Chris@101: /* [out] */ void * *pNames) = 0; Chris@101: Chris@101: virtual long __stdcall BeginEnumeration( Chris@101: /* [in] */ long lEnumFlags) = 0; Chris@101: Chris@101: virtual long __stdcall Next( Chris@101: /* [in] */ long lFlags, Chris@101: /* [unique][in][out] */ bstr *strName, Chris@101: /* [unique][in][out] */ wchar_variant *pVal, Chris@101: /* [unique][in][out] */ long *pType, Chris@101: /* [unique][in][out] */ long *plFlavor) = 0; Chris@101: Chris@101: virtual long __stdcall EndEnumeration( void) = 0; Chris@101: Chris@101: virtual long __stdcall GetPropertyQualifierSet( Chris@101: /* [string][in] */ const bstr wszProperty, Chris@101: /* [out] */ void **ppQualSet) = 0; Chris@101: Chris@101: virtual long __stdcall Clone( Chris@101: /* [out] */ IWbemClassObject_BIPC **ppCopy) = 0; Chris@101: Chris@101: virtual long __stdcall GetObjectText( Chris@101: /* [in] */ long lFlags, Chris@101: /* [out] */ bstr *pstrObjectText) = 0; Chris@101: Chris@101: virtual long __stdcall SpawnDerivedClass( Chris@101: /* [in] */ long lFlags, Chris@101: /* [out] */ IWbemClassObject_BIPC **ppNewClass) = 0; Chris@101: Chris@101: virtual long __stdcall SpawnInstance( Chris@101: /* [in] */ long lFlags, Chris@101: /* [out] */ IWbemClassObject_BIPC **ppNewInstance) = 0; Chris@101: Chris@101: virtual long __stdcall CompareTo( Chris@101: /* [in] */ long lFlags, Chris@101: /* [in] */ IWbemClassObject_BIPC *pCompareTo) = 0; Chris@101: Chris@101: virtual long __stdcall GetPropertyOrigin( Chris@101: /* [string][in] */ const bstr wszName, Chris@101: /* [out] */ bstr *pstrClassName) = 0; Chris@101: Chris@101: virtual long __stdcall InheritsFrom( Chris@101: /* [in] */ const bstr strAncestor) = 0; Chris@101: Chris@101: virtual long __stdcall GetMethod( Chris@101: /* [string][in] */ const bstr wszName, Chris@101: /* [in] */ long lFlags, Chris@101: /* [out] */ IWbemClassObject_BIPC **ppInSignature, Chris@101: /* [out] */ IWbemClassObject_BIPC **ppOutSignature) = 0; Chris@101: Chris@101: virtual long __stdcall PutMethod( Chris@101: /* [string][in] */ const bstr wszName, Chris@101: /* [in] */ long lFlags, Chris@101: /* [in] */ IWbemClassObject_BIPC *pInSignature, Chris@101: /* [in] */ IWbemClassObject_BIPC *pOutSignature) = 0; Chris@101: Chris@101: virtual long __stdcall DeleteMethod( Chris@101: /* [string][in] */ const bstr wszName) = 0; Chris@101: Chris@101: virtual long __stdcall BeginMethodEnumeration( Chris@101: /* [in] */ long lEnumFlags) = 0; Chris@101: Chris@101: virtual long __stdcall NextMethod( Chris@101: /* [in] */ long lFlags, Chris@101: /* [unique][in][out] */ bstr *pstrName, Chris@101: /* [unique][in][out] */ IWbemClassObject_BIPC **ppInSignature, Chris@101: /* [unique][in][out] */ IWbemClassObject_BIPC **ppOutSignature) = 0; Chris@101: Chris@101: virtual long __stdcall EndMethodEnumeration( void) = 0; Chris@101: Chris@101: virtual long __stdcall GetMethodQualifierSet( Chris@101: /* [string][in] */ const bstr wszMethod, Chris@101: /* [out] */ void **ppQualSet) = 0; Chris@101: Chris@101: virtual long __stdcall GetMethodOrigin( Chris@101: /* [string][in] */ const bstr wszMethodName, Chris@101: /* [out] */ bstr *pstrClassName) = 0; Chris@101: Chris@101: }; Chris@101: Chris@101: struct IWbemContext_BIPC : public IUnknown_BIPC Chris@101: { Chris@101: public: Chris@101: virtual long __stdcall Clone( Chris@101: /* [out] */ IWbemContext_BIPC **ppNewCopy) = 0; Chris@101: Chris@101: virtual long __stdcall GetNames( Chris@101: /* [in] */ long lFlags, Chris@101: /* [out] */ void * *pNames) = 0; Chris@101: Chris@101: virtual long __stdcall BeginEnumeration( Chris@101: /* [in] */ long lFlags) = 0; Chris@101: Chris@101: virtual long __stdcall Next( Chris@101: /* [in] */ long lFlags, Chris@101: /* [out] */ bstr *pstrName, Chris@101: /* [out] */ wchar_variant *pValue) = 0; Chris@101: Chris@101: virtual long __stdcall EndEnumeration( void) = 0; Chris@101: Chris@101: virtual long __stdcall SetValue( Chris@101: /* [string][in] */ const bstr wszName, Chris@101: /* [in] */ long lFlags, Chris@101: /* [in] */ wchar_variant *pValue) = 0; Chris@101: Chris@101: virtual long __stdcall GetValue( Chris@101: /* [string][in] */ const bstr wszName, Chris@101: /* [in] */ long lFlags, Chris@101: /* [out] */ wchar_variant *pValue) = 0; Chris@101: Chris@101: virtual long __stdcall DeleteValue( Chris@101: /* [string][in] */ const bstr wszName, Chris@101: /* [in] */ long lFlags) = 0; Chris@101: Chris@101: virtual long __stdcall DeleteAll( void) = 0; Chris@101: Chris@101: }; Chris@101: Chris@101: Chris@101: struct IEnumWbemClassObject_BIPC : public IUnknown_BIPC Chris@101: { Chris@101: public: Chris@101: virtual long __stdcall Reset( void) = 0; Chris@101: Chris@101: virtual long __stdcall Next( Chris@101: /* [in] */ long lTimeout, Chris@101: /* [in] */ unsigned long uCount, Chris@101: /* [length_is][size_is][out] */ IWbemClassObject_BIPC **apObjects, Chris@101: /* [out] */ unsigned long *puReturned) = 0; Chris@101: Chris@101: virtual long __stdcall NextAsync( Chris@101: /* [in] */ unsigned long uCount, Chris@101: /* [in] */ void *pSink) = 0; Chris@101: Chris@101: virtual long __stdcall Clone( Chris@101: /* [out] */ void **ppEnum) = 0; Chris@101: Chris@101: virtual long __stdcall Skip( Chris@101: /* [in] */ long lTimeout, Chris@101: /* [in] */ unsigned long nCount) = 0; Chris@101: Chris@101: }; Chris@101: Chris@101: struct IWbemServices_BIPC : public IUnknown_BIPC Chris@101: { Chris@101: public: Chris@101: virtual long __stdcall OpenNamespace( Chris@101: /* [in] */ const bstr strNamespace, Chris@101: /* [in] */ long lFlags, Chris@101: /* [in] */ void *pCtx, Chris@101: /* [unique][in][out] */ void **ppWorkingNamespace, Chris@101: /* [unique][in][out] */ void **ppResult) = 0; Chris@101: Chris@101: virtual long __stdcall CancelAsyncCall( Chris@101: /* [in] */ void *pSink) = 0; Chris@101: Chris@101: virtual long __stdcall QueryObjectSink( Chris@101: /* [in] */ long lFlags, Chris@101: /* [out] */ void **ppResponseHandler) = 0; Chris@101: Chris@101: virtual long __stdcall GetObject( Chris@101: /* [in] */ const bstr strObjectPath, Chris@101: /* [in] */ long lFlags, Chris@101: /* [in] */ void *pCtx, Chris@101: /* [unique][in][out] */ void **ppObject, Chris@101: /* [unique][in][out] */ void **ppCallResult) = 0; Chris@101: Chris@101: virtual long __stdcall GetObjectAsync( Chris@101: /* [in] */ const bstr strObjectPath, Chris@101: /* [in] */ long lFlags, Chris@101: /* [in] */ void *pCtx, Chris@101: /* [in] */ void *pResponseHandler) = 0; Chris@101: Chris@101: virtual long __stdcall PutClass( Chris@101: /* [in] */ IWbemClassObject_BIPC *pObject, Chris@101: /* [in] */ long lFlags, Chris@101: /* [in] */ void *pCtx, Chris@101: /* [unique][in][out] */ void **ppCallResult) = 0; Chris@101: Chris@101: virtual long __stdcall PutClassAsync( Chris@101: /* [in] */ IWbemClassObject_BIPC *pObject, Chris@101: /* [in] */ long lFlags, Chris@101: /* [in] */ void *pCtx, Chris@101: /* [in] */ void *pResponseHandler) = 0; Chris@101: Chris@101: virtual long __stdcall DeleteClass( Chris@101: /* [in] */ const bstr strClass, Chris@101: /* [in] */ long lFlags, Chris@101: /* [in] */ void *pCtx, Chris@101: /* [unique][in][out] */ void **ppCallResult) = 0; Chris@101: Chris@101: virtual long __stdcall DeleteClassAsync( Chris@101: /* [in] */ const bstr strClass, Chris@101: /* [in] */ long lFlags, Chris@101: /* [in] */ void *pCtx, Chris@101: /* [in] */ void *pResponseHandler) = 0; Chris@101: Chris@101: virtual long __stdcall CreateClassEnum( Chris@101: /* [in] */ const bstr strSuperclass, Chris@101: /* [in] */ long lFlags, Chris@101: /* [in] */ void *pCtx, Chris@101: /* [out] */ void **ppEnum) = 0; Chris@101: Chris@101: virtual long __stdcall CreateClassEnumAsync( Chris@101: /* [in] */ const bstr strSuperclass, Chris@101: /* [in] */ long lFlags, Chris@101: /* [in] */ void *pCtx, Chris@101: /* [in] */ void *pResponseHandler) = 0; Chris@101: Chris@101: virtual long __stdcall PutInstance( Chris@101: /* [in] */ void *pInst, Chris@101: /* [in] */ long lFlags, Chris@101: /* [in] */ void *pCtx, Chris@101: /* [unique][in][out] */ void **ppCallResult) = 0; Chris@101: Chris@101: virtual long __stdcall PutInstanceAsync( Chris@101: /* [in] */ void *pInst, Chris@101: /* [in] */ long lFlags, Chris@101: /* [in] */ void *pCtx, Chris@101: /* [in] */ void *pResponseHandler) = 0; Chris@101: Chris@101: virtual long __stdcall DeleteInstance( Chris@101: /* [in] */ const bstr strObjectPath, Chris@101: /* [in] */ long lFlags, Chris@101: /* [in] */ void *pCtx, Chris@101: /* [unique][in][out] */ void **ppCallResult) = 0; Chris@101: Chris@101: virtual long __stdcall DeleteInstanceAsync( Chris@101: /* [in] */ const bstr strObjectPath, Chris@101: /* [in] */ long lFlags, Chris@101: /* [in] */ void *pCtx, Chris@101: /* [in] */ void *pResponseHandler) = 0; Chris@101: Chris@101: virtual long __stdcall CreateInstanceEnum( Chris@101: /* [in] */ const bstr strFilter, Chris@101: /* [in] */ long lFlags, Chris@101: /* [in] */ void *pCtx, Chris@101: /* [out] */ void **ppEnum) = 0; Chris@101: Chris@101: virtual long __stdcall CreateInstanceEnumAsync( Chris@101: /* [in] */ const bstr strFilter, Chris@101: /* [in] */ long lFlags, Chris@101: /* [in] */ void *pCtx, Chris@101: /* [in] */ void *pResponseHandler) = 0; Chris@101: Chris@101: virtual long __stdcall ExecQuery( Chris@101: /* [in] */ const bstr strQueryLanguage, Chris@101: /* [in] */ const bstr strQuery, Chris@101: /* [in] */ long lFlags, Chris@101: /* [in] */ IWbemContext_BIPC *pCtx, Chris@101: /* [out] */ IEnumWbemClassObject_BIPC **ppEnum) = 0; Chris@101: Chris@101: virtual long __stdcall ExecQueryAsync( Chris@101: /* [in] */ const bstr strQueryLanguage, Chris@101: /* [in] */ const bstr strQuery, Chris@101: /* [in] */ long lFlags, Chris@101: /* [in] */ IWbemContext_BIPC *pCtx, Chris@101: /* [in] */ void *pResponseHandler) = 0; Chris@101: Chris@101: virtual long __stdcall ExecNotificationQuery( Chris@101: /* [in] */ const bstr strQueryLanguage, Chris@101: /* [in] */ const bstr strQuery, Chris@101: /* [in] */ long lFlags, Chris@101: /* [in] */ IWbemContext_BIPC *pCtx, Chris@101: /* [out] */ void **ppEnum) = 0; Chris@101: Chris@101: virtual long __stdcall ExecNotificationQueryAsync( Chris@101: /* [in] */ const bstr strQueryLanguage, Chris@101: /* [in] */ const bstr strQuery, Chris@101: /* [in] */ long lFlags, Chris@101: /* [in] */ IWbemContext_BIPC *pCtx, Chris@101: /* [in] */ void *pResponseHandler) = 0; Chris@101: Chris@101: virtual long __stdcall ExecMethod( Chris@101: /* [in] */ const bstr strObjectPath, Chris@101: /* [in] */ const bstr strMethodName, Chris@101: /* [in] */ long lFlags, Chris@101: /* [in] */ IWbemContext_BIPC *pCtx, Chris@101: /* [in] */ IWbemClassObject_BIPC *pInParams, Chris@101: /* [unique][in][out] */ IWbemClassObject_BIPC **ppOutParams, Chris@101: /* [unique][in][out] */ void **ppCallResult) = 0; Chris@101: Chris@101: virtual long __stdcall ExecMethodAsync( Chris@101: /* [in] */ const bstr strObjectPath, Chris@101: /* [in] */ const bstr strMethodName, Chris@101: /* [in] */ long lFlags, Chris@101: /* [in] */ IWbemContext_BIPC *pCtx, Chris@101: /* [in] */ IWbemClassObject_BIPC *pInParams, Chris@101: /* [in] */ void *pResponseHandler) = 0; Chris@101: Chris@101: }; Chris@101: Chris@101: struct IWbemLocator_BIPC : public IUnknown_BIPC Chris@101: { Chris@101: public: Chris@101: virtual long __stdcall ConnectServer( Chris@101: /* [in] */ const bstr strNetworkResource, Chris@101: /* [in] */ const bstr strUser, Chris@101: /* [in] */ const bstr strPassword, Chris@101: /* [in] */ const bstr strLocale, Chris@101: /* [in] */ long lSecurityFlags, Chris@101: /* [in] */ const bstr strAuthority, Chris@101: /* [in] */ void *pCtx, Chris@101: /* [out] */ IWbemServices_BIPC **ppNamespace) = 0; Chris@101: Chris@101: }; Chris@101: Chris@101: struct interprocess_overlapped Chris@101: { Chris@101: unsigned long *internal; Chris@101: unsigned long *internal_high; Chris@101: union { Chris@101: struct { Chris@101: unsigned long offset; Chris@101: unsigned long offset_high; Chris@101: }dummy; Chris@101: void *pointer; Chris@101: }; Chris@101: Chris@101: void *h_event; Chris@101: }; Chris@101: Chris@101: Chris@101: struct interprocess_filetime Chris@101: { Chris@101: unsigned long dwLowDateTime; Chris@101: unsigned long dwHighDateTime; Chris@101: }; Chris@101: Chris@101: struct win32_find_data Chris@101: { Chris@101: unsigned long dwFileAttributes; Chris@101: interprocess_filetime ftCreationTime; Chris@101: interprocess_filetime ftLastAccessTime; Chris@101: interprocess_filetime ftLastWriteTime; Chris@101: unsigned long nFileSizeHigh; Chris@101: unsigned long nFileSizeLow; Chris@101: unsigned long dwReserved0; Chris@101: unsigned long dwReserved1; Chris@101: char cFileName[MaxPath]; Chris@101: char cAlternateFileName[14]; Chris@101: }; Chris@101: Chris@101: struct interprocess_security_attributes Chris@101: { Chris@101: unsigned long nLength; Chris@101: void *lpSecurityDescriptor; Chris@101: int bInheritHandle; Chris@101: }; Chris@101: Chris@101: struct system_info { Chris@101: union { Chris@101: unsigned long dwOemId; // Obsolete field...do not use Chris@101: struct { Chris@101: unsigned short wProcessorArchitecture; Chris@101: unsigned short wReserved; Chris@101: } dummy; Chris@101: }; Chris@101: unsigned long dwPageSize; Chris@101: void * lpMinimumApplicationAddress; Chris@101: void * lpMaximumApplicationAddress; Chris@101: unsigned long * dwActiveProcessorMask; Chris@101: unsigned long dwNumberOfProcessors; Chris@101: unsigned long dwProcessorType; Chris@101: unsigned long dwAllocationGranularity; Chris@101: unsigned short wProcessorLevel; Chris@101: unsigned short wProcessorRevision; Chris@101: }; Chris@101: Chris@101: struct interprocess_acl Chris@101: { Chris@101: unsigned char AclRevision; Chris@101: unsigned char Sbz1; Chris@101: unsigned short AclSize; Chris@101: unsigned short AceCount; Chris@101: unsigned short Sbz2; Chris@101: }; Chris@101: Chris@101: struct interprocess_security_descriptor Chris@101: { Chris@101: unsigned char Revision; Chris@101: unsigned char Sbz1; Chris@101: unsigned short Control; Chris@101: void *Owner; Chris@101: void *Group; Chris@101: interprocess_acl *Sacl; Chris@101: interprocess_acl *Dacl; Chris@101: }; Chris@101: Chris@101: struct interprocess_by_handle_file_information Chris@101: { Chris@101: unsigned long dwFileAttributes; Chris@101: interprocess_filetime ftCreationTime; Chris@101: interprocess_filetime ftLastAccessTime; Chris@101: interprocess_filetime ftLastWriteTime; Chris@101: unsigned long dwVolumeSerialNumber; Chris@101: unsigned long nFileSizeHigh; Chris@101: unsigned long nFileSizeLow; Chris@101: unsigned long nNumberOfLinks; Chris@101: unsigned long nFileIndexHigh; Chris@101: unsigned long nFileIndexLow; Chris@101: }; Chris@101: Chris@101: struct interprocess_eventlogrecord Chris@101: { Chris@101: unsigned long Length; // Length of full record Chris@101: unsigned long Reserved; // Used by the service Chris@101: unsigned long RecordNumber; // Absolute record number Chris@101: unsigned long TimeGenerated; // Seconds since 1-1-1970 Chris@101: unsigned long TimeWritten; // Seconds since 1-1-1970 Chris@101: unsigned long EventID; Chris@101: unsigned short EventType; Chris@101: unsigned short NumStrings; Chris@101: unsigned short EventCategory; Chris@101: unsigned short ReservedFlags; // For use with paired events (auditing) Chris@101: unsigned long ClosingRecordNumber; // For use with paired events (auditing) Chris@101: unsigned long StringOffset; // Offset from beginning of record Chris@101: unsigned long UserSidLength; Chris@101: unsigned long UserSidOffset; Chris@101: unsigned long DataLength; Chris@101: unsigned long DataOffset; // Offset from beginning of record Chris@101: // Chris@101: // Then follow: Chris@101: // Chris@101: // wchar_t SourceName[] Chris@101: // wchar_t Computername[] Chris@101: // SID UserSid Chris@101: // wchar_t Strings[] Chris@101: // BYTE Data[] Chris@101: // CHAR Pad[] Chris@101: // unsigned long Length; Chris@101: // Chris@101: }; Chris@101: Chris@101: union large_integer Chris@101: { Chris@101: __int64 QuadPart; Chris@101: }; Chris@101: Chris@101: struct hinstance_struct { int unused; }; Chris@101: typedef hinstance_struct *hmodule; Chris@101: Chris@101: struct hkey_struct; Chris@101: typedef hkey_struct *hkey; Chris@101: Chris@101: #ifdef _WIN64 Chris@101: typedef __int64 (__stdcall *farproc_t)(); Chris@101: #else Chris@101: typedef int (__stdcall *farproc_t)(); Chris@101: #endif // _WIN64 Chris@101: Chris@101: #else //#ifndef BOOST_USE_WINDOWS_H Chris@101: Chris@101: typedef GUID GUID_BIPC; Chris@101: typedef VARIANT wchar_variant; Chris@101: Chris@101: typedef IUnknown IUnknown_BIPC; Chris@101: Chris@101: typedef IWbemClassObject IWbemClassObject_BIPC; Chris@101: Chris@101: typedef IWbemContext IWbemContext_BIPC; Chris@101: Chris@101: typedef IEnumWbemClassObject IEnumWbemClassObject_BIPC; Chris@101: Chris@101: typedef IWbemServices IWbemServices_BIPC; Chris@101: Chris@101: typedef IWbemLocator IWbemLocator_BIPC; Chris@101: Chris@101: typedef OVERLAPPED interprocess_overlapped; Chris@101: Chris@101: typedef FILETIME interprocess_filetime; Chris@101: Chris@101: typedef WIN32_FIND_DATAA win32_find_data; Chris@101: Chris@101: typedef SECURITY_ATTRIBUTES interprocess_security_attributes; Chris@101: Chris@101: typedef SYSTEM_INFO system_info; Chris@101: Chris@101: typedef ACL interprocess_acl; Chris@101: Chris@101: typedef SECURITY_DESCRIPTOR interprocess_security_descriptor; Chris@101: Chris@101: typedef BY_HANDLE_FILE_INFORMATION interprocess_by_handle_file_information; Chris@101: Chris@101: typedef EVENTLOGRECORD interprocess_eventlogrecord; Chris@101: Chris@101: typedef LARGE_INTEGER large_integer; Chris@101: Chris@101: typedef HMODULE hmodule; Chris@101: Chris@101: typedef HKEY hkey; Chris@101: Chris@101: typedef BSTR bstr; Chris@101: Chris@101: typedef FARPROC farproc_t; Chris@101: Chris@101: #endif //#ifndef BOOST_USE_WINDOWS_H Chris@101: Chris@101: ////////////////////////////////////////////////////////////////////////////// Chris@101: // Chris@101: // Nt native structures Chris@101: // Chris@101: ////////////////////////////////////////////////////////////////////////////// Chris@101: Chris@101: struct interprocess_semaphore_basic_information Chris@101: { Chris@101: unsigned int count; // current semaphore count Chris@101: unsigned int limit; // max semaphore count Chris@101: }; Chris@101: Chris@101: struct interprocess_section_basic_information Chris@101: { Chris@101: void * base_address; Chris@101: unsigned long section_attributes; Chris@101: __int64 section_size; Chris@101: }; Chris@101: Chris@101: struct file_rename_information_t { Chris@101: int Replace; Chris@101: void *RootDir; Chris@101: unsigned long FileNameLength; Chris@101: wchar_t FileName[1]; Chris@101: }; Chris@101: Chris@101: struct unicode_string_t { Chris@101: unsigned short Length; Chris@101: unsigned short MaximumLength; Chris@101: wchar_t *Buffer; Chris@101: }; Chris@101: Chris@101: struct object_attributes_t { Chris@101: unsigned long Length; Chris@101: void * RootDirectory; Chris@101: unicode_string_t *ObjectName; Chris@101: unsigned long Attributes; Chris@101: void *SecurityDescriptor; Chris@101: void *SecurityQualityOfService; Chris@101: }; Chris@101: Chris@101: struct io_status_block_t { Chris@101: union { Chris@101: long Status; Chris@101: void *Pointer; Chris@101: }; Chris@101: Chris@101: unsigned long *Information; Chris@101: }; Chris@101: Chris@101: union system_timeofday_information Chris@101: { Chris@101: struct data_t Chris@101: { Chris@101: __int64 liKeBootTime; Chris@101: __int64 liKeSystemTime; Chris@101: __int64 liExpTimeZoneBias; Chris@101: unsigned long uCurrentTimeZoneId; Chris@101: unsigned long dwReserved; Chris@101: ::boost::ulong_long_type ullBootTimeBias; Chris@101: ::boost::ulong_long_type ullSleepTimeBias; Chris@101: } data; Chris@101: unsigned char Reserved1[sizeof(data_t)]; Chris@101: }; Chris@101: Chris@101: static const long BootstampLength = sizeof(__int64); Chris@101: static const long BootAndSystemstampLength = sizeof(__int64)*2; Chris@101: static const long SystemTimeOfDayInfoLength = sizeof(system_timeofday_information::data_t); Chris@101: Chris@101: struct object_name_information_t Chris@101: { Chris@101: unicode_string_t Name; Chris@101: wchar_t NameBuffer[1]; Chris@101: }; Chris@101: Chris@101: enum file_information_class_t { Chris@101: file_directory_information = 1, Chris@101: file_full_directory_information, Chris@101: file_both_directory_information, Chris@101: file_basic_information, Chris@101: file_standard_information, Chris@101: file_internal_information, Chris@101: file_ea_information, Chris@101: file_access_information, Chris@101: file_name_information, Chris@101: file_rename_information, Chris@101: file_link_information, Chris@101: file_names_information, Chris@101: file_disposition_information, Chris@101: file_position_information, Chris@101: file_full_ea_information, Chris@101: file_mode_information, Chris@101: file_alignment_information, Chris@101: file_all_information, Chris@101: file_allocation_information, Chris@101: file_end_of_file_information, Chris@101: file_alternate_name_information, Chris@101: file_stream_information, Chris@101: file_pipe_information, Chris@101: file_pipe_local_information, Chris@101: file_pipe_remote_information, Chris@101: file_mailslot_query_information, Chris@101: file_mailslot_set_information, Chris@101: file_compression_information, Chris@101: file_copy_on_write_information, Chris@101: file_completion_information, Chris@101: file_move_cluster_information, Chris@101: file_quota_information, Chris@101: file_reparse_point_information, Chris@101: file_network_open_information, Chris@101: file_object_id_information, Chris@101: file_tracking_information, Chris@101: file_ole_directory_information, Chris@101: file_content_index_information, Chris@101: file_inherit_content_index_information, Chris@101: file_ole_information, Chris@101: file_maximum_information Chris@101: }; Chris@101: Chris@101: enum semaphore_information_class { Chris@101: semaphore_basic_information = 0 Chris@101: }; Chris@101: Chris@101: Chris@101: enum system_information_class { Chris@101: system_basic_information = 0, Chris@101: system_performance_information = 2, Chris@101: system_time_of_day_information = 3, Chris@101: system_process_information = 5, Chris@101: system_processor_performance_information = 8, Chris@101: system_interrupt_information = 23, Chris@101: system_exception_information = 33, Chris@101: system_registry_quota_information = 37, Chris@101: system_lookaside_information = 45 Chris@101: }; Chris@101: Chris@101: enum object_information_class Chris@101: { Chris@101: object_basic_information, Chris@101: object_name_information, Chris@101: object_type_information, Chris@101: object_all_information, Chris@101: object_data_information Chris@101: }; Chris@101: Chris@101: enum section_information_class Chris@101: { Chris@101: section_basic_information, Chris@101: section_image_information Chris@101: }; Chris@101: Chris@101: ////////////////////////////////////////////////////////////////////////////// Chris@101: // Chris@101: // Forward declaration of winapi Chris@101: // Chris@101: ////////////////////////////////////////////////////////////////////////////// Chris@101: Chris@101: #ifndef BOOST_USE_WINDOWS_H Chris@101: Chris@101: //Kernel32.dll Chris@101: Chris@101: //Some windows API declarations Chris@101: extern "C" __declspec(dllimport) unsigned long __stdcall GetCurrentProcessId(); Chris@101: extern "C" __declspec(dllimport) unsigned long __stdcall GetCurrentThreadId(); Chris@101: extern "C" __declspec(dllimport) int __stdcall GetProcessTimes Chris@101: ( void *hProcess, interprocess_filetime* lpCreationTime Chris@101: , interprocess_filetime *lpExitTime,interprocess_filetime *lpKernelTime Chris@101: , interprocess_filetime *lpUserTime ); Chris@101: extern "C" __declspec(dllimport) void __stdcall Sleep(unsigned long); Chris@101: extern "C" __declspec(dllimport) unsigned long __stdcall GetTickCount(void); Chris@101: extern "C" __declspec(dllimport) int __stdcall SwitchToThread(); Chris@101: extern "C" __declspec(dllimport) unsigned long __stdcall GetLastError(); Chris@101: extern "C" __declspec(dllimport) void __stdcall SetLastError(unsigned long); Chris@101: extern "C" __declspec(dllimport) void * __stdcall GetCurrentProcess(); Chris@101: extern "C" __declspec(dllimport) int __stdcall CloseHandle(void*); Chris@101: extern "C" __declspec(dllimport) int __stdcall DuplicateHandle Chris@101: ( void *hSourceProcessHandle, void *hSourceHandle Chris@101: , void *hTargetProcessHandle, void **lpTargetHandle Chris@101: , unsigned long dwDesiredAccess, int bInheritHandle Chris@101: , unsigned long dwOptions); Chris@101: extern "C" __declspec(dllimport) long __stdcall GetFileType(void *hFile); Chris@101: extern "C" __declspec(dllimport) void *__stdcall FindFirstFileA(const char *lpFileName, win32_find_data *lpFindFileData); Chris@101: extern "C" __declspec(dllimport) int __stdcall FindNextFileA(void *hFindFile, win32_find_data *lpFindFileData); Chris@101: extern "C" __declspec(dllimport) int __stdcall FindClose(void *hFindFile); Chris@101: //extern "C" __declspec(dllimport) void __stdcall GetSystemTimeAsFileTime(interprocess_filetime*); Chris@101: //extern "C" __declspec(dllimport) int __stdcall FileTimeToLocalFileTime(const interprocess_filetime *in, const interprocess_filetime *out); Chris@101: extern "C" __declspec(dllimport) void * __stdcall CreateMutexA(interprocess_security_attributes*, int, const char *); Chris@101: extern "C" __declspec(dllimport) void * __stdcall OpenMutexA(unsigned long, int, const char *); Chris@101: extern "C" __declspec(dllimport) unsigned long __stdcall WaitForSingleObject(void *, unsigned long); Chris@101: extern "C" __declspec(dllimport) int __stdcall ReleaseMutex(void *); Chris@101: extern "C" __declspec(dllimport) int __stdcall UnmapViewOfFile(void *); Chris@101: extern "C" __declspec(dllimport) void * __stdcall CreateSemaphoreA(interprocess_security_attributes*, long, long, const char *); Chris@101: extern "C" __declspec(dllimport) int __stdcall ReleaseSemaphore(void *, long, long *); Chris@101: extern "C" __declspec(dllimport) void * __stdcall OpenSemaphoreA(unsigned long, int, const char *); Chris@101: extern "C" __declspec(dllimport) void * __stdcall CreateFileMappingA (void *, interprocess_security_attributes*, unsigned long, unsigned long, unsigned long, const char *); Chris@101: extern "C" __declspec(dllimport) void * __stdcall MapViewOfFileEx (void *, unsigned long, unsigned long, unsigned long, std::size_t, void*); Chris@101: extern "C" __declspec(dllimport) void * __stdcall OpenFileMappingA (unsigned long, int, const char *); Chris@101: extern "C" __declspec(dllimport) void * __stdcall CreateFileA (const char *, unsigned long, unsigned long, struct interprocess_security_attributes*, unsigned long, unsigned long, void *); Chris@101: extern "C" __declspec(dllimport) void __stdcall GetSystemInfo (struct system_info *); Chris@101: extern "C" __declspec(dllimport) int __stdcall FlushViewOfFile (void *, std::size_t); Chris@101: extern "C" __declspec(dllimport) int __stdcall VirtualUnlock (void *, std::size_t); Chris@101: extern "C" __declspec(dllimport) int __stdcall VirtualProtect (void *, std::size_t, unsigned long, unsigned long *); Chris@101: extern "C" __declspec(dllimport) int __stdcall FlushFileBuffers (void *); Chris@101: extern "C" __declspec(dllimport) int __stdcall GetFileSizeEx (void *, large_integer *size); Chris@101: extern "C" __declspec(dllimport) unsigned long __stdcall FormatMessageA Chris@101: (unsigned long dwFlags, const void *lpSource, unsigned long dwMessageId, Chris@101: unsigned long dwLanguageId, char *lpBuffer, unsigned long nSize, Chris@101: std::va_list *Arguments); Chris@101: extern "C" __declspec(dllimport) void *__stdcall LocalFree (void *); Chris@101: extern "C" __declspec(dllimport) unsigned long __stdcall GetFileAttributesA(const char *); Chris@101: extern "C" __declspec(dllimport) int __stdcall CreateDirectoryA(const char *, interprocess_security_attributes*); Chris@101: extern "C" __declspec(dllimport) int __stdcall RemoveDirectoryA(const char *lpPathName); Chris@101: extern "C" __declspec(dllimport) int __stdcall GetTempPathA(unsigned long length, char *buffer); Chris@101: extern "C" __declspec(dllimport) int __stdcall CreateDirectory(const char *, interprocess_security_attributes*); Chris@101: extern "C" __declspec(dllimport) int __stdcall SetFileValidData(void *, __int64 size); Chris@101: extern "C" __declspec(dllimport) int __stdcall SetEndOfFile(void *); Chris@101: extern "C" __declspec(dllimport) int __stdcall SetFilePointerEx(void *, large_integer distance, large_integer *new_file_pointer, unsigned long move_method); Chris@101: extern "C" __declspec(dllimport) int __stdcall LockFile (void *hnd, unsigned long offset_low, unsigned long offset_high, unsigned long size_low, unsigned long size_high); Chris@101: extern "C" __declspec(dllimport) int __stdcall UnlockFile(void *hnd, unsigned long offset_low, unsigned long offset_high, unsigned long size_low, unsigned long size_high); Chris@101: extern "C" __declspec(dllimport) int __stdcall LockFileEx(void *hnd, unsigned long flags, unsigned long reserved, unsigned long size_low, unsigned long size_high, interprocess_overlapped* overlapped); Chris@101: extern "C" __declspec(dllimport) int __stdcall UnlockFileEx(void *hnd, unsigned long reserved, unsigned long size_low, unsigned long size_high, interprocess_overlapped* overlapped); Chris@101: extern "C" __declspec(dllimport) int __stdcall WriteFile(void *hnd, const void *buffer, unsigned long bytes_to_write, unsigned long *bytes_written, interprocess_overlapped* overlapped); Chris@101: extern "C" __declspec(dllimport) int __stdcall ReadFile(void *hnd, void *buffer, unsigned long bytes_to_read, unsigned long *bytes_read, interprocess_overlapped* overlapped); Chris@101: extern "C" __declspec(dllimport) int __stdcall InitializeSecurityDescriptor(interprocess_security_descriptor *pSecurityDescriptor, unsigned long dwRevision); Chris@101: extern "C" __declspec(dllimport) int __stdcall SetSecurityDescriptorDacl(interprocess_security_descriptor *pSecurityDescriptor, int bDaclPresent, interprocess_acl *pDacl, int bDaclDefaulted); Chris@101: extern "C" __declspec(dllimport) hmodule __stdcall LoadLibraryA(const char *); Chris@101: extern "C" __declspec(dllimport) int __stdcall FreeLibrary(hmodule); Chris@101: extern "C" __declspec(dllimport) farproc_t __stdcall GetProcAddress(void *, const char*); Chris@101: extern "C" __declspec(dllimport) hmodule __stdcall GetModuleHandleA(const char*); Chris@101: extern "C" __declspec(dllimport) void *__stdcall GetFileInformationByHandle(void *, interprocess_by_handle_file_information*); Chris@101: Chris@101: //Advapi32.dll Chris@101: extern "C" __declspec(dllimport) long __stdcall RegOpenKeyExA(hkey, const char *, unsigned long, unsigned long, hkey*); Chris@101: extern "C" __declspec(dllimport) long __stdcall RegQueryValueExA(hkey, const char *, unsigned long*, unsigned long*, unsigned char *, unsigned long*); Chris@101: extern "C" __declspec(dllimport) long __stdcall RegCloseKey(hkey); Chris@101: Chris@101: //Ole32.dll Chris@101: extern "C" __declspec(dllimport) long __stdcall CoInitializeEx(void *pvReserved, unsigned long dwCoInit); Chris@101: extern "C" __declspec(dllimport) long __stdcall CoInitializeSecurity( Chris@101: void* pSecDesc, Chris@101: long cAuthSvc, Chris@101: void * asAuthSvc, Chris@101: void *pReserved1, Chris@101: unsigned long dwAuthnLevel, Chris@101: unsigned long dwImpLevel, Chris@101: void *pAuthList, Chris@101: unsigned long dwCapabilities, Chris@101: void *pReserved3 ); Chris@101: Chris@101: extern "C" __declspec(dllimport) long __stdcall CoSetProxyBlanket( Chris@101: IUnknown_BIPC *pProxy, Chris@101: unsigned long dwAuthnSvc, Chris@101: unsigned long dwAuthzSvc, Chris@101: wchar_t *pServerPrincName, Chris@101: unsigned long dwAuthnLevel, Chris@101: unsigned long dwImpLevel, Chris@101: void *pAuthInfo, Chris@101: unsigned long dwCapabilities); Chris@101: extern "C" __declspec(dllimport) long __stdcall CoCreateInstance(const GUID_BIPC & rclsid, IUnknown_BIPC *pUnkOuter, Chris@101: unsigned long dwClsContext, const GUID_BIPC & riid, void** ppv); Chris@101: extern "C" __declspec(dllimport) void __stdcall CoUninitialize(void); Chris@101: Chris@101: //OleAut32.dll Chris@101: extern "C" __declspec(dllimport) long __stdcall VariantClear(wchar_variant * pvarg); Chris@101: Chris@101: //Shell32.dll Chris@101: extern "C" __declspec(dllimport) int __stdcall SHGetSpecialFolderPathA Chris@101: (void* hwnd, const char *pszPath, int csidl, int fCreate); Chris@101: Chris@101: extern "C" __declspec(dllimport) int __stdcall SHGetFolderPathA(void *hwnd, int csidl, void *hToken, unsigned long dwFlags, const char *pszPath); Chris@101: Chris@101: //EventLog access functions Chris@101: Chris@101: extern "C" __declspec(dllimport) void* __stdcall OpenEventLogA Chris@101: (const char* lpUNCServerName, const char* lpSourceName); Chris@101: Chris@101: extern "C" __declspec(dllimport) int __stdcall CloseEventLog(void *hEventLog); Chris@101: Chris@101: extern "C" __declspec(dllimport) int __stdcall ReadEventLogA Chris@101: (void *hEventLog, Chris@101: unsigned long dwReadFlags, Chris@101: unsigned long dwRecordOffset, Chris@101: void *lpBuffer, Chris@101: unsigned long nNumberOfBytesToRead, Chris@101: unsigned long *pnBytesRead, Chris@101: unsigned long *pnMinNumberOfBytesNeeded Chris@101: ); Chris@101: Chris@101: #endif //#ifndef BOOST_USE_WINDOWS_H Chris@101: Chris@101: //kernel32.dll Chris@101: typedef int (__stdcall *QueryPerformanceCounter_t) (__int64 *lpPerformanceCount); Chris@101: typedef int (__stdcall *QueryPerformanceFrequency_t)(__int64 *lpFrequency); Chris@101: Chris@101: //ntdll.dll Chris@101: typedef long (__stdcall *NtDeleteFile_t)(object_attributes_t *ObjectAttributes); Chris@101: typedef long (__stdcall *NtSetInformationFile_t)(void *FileHandle, io_status_block_t *IoStatusBlock, void *FileInformation, unsigned long Length, int FileInformationClass ); Chris@101: typedef long (__stdcall *NtOpenFile)(void **FileHandle, unsigned long DesiredAccess, object_attributes_t *ObjectAttributes Chris@101: , io_status_block_t *IoStatusBlock, unsigned long ShareAccess, unsigned long Length, unsigned long OpenOptions); Chris@101: typedef long (__stdcall *NtQuerySystemInformation_t)(int, void*, unsigned long, unsigned long *); Chris@101: typedef long (__stdcall *NtQueryObject_t)(void*, object_information_class, void *, unsigned long, unsigned long *); Chris@101: typedef long (__stdcall *NtQuerySemaphore_t)(void*, unsigned int info_class, interprocess_semaphore_basic_information *pinfo, unsigned int info_size, unsigned int *ret_len); Chris@101: typedef long (__stdcall *NtQuerySection_t)(void*, section_information_class, interprocess_section_basic_information *pinfo, unsigned long info_size, unsigned long *ret_len); Chris@101: typedef long (__stdcall *NtQueryInformationFile_t)(void *,io_status_block_t *,void *, long, int); Chris@101: typedef long (__stdcall *NtOpenFile_t)(void*,unsigned long ,object_attributes_t*,io_status_block_t*,unsigned long,unsigned long); Chris@101: typedef long (__stdcall *NtClose_t) (void*); Chris@101: typedef long (__stdcall *NtQueryTimerResolution_t) (unsigned long* LowestResolution, unsigned long* HighestResolution, unsigned long* CurrentResolution); Chris@101: typedef long (__stdcall *NtSetTimerResolution_t) (unsigned long RequestedResolution, int Set, unsigned long* ActualResolution); Chris@101: Chris@101: } //namespace winapi { Chris@101: } //namespace interprocess { Chris@101: } //namespace boost { Chris@101: Chris@101: ////////////////////////////////////////////////////////////////////////////// Chris@101: // Chris@101: // Forward declaration of constants Chris@101: // Chris@101: ////////////////////////////////////////////////////////////////////////////// Chris@101: Chris@16: namespace boost { Chris@16: namespace interprocess { Chris@16: namespace winapi { Chris@16: Chris@16: //Some used constants Chris@16: static const unsigned long infinite_time = 0xFFFFFFFF; Chris@16: static const unsigned long error_already_exists = 183L; Chris@16: static const unsigned long error_invalid_handle = 6L; Chris@16: static const unsigned long error_sharing_violation = 32L; Chris@16: static const unsigned long error_file_not_found = 2u; Chris@16: static const unsigned long error_no_more_files = 18u; Chris@16: static const unsigned long error_not_locked = 158L; Chris@16: //Retries in CreateFile, see http://support.microsoft.com/kb/316609 Chris@16: static const unsigned long error_sharing_violation_tries = 3L; Chris@16: static const unsigned long error_sharing_violation_sleep_ms = 250L; Chris@16: static const unsigned long error_file_too_large = 223L; Chris@16: static const unsigned long error_insufficient_buffer = 122L; Chris@16: static const unsigned long error_handle_eof = 38L; Chris@16: static const unsigned long semaphore_all_access = (0x000F0000L)|(0x00100000L)|0x3; Chris@16: static const unsigned long mutex_all_access = (0x000F0000L)|(0x00100000L)|0x0001; Chris@16: Chris@16: static const unsigned long page_readonly = 0x02; Chris@16: static const unsigned long page_readwrite = 0x04; Chris@16: static const unsigned long page_writecopy = 0x08; Chris@16: static const unsigned long page_noaccess = 0x01; Chris@16: Chris@16: static const unsigned long standard_rights_required = 0x000F0000L; Chris@16: static const unsigned long section_query = 0x0001; Chris@16: static const unsigned long section_map_write = 0x0002; Chris@16: static const unsigned long section_map_read = 0x0004; Chris@16: static const unsigned long section_map_execute = 0x0008; Chris@16: static const unsigned long section_extend_size = 0x0010; Chris@16: static const unsigned long section_all_access = standard_rights_required | Chris@16: section_query | Chris@16: section_map_write | Chris@16: section_map_read | Chris@16: section_map_execute | Chris@16: section_extend_size; Chris@16: Chris@16: static const unsigned long file_map_copy = section_query; Chris@16: static const unsigned long file_map_write = section_map_write; Chris@16: static const unsigned long file_map_read = section_map_read; Chris@16: static const unsigned long file_map_all_access = section_all_access; Chris@16: static const unsigned long delete_access = 0x00010000L; Chris@16: static const unsigned long file_flag_backup_semantics = 0x02000000; Chris@16: static const long file_flag_delete_on_close = 0x04000000; Chris@16: Chris@16: //Native API constants Chris@16: static const unsigned long file_open_for_backup_intent = 0x00004000; Chris@16: static const int file_share_valid_flags = 0x00000007; Chris@16: static const long file_delete_on_close = 0x00001000L; Chris@16: static const long obj_case_insensitive = 0x00000040L; Chris@16: static const long delete_flag = 0x00010000L; Chris@16: Chris@16: static const unsigned long movefile_copy_allowed = 0x02; Chris@16: static const unsigned long movefile_delay_until_reboot = 0x04; Chris@16: static const unsigned long movefile_replace_existing = 0x01; Chris@16: static const unsigned long movefile_write_through = 0x08; Chris@16: static const unsigned long movefile_create_hardlink = 0x10; Chris@16: static const unsigned long movefile_fail_if_not_trackable = 0x20; Chris@16: Chris@16: static const unsigned long file_share_read = 0x00000001; Chris@16: static const unsigned long file_share_write = 0x00000002; Chris@16: static const unsigned long file_share_delete = 0x00000004; Chris@16: Chris@16: static const unsigned long file_attribute_readonly = 0x00000001; Chris@16: static const unsigned long file_attribute_hidden = 0x00000002; Chris@16: static const unsigned long file_attribute_system = 0x00000004; Chris@16: static const unsigned long file_attribute_directory = 0x00000010; Chris@16: static const unsigned long file_attribute_archive = 0x00000020; Chris@16: static const unsigned long file_attribute_device = 0x00000040; Chris@16: static const unsigned long file_attribute_normal = 0x00000080; Chris@16: static const unsigned long file_attribute_temporary = 0x00000100; Chris@16: Chris@16: static const unsigned long generic_read = 0x80000000L; Chris@16: static const unsigned long generic_write = 0x40000000L; Chris@16: Chris@16: static const unsigned long wait_object_0 = 0; Chris@16: static const unsigned long wait_abandoned = 0x00000080L; Chris@16: static const unsigned long wait_timeout = 258L; Chris@16: static const unsigned long wait_failed = (unsigned long)0xFFFFFFFF; Chris@16: Chris@16: static const unsigned long duplicate_close_source = (unsigned long)0x00000001; Chris@16: static const unsigned long duplicate_same_access = (unsigned long)0x00000002; Chris@16: Chris@16: static const unsigned long format_message_allocate_buffer Chris@16: = (unsigned long)0x00000100; Chris@16: static const unsigned long format_message_ignore_inserts Chris@16: = (unsigned long)0x00000200; Chris@16: static const unsigned long format_message_from_string Chris@16: = (unsigned long)0x00000400; Chris@16: static const unsigned long format_message_from_hmodule Chris@16: = (unsigned long)0x00000800; Chris@16: static const unsigned long format_message_from_system Chris@16: = (unsigned long)0x00001000; Chris@16: static const unsigned long format_message_argument_array Chris@16: = (unsigned long)0x00002000; Chris@16: static const unsigned long format_message_max_width_mask Chris@16: = (unsigned long)0x000000FF; Chris@16: static const unsigned long lang_neutral = (unsigned long)0x00; Chris@16: static const unsigned long sublang_default = (unsigned long)0x01; Chris@16: static const unsigned long invalid_file_size = (unsigned long)0xFFFFFFFF; Chris@16: static const unsigned long invalid_file_attributes = ((unsigned long)-1); Chris@16: static void * const invalid_handle_value = ((void*)(long)(-1)); Chris@16: Chris@16: static const unsigned long file_type_char = 0x0002L; Chris@16: static const unsigned long file_type_disk = 0x0001L; Chris@16: static const unsigned long file_type_pipe = 0x0003L; Chris@16: static const unsigned long file_type_remote = 0x8000L; Chris@16: static const unsigned long file_type_unknown = 0x0000L; Chris@16: Chris@16: static const unsigned long create_new = 1; Chris@16: static const unsigned long create_always = 2; Chris@16: static const unsigned long open_existing = 3; Chris@16: static const unsigned long open_always = 4; Chris@16: static const unsigned long truncate_existing = 5; Chris@16: Chris@16: static const unsigned long file_begin = 0; Chris@16: static const unsigned long file_current = 1; Chris@16: static const unsigned long file_end = 2; Chris@16: Chris@16: static const unsigned long lockfile_fail_immediately = 1; Chris@16: static const unsigned long lockfile_exclusive_lock = 2; Chris@16: static const unsigned long error_lock_violation = 33; Chris@16: static const unsigned long security_descriptor_revision = 1; Chris@16: Chris@16: const unsigned long max_record_buffer_size = 0x10000L; // 64K Chris@101: const unsigned long max_path = 260; Chris@16: Chris@16: //Keys Chris@101: static const hkey hkey_local_machine = (hkey)(unsigned long*)(long)(0x80000002); Chris@16: static unsigned long key_query_value = 0x0001; Chris@16: Chris@16: //COM API Chris@16: const unsigned long RPC_C_AUTHN_LEVEL_PKT_BIPC = 4; Chris@16: const unsigned long RPC_C_AUTHN_DEFAULT_BIPC = 0xffffffffL; Chris@16: const unsigned long RPC_C_AUTHZ_DEFAULT_BIPC = 0xffffffffL; Chris@16: const unsigned long RPC_C_IMP_LEVEL_IMPERSONATE_BIPC = 3; Chris@16: const signed long EOAC_NONE_BIPC = 0; Chris@16: const signed long CLSCTX_INPROC_SERVER_BIPC = 0x1; Chris@16: const signed long CLSCTX_LOCAL_SERVER_BIPC = 0x4; Chris@16: const signed long WBEM_FLAG_RETURN_IMMEDIATELY_BIPC = 0x10; Chris@16: const signed long WBEM_FLAG_RETURN_WHEN_COMPLETE_BIPC = 0x0; Chris@16: const signed long WBEM_FLAG_FORWARD_ONLY_BIPC = 0x20; Chris@16: const signed long WBEM_INFINITE_BIPC = 0xffffffffL; Chris@16: const signed long RPC_E_TOO_LATE_BIPC = 0x80010119L; Chris@16: const signed long S_OK_BIPC = 0L; Chris@16: const signed long S_FALSE_BIPC = 1; Chris@16: const signed long RPC_E_CHANGED_MODE_BIPC = 0x80010106L; Chris@16: const unsigned long COINIT_APARTMENTTHREADED_BIPC = 0x2; Chris@16: const unsigned long COINIT_MULTITHREADED_BIPC = 0x0; Chris@16: const unsigned long COINIT_DISABLE_OLE1DDE_BIPC = 0x4; Chris@16: const unsigned long COINIT_SPEED_OVER_MEMORY_BIPC = 0x4; Chris@16: Chris@101: Chris@16: //If the user needs to change default COM initialization model, Chris@16: //it can define BOOST_INTERPROCESS_WINDOWS_COINIT_MODEL to one of these: Chris@16: // Chris@16: // COINIT_APARTMENTTHREADED_BIPC Chris@16: // COINIT_MULTITHREADED_BIPC Chris@16: // COINIT_DISABLE_OLE1DDE_BIPC Chris@16: // COINIT_SPEED_OVER_MEMORY_BIPC Chris@16: #if !defined(BOOST_INTERPROCESS_WINDOWS_COINIT_MODEL) Chris@16: #define BOOST_INTERPROCESS_WINDOWS_COINIT_MODEL COINIT_APARTMENTTHREADED_BIPC Chris@16: #elif (BOOST_INTERPROCESS_WINDOWS_COINIT_MODEL != COINIT_APARTMENTTHREADED_BIPC) &&\ Chris@16: (BOOST_INTERPROCESS_WINDOWS_COINIT_MODEL != COINIT_MULTITHREADED_BIPC) &&\ Chris@16: (BOOST_INTERPROCESS_WINDOWS_COINIT_MODEL != COINIT_DISABLE_OLE1DDE_BIPC) &&\ Chris@16: (BOOST_INTERPROCESS_WINDOWS_COINIT_MODEL != COINIT_SPEED_OVER_MEMORY_BIPC) Chris@16: #error "Wrong value for BOOST_INTERPROCESS_WINDOWS_COINIT_MODEL macro" Chris@16: #endif Chris@16: Chris@16: const GUID_BIPC CLSID_WbemAdministrativeLocator = Chris@16: { 0xcb8555cc, 0x9128, 0x11d1, {0xad, 0x9b, 0x00, 0xc0, 0x4f, 0xd8, 0xfd, 0xff}}; Chris@16: Chris@16: const GUID_BIPC IID_IUnknown = { 0x00000000, 0x0000, 0x0000, {0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46}}; Chris@16: Chris@16: static const unsigned long eventlog_sequential_read = 0x0001; Chris@16: static const unsigned long eventlog_backwards_read = 0x0008; Chris@16: Chris@16: } //namespace winapi { Chris@16: } //namespace interprocess { Chris@16: } //namespace boost { Chris@16: Chris@101: Chris@16: namespace boost { Chris@16: namespace interprocess { Chris@16: namespace winapi { Chris@16: Chris@16: inline unsigned long get_last_error() Chris@16: { return GetLastError(); } Chris@16: Chris@16: inline void set_last_error(unsigned long err) Chris@16: { return SetLastError(err); } Chris@16: Chris@16: inline unsigned long format_message Chris@16: (unsigned long dwFlags, const void *lpSource, Chris@16: unsigned long dwMessageId, unsigned long dwLanguageId, Chris@16: char *lpBuffer, unsigned long nSize, std::va_list *Arguments) Chris@16: { Chris@16: return FormatMessageA Chris@16: (dwFlags, lpSource, dwMessageId, dwLanguageId, lpBuffer, nSize, Arguments); Chris@16: } Chris@16: Chris@16: //And now, wrapper functions Chris@16: inline void * local_free(void *hmem) Chris@16: { return LocalFree(hmem); } Chris@16: Chris@16: inline unsigned long make_lang_id(unsigned long p, unsigned long s) Chris@16: { return ((((unsigned short)(s)) << 10) | (unsigned short)(p)); } Chris@16: Chris@16: inline void sched_yield() Chris@16: { Chris@16: if(!SwitchToThread()){ Chris@16: Sleep(0); Chris@16: } Chris@16: } Chris@16: Chris@16: inline void sleep_tick() Chris@16: { Sleep(1); } Chris@16: Chris@16: inline void sleep(unsigned long ms) Chris@16: { Sleep(ms); } Chris@16: Chris@16: inline unsigned long get_current_thread_id() Chris@16: { return GetCurrentThreadId(); } Chris@16: Chris@16: inline bool get_process_times Chris@16: ( void *hProcess, interprocess_filetime* lpCreationTime Chris@16: , interprocess_filetime *lpExitTime, interprocess_filetime *lpKernelTime Chris@16: , interprocess_filetime *lpUserTime ) Chris@16: { return 0 != GetProcessTimes(hProcess, lpCreationTime, lpExitTime, lpKernelTime, lpUserTime); } Chris@16: Chris@16: inline unsigned long get_current_process_id() Chris@16: { return GetCurrentProcessId(); } Chris@16: Chris@16: inline unsigned int close_handle(void* handle) Chris@16: { return CloseHandle(handle); } Chris@16: Chris@101: inline void * find_first_file(const char *lpFileName, win32_find_data *lpFindFileData) Chris@16: { return FindFirstFileA(lpFileName, lpFindFileData); } Chris@16: Chris@101: inline bool find_next_file(void *hFindFile, win32_find_data *lpFindFileData) Chris@16: { return FindNextFileA(hFindFile, lpFindFileData) != 0; } Chris@16: Chris@16: inline bool find_close(void *handle) Chris@16: { return FindClose(handle) != 0; } Chris@16: Chris@16: inline bool duplicate_current_process_handle Chris@16: (void *hSourceHandle, void **lpTargetHandle) Chris@16: { Chris@16: return 0 != DuplicateHandle Chris@16: ( GetCurrentProcess(), hSourceHandle, GetCurrentProcess() Chris@16: , lpTargetHandle, 0, 0 Chris@16: , duplicate_same_access); Chris@16: } Chris@16: Chris@16: inline unsigned long get_file_type(void *hFile) Chris@16: { Chris@16: return GetFileType(hFile); Chris@16: } Chris@16: Chris@16: /* Chris@16: inline void get_system_time_as_file_time(interprocess_filetime *filetime) Chris@16: { GetSystemTimeAsFileTime(filetime); } Chris@16: Chris@16: inline bool file_time_to_local_file_time Chris@16: (const interprocess_filetime *in, const interprocess_filetime *out) Chris@16: { return 0 != FileTimeToLocalFileTime(in, out); } Chris@16: */ Chris@16: inline void *open_or_create_mutex(const char *name, bool initial_owner, interprocess_security_attributes *attr) Chris@16: { return CreateMutexA(attr, (int)initial_owner, name); } Chris@16: Chris@16: inline unsigned long wait_for_single_object(void *handle, unsigned long time) Chris@16: { return WaitForSingleObject(handle, time); } Chris@16: Chris@16: inline int release_mutex(void *handle) Chris@16: { return ReleaseMutex(handle); } Chris@16: Chris@16: inline int unmap_view_of_file(void *address) Chris@16: { return UnmapViewOfFile(address); } Chris@16: Chris@16: inline void *open_or_create_semaphore(const char *name, long initial_count, long maximum_count, interprocess_security_attributes *attr) Chris@16: { return CreateSemaphoreA(attr, initial_count, maximum_count, name); } Chris@16: Chris@16: inline void *open_semaphore(const char *name) Chris@16: { return OpenSemaphoreA(semaphore_all_access, 0, name); } Chris@16: Chris@16: inline int release_semaphore(void *handle, long release_count, long *prev_count) Chris@16: { return ReleaseSemaphore(handle, release_count, prev_count); } Chris@16: Chris@16: class interprocess_all_access_security Chris@16: { Chris@16: interprocess_security_attributes sa; Chris@16: interprocess_security_descriptor sd; Chris@16: bool initialized; Chris@16: Chris@16: public: Chris@16: interprocess_all_access_security() Chris@16: : initialized(false) Chris@16: { Chris@16: if(!InitializeSecurityDescriptor(&sd, security_descriptor_revision)) Chris@16: return; Chris@16: if(!SetSecurityDescriptorDacl(&sd, true, 0, false)) Chris@16: return; Chris@16: sa.lpSecurityDescriptor = &sd; Chris@16: sa.nLength = sizeof(interprocess_security_attributes); Chris@16: sa.bInheritHandle = false; Chris@16: initialized = false; Chris@16: } Chris@16: Chris@16: interprocess_security_attributes *get_attributes() Chris@16: { return &sa; } Chris@16: }; Chris@16: Chris@101: inline void * create_file_mapping (void * handle, unsigned long access, ::boost::ulong_long_type file_offset, const char * name, interprocess_security_attributes *psec) Chris@16: { Chris@16: const unsigned long high_size(file_offset >> 32), low_size((boost::uint32_t)file_offset); Chris@16: return CreateFileMappingA (handle, psec, access, high_size, low_size, name); Chris@16: } Chris@16: Chris@16: inline void * open_file_mapping (unsigned long access, const char *name) Chris@16: { return OpenFileMappingA (access, 0, name); } Chris@16: Chris@101: inline void *map_view_of_file_ex(void *handle, unsigned long file_access, ::boost::ulong_long_type offset, std::size_t numbytes, void *base_addr) Chris@16: { Chris@101: const unsigned long offset_low = (unsigned long)(offset & ((::boost::ulong_long_type)0xFFFFFFFF)); Chris@16: const unsigned long offset_high = offset >> 32; Chris@16: return MapViewOfFileEx(handle, file_access, offset_high, offset_low, numbytes, base_addr); Chris@16: } Chris@16: Chris@16: inline void *create_file(const char *name, unsigned long access, unsigned long creation_flags, unsigned long attributes, interprocess_security_attributes *psec) Chris@16: { Chris@16: for (unsigned int attempt(0); attempt < error_sharing_violation_tries; ++attempt){ Chris@16: void * const handle = CreateFileA(name, access, Chris@16: file_share_read | file_share_write | file_share_delete, Chris@16: psec, creation_flags, attributes, 0); Chris@16: bool const invalid(invalid_handle_value == handle); Chris@16: if (!invalid){ Chris@16: return handle; Chris@16: } Chris@16: if (error_sharing_violation != get_last_error()){ Chris@16: return handle; Chris@16: } Chris@16: sleep(error_sharing_violation_sleep_ms); Chris@16: } Chris@16: return invalid_handle_value; Chris@16: } Chris@16: Chris@16: inline void get_system_info(system_info *info) Chris@16: { GetSystemInfo(info); } Chris@16: Chris@16: inline bool flush_view_of_file(void *base_addr, std::size_t numbytes) Chris@16: { return 0 != FlushViewOfFile(base_addr, numbytes); } Chris@16: Chris@16: inline bool virtual_unlock(void *base_addr, std::size_t numbytes) Chris@16: { return 0 != VirtualUnlock(base_addr, numbytes); } Chris@16: Chris@16: inline bool virtual_protect(void *base_addr, std::size_t numbytes, unsigned long flNewProtect, unsigned long &lpflOldProtect) Chris@16: { return 0 != VirtualProtect(base_addr, numbytes, flNewProtect, &lpflOldProtect); } Chris@16: Chris@16: inline bool flush_file_buffers(void *handle) Chris@16: { return 0 != FlushFileBuffers(handle); } Chris@16: Chris@16: inline bool get_file_size(void *handle, __int64 &size) Chris@101: { return 0 != GetFileSizeEx(handle, (large_integer*)&size); } Chris@16: Chris@16: inline bool create_directory(const char *name) Chris@16: { Chris@16: interprocess_all_access_security sec; Chris@16: return 0 != CreateDirectoryA(name, sec.get_attributes()); Chris@16: } Chris@16: Chris@16: inline bool remove_directory(const char *lpPathName) Chris@16: { return 0 != RemoveDirectoryA(lpPathName); } Chris@16: Chris@16: inline unsigned long get_temp_path(unsigned long length, char *buffer) Chris@16: { return GetTempPathA(length, buffer); } Chris@16: Chris@16: inline int set_end_of_file(void *handle) Chris@16: { return 0 != SetEndOfFile(handle); } Chris@16: Chris@16: inline bool set_file_pointer_ex(void *handle, __int64 distance, __int64 *new_file_pointer, unsigned long move_method) Chris@101: { Chris@101: large_integer d; d.QuadPart = distance; Chris@101: return 0 != SetFilePointerEx(handle, d, (large_integer*)new_file_pointer, move_method); Chris@101: } Chris@16: Chris@16: inline bool lock_file_ex(void *hnd, unsigned long flags, unsigned long reserved, unsigned long size_low, unsigned long size_high, interprocess_overlapped *overlapped) Chris@16: { return 0 != LockFileEx(hnd, flags, reserved, size_low, size_high, overlapped); } Chris@16: Chris@16: inline bool unlock_file_ex(void *hnd, unsigned long reserved, unsigned long size_low, unsigned long size_high, interprocess_overlapped *overlapped) Chris@16: { return 0 != UnlockFileEx(hnd, reserved, size_low, size_high, overlapped); } Chris@16: Chris@16: inline bool write_file(void *hnd, const void *buffer, unsigned long bytes_to_write, unsigned long *bytes_written, interprocess_overlapped* overlapped) Chris@16: { return 0 != WriteFile(hnd, buffer, bytes_to_write, bytes_written, overlapped); } Chris@16: Chris@16: inline bool read_file(void *hnd, void *buffer, unsigned long bytes_to_read, unsigned long *bytes_read, interprocess_overlapped* overlapped) Chris@16: { return 0 != ReadFile(hnd, buffer, bytes_to_read, bytes_read, overlapped); } Chris@16: Chris@16: inline bool get_file_information_by_handle(void *hnd, interprocess_by_handle_file_information *info) Chris@16: { return 0 != GetFileInformationByHandle(hnd, info); } Chris@16: Chris@16: inline long interlocked_increment(long volatile *addr) Chris@16: { return BOOST_INTERLOCKED_INCREMENT(addr); } Chris@16: Chris@16: inline long interlocked_decrement(long volatile *addr) Chris@16: { return BOOST_INTERLOCKED_DECREMENT(addr); } Chris@16: Chris@16: inline long interlocked_compare_exchange(long volatile *addr, long val1, long val2) Chris@16: { return BOOST_INTERLOCKED_COMPARE_EXCHANGE(addr, val1, val2); } Chris@16: Chris@16: inline long interlocked_exchange_add(long volatile* addend, long value) Chris@16: { return BOOST_INTERLOCKED_EXCHANGE_ADD(const_cast(addend), value); } Chris@16: Chris@16: inline long interlocked_exchange(long volatile* addend, long value) Chris@16: { return BOOST_INTERLOCKED_EXCHANGE(const_cast(addend), value); } Chris@16: Chris@16: //Forward functions Chris@101: inline hmodule load_library(const char *name) Chris@16: { return LoadLibraryA(name); } Chris@16: Chris@101: inline bool free_library(hmodule module) Chris@16: { return 0 != FreeLibrary(module); } Chris@16: Chris@101: inline farproc_t get_proc_address(hmodule module, const char *name) Chris@16: { return GetProcAddress(module, name); } Chris@16: Chris@16: inline void *get_current_process() Chris@16: { return GetCurrentProcess(); } Chris@16: Chris@101: inline hmodule get_module_handle(const char *name) Chris@16: { return GetModuleHandleA(name); } Chris@16: Chris@101: inline long reg_open_key_ex(hkey hKey, const char *lpSubKey, unsigned long ulOptions, unsigned long samDesired, hkey *phkResult) Chris@16: { return RegOpenKeyExA(hKey, lpSubKey, ulOptions, samDesired, phkResult); } Chris@16: Chris@101: inline long reg_query_value_ex(hkey hKey, const char *lpValueName, unsigned long*lpReserved, unsigned long*lpType, unsigned char *lpData, unsigned long*lpcbData) Chris@16: { return RegQueryValueExA(hKey, lpValueName, lpReserved, lpType, lpData, lpcbData); } Chris@16: Chris@101: inline long reg_close_key(hkey hKey) Chris@16: { return RegCloseKey(hKey); } Chris@16: Chris@16: inline void initialize_object_attributes Chris@16: ( object_attributes_t *pobject_attr, unicode_string_t *name Chris@16: , unsigned long attr, void *rootdir, void *security_descr) Chris@16: Chris@16: { Chris@16: pobject_attr->Length = sizeof(object_attributes_t); Chris@16: pobject_attr->RootDirectory = rootdir; Chris@16: pobject_attr->Attributes = attr; Chris@16: pobject_attr->ObjectName = name; Chris@16: pobject_attr->SecurityDescriptor = security_descr; Chris@16: pobject_attr->SecurityQualityOfService = 0; Chris@16: } Chris@16: Chris@16: inline void rtl_init_empty_unicode_string(unicode_string_t *ucStr, wchar_t *buf, unsigned short bufSize) Chris@16: { Chris@16: ucStr->Buffer = buf; Chris@16: ucStr->Length = 0; Chris@16: ucStr->MaximumLength = bufSize; Chris@16: } Chris@16: Chris@16: //A class that locates and caches loaded DLL function addresses. Chris@16: template Chris@16: struct function_address_holder Chris@16: { Chris@16: enum { NtSetInformationFile Chris@16: , NtQuerySystemInformation Chris@16: , NtQueryObject Chris@16: , NtQuerySemaphore Chris@16: , NtQuerySection Chris@16: , NtOpenFile Chris@16: , NtClose Chris@16: , NtQueryTimerResolution Chris@16: , NtSetTimerResolution Chris@16: , QueryPerformanceCounter Chris@16: , QueryPerformanceFrequency Chris@16: , NumFunction Chris@16: }; Chris@16: enum { NtDll_dll, Kernel32_dll, NumModule }; Chris@16: Chris@16: private: Chris@16: static const char *FunctionNames[NumFunction]; Chris@16: static const char *ModuleNames[NumModule]; Chris@101: static farproc_t FunctionAddresses[NumFunction]; Chris@16: static unsigned int FunctionModules[NumFunction]; Chris@16: static volatile long FunctionStates[NumFunction]; Chris@101: static hmodule ModuleAddresses[NumModule]; Chris@16: static volatile long ModuleStates[NumModule]; Chris@16: Chris@101: static hmodule get_module_from_id(unsigned int id) Chris@16: { Chris@16: BOOST_ASSERT(id < (unsigned int)NumModule); Chris@101: hmodule addr = get_module_handle(ModuleNames[id]); Chris@16: BOOST_ASSERT(addr); Chris@16: return addr; Chris@16: } Chris@16: Chris@101: static hmodule get_module(const unsigned int id) Chris@16: { Chris@16: BOOST_ASSERT(id < (unsigned int)NumModule); Chris@16: for(unsigned i = 0; ModuleStates[id] < 2; ++i){ Chris@16: if(interlocked_compare_exchange(&ModuleStates[id], 1, 0) == 0){ Chris@16: ModuleAddresses[id] = get_module_from_id(id); Chris@16: interlocked_increment(&ModuleStates[id]); Chris@16: break; Chris@16: } Chris@16: else if(i & 1){ Chris@16: sched_yield(); Chris@16: } Chris@16: else{ Chris@16: sleep_tick(); Chris@16: } Chris@16: } Chris@16: return ModuleAddresses[id]; Chris@16: } Chris@16: Chris@101: static farproc_t get_address_from_dll(const unsigned int id) Chris@16: { Chris@16: BOOST_ASSERT(id < (unsigned int)NumFunction); Chris@101: farproc_t addr = get_proc_address(get_module(FunctionModules[id]), FunctionNames[id]); Chris@16: BOOST_ASSERT(addr); Chris@16: return addr; Chris@16: } Chris@16: Chris@16: public: Chris@101: static farproc_t get(const unsigned int id) Chris@16: { Chris@16: BOOST_ASSERT(id < (unsigned int)NumFunction); Chris@16: for(unsigned i = 0; FunctionStates[id] < 2; ++i){ Chris@16: if(interlocked_compare_exchange(&FunctionStates[id], 1, 0) == 0){ Chris@16: FunctionAddresses[id] = get_address_from_dll(id); Chris@16: interlocked_increment(&FunctionStates[id]); Chris@16: break; Chris@16: } Chris@16: else if(i & 1){ Chris@16: sched_yield(); Chris@16: } Chris@16: else{ Chris@16: sleep_tick(); Chris@16: } Chris@16: } Chris@16: return FunctionAddresses[id]; Chris@16: } Chris@16: }; Chris@16: Chris@16: template Chris@16: const char *function_address_holder::FunctionNames[function_address_holder::NumFunction] = Chris@16: { Chris@16: "NtSetInformationFile", Chris@16: "NtQuerySystemInformation", Chris@16: "NtQueryObject", Chris@16: "NtQuerySemaphore", Chris@16: "NtQuerySection", Chris@16: "NtOpenFile", Chris@16: "NtClose", Chris@16: "NtQueryTimerResolution", Chris@16: "NtSetTimerResolution", Chris@16: "QueryPerformanceCounter", Chris@16: "QueryPerformanceFrequency" Chris@16: }; Chris@16: Chris@16: template Chris@101: unsigned int function_address_holder::FunctionModules[function_address_holder::NumFunction] = Chris@16: { Chris@16: NtDll_dll, Chris@16: NtDll_dll, Chris@16: NtDll_dll, Chris@16: NtDll_dll, Chris@16: NtDll_dll, Chris@16: NtDll_dll, Chris@16: NtDll_dll, Chris@16: NtDll_dll, Chris@16: NtDll_dll, Chris@16: Kernel32_dll, Chris@16: Kernel32_dll Chris@16: }; Chris@16: Chris@16: template Chris@101: const char *function_address_holder::ModuleNames[function_address_holder::NumModule] = Chris@16: { Chris@16: "ntdll.dll", Chris@16: "kernel32.dll" Chris@16: }; Chris@16: Chris@16: Chris@16: template Chris@101: farproc_t function_address_holder::FunctionAddresses[function_address_holder::NumFunction]; Chris@16: Chris@16: template Chris@16: volatile long function_address_holder::FunctionStates[function_address_holder::NumFunction]; Chris@16: Chris@16: template Chris@101: hmodule function_address_holder::ModuleAddresses[function_address_holder::NumModule]; Chris@16: Chris@16: template Chris@16: volatile long function_address_holder::ModuleStates[function_address_holder::NumModule]; Chris@16: Chris@16: Chris@16: struct dll_func Chris@16: : public function_address_holder<0> Chris@16: {}; Chris@16: Chris@16: //Complex winapi based functions... Chris@16: struct library_unloader Chris@16: { Chris@101: hmodule lib_; Chris@101: library_unloader(hmodule module) : lib_(module){} Chris@16: ~library_unloader(){ free_library(lib_); } Chris@16: }; Chris@16: Chris@16: Chris@16: inline bool get_system_time_of_day_information(system_timeofday_information &info) Chris@16: { Chris@16: NtQuerySystemInformation_t pNtQuerySystemInformation = (NtQuerySystemInformation_t) Chris@16: dll_func::get(dll_func::NtQuerySystemInformation); Chris@16: unsigned long res; Chris@16: long status = pNtQuerySystemInformation(system_time_of_day_information, &info, sizeof(info), &res); Chris@16: if(status){ Chris@16: return false; Chris@16: } Chris@16: return true; Chris@16: } Chris@16: Chris@16: inline bool get_boot_time(unsigned char (&bootstamp) [BootstampLength]) Chris@16: { Chris@16: system_timeofday_information info; Chris@16: bool ret = get_system_time_of_day_information(info); Chris@16: if(!ret){ Chris@16: return false; Chris@16: } Chris@16: std::memcpy(&bootstamp[0], &info.Reserved1, sizeof(bootstamp)); Chris@16: return true; Chris@16: } Chris@16: Chris@16: inline bool get_boot_and_system_time(unsigned char (&bootsystemstamp) [BootAndSystemstampLength]) Chris@16: { Chris@16: system_timeofday_information info; Chris@16: bool ret = get_system_time_of_day_information(info); Chris@16: if(!ret){ Chris@16: return false; Chris@16: } Chris@16: std::memcpy(&bootsystemstamp[0], &info.Reserved1, sizeof(bootsystemstamp)); Chris@16: return true; Chris@16: } Chris@16: Chris@101: inline bool get_boot_time_str(char *bootstamp_str, std::size_t &s) Chris@101: //will write BootstampLength chars Chris@16: { Chris@16: if(s < (BootstampLength*2)) Chris@16: return false; Chris@16: system_timeofday_information info; Chris@16: bool ret = get_system_time_of_day_information(info); Chris@16: if(!ret){ Chris@16: return false; Chris@16: } Chris@16: const char Characters [] = Chris@16: { '0', '1', '2', '3', '4', '5', '6', '7' Chris@16: , '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; Chris@16: std::size_t char_counter = 0; Chris@16: for(std::size_t i = 0; i != static_cast(BootstampLength); ++i){ Chris@16: bootstamp_str[char_counter++] = Characters[(info.Reserved1[i]&0xF0)>>4]; Chris@16: bootstamp_str[char_counter++] = Characters[(info.Reserved1[i]&0x0F)]; Chris@16: } Chris@16: s = BootstampLength*2; Chris@16: return true; Chris@16: } Chris@16: Chris@16: //Writes the hexadecimal value of the buffer, in the wide character string. Chris@16: //str must be twice length Chris@16: inline void buffer_to_wide_str(const void *buf, std::size_t length, wchar_t *str) Chris@16: { Chris@16: const wchar_t Characters [] = Chris@16: { L'0', L'1', L'2', L'3', L'4', L'5', L'6', L'7' Chris@16: , L'8', L'9', L'A', L'B', L'C', L'D', L'E', L'F' }; Chris@16: std::size_t char_counter = 0; Chris@16: const char *chbuf = static_cast(buf); Chris@16: for(std::size_t i = 0; i != length; ++i){ Chris@16: str[char_counter++] = Characters[(chbuf[i]&0xF0)>>4]; Chris@16: str[char_counter++] = Characters[(chbuf[i]&0x0F)]; Chris@16: } Chris@16: } Chris@16: Chris@101: inline bool get_boot_and_system_time_wstr(wchar_t *bootsystemstamp, std::size_t &s) Chris@101: //will write BootAndSystemstampLength chars Chris@16: { Chris@16: if(s < (BootAndSystemstampLength*2)) Chris@16: return false; Chris@16: system_timeofday_information info; Chris@16: bool ret = get_system_time_of_day_information(info); Chris@16: if(!ret){ Chris@16: return false; Chris@16: } Chris@16: Chris@16: buffer_to_wide_str(&info.Reserved1[0], BootAndSystemstampLength, bootsystemstamp); Chris@16: s = BootAndSystemstampLength*2; Chris@16: return true; Chris@16: } Chris@16: Chris@16: class handle_closer Chris@16: { Chris@16: void *handle_; Chris@16: handle_closer(const handle_closer &); Chris@16: handle_closer& operator=(const handle_closer &); Chris@16: public: Chris@16: explicit handle_closer(void *handle) : handle_(handle){} Chris@16: ~handle_closer() Chris@16: { close_handle(handle_); } Chris@16: }; Chris@16: Chris@16: class eventlog_handle_closer Chris@16: { Chris@16: void *handle_; Chris@16: eventlog_handle_closer(const handle_closer &); Chris@16: eventlog_handle_closer& operator=(const eventlog_handle_closer &); Chris@16: public: Chris@16: explicit eventlog_handle_closer(void *handle) : handle_(handle){} Chris@16: ~eventlog_handle_closer() Chris@16: { CloseEventLog(handle_); } Chris@16: }; Chris@16: Chris@16: union ntquery_mem_t Chris@16: { Chris@16: object_name_information_t name; Chris@16: struct ren_t Chris@16: { Chris@16: file_rename_information_t info; Chris@16: wchar_t buf[1]; Chris@16: } ren; Chris@16: }; Chris@16: Chris@16: class nt_query_mem_deleter Chris@16: { Chris@16: static const std::size_t rename_offset = offsetof(ntquery_mem_t, ren.info.FileName) - Chris@16: offsetof(ntquery_mem_t, name.Name.Buffer); Chris@16: // Timestamp process id atomic count Chris@101: static const std::size_t rename_suffix = Chris@101: (SystemTimeOfDayInfoLength + sizeof(unsigned long) + sizeof(boost::uint32_t))*2; Chris@16: Chris@16: public: Chris@16: nt_query_mem_deleter(std::size_t object_name_information_size) Chris@16: : m_size(object_name_information_size + rename_offset + rename_suffix) Chris@16: , m_buf(new char [m_size]) Chris@16: {} Chris@16: Chris@16: ~nt_query_mem_deleter() Chris@16: { Chris@16: delete[]m_buf; Chris@16: } Chris@16: Chris@16: void realloc_mem(std::size_t num_bytes) Chris@16: { Chris@16: num_bytes += rename_suffix + rename_offset; Chris@16: char *buf = m_buf; Chris@16: m_buf = new char[num_bytes]; Chris@16: delete[]buf; Chris@16: m_size = num_bytes; Chris@16: } Chris@16: Chris@16: ntquery_mem_t *query_mem() const Chris@101: { return static_cast(static_cast(m_buf)); } Chris@16: Chris@16: unsigned long object_name_information_size() const Chris@101: { Chris@101: return static_cast(m_size - rename_offset - SystemTimeOfDayInfoLength*2); Chris@101: } Chris@16: Chris@16: std::size_t file_rename_information_size() const Chris@16: { return static_cast(m_size); } Chris@16: Chris@16: private: Chris@16: std::size_t m_size; Chris@16: char *m_buf; Chris@16: }; Chris@16: Chris@16: class c_heap_deleter Chris@16: { Chris@16: public: Chris@16: c_heap_deleter(std::size_t size) Chris@16: : m_buf(::malloc(size)) Chris@16: {} Chris@16: Chris@16: ~c_heap_deleter() Chris@16: { Chris@16: if(m_buf) ::free(m_buf); Chris@16: } Chris@16: Chris@16: void realloc_mem(std::size_t num_bytes) Chris@16: { Chris@16: void *buf = ::realloc(m_buf, num_bytes); Chris@16: if(!buf){ Chris@16: free(m_buf); Chris@16: m_buf = 0; Chris@16: } Chris@16: } Chris@16: Chris@16: void *get() const Chris@16: { return m_buf; } Chris@16: Chris@16: private: Chris@16: void *m_buf; Chris@16: }; Chris@16: Chris@16: inline bool unlink_file(const char *filename) Chris@16: { Chris@16: //Don't try to optimize doing a DeleteFile first Chris@16: //as there are interactions with permissions and Chris@16: //in-use files. Chris@16: // Chris@16: //if(!delete_file(filename)){ Chris@16: // (...) Chris@16: // Chris@16: Chris@16: //This functions tries to emulate UNIX unlink semantics in windows. Chris@16: // Chris@16: //- Open the file and mark the handle as delete-on-close Chris@16: //- Rename the file to an arbitrary name based on a random number Chris@16: //- Close the handle. If there are no file users, it will be deleted. Chris@16: // Otherwise it will be used by already connected handles but the Chris@16: // file name can't be used to open this file again Chris@16: try{ Chris@16: NtSetInformationFile_t pNtSetInformationFile = Chris@16: (NtSetInformationFile_t)dll_func::get(dll_func::NtSetInformationFile); Chris@16: Chris@16: NtQueryObject_t pNtQueryObject = (NtQueryObject_t)dll_func::get(dll_func::NtQueryObject); Chris@16: Chris@16: //First step: Obtain a handle to the file using Win32 rules. This resolves relative paths Chris@16: void *fh = create_file(filename, generic_read | delete_access, open_existing, 0, 0); Chris@16: if(fh == invalid_handle_value){ Chris@16: return false; Chris@16: } Chris@16: Chris@16: handle_closer h_closer(fh); Chris@16: { Chris@16: //Obtain name length Chris@16: unsigned long size; Chris@16: const std::size_t initial_string_mem = 512u; Chris@16: Chris@16: nt_query_mem_deleter nt_query_mem(sizeof(ntquery_mem_t)+initial_string_mem); Chris@16: //Obtain file name with guessed length Chris@16: if(pNtQueryObject(fh, object_name_information, nt_query_mem.query_mem(), nt_query_mem.object_name_information_size(), &size)){ Chris@16: //Obtain file name with exact length buffer Chris@16: nt_query_mem.realloc_mem(size); Chris@16: if(pNtQueryObject(fh, object_name_information, nt_query_mem.query_mem(), nt_query_mem.object_name_information_size(), &size)){ Chris@16: return false; Chris@16: } Chris@16: } Chris@16: ntquery_mem_t *pmem = nt_query_mem.query_mem(); Chris@16: file_rename_information_t *pfri = &pmem->ren.info; Chris@16: const std::size_t RenMaxNumChars = Chris@16: (((char*)(pmem) + nt_query_mem.file_rename_information_size()) - (char*)&pmem->ren.info.FileName[0])/sizeof(wchar_t); Chris@16: Chris@16: //Copy filename to the rename member Chris@16: std::memmove(pmem->ren.info.FileName, pmem->name.Name.Buffer, pmem->name.Name.Length); Chris@16: std::size_t filename_string_length = pmem->name.Name.Length/sizeof(wchar_t); Chris@16: Chris@16: //Search '\\' character to replace from it Chris@16: for(std::size_t i = filename_string_length; i != 0; --filename_string_length){ Chris@16: if(pmem->ren.info.FileName[--i] == L'\\') Chris@16: break; Chris@16: } Chris@16: Chris@16: //Add random number Chris@16: std::size_t s = RenMaxNumChars - filename_string_length; Chris@16: if(!get_boot_and_system_time_wstr(&pfri->FileName[filename_string_length], s)){ Chris@16: return false; Chris@16: } Chris@16: filename_string_length += s; Chris@16: Chris@16: //Sometimes the precission of the timestamp is not enough and we need to add another random number. Chris@16: //The process id (to exclude concurrent processes) and an atomic count (to exclude concurrent threads). Chris@16: //should be enough Chris@16: const unsigned long pid = get_current_process_id(); Chris@16: buffer_to_wide_str(&pid, sizeof(pid), &pfri->FileName[filename_string_length]); Chris@16: filename_string_length += sizeof(pid)*2; Chris@16: Chris@16: static volatile boost::uint32_t u32_count = 0; Chris@16: interlocked_decrement(reinterpret_cast(&u32_count)); Chris@16: buffer_to_wide_str(const_cast(&u32_count), sizeof(boost::uint32_t), &pfri->FileName[filename_string_length]); Chris@16: filename_string_length += sizeof(boost::uint32_t)*2; Chris@16: Chris@16: //Fill rename information (FileNameLength is in bytes) Chris@16: pfri->FileNameLength = static_cast(sizeof(wchar_t)*(filename_string_length)); Chris@16: pfri->Replace = 1; Chris@16: pfri->RootDir = 0; Chris@16: Chris@16: //Cange the name of the in-use file... Chris@16: io_status_block_t io; Chris@16: if(0 != pNtSetInformationFile(fh, &io, pfri, nt_query_mem.file_rename_information_size(), file_rename_information)){ Chris@16: return false; Chris@16: } Chris@16: } Chris@16: //...and mark it as delete-on-close Chris@16: { Chris@16: //Don't use pNtSetInformationFile with file_disposition_information as it can return STATUS_CANNOT_DELETE Chris@16: //if the file is still mapped. Reopen it with NtOpenFile and file_delete_on_close Chris@16: NtOpenFile_t pNtOpenFile = (NtOpenFile_t)dll_func::get(dll_func::NtOpenFile); Chris@16: NtClose_t pNtClose = (NtClose_t)dll_func::get(dll_func::NtClose); Chris@16: const wchar_t empty_str [] = L""; Chris@16: unicode_string_t ustring = { sizeof(empty_str) - sizeof (wchar_t) //length in bytes without null Chris@16: , sizeof(empty_str) //total size in bytes of memory allocated for Buffer. Chris@16: , const_cast(empty_str) Chris@16: }; Chris@16: object_attributes_t object_attr; Chris@101: initialize_object_attributes(&object_attr, &ustring, 0, fh, 0); Chris@16: void* fh2 = 0; Chris@16: io_status_block_t io; Chris@16: pNtOpenFile( &fh2, delete_flag, &object_attr, &io Chris@16: , file_share_read | file_share_write | file_share_delete, file_delete_on_close); Chris@16: pNtClose(fh2); Chris@16: //Even if NtOpenFile fails, the file was renamed and the original no longer exists, so return a success status Chris@16: return true; Chris@16: } Chris@16: } Chris@16: catch(...){ Chris@16: return false; Chris@16: } Chris@16: return true; Chris@16: } Chris@16: Chris@16: struct reg_closer Chris@16: { Chris@101: hkey key_; Chris@101: reg_closer(hkey key) : key_(key){} Chris@16: ~reg_closer(){ reg_close_key(key_); } Chris@16: }; Chris@16: Chris@16: inline void get_shared_documents_folder(std::string &s) Chris@16: { Chris@101: #if 1 //Original registry search code Chris@16: s.clear(); Chris@101: hkey key; Chris@16: if (reg_open_key_ex( hkey_local_machine Chris@16: , "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders" Chris@16: , 0 Chris@16: , key_query_value Chris@16: , &key) == 0){ Chris@16: reg_closer key_closer(key); Chris@16: Chris@16: //Obtain the value Chris@16: unsigned long size; Chris@16: unsigned long type; Chris@16: const char *const reg_value = "Common AppData"; Chris@16: //long err = (*pRegQueryValue)( key, reg_value, 0, &type, 0, &size); Chris@16: long err = reg_query_value_ex( key, reg_value, 0, &type, 0, &size); Chris@16: if(!err){ Chris@16: //Size includes terminating NULL Chris@16: s.resize(size); Chris@16: //err = (*pRegQueryValue)( key, reg_value, 0, &type, (unsigned char*)(&s[0]), &size); Chris@16: err = reg_query_value_ex( key, reg_value, 0, &type, (unsigned char*)(&s[0]), &size); Chris@16: if(!err) Chris@16: s.erase(s.end()-1); Chris@16: (void)err; Chris@16: } Chris@16: } Chris@101: #else //registry alternative: SHGetSpecialFolderPathA Chris@101: const int BIPC_CSIDL_COMMON_APPDATA = 0x0023; // All Users\Application Data Chris@101: const int BIPC_CSIDL_FLAG_CREATE = 0x8000; // new for Win2K, or this in to force creation of folder Chris@101: const int BIPC_SHGFP_TYPE_CURRENT = 0; // current value for user, verify it exists Chris@101: Chris@101: s.clear(); Chris@101: char szPath[max_path]; Chris@101: if(0 == SHGetFolderPathA(0, BIPC_CSIDL_COMMON_APPDATA | BIPC_CSIDL_FLAG_CREATE, 0, BIPC_SHGFP_TYPE_CURRENT, szPath)){ Chris@101: s = szPath; Chris@101: } Chris@101: Chris@101: #endif Chris@16: } Chris@16: Chris@16: inline void get_registry_value(const char *folder, const char *value_key, std::vector &s) Chris@16: { Chris@16: s.clear(); Chris@101: hkey key; Chris@16: if (reg_open_key_ex( hkey_local_machine Chris@16: , folder Chris@16: , 0 Chris@16: , key_query_value Chris@16: , &key) == 0){ Chris@16: reg_closer key_closer(key); Chris@16: Chris@16: //Obtain the value Chris@16: unsigned long size; Chris@16: unsigned long type; Chris@16: const char *const reg_value = value_key; Chris@16: //long err = (*pRegQueryValue)( key, reg_value, 0, &type, 0, &size); Chris@16: long err = reg_query_value_ex( key, reg_value, 0, &type, 0, &size); Chris@16: if(!err){ Chris@16: //Size includes terminating NULL Chris@16: s.resize(size); Chris@16: //err = (*pRegQueryValue)( key, reg_value, 0, &type, (unsigned char*)(&s[0]), &size); Chris@16: err = reg_query_value_ex( key, reg_value, 0, &type, (unsigned char*)(&s[0]), &size); Chris@16: if(!err) Chris@16: s.erase(s.end()-1); Chris@16: (void)err; Chris@16: } Chris@16: } Chris@16: } Chris@16: Chris@16: struct co_uninitializer Chris@16: { Chris@16: co_uninitializer(bool b_uninitialize) Chris@16: : m_b_uninitialize(b_uninitialize) Chris@16: {} Chris@16: Chris@16: ~co_uninitializer() Chris@16: { Chris@16: if(m_b_uninitialize){ Chris@16: CoUninitialize(); Chris@16: } Chris@16: } Chris@16: Chris@16: private: Chris@16: const bool m_b_uninitialize; Chris@16: }; Chris@16: Chris@16: template Chris@16: struct com_releaser Chris@16: { Chris@16: Object *&object_; Chris@16: com_releaser(Object *&object) : object_(object) {} Chris@16: ~com_releaser() { object_->Release(); object_ = 0; } Chris@16: }; Chris@16: Chris@16: inline bool get_wmi_class_attribute( std::wstring& strValue, const wchar_t *wmi_class, const wchar_t *wmi_class_var) Chris@16: { Chris@16: //See example http://msdn.microsoft.com/en-us/library/aa390423%28v=VS.85%29.aspx Chris@16: // Chris@16: //See BOOST_INTERPROCESS_WINDOWS_COINIT_MODEL definition if you need to change the Chris@16: //default value of this macro in your application Chris@16: long co_init_ret = CoInitializeEx(0, BOOST_INTERPROCESS_WINDOWS_COINIT_MODEL); Chris@16: if(co_init_ret != S_OK_BIPC && co_init_ret != S_FALSE_BIPC && co_init_ret != RPC_E_CHANGED_MODE_BIPC) Chris@16: return false; Chris@16: co_uninitializer co_initialize_end(co_init_ret != RPC_E_CHANGED_MODE_BIPC); Chris@16: (void)co_initialize_end; Chris@16: Chris@16: bool bRet = false; Chris@16: long sec_init_ret = CoInitializeSecurity Chris@16: ( 0 //pVoid Chris@16: ,-1 //cAuthSvc Chris@16: , 0 //asAuthSvc Chris@16: , 0 //pReserved1 Chris@16: , RPC_C_AUTHN_LEVEL_PKT_BIPC //dwAuthnLevel Chris@16: , RPC_C_IMP_LEVEL_IMPERSONATE_BIPC //dwImpLevel Chris@16: , 0 //pAuthList Chris@16: , EOAC_NONE_BIPC //dwCapabilities Chris@16: , 0 //pReserved3 Chris@16: ); Chris@16: if( 0 == sec_init_ret || RPC_E_TOO_LATE_BIPC == sec_init_ret) Chris@16: { Chris@16: IWbemLocator_BIPC * pIWbemLocator = 0; Chris@16: const wchar_t * bstrNamespace = L"root\\cimv2"; Chris@16: Chris@16: if( 0 != CoCreateInstance( Chris@16: CLSID_WbemAdministrativeLocator, Chris@16: 0, Chris@16: CLSCTX_INPROC_SERVER_BIPC | CLSCTX_LOCAL_SERVER_BIPC, Chris@16: IID_IUnknown, (void **)&pIWbemLocator)){ Chris@16: return false; Chris@16: } Chris@16: Chris@16: com_releaser IWbemLocator_releaser(pIWbemLocator); Chris@16: Chris@16: IWbemServices_BIPC *pWbemServices = 0; Chris@16: Chris@16: if( 0 != pIWbemLocator->ConnectServer( Chris@101: (bstr)bstrNamespace, // Namespace Chris@16: 0, // Userid Chris@16: 0, // PW Chris@16: 0, // Locale Chris@16: 0, // flags Chris@16: 0, // Authority Chris@16: 0, // Context Chris@16: &pWbemServices Chris@16: ) Chris@16: ){ Chris@16: return false; Chris@16: } Chris@16: Chris@16: if( S_OK_BIPC != CoSetProxyBlanket( Chris@16: pWbemServices, Chris@16: RPC_C_AUTHN_DEFAULT_BIPC, Chris@16: RPC_C_AUTHZ_DEFAULT_BIPC, Chris@16: 0, Chris@16: RPC_C_AUTHN_LEVEL_PKT_BIPC, Chris@16: RPC_C_IMP_LEVEL_IMPERSONATE_BIPC, Chris@16: 0, Chris@16: EOAC_NONE_BIPC Chris@16: ) Chris@16: ){ Chris@16: return false; Chris@16: } Chris@16: Chris@16: com_releaser IWbemServices_releaser(pWbemServices); Chris@16: Chris@16: strValue.clear(); Chris@16: strValue += L"Select "; Chris@16: strValue += wmi_class_var; Chris@16: strValue += L" from "; Chris@16: strValue += wmi_class; Chris@16: Chris@16: IEnumWbemClassObject_BIPC * pEnumObject = 0; Chris@16: Chris@16: if ( 0 != pWbemServices->ExecQuery( Chris@101: (bstr)L"WQL", Chris@101: (bstr)strValue.c_str(), Chris@16: //WBEM_FLAG_RETURN_IMMEDIATELY_BIPC, Chris@16: WBEM_FLAG_RETURN_WHEN_COMPLETE_BIPC | WBEM_FLAG_FORWARD_ONLY_BIPC, Chris@16: 0, Chris@16: &pEnumObject Chris@16: ) Chris@16: ){ Chris@16: return false; Chris@16: } Chris@16: Chris@16: com_releaser IEnumWbemClassObject_releaser(pEnumObject); Chris@16: Chris@16: //WBEM_FLAG_FORWARD_ONLY_BIPC incompatible with Reset Chris@16: //if ( 0 != pEnumObject->Reset() ){ Chris@16: //return false; Chris@16: //} Chris@16: Chris@16: wchar_variant vwchar; Chris@16: unsigned long uCount = 1, uReturned; Chris@16: IWbemClassObject_BIPC * pClassObject = 0; Chris@16: while( 0 == pEnumObject->Next( WBEM_INFINITE_BIPC, uCount, &pClassObject, &uReturned ) ) Chris@16: { Chris@16: com_releaser IWbemClassObject_releaser(pClassObject); Chris@101: if ( 0 == pClassObject->Get( (bstr)L"LastBootUpTime", 0, &vwchar, 0, 0 ) ){ Chris@16: bRet = true; Chris@101: strValue = (wchar_t*)vwchar.bstrVal; Chris@16: VariantClear(&vwchar ); Chris@16: break; Chris@16: } Chris@16: } Chris@16: } Chris@16: return bRet; Chris@16: } Chris@16: Chris@16: #ifdef BOOST_INTERPROCESS_BOOTSTAMP_IS_LASTBOOTUPTIME Chris@16: Chris@16: //Obtains the bootup time from WMI LastBootUpTime. Chris@16: //This time seems to change with hibernation and clock synchronization so avoid it. Chris@16: inline bool get_last_bootup_time( std::wstring& strValue ) Chris@16: { Chris@16: bool ret = get_wmi_class_attribute(strValue, L"Win32_OperatingSystem", L"LastBootUpTime"); Chris@16: std::size_t timezone = strValue.find(L'+'); Chris@16: if(timezone != std::wstring::npos){ Chris@16: strValue.erase(timezone); Chris@16: } Chris@16: timezone = strValue.find(L'-'); Chris@16: if(timezone != std::wstring::npos){ Chris@16: strValue.erase(timezone); Chris@16: } Chris@16: return ret; Chris@16: } Chris@16: Chris@16: inline bool get_last_bootup_time( std::string& str ) Chris@16: { Chris@16: std::wstring wstr; Chris@16: bool ret = get_last_bootup_time(wstr); Chris@16: str.resize(wstr.size()); Chris@16: for(std::size_t i = 0, max = str.size(); i != max; ++i){ Chris@16: str[i] = '0' + (wstr[i]-L'0'); Chris@16: } Chris@16: return ret; Chris@16: } Chris@16: Chris@16: #else Chris@16: Chris@16: // Loop through the buffer and obtain the contents of the Chris@16: // requested record in the buffer. Chris@16: inline bool find_record_in_buffer( const void* pBuffer, unsigned long dwBytesRead, const char *provider_name Chris@16: , unsigned int id_to_find, interprocess_eventlogrecord *&pevent_log_record) Chris@16: { Chris@16: const unsigned char * pRecord = static_cast(pBuffer); Chris@16: const unsigned char * pEndOfRecords = pRecord + dwBytesRead; Chris@16: Chris@16: while (pRecord < pEndOfRecords){ Chris@16: interprocess_eventlogrecord *pTypedRecord = (interprocess_eventlogrecord*)pRecord; Chris@16: // Check provider, written at the end of the fixed-part of the record Chris@16: if (0 == std::strcmp(provider_name, (char*)(pRecord + sizeof(interprocess_eventlogrecord)))) Chris@16: { Chris@16: // Check event id Chris@16: if(id_to_find == (pTypedRecord->EventID & 0xFFFF)){ Chris@16: pevent_log_record = pTypedRecord; Chris@16: return true; Chris@16: } Chris@16: } Chris@16: Chris@16: pRecord += pTypedRecord->Length; Chris@16: } Chris@16: pevent_log_record = 0; Chris@16: return false; Chris@16: } Chris@16: Chris@16: //Obtains the bootup time from the System Event Log, Chris@16: //event ID == 6005 (event log started). Chris@16: //Adapted from http://msdn.microsoft.com/en-us/library/windows/desktop/bb427356.aspx Chris@16: inline bool get_last_bootup_time(std::string &stamp) Chris@16: { Chris@16: const char *source_name = "System"; Chris@16: const char *provider_name = "EventLog"; Chris@16: const unsigned short event_id = 6005u; Chris@16: Chris@16: unsigned long status = 0; Chris@16: unsigned long dwBytesToRead = 0; Chris@16: unsigned long dwBytesRead = 0; Chris@16: unsigned long dwMinimumBytesToRead = 0; Chris@16: Chris@16: // The source name (provider) must exist as a subkey of Application. Chris@16: void *hEventLog = OpenEventLogA(0, source_name); Chris@16: if (hEventLog){ Chris@16: eventlog_handle_closer hnd_closer(hEventLog); (void)hnd_closer; Chris@101: // Allocate an initial block of memory used to read event records. The number Chris@16: // of records read into the buffer will vary depending on the size of each event. Chris@16: // The size of each event will vary based on the size of the user-defined Chris@101: // data included with each event, the number and length of insertion Chris@16: // strings, and other data appended to the end of the event record. Chris@16: dwBytesToRead = max_record_buffer_size; Chris@16: c_heap_deleter heap_deleter(dwBytesToRead); Chris@16: Chris@101: // Read blocks of records until you reach the end of the log or an Chris@16: // error occurs. The records are read from newest to oldest. If the buffer Chris@16: // is not big enough to hold a complete event record, reallocate the buffer. Chris@16: if (heap_deleter.get() != 0){ Chris@16: while (0 == status){ Chris@101: if (!ReadEventLogA(hEventLog, Chris@16: eventlog_sequential_read | eventlog_backwards_read, Chris@101: 0, Chris@16: heap_deleter.get(), Chris@16: dwBytesToRead, Chris@16: &dwBytesRead, Chris@16: &dwMinimumBytesToRead)) { Chris@16: status = get_last_error(); Chris@16: if (error_insufficient_buffer == status) { Chris@16: status = 0; Chris@16: dwBytesToRead = dwMinimumBytesToRead; Chris@16: heap_deleter.realloc_mem(dwMinimumBytesToRead); Chris@16: if (!heap_deleter.get()){ Chris@16: return false; Chris@16: } Chris@16: } Chris@16: else{ //Not found or EOF Chris@16: return false; Chris@16: } Chris@16: } Chris@16: else Chris@16: { Chris@16: interprocess_eventlogrecord *pTypedRecord; Chris@16: // Print the contents of each record in the buffer. Chris@16: if(find_record_in_buffer(heap_deleter.get(), dwBytesRead, provider_name, event_id, pTypedRecord)){ Chris@16: char stamp_str[sizeof(unsigned long)*3+1]; Chris@16: std::sprintf(&stamp_str[0], "%u", ((unsigned int)pTypedRecord->TimeGenerated)); Chris@16: stamp = stamp_str; Chris@16: break; Chris@16: } Chris@16: } Chris@16: } Chris@16: } Chris@16: } Chris@16: return true; Chris@16: } Chris@16: Chris@16: #endif Chris@16: Chris@16: inline bool is_directory(const char *path) Chris@16: { Chris@101: unsigned long attrib = GetFileAttributesA(path); Chris@16: Chris@101: return (attrib != invalid_file_attributes && Chris@101: (attrib & file_attribute_directory)); Chris@16: } Chris@16: Chris@16: inline bool get_file_mapping_size(void *file_mapping_hnd, __int64 &size) Chris@16: { Chris@16: NtQuerySection_t pNtQuerySection = Chris@16: (NtQuerySection_t)dll_func::get(dll_func::NtQuerySection); Chris@16: //Obtain file name Chris@16: interprocess_section_basic_information info; Chris@16: unsigned long ntstatus = Chris@16: pNtQuerySection(file_mapping_hnd, section_basic_information, &info, sizeof(info), 0); Chris@16: size = info.section_size; Chris@16: return !ntstatus; Chris@16: } Chris@16: Chris@16: inline bool get_semaphore_info(void *handle, long &count, long &limit) Chris@16: { Chris@16: winapi::interprocess_semaphore_basic_information info; Chris@16: winapi::NtQuerySemaphore_t pNtQuerySemaphore = Chris@16: (winapi::NtQuerySemaphore_t)dll_func::get(winapi::dll_func::NtQuerySemaphore); Chris@16: unsigned int ret_len; Chris@16: long status = pNtQuerySemaphore(handle, winapi::semaphore_basic_information, &info, sizeof(info), &ret_len); Chris@16: count = info.count; Chris@16: limit = info.limit; Chris@16: return !status; Chris@16: } Chris@16: Chris@101: inline bool query_timer_resolution(unsigned long *lowres, unsigned long *highres, unsigned long *curres) Chris@16: { Chris@16: winapi::NtQueryTimerResolution_t pNtQueryTimerResolution = Chris@16: (winapi::NtQueryTimerResolution_t)dll_func::get(winapi::dll_func::NtQueryTimerResolution); Chris@16: return !pNtQueryTimerResolution(lowres, highres, curres); Chris@16: } Chris@16: Chris@16: inline bool set_timer_resolution(unsigned long RequestedResolution, int Set, unsigned long* ActualResolution) Chris@16: { Chris@16: winapi::NtSetTimerResolution_t pNtSetTimerResolution = Chris@16: (winapi::NtSetTimerResolution_t)dll_func::get(winapi::dll_func::NtSetTimerResolution); Chris@16: return !pNtSetTimerResolution(RequestedResolution, Set, ActualResolution); Chris@16: } Chris@16: Chris@16: inline bool query_performance_counter(__int64 *lpPerformanceCount) Chris@16: { Chris@16: QueryPerformanceCounter_t pQueryPerformanceCounter = (QueryPerformanceCounter_t) Chris@16: dll_func::get(dll_func::QueryPerformanceCounter); Chris@16: return 0 != pQueryPerformanceCounter(lpPerformanceCount); Chris@16: } Chris@16: Chris@16: inline bool query_performance_frequency(__int64 *lpFrequency) Chris@16: { Chris@16: QueryPerformanceCounter_t pQueryPerformanceFrequency = (QueryPerformanceFrequency_t) Chris@16: dll_func::get(dll_func::QueryPerformanceFrequency); Chris@16: return 0 != pQueryPerformanceFrequency(lpFrequency); Chris@16: } Chris@16: Chris@16: inline unsigned long get_tick_count() Chris@16: { return GetTickCount(); } Chris@16: Chris@16: } //namespace winapi Chris@16: } //namespace interprocess Chris@16: } //namespace boost Chris@16: Chris@101: #if defined(BOOST_GCC) && (BOOST_GCC >= 40600) Chris@101: # pragma GCC diagnostic pop Chris@101: #endif Chris@101: Chris@16: #include Chris@16: Chris@101: #endif //#ifdef BOOST_INTERPROCESS_WIN32_API_HPP