diff --git a/include/boost/interprocess/detail/win32_api.hpp b/include/boost/interprocess/detail/win32_api.hpp index aeb1060..fadcc44 100644 --- a/include/boost/interprocess/detail/win32_api.hpp +++ b/include/boost/interprocess/detail/win32_api.hpp @@ -22,8 +22,11 @@ # include # include # include +# if !defined(__MINGW32__) +# pragma comment( lib, "advapi32.lib" )//auto-unlink security features +# endif #else -# error "This file can only be included in Windows OS" +# error "This file can only be included in Windows OS" #endif //The structures used in Interprocess with the @@ -109,6 +112,7 @@ static const unsigned long file_end = 2; static const unsigned long lockfile_fail_immediately = 1; static const unsigned long lockfile_exclusive_lock = 2; static const unsigned long error_lock_violation = 33; +static const unsigned long security_descriptor_revision = 1; } //namespace winapi { } //namespace interprocess { @@ -178,7 +182,28 @@ struct interprocess_memory_basic_information unsigned long Type; }; +typedef struct _interprocess_acl +{ + unsigned char AclRevision; + unsigned char Sbz1; + unsigned short AclSize; + unsigned short AceCount; + unsigned short Sbz2; +} interprocess_acl; + +typedef struct _interprocess_security_descriptor +{ + unsigned char Revision; + unsigned char Sbz1; + unsigned short Control; + void *Owner; + void *Group; + interprocess_acl *Sacl; + interprocess_acl *Dacl; +} interprocess_security_descriptor; + //Some windows API declarations +extern "C" __declspec(dllimport) unsigned long __stdcall GetCurrentProcessId(); extern "C" __declspec(dllimport) unsigned long __stdcall GetCurrentThreadId(); extern "C" __declspec(dllimport) void __stdcall Sleep(unsigned long); extern "C" __declspec(dllimport) unsigned long __stdcall GetLastError(); @@ -223,7 +248,10 @@ extern "C" __declspec(dllimport) int __stdcall UnlockFile(void *hnd, unsigned lo 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); extern "C" __declspec(dllimport) int __stdcall UnlockFileEx(void *hnd, unsigned long reserved, unsigned long size_low, unsigned long size_high, interprocess_overlapped* overlapped); extern "C" __declspec(dllimport) int __stdcall WriteFile(void *hnd, const void *buffer, unsigned long bytes_to_write, unsigned long *bytes_written, interprocess_overlapped* overlapped); - +extern "C" __declspec(dllimport) int __stdcall InitializeSecurityDescriptor + (void *pSecurityDescriptor, unsigned long dwRevision); +extern "C" __declspec(dllimport) int __stdcall SetSecurityDescriptorDacl + ( void *pSecurityDescriptor, int bDaclPresent, interprocess_acl *pDacl, int bDaclDefaulted); /* extern "C" __declspec(dllimport) long __stdcall InterlockedIncrement( long volatile * ); extern "C" __declspec(dllimport) long __stdcall InterlockedDecrement( long volatile * ); @@ -266,6 +294,9 @@ static inline void sched_yield() static inline unsigned long get_current_thread_id() { return GetCurrentThreadId(); } +static inline unsigned long get_current_process_id() +{ return GetCurrentProcessId(); } + static inline unsigned int close_handle(void* handle) { return CloseHandle(handle); } @@ -313,7 +344,20 @@ static inline void *open_semaphore(const char *name) { return OpenSemaphoreA(semaphore_all_access, 1, name); } static inline void * create_file_mapping (void * handle, unsigned long access, unsigned long high_size, unsigned long low_size, const char * name) -{ return CreateFileMappingA (handle, 0, access, high_size, low_size, name); } +{ + interprocess_security_attributes sa; + interprocess_security_descriptor sd; + + if(!InitializeSecurityDescriptor(&sd, security_descriptor_revision)) + return 0; + if(!SetSecurityDescriptorDacl(&sd, true, 0, false)) + return 0; + sa.lpSecurityDescriptor = &sd; + sa.nLength = sizeof(interprocess_security_attributes); + sa.bInheritHandle = false; + return CreateFileMappingA (handle, &sa, access, high_size, low_size, name); + //return CreateFileMappingA (handle, 0, access, high_size, low_size, name); +} static inline void * open_file_mapping (unsigned long access, const char *name) { return OpenFileMappingA (access, 0, name); }