newlib/winsup/cygwin/include/cygwin/cygwin_dll.h
Christopher Faylor e3c25c4a47 Update copyrights.
2001-09-11 20:01:02 +00:00

95 lines
2.8 KiB
C

/* cygwin_dll.h
Copyright 1998, 1999, 2000, 2001 Red Hat, Inc.
This file is part of Cygwin.
This software is a copyrighted work licensed under the terms of the
Cygwin license. Please consult the file "CYGWIN_LICENSE" for
details. */
#ifndef __CYGWIN_CYGWIN_DLL_H__
#define __CYGWIN_CYGWIN_DLL_H__
#include <windows.h>
#ifdef __cplusplus
#define CDECL_BEGIN extern "C" {
#define CDECL_END }
#else
#define CDECL_BEGIN
#define CDECL_END
#endif
#define DECLARE_CYGWIN_DLL(Entry) \
\
CDECL_BEGIN \
int WINAPI Entry (HINSTANCE h, DWORD reason, void *ptr); \
typedef int (*mainfunc) (int, char **, char **); \
extern int cygwin_attach_dll (HMODULE, mainfunc); \
extern void cygwin_detach_dll (DWORD); \
CDECL_END \
\
static HINSTANCE storedHandle; \
static DWORD storedReason; \
static void* storedPtr; \
\
static int __dllMain (int a, char **b, char **c) \
{ \
return Entry (storedHandle, storedReason, storedPtr); \
} \
\
static DWORD dll_index; \
\
int WINAPI _cygwin_dll_entry (HINSTANCE h, DWORD reason, void *ptr) \
{ \
int ret; \
ret = 1; \
\
switch (reason) \
{ \
case DLL_PROCESS_ATTACH: \
{ \
storedHandle = h; \
storedReason = reason; \
storedPtr = ptr; \
dll_index = cygwin_attach_dll (h, &__dllMain); \
if (dll_index == (DWORD) -1) \
ret = 0; \
} \
break; \
\
case DLL_PROCESS_DETACH: \
{ \
ret = Entry (h, reason, ptr); \
if (ret) \
{ \
cygwin_detach_dll (dll_index); \
dll_index = (DWORD) -1; \
} \
} \
break; \
\
case DLL_THREAD_ATTACH: \
{ \
ret = Entry (h, reason, ptr); \
} \
break; \
\
case DLL_THREAD_DETACH: \
{ \
ret = Entry (h, reason, ptr); \
} \
break; \
} \
return ret; \
} \
\
/* OBSOLETE: This is only provided for source level compatibility. */ \
int WINAPI _cygwin_noncygwin_dll_entry (HINSTANCE h, DWORD reason, void *ptr) \
{ \
return _cygwin_dll_entry (h, reason, ptr); \
} \
#endif /* __CYGWIN_CYGWIN_DLL_H__ */