216 lines
6 KiB
C
216 lines
6 KiB
C
|
|
||
|
// 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
|