blob: 875b7e4ab6f2fc28a86318288ed59c97d350feca [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)
cristy38d73d62011-05-19 01:55:37 +000078# define access(path,mode) _access_s(path,mode)
cristy3ed852e2009-09-05 21:47:34 +000079#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
cristyf9a253e2011-03-29 15:10:42 +0000143#else
144# define lseek _lseek
cristyecfd7242011-02-18 20:23:57 +0000145#endif
cristy3ed852e2009-09-05 21:47:34 +0000146#if !defined(MAGICKCORE_LTDL_DELEGATE)
147#if !defined(lt_dlclose)
148# define lt_dlclose(handle) NTCloseLibrary(handle)
149#endif
150#if !defined(lt_dlerror)
151# define lt_dlerror() NTGetLibraryError()
152#endif
153#if !defined(lt_dlexit)
154# define lt_dlexit() NTExitLibrary()
155#endif
156#if !defined(lt_dlinit)
157# define lt_dlinit() NTInitializeLibrary()
158#endif
159#if !defined(lt_dlopen)
160# define lt_dlopen(filename) NTOpenLibrary(filename)
161#endif
162#if !defined(lt_dlsetsearchpath)
163# define lt_dlsetsearchpath(path) NTSetSearchPath(path)
164#endif
165#if !defined(lt_dlsym)
166# define lt_dlsym(handle,name) NTGetLibrarySymbol(handle,name)
167#endif
168#endif
169#if !defined(mkdir)
170# define mkdir _mkdir
171#endif
172#if !defined(mmap)
173# define mmap(address,length,protection,access,file,offset) \
174 NTMapMemory(address,length,protection,access,file,offset)
175#endif
176#if !defined(msync)
177# define msync(address,length,flags) NTSyncMemory(address,length,flags)
178#endif
179#if !defined(munmap)
180# define munmap(address,length) NTUnmapMemory(address,length)
181#endif
182#if !defined(opendir)
183# define opendir(directory) NTOpenDirectory(directory)
184#endif
185#if !defined(open)
186# define open _open
187#endif
188#if !defined(pclose)
189# define pclose _pclose
190#endif
191#if !defined(popen)
192# define popen _popen
193#endif
194#if !defined(read)
195# define read _read
196#endif
197#if !defined(readdir)
198# define readdir(directory) NTReadDirectory(directory)
199#endif
200#if !defined(seekdir)
201# define seekdir(directory,offset) NTSeekDirectory(directory,offset)
202#endif
203#if !defined(setmode)
204# define setmode _setmode
205#endif
cristy98e91bd2010-01-12 01:11:42 +0000206#if !defined(spawnvp)
207# define spawnvp _spawnvp
208#endif
cristy3ed852e2009-09-05 21:47:34 +0000209#if !defined(stat) && !defined(__BORLANDC__)
cristy0157aea2010-04-24 21:12:18 +0000210#if defined(MAGICKCORE_WINDOWS_SUPPORT) && !defined(Windows95) && \
cristyad09dad2011-03-30 21:50:41 +0000211 !(defined(_MSC_VER) && (_MSC_VER < 1400)) && (__MSVCRT_VERSION__ < 0x800)
cristy3ed852e2009-09-05 21:47:34 +0000212# define stat _stati64
213#else
214# define stat _stat
215#endif
216#endif
217#if !defined(strcasecmp)
218# define strcasecmp _strcmpi
219#endif
220#if !defined(strncasecmp)
221# define strncasecmp _strnicmp
222#endif
223#if !defined(sysconf)
224# define sysconf(name) NTSystemConfiguration(name)
225#endif
cristyecfd7242011-02-18 20:23:57 +0000226#if defined(MAGICKCORE_WINDOWS_SUPPORT) && !defined(Windows95) && \
cristyad09dad2011-03-30 21:50:41 +0000227 !(defined(_MSC_VER) && (_MSC_VER < 1400)) && (__MSVCRT_VERSION__ < 0x800)
cristyecfd7242011-02-18 20:23:57 +0000228# define tell _telli64
cristyf9a253e2011-03-29 15:10:42 +0000229#else
230# define tell _tell
cristyecfd7242011-02-18 20:23:57 +0000231#endif
cristy3ed852e2009-09-05 21:47:34 +0000232#if !defined(telldir)
233# define telldir(directory) NTTellDirectory(directory)
234#endif
235#if !defined(tempnam)
cristy38d73d62011-05-19 01:55:37 +0000236# define tempnam _tempnam_s
cristy3ed852e2009-09-05 21:47:34 +0000237#endif
238#if !defined(vsnprintf)
239#if !defined(_MSC_VER) || (defined(_MSC_VER) && (_MSC_VER < 1500))
cristy38d73d62011-05-19 01:55:37 +0000240#define vsnprintf _vsnprintf_s
241#endif
242#endif
243#if !defined(vsnprintf_l)
244#if !defined(_MSC_VER) || (defined(_MSC_VER) && (_MSC_VER < 1500))
245#define vsnprintf_l _vsnprintf_s_l
cristy3ed852e2009-09-05 21:47:34 +0000246#endif
247#endif
248#if !defined(write)
249# define write _write
250#endif
251#if !defined(wstat) && !defined(__BORLANDC__)
cristy0157aea2010-04-24 21:12:18 +0000252#if defined(MAGICKCORE_WINDOWS_SUPPORT) && !defined(Windows95) && \
cristyad09dad2011-03-30 21:50:41 +0000253 !(defined(_MSC_VER) && (_MSC_VER < 1400)) && (__MSVCRT_VERSION__ < 0x800)
cristy3ed852e2009-09-05 21:47:34 +0000254# define wstat _wstati64
255#else
256# define wstat _wstat
257#endif
258#endif
259
cristy0157aea2010-04-24 21:12:18 +0000260#if defined(_MT) && defined(MAGICKCORE_WINDOWS_SUPPORT)
cristy3ed852e2009-09-05 21:47:34 +0000261# define SAFE_GLOBAL __declspec(thread)
262#else
263# define SAFE_GLOBAL
264#endif
265
266#if defined(__BORLANDC__)
267#undef _O_RANDOM
268#define _O_RANDOM 0
269#undef _O_SEQUENTIAL
270#define _O_SEQUENTIAL 0
271#undef _O_SHORT_LIVED
272#define _O_SHORT_LIVED 0
273#undef _O_TEMPORARY
274#define _O_TEMPORARY 0
275#endif
276
277#if !defined(XS_VERSION)
278struct dirent
279{
280 char
281 d_name[2048];
282
283 int
284 d_namlen;
285};
286
287typedef struct _DIR
288{
289 HANDLE
290 hSearch;
291
292 WIN32_FIND_DATA
293 Win32FindData;
294
295 BOOL
296 firsttime;
297
298 struct dirent
299 file_info;
300} DIR;
301
302typedef struct _NTMEMORYSTATUSEX
303{
304 DWORD
305 dwLength,
306 dwMemoryLoad;
307
308 DWORDLONG
309 ullTotalPhys,
310 ullAvailPhys,
311 ullTotalPageFile,
312 ullAvailPageFile,
313 ullTotalVirtual,
314 ullAvailVirtual,
315 ullAvailExtendedVirtual;
316} NTMEMORYSTATUSEX;
317
cristy9acb8642010-04-24 17:12:04 +0000318#if !defined(__MINGW32__)
cristy6d71f8d2010-02-28 00:46:02 +0000319struct timezone
320{
321 int
322 tz_minuteswest,
323 tz_dsttime;
324};
cristy9acb8642010-04-24 17:12:04 +0000325#endif
cristy6d71f8d2010-02-28 00:46:02 +0000326
cristy3ed852e2009-09-05 21:47:34 +0000327typedef UINT
328 (CALLBACK *LPFNDLLFUNC1)(DWORD,UINT);
329
330typedef UINT
331 (CALLBACK *LPFNDLLFUNC2)(NTMEMORYSTATUSEX *);
332
333#endif
334
cristy3ed852e2009-09-05 21:47:34 +0000335#if defined(MAGICKCORE_BZLIB_DELEGATE)
336# if defined(_WIN32)
337# define BZ_IMPORT 1
338# endif
339#endif
340
341extern MagickExport char
342 *NTGetLastError(void);
343
cristydefb3f02009-09-10 02:18:35 +0000344extern MagickExport const GhostInfo
cristy3ed852e2009-09-05 21:47:34 +0000345 *NTGhostscriptDLLVectors(void);
346
347#if !defined(MAGICKCORE_LTDL_DELEGATE)
348extern MagickExport const char
349 *NTGetLibraryError(void);
350#endif
351
352#if !defined(XS_VERSION)
353extern MagickExport const char
354 *NTGetLibraryError(void);
355
356extern MagickExport DIR
357 *NTOpenDirectory(const char *);
358
359extern MagickExport double
360 NTElapsedTime(void),
361 NTUserTime(void);
362
363extern MagickExport int
364 Exit(int),
cristy807fd932010-04-24 03:38:46 +0000365#if !defined(__MINGW32__)
cristy6d71f8d2010-02-28 00:46:02 +0000366 gettimeofday(struct timeval *,struct timezone *),
cristy807fd932010-04-24 03:38:46 +0000367#endif
cristy3ed852e2009-09-05 21:47:34 +0000368 IsWindows95(),
369 NTCloseDirectory(DIR *),
370 NTCloseLibrary(void *),
371 NTControlHandler(void),
372 NTExitLibrary(void),
373 NTTruncateFile(int,off_t),
374 NTGhostscriptDLL(char *,int),
375 NTGhostscriptEXE(char *,int),
376 NTGhostscriptFonts(char *,int),
377 NTGhostscriptLoadDLL(void),
378 NTGhostscriptUnLoadDLL(void),
379 NTInitializeLibrary(void),
380 NTSetSearchPath(const char *),
381 NTSyncMemory(void *,size_t,int),
382 NTUnmapMemory(void *,size_t),
383 NTSystemCommand(const char *);
384
cristybb503372010-05-27 20:51:26 +0000385extern MagickExport ssize_t
cristy3ed852e2009-09-05 21:47:34 +0000386 NTSystemConfiguration(int),
387 NTTellDirectory(DIR *);
388
389extern MagickExport MagickBooleanType
390 NTGatherRandomData(const size_t,unsigned char *),
391 NTGetExecutionPath(char *,const size_t),
392 NTGetModulePath(const char *,char *),
393 NTReportEvent(const char *,const MagickBooleanType),
394 NTReportException(const char *,const MagickBooleanType);
395
396extern MagickExport struct dirent
397 *NTReadDirectory(DIR *);
398
399extern MagickExport unsigned char
400 *NTRegistryKeyLookup(const char *),
401 *NTResourceToBlob(const char *);
402
403extern MagickExport void
404 NTErrorHandler(const ExceptionType,const char *,const char *),
405 *NTGetLibrarySymbol(void *,const char *),
406 *NTMapMemory(char *,size_t,int,int,int,MagickOffsetType),
407 *NTOpenLibrary(const char *),
cristybb503372010-05-27 20:51:26 +0000408 NTSeekDirectory(DIR *,ssize_t),
cristy3ed852e2009-09-05 21:47:34 +0000409 NTWarningHandler(const ExceptionType,const char *,const char *);
410
411#endif /* !XS_VERSION */
412
413#if defined(__cplusplus) || defined(c_plusplus)
414}
415#endif /* !C++ */
416
417#endif /* !_MAGICKCORE_NT_BASE_H */