// Some nice shared memory macros // // Changed by DaveHart 25-Feb-96 so that the shared memory // is kept open and mapped for the duration of the process. // At the same time added needed synchronization. // #define LOCKSHAREWOW() LockWowSharedMemory() #define UNLOCKSHAREWOW() ReleaseMutex(hSharedWOWMutex) #define MAX_SHARED_OBJECTS 200 typedef struct _SHAREDTASKMEM { BOOL fInitialized; DWORD dwFirstProcess; // Offset into shared memory where 1st shared process struct begins } SHAREDTASKMEM, *LPSHAREDTASKMEM; typedef struct _SHAREDPROCESS { DWORD dwType; DWORD dwProcessId; DWORD dwAttributes; // WOW_SYSTEM for shared WOW DWORD dwNextProcess; // Offset into shared memory where next shared process struct begins DWORD dwFirstTask; // Offset into shared memory where 1st task for this process begins LPTHREAD_START_ROUTINE pfnW32HungAppNotifyThread; // For VDMTerminateTaskWOW } SHAREDPROCESS, *LPSHAREDPROCESS; typedef struct _SHAREDTASK { DWORD dwType; DWORD dwThreadId; WORD hTask16; WORD hMod16; DWORD dwNextTask; // Offset into shared memory where next task for this process begins CHAR szModName[9]; // null terminated CHAR szFilePath[128]; // null terminated } SHAREDTASK, *LPSHAREDTASK; typedef union _SHAREDMEMOBJECT { SHAREDPROCESS sp; SHAREDTASK st; DWORD dwType; } SHAREDMEMOBJECT, *LPSHAREDMEMOBJECT; #define SMO_AVAILABLE 0 #define SMO_PROCESS 1 #define SMO_TASK 2 #ifndef SHAREWOW_MAIN extern HANDLE hSharedWOWMem; extern LPSHAREDTASKMEM lpSharedWOWMem; extern CHAR szWowSharedMemName[]; extern HANDLE hSharedWOWMutex; LPSHAREDTASKMEM LockWowSharedMemory(VOID); #else HANDLE hSharedWOWMem = NULL; LPSHAREDTASKMEM lpSharedWOWMem = NULL; CHAR szWowSharedMemName[] = "msvdmdbg.wow"; CHAR szWowSharedMutexName[] = "msvdmdbg.mtx"; HANDLE hSharedWOWMutex = NULL; #define MALLOC_SHAREWOW(cb) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, cb) #define FREE_SHAREWOW(addr) HeapFree(GetProcessHeap(), 0, addr) BOOL WOWCreateSecurityDescriptor(PSECURITY_DESCRIPTOR* ppsd) { SID_IDENTIFIER_AUTHORITY WorldAuthority = SECURITY_WORLD_SID_AUTHORITY; PSID Anyone = NULL; ULONG AclSize; ACL* pAcl; PSECURITY_DESCRIPTOR psd = NULL; BOOL fSuccess = FALSE; // -- create world authority if (!AllocateAndInitializeSid(&WorldAuthority, 1, SECURITY_WORLD_RID, 0, 0, 0, 0, 0, 0, 0, &Anyone)) { goto Fail; } // -- calc the size of the ACL (one ace) // 1 is one ACE, which includes a single ULONG from SID, since we add the size // of any Sids in -- we don't need to count the said ULONG twice AclSize = sizeof(ACL) + (1 * (sizeof(ACCESS_ALLOWED_ACE) - sizeof(ULONG))) + GetLengthSid(Anyone); psd = (PSECURITY_DESCRIPTOR)MALLOC_SHAREWOW(SECURITY_DESCRIPTOR_MIN_LENGTH + AclSize); if (NULL == psd) { goto Fail; } pAcl = (ACL*)((BYTE*)psd + SECURITY_DESCRIPTOR_MIN_LENGTH); if (!InitializeAcl(pAcl, AclSize, ACL_REVISION)) { goto Fail; } if (!AddAccessAllowedAce(pAcl, ACL_REVISION, (SPECIFIC_RIGHTS_ALL|STANDARD_RIGHTS_ALL) & ~(WRITE_DAC|WRITE_OWNER), Anyone)) { goto Fail; } InitializeSecurityDescriptor(psd, SECURITY_DESCRIPTOR_REVISION); if (!SetSecurityDescriptorDacl(psd, TRUE, pAcl, FALSE)) { goto Fail; } *ppsd = psd; fSuccess = TRUE; Fail: if (!fSuccess && NULL != psd) { FREE_SHAREWOW(psd); } if (NULL != Anyone) { FreeSid(Anyone); } return(fSuccess); } LPSHAREDTASKMEM LockWowSharedMemory(VOID) { DWORD dwWaitResult; LPSHAREDTASKMEM RetVal = NULL; PSECURITY_DESCRIPTOR psd = NULL; SECURITY_ATTRIBUTES sa; if (!WOWCreateSecurityDescriptor(&psd)) { goto Fail; } RtlZeroMemory(&sa, sizeof sa); sa.nLength = sizeof sa; sa.lpSecurityDescriptor = psd; if (! lpSharedWOWMem ) { if (!hSharedWOWMutex) { hSharedWOWMutex = OpenMutex(SYNCHRONIZE, FALSE, szWowSharedMutexName); if (!hSharedWOWMutex) { hSharedWOWMutex = CreateMutex(&sa, FALSE, szWowSharedMutexName); // will open if exists } if (! hSharedWOWMutex) { goto Fail; } } if (! hSharedWOWMem) { hSharedWOWMem = OpenFileMapping( FILE_MAP_WRITE, FALSE, szWowSharedMemName); if (!hSharedWOWMem) { hSharedWOWMem = CreateFileMapping( // will open if it exists (HANDLE)-1, &sa, PAGE_READWRITE, 0, sizeof(SHAREDTASKMEM) + (MAX_SHARED_OBJECTS * sizeof(SHAREDMEMOBJECT)), szWowSharedMemName); } if (! hSharedWOWMem) { goto Fail; } } lpSharedWOWMem = MapViewOfFile(hSharedWOWMem, FILE_MAP_WRITE, 0, 0, 0); if (! lpSharedWOWMem) { goto Fail; } } dwWaitResult = WaitForSingleObject(hSharedWOWMutex, INFINITE); if (dwWaitResult != WAIT_OBJECT_0 && dwWaitResult != WAIT_ABANDONED) { goto Fail; } RetVal = lpSharedWOWMem; goto Succeed; Fail: if (! RetVal) { if (hSharedWOWMutex) { CloseHandle(hSharedWOWMutex); hSharedWOWMutex = NULL; } if (lpSharedWOWMem) { UnmapViewOfFile(lpSharedWOWMem); lpSharedWOWMem = NULL; } if (hSharedWOWMem) { CloseHandle(hSharedWOWMem); hSharedWOWMem = NULL; } } Succeed: if (NULL != psd) { FREE_SHAREWOW(psd); } return RetVal; } #endif