blob: 60e4cea12903c3084836bfbfdefc4f989063bd5e [file] [log] [blame]
cristy3ed852e2009-09-05 21:47:34 +00001/*
cristy7e41fe82010-12-04 23:12:08 +00002 Copyright 1999-2011 ImageMagick Studio LLC, a non-profit organization
cristy3ed852e2009-09-05 21:47:34 +00003 dedicated to making software imaging solutions freely available.
4
5 You may not use this file except in compliance with the License.
6 obtain a copy of the License at
7
8 http://www.imagemagick.org/script/license.php
9
10 Unless required by applicable law or agreed to in writing, software
11 distributed under the License is distributed on an "AS IS" BASIS,
12 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 See the License for the specific language governing permissions and
14 limitations under the License.
15
16 MagickCore Windows NT utility methods.
17*/
18#ifndef _MAGICKCORE_NT_BASE_H
19#define _MAGICKCORE_NT_BASE_H
20
21#if defined(__cplusplus) || defined(c_plusplus)
22extern "C" {
23#endif
24
25#include "magick/delegate.h"
26#include "magick/delegate-private.h"
27#include "magick/exception.h"
28
29#define WIN32_LEAN_AND_MEAN
30#define VC_EXTRALEAN
31#define _CRT_SECURE_NO_DEPRECATE 1
32#include <windows.h>
33#include <wchar.h>
34#include <winuser.h>
35#include <wingdi.h>
36#include <io.h>
37#include <process.h>
38#include <errno.h>
39#if defined(_DEBUG) && !defined(__MINGW32__)
40#include <crtdbg.h>
41#endif
42
43#define PROT_READ 0x01
44#define PROT_WRITE 0x02
45#define MAP_SHARED 0x01
46#define MAP_PRIVATE 0x02
47#define MAP_ANONYMOUS 0x20
48#define F_OK 0
49#define R_OK 4
50#define W_OK 2
51#define RW_OK 6
52#define _SC_PAGESIZE 1
53#define _SC_PHYS_PAGES 2
54#define _SC_OPEN_MAX 3
55#if !defined(SSIZE_MAX)
56#define SSIZE_MAX 0x7fffffffL
57#endif
58
59/*
60 _MSC_VER values:
61 1100 MSVC 5.0
62 1200 MSVC 6.0
63 1300 MSVC 7.0 Visual C++ .NET 2002
64 1310 Visual c++ .NET 2003
65 1400 Visual C++ 2005
66 1500 Visual C++ 2008
67*/
68
69#if !defined(chsize)
70# if defined(__BORLANDC__)
71# define chsize(file,length) chsize(file,length)
72# else
73# define chsize(file,length) _chsize(file,length)
74# endif
75#endif
76
77#if !defined(access)
78# define access(path,mode) _access(path,mode)
79#endif
80#if !defined(chdir)
81# define chdir _chdir
82#endif
83#if !defined(close)
84# define close _close
85#endif
86#if !defined(closedir)
87# define closedir(directory) NTCloseDirectory(directory)
88#endif
89#if !defined(fdopen)
90# define fdopen _fdopen
91#endif
92#if !defined(fileno)
93# define fileno _fileno
94#endif
cristy9538f232011-03-29 15:07:55 +000095#if !defined(fseek) && !defined(__MINGW32__)
cristy32be6cf2011-03-29 14:53:14 +000096#if defined(MAGICKCORE_WINDOWS_SUPPORT) && !defined(Windows95) && \
cristy785c45f2011-03-29 14:55:11 +000097 !(defined(_MSC_VER) && (_MSC_VER < 1400)) && (__MSVCRT_VERSION__ < 0x800)
cristy7f317702011-02-18 20:40:28 +000098# define fseek _fseeki64
cristy9538f232011-03-29 15:07:55 +000099#else
100# define fseek _fseek
101#endif
cristy3ed852e2009-09-05 21:47:34 +0000102#endif
103#if !defined(fstat) && !defined(__BORLANDC__)
cristy0157aea2010-04-24 21:12:18 +0000104#if defined(MAGICKCORE_WINDOWS_SUPPORT) && !defined(Windows95) && \
cristy785c45f2011-03-29 14:55:11 +0000105 !(defined(_MSC_VER) && (_MSC_VER < 1400)) && (__MSVCRT_VERSION__ < 0x800)
cristy3ed852e2009-09-05 21:47:34 +0000106# define fstat _fstati64
107#else
108# define fstat _fstat
109#endif
110#endif
111#if !defined(fsync)
112# define fsync _commit
113#endif
cristy9538f232011-03-29 15:07:55 +0000114#if !defined(ftell) && !defined(__MINGW32__)
cristy32be6cf2011-03-29 14:53:14 +0000115#if defined(MAGICKCORE_WINDOWS_SUPPORT) && !defined(Windows95) && \
cristy785c45f2011-03-29 14:55:11 +0000116 !(defined(_MSC_VER) && (_MSC_VER < 1400)) && (__MSVCRT_VERSION__ < 0x800)
cristy7f317702011-02-18 20:40:28 +0000117# define ftell _ftelli64
cristy9538f232011-03-29 15:07:55 +0000118#else
119# define ftell _ftell
120#endif
cristy3ed852e2009-09-05 21:47:34 +0000121#endif
122#if !defined(ftruncate)
123# define ftruncate(file,length) NTTruncateFile(file,length)
124#endif
125#if !defined(getcwd)
126# define getcwd _getcwd
127#endif
128#if !defined(getpid)
129# define getpid _getpid
130#endif
131#if !defined(hypot)
132# define hypot _hypot
133#endif
134#if !defined(inline)
135# define inline __inline
136#endif
137#if !defined(isatty)
138# define isatty _isatty
139#endif
cristyecfd7242011-02-18 20:23:57 +0000140#if defined(MAGICKCORE_WINDOWS_SUPPORT) && !defined(Windows95) && \
cristy785c45f2011-03-29 14:55:11 +0000141 !(defined(_MSC_VER) && (_MSC_VER < 1400)) && (__MSVCRT_VERSION__ < 0x800)
cristyecfd7242011-02-18 20:23:57 +0000142# define lseek _lseeki64
143#endif
cristy3ed852e2009-09-05 21:47:34 +0000144#if !defined(MAGICKCORE_LTDL_DELEGATE)
145#if !defined(lt_dlclose)
146# define lt_dlclose(handle) NTCloseLibrary(handle)
147#endif
148#if !defined(lt_dlerror)
149# define lt_dlerror() NTGetLibraryError()
150#endif
151#if !defined(lt_dlexit)
152# define lt_dlexit() NTExitLibrary()
153#endif
154#if !defined(lt_dlinit)
155# define lt_dlinit() NTInitializeLibrary()
156#endif
157#if !defined(lt_dlopen)
158# define lt_dlopen(filename) NTOpenLibrary(filename)
159#endif
160#if !defined(lt_dlsetsearchpath)
161# define lt_dlsetsearchpath(path) NTSetSearchPath(path)
162#endif
163#if !defined(lt_dlsym)
164# define lt_dlsym(handle,name) NTGetLibrarySymbol(handle,name)
165#endif
166#endif
167#if !defined(mkdir)
168# define mkdir _mkdir
169#endif
170#if !defined(mmap)
171# define mmap(address,length,protection,access,file,offset) \
172 NTMapMemory(address,length,protection,access,file,offset)
173#endif
174#if !defined(msync)
175# define msync(address,length,flags) NTSyncMemory(address,length,flags)
176#endif
177#if !defined(munmap)
178# define munmap(address,length) NTUnmapMemory(address,length)
179#endif
180#if !defined(opendir)
181# define opendir(directory) NTOpenDirectory(directory)
182#endif
183#if !defined(open)
184# define open _open
185#endif
186#if !defined(pclose)
187# define pclose _pclose
188#endif
189#if !defined(popen)
190# define popen _popen
191#endif
192#if !defined(read)
193# define read _read
194#endif
195#if !defined(readdir)
196# define readdir(directory) NTReadDirectory(directory)
197#endif
198#if !defined(seekdir)
199# define seekdir(directory,offset) NTSeekDirectory(directory,offset)
200#endif
201#if !defined(setmode)
202# define setmode _setmode
203#endif
cristy98e91bd2010-01-12 01:11:42 +0000204#if !defined(spawnvp)
205# define spawnvp _spawnvp
206#endif
cristy3ed852e2009-09-05 21:47:34 +0000207#if !defined(stat) && !defined(__BORLANDC__)
cristy0157aea2010-04-24 21:12:18 +0000208#if defined(MAGICKCORE_WINDOWS_SUPPORT) && !defined(Windows95) && \
cristy3ed852e2009-09-05 21:47:34 +0000209 !(defined(_MSC_VER) && (_MSC_VER < 1400)) && (__MSVCRT_VERSION__ < 0x800)
210# define stat _stati64
211#else
212# define stat _stat
213#endif
214#endif
215#if !defined(strcasecmp)
216# define strcasecmp _strcmpi
217#endif
218#if !defined(strncasecmp)
219# define strncasecmp _strnicmp
220#endif
221#if !defined(sysconf)
222# define sysconf(name) NTSystemConfiguration(name)
223#endif
cristyecfd7242011-02-18 20:23:57 +0000224#if defined(MAGICKCORE_WINDOWS_SUPPORT) && !defined(Windows95) && \
225 !(defined(_MSC_VER) && (_MSC_VER < 1400)) && (__MSVCRT_VERSION__ < 0x800)
226# define tell _telli64
227#endif
cristy3ed852e2009-09-05 21:47:34 +0000228#if !defined(telldir)
229# define telldir(directory) NTTellDirectory(directory)
230#endif
231#if !defined(tempnam)
232# define tempnam _tempnam
233#endif
234#if !defined(vsnprintf)
235#if !defined(_MSC_VER) || (defined(_MSC_VER) && (_MSC_VER < 1500))
cristy32be6cf2011-03-29 14:53:14 +0000236#define vsnprintf _vsnprintf
cristy3ed852e2009-09-05 21:47:34 +0000237#endif
238#endif
239#if !defined(write)
240# define write _write
241#endif
242#if !defined(wstat) && !defined(__BORLANDC__)
cristy0157aea2010-04-24 21:12:18 +0000243#if defined(MAGICKCORE_WINDOWS_SUPPORT) && !defined(Windows95) && \
cristy3ed852e2009-09-05 21:47:34 +0000244 !(defined(_MSC_VER) && (_MSC_VER < 1400)) && (__MSVCRT_VERSION__ < 0x800)
245# define wstat _wstati64
246#else
247# define wstat _wstat
248#endif
249#endif
250
cristy0157aea2010-04-24 21:12:18 +0000251#if defined(_MT) && defined(MAGICKCORE_WINDOWS_SUPPORT)
cristy3ed852e2009-09-05 21:47:34 +0000252# define SAFE_GLOBAL __declspec(thread)
253#else
254# define SAFE_GLOBAL
255#endif
256
257#if defined(__BORLANDC__)
258#undef _O_RANDOM
259#define _O_RANDOM 0
260#undef _O_SEQUENTIAL
261#define _O_SEQUENTIAL 0
262#undef _O_SHORT_LIVED
263#define _O_SHORT_LIVED 0
264#undef _O_TEMPORARY
265#define _O_TEMPORARY 0
266#endif
267
268#if !defined(XS_VERSION)
269struct dirent
270{
271 char
272 d_name[2048];
273
274 int
275 d_namlen;
276};
277
278typedef struct _DIR
279{
280 HANDLE
281 hSearch;
282
283 WIN32_FIND_DATA
284 Win32FindData;
285
286 BOOL
287 firsttime;
288
289 struct dirent
290 file_info;
291} DIR;
292
293typedef struct _NTMEMORYSTATUSEX
294{
295 DWORD
296 dwLength,
297 dwMemoryLoad;
298
299 DWORDLONG
300 ullTotalPhys,
301 ullAvailPhys,
302 ullTotalPageFile,
303 ullAvailPageFile,
304 ullTotalVirtual,
305 ullAvailVirtual,
306 ullAvailExtendedVirtual;
307} NTMEMORYSTATUSEX;
308
cristy9acb8642010-04-24 17:12:04 +0000309#if !defined(__MINGW32__)
cristy6d71f8d2010-02-28 00:46:02 +0000310struct timezone
311{
312 int
313 tz_minuteswest,
314 tz_dsttime;
315};
cristy9acb8642010-04-24 17:12:04 +0000316#endif
cristy6d71f8d2010-02-28 00:46:02 +0000317
cristy3ed852e2009-09-05 21:47:34 +0000318typedef UINT
319 (CALLBACK *LPFNDLLFUNC1)(DWORD,UINT);
320
321typedef UINT
322 (CALLBACK *LPFNDLLFUNC2)(NTMEMORYSTATUSEX *);
323
324#endif
325
cristy3ed852e2009-09-05 21:47:34 +0000326#if defined(MAGICKCORE_BZLIB_DELEGATE)
327# if defined(_WIN32)
328# define BZ_IMPORT 1
329# endif
330#endif
331
332extern MagickExport char
333 *NTGetLastError(void);
334
cristydefb3f02009-09-10 02:18:35 +0000335extern MagickExport const GhostInfo
cristy3ed852e2009-09-05 21:47:34 +0000336 *NTGhostscriptDLLVectors(void);
337
338#if !defined(MAGICKCORE_LTDL_DELEGATE)
339extern MagickExport const char
340 *NTGetLibraryError(void);
341#endif
342
343#if !defined(XS_VERSION)
344extern MagickExport const char
345 *NTGetLibraryError(void);
346
347extern MagickExport DIR
348 *NTOpenDirectory(const char *);
349
350extern MagickExport double
351 NTElapsedTime(void),
352 NTUserTime(void);
353
354extern MagickExport int
355 Exit(int),
cristy807fd932010-04-24 03:38:46 +0000356#if !defined(__MINGW32__)
cristy6d71f8d2010-02-28 00:46:02 +0000357 gettimeofday(struct timeval *,struct timezone *),
cristy807fd932010-04-24 03:38:46 +0000358#endif
cristy3ed852e2009-09-05 21:47:34 +0000359 IsWindows95(),
360 NTCloseDirectory(DIR *),
361 NTCloseLibrary(void *),
362 NTControlHandler(void),
363 NTExitLibrary(void),
364 NTTruncateFile(int,off_t),
365 NTGhostscriptDLL(char *,int),
366 NTGhostscriptEXE(char *,int),
367 NTGhostscriptFonts(char *,int),
368 NTGhostscriptLoadDLL(void),
369 NTGhostscriptUnLoadDLL(void),
370 NTInitializeLibrary(void),
371 NTSetSearchPath(const char *),
372 NTSyncMemory(void *,size_t,int),
373 NTUnmapMemory(void *,size_t),
374 NTSystemCommand(const char *);
375
cristybb503372010-05-27 20:51:26 +0000376extern MagickExport ssize_t
cristy3ed852e2009-09-05 21:47:34 +0000377 NTSystemConfiguration(int),
378 NTTellDirectory(DIR *);
379
380extern MagickExport MagickBooleanType
381 NTGatherRandomData(const size_t,unsigned char *),
382 NTGetExecutionPath(char *,const size_t),
383 NTGetModulePath(const char *,char *),
384 NTReportEvent(const char *,const MagickBooleanType),
385 NTReportException(const char *,const MagickBooleanType);
386
387extern MagickExport struct dirent
388 *NTReadDirectory(DIR *);
389
390extern MagickExport unsigned char
391 *NTRegistryKeyLookup(const char *),
392 *NTResourceToBlob(const char *);
393
394extern MagickExport void
395 NTErrorHandler(const ExceptionType,const char *,const char *),
396 *NTGetLibrarySymbol(void *,const char *),
397 *NTMapMemory(char *,size_t,int,int,int,MagickOffsetType),
398 *NTOpenLibrary(const char *),
cristybb503372010-05-27 20:51:26 +0000399 NTSeekDirectory(DIR *,ssize_t),
cristy3ed852e2009-09-05 21:47:34 +0000400 NTWarningHandler(const ExceptionType,const char *,const char *);
401
402#endif /* !XS_VERSION */
403
404#if defined(__cplusplus) || defined(c_plusplus)
405}
406#endif /* !C++ */
407
408#endif /* !_MAGICKCORE_NT_BASE_H */