Windows2000/private/mvdm/inc/sharewow.h
2020-09-30 17:12:32 +02:00

133 lines
3.8 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;
LPSHAREDTASKMEM LockWowSharedMemory(VOID)
{
DWORD dwWaitResult;
LPSHAREDTASKMEM RetVal = NULL;
SECURITY_DESCRIPTOR sd;
SECURITY_ATTRIBUTES sa;
InitializeSecurityDescriptor(&sd, SECURITY_DESCRIPTOR_REVISION);
SetSecurityDescriptorDacl(&sd, TRUE, NULL, FALSE); // NULL DACL == wide open
RtlZeroMemory(&sa, sizeof sa);
sa.nLength = sizeof sa;
sa.lpSecurityDescriptor = &sd;
if (! lpSharedWOWMem ) {
if (! hSharedWOWMutex) {
hSharedWOWMutex = CreateMutex(&sa, FALSE, szWowSharedMutexName); // will open if exists
if (! hSharedWOWMutex) {
goto Fail;
}
}
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:
return RetVal;
}
#endif