123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327 |
- /* Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
- #ifndef MISC_H
- #define MISC_H
- #include "fspr.h"
- #include "fspr_portable.h"
- #include "fspr_private.h"
- #include "fspr_general.h"
- #include "fspr_pools.h"
- #include "fspr_getopt.h"
- #include "fspr_thread_proc.h"
- #include "fspr_file_io.h"
- #include "fspr_errno.h"
- #include "fspr_getopt.h"
- #if APR_HAVE_STDIO_H
- #include <stdio.h>
- #endif
- #if APR_HAVE_SIGNAL_H
- #include <signal.h>
- #endif
- #if APR_HAVE_PTHREAD_H
- #include <pthread.h>
- #endif
- /* ### create APR_HAVE_* macros for these? */
- #if APR_HAVE_STDLIB_H
- #include <stdlib.h>
- #endif
- #if APR_HAVE_STRING_H
- #include <string.h>
- #endif
- struct fspr_other_child_rec_t {
- fspr_pool_t *p;
- struct fspr_other_child_rec_t *next;
- fspr_proc_t *proc;
- void (*maintenance) (int, void *, int);
- void *data;
- fspr_os_file_t write_fd;
- };
- #define WSAHighByte 2
- #define WSALowByte 0
- /* start.c and fspr_app.c helpers and communication within misc.c
- *
- * They are not for public consumption, although fspr_app_init_complete
- * must be an exported symbol to avoid reinitialization.
- */
- extern int APR_DECLARE_DATA fspr_app_init_complete;
- int fspr_wastrtoastr(char const * const * *retarr,
- wchar_t const * const *arr, int args);
- /* Platform specific designation of run time os version.
- * Gaps allow for specific service pack levels that
- * export new kernel or winsock functions or behavior.
- */
- typedef enum {
- APR_WIN_UNK = 0,
- APR_WIN_UNSUP = 1,
- APR_WIN_95 = 10,
- APR_WIN_95_B = 11,
- APR_WIN_95_OSR2 = 12,
- APR_WIN_98 = 14,
- APR_WIN_98_SE = 16,
- APR_WIN_ME = 18,
- APR_WIN_UNICODE = 20, /* Prior versions support only narrow chars */
- APR_WIN_CE_3 = 23, /* CE is an odd beast, not supporting */
- /* some pre-NT features, such as the */
- APR_WIN_NT = 30, /* narrow charset APIs (fooA fns), while */
- APR_WIN_NT_3_5 = 35, /* not supporting some NT-family features. */
- APR_WIN_NT_3_51 = 36,
- APR_WIN_NT_4 = 40,
- APR_WIN_NT_4_SP2 = 42,
- APR_WIN_NT_4_SP3 = 43,
- APR_WIN_NT_4_SP4 = 44,
- APR_WIN_NT_4_SP5 = 45,
- APR_WIN_NT_4_SP6 = 46,
- APR_WIN_2000 = 50,
- APR_WIN_2000_SP1 = 51,
- APR_WIN_2000_SP2 = 52,
- APR_WIN_XP = 60,
- APR_WIN_XP_SP1 = 61,
- APR_WIN_XP_SP2 = 62,
- APR_WIN_2003 = 70
- } fspr_oslevel_e;
- extern APR_DECLARE_DATA fspr_oslevel_e fspr_os_level;
- fspr_status_t fspr_get_oslevel(fspr_oslevel_e *);
- /* The APR_HAS_ANSI_FS symbol is PRIVATE, and internal to APR.
- * APR only supports char data for filenames. Like most applications,
- * characters >127 are essentially undefined. APR_HAS_UNICODE_FS lets
- * the application know that utf-8 is the encoding method of APR, and
- * only incidently hints that we have Wide OS calls.
- *
- * APR_HAS_ANSI_FS is simply an OS flag to tell us all calls must be
- * the unicode eqivilant.
- */
- #if defined(_WIN32_WCE) || defined(WINNT)
- #define APR_HAS_ANSI_FS 0
- #else
- #define APR_HAS_ANSI_FS 1
- #endif
- /* IF_WIN_OS_IS_UNICODE / ELSE_WIN_OS_IS_ANSI help us keep the code trivial
- * where have runtime tests for unicode-ness, that aren't needed in any
- * build which supports only WINNT or WCE.
- */
- #if APR_HAS_ANSI_FS && APR_HAS_UNICODE_FS
- #define IF_WIN_OS_IS_UNICODE if (fspr_os_level >= APR_WIN_UNICODE)
- #define ELSE_WIN_OS_IS_ANSI else
- #else /* APR_HAS_UNICODE_FS */
- #define IF_WIN_OS_IS_UNICODE
- #define ELSE_WIN_OS_IS_ANSI
- #endif /* WINNT */
- typedef enum {
- DLL_WINBASEAPI = 0, // kernel32 From WinBase.h
- DLL_WINADVAPI = 1, // advapi32 From WinBase.h
- DLL_WINSOCKAPI = 2, // mswsock From WinSock.h
- DLL_WINSOCK2API = 3, // ws2_32 From WinSock2.h
- DLL_SHSTDAPI = 4, // shell32 From ShellAPI.h
- DLL_NTDLL = 5, // shell32 From our real kernel
- DLL_defined = 6 // must define as last idx_ + 1
- } fspr_dlltoken_e;
- FARPROC fspr_load_dll_func(fspr_dlltoken_e fnLib, char *fnName, int ordinal);
- /* The fspr_load_dll_func call WILL fault if the function cannot be loaded */
- #define APR_DECLARE_LATE_DLL_FUNC(lib, rettype, calltype, fn, ord, args, names) \
- typedef rettype (calltype *fspr_winapi_fpt_##fn) args; \
- static fspr_winapi_fpt_##fn fspr_winapi_pfn_##fn = NULL; \
- __inline rettype fspr_winapi_##fn args \
- { if (!fspr_winapi_pfn_##fn) \
- fspr_winapi_pfn_##fn = (fspr_winapi_fpt_##fn) \
- fspr_load_dll_func(lib, #fn, ord); \
- return (*(fspr_winapi_pfn_##fn)) names; }; \
- /* Provide late bound declarations of every API function missing from
- * one or more supported releases of the Win32 API
- *
- * lib is the enumerated token from fspr_dlltoken_e, and must correspond
- * to the string table entry in start.c used by the fspr_load_dll_func().
- * Token names (attempt to) follow Windows.h declarations prefixed by DLL_
- * in order to facilitate comparison. Use the exact declaration syntax
- * and names from Windows.h to prevent ambigutity and bugs.
- *
- * rettype and calltype follow the original declaration in Windows.h
- * fn is the true function name - beware Ansi/Unicode #defined macros
- * ord is the ordinal within the library, use 0 if it varies between versions
- * args is the parameter list following the original declaration, in parens
- * names is the parameter list sans data types, enclosed in parens
- *
- * #undef/re#define the Ansi/Unicode generic name to abate confusion
- * In the case of non-text functions, simply #define the original name
- */
- #if !defined(_WIN32_WCE) && !defined(WINNT)
- #ifdef GetFileAttributesExA
- #undef GetFileAttributesExA
- #endif
- APR_DECLARE_LATE_DLL_FUNC(DLL_WINBASEAPI, BOOL, WINAPI, GetFileAttributesExA, 0, (
- IN LPCSTR lpFileName,
- IN GET_FILEEX_INFO_LEVELS fInfoLevelId,
- OUT LPVOID lpFileInformation),
- (lpFileName, fInfoLevelId, lpFileInformation));
- #define GetFileAttributesExA fspr_winapi_GetFileAttributesExA
- #undef GetFileAttributesEx
- #define GetFileAttributesEx fspr_winapi_GetFileAttributesExA
- #ifdef GetFileAttributesExW
- #undef GetFileAttributesExW
- #endif
- APR_DECLARE_LATE_DLL_FUNC(DLL_WINBASEAPI, BOOL, WINAPI, GetFileAttributesExW, 0, (
- IN LPCWSTR lpFileName,
- IN GET_FILEEX_INFO_LEVELS fInfoLevelId,
- OUT LPVOID lpFileInformation),
- (lpFileName, fInfoLevelId, lpFileInformation));
- #define GetFileAttributesExW fspr_winapi_GetFileAttributesExW
- APR_DECLARE_LATE_DLL_FUNC(DLL_WINBASEAPI, BOOL, WINAPI, CancelIo, 0, (
- IN HANDLE hFile),
- (hFile));
- #define CancelIo fspr_winapi_CancelIo
- APR_DECLARE_LATE_DLL_FUNC(DLL_WINBASEAPI, BOOL, WINAPI, TryEnterCriticalSection, 0, (
- LPCRITICAL_SECTION lpCriticalSection),
- (lpCriticalSection));
- #define TryEnterCriticalSection fspr_winapi_TryEnterCriticalSection
- APR_DECLARE_LATE_DLL_FUNC(DLL_WINBASEAPI, BOOL, WINAPI, SwitchToThread, 0, (
- void),
- ());
- #define SwitchToThread fspr_winapi_SwitchToThread
- APR_DECLARE_LATE_DLL_FUNC(DLL_WINADVAPI, BOOL, WINAPI, GetEffectiveRightsFromAclW, 0, (
- IN PACL pacl,
- IN PTRUSTEE_W pTrustee,
- OUT PACCESS_MASK pAccessRights),
- (pacl, pTrustee, pAccessRights));
- #define GetEffectiveRightsFromAclW fspr_winapi_GetEffectiveRightsFromAclW
- APR_DECLARE_LATE_DLL_FUNC(DLL_WINADVAPI, BOOL, WINAPI, GetNamedSecurityInfoW, 0, (
- IN LPWSTR pObjectName,
- IN SE_OBJECT_TYPE ObjectType,
- IN SECURITY_INFORMATION SecurityInfo,
- OUT PSID *ppsidOwner,
- OUT PSID *ppsidGroup,
- OUT PACL *ppDacl,
- OUT PACL *ppSacl,
- OUT PSECURITY_DESCRIPTOR *ppSecurityDescriptor),
- (pObjectName, ObjectType, SecurityInfo, ppsidOwner, ppsidGroup,
- ppDacl, ppSacl, ppSecurityDescriptor));
- #define GetNamedSecurityInfoW fspr_winapi_GetNamedSecurityInfoW
- APR_DECLARE_LATE_DLL_FUNC(DLL_WINADVAPI, BOOL, WINAPI, GetNamedSecurityInfoA, 0, (
- IN LPSTR pObjectName,
- IN SE_OBJECT_TYPE ObjectType,
- IN SECURITY_INFORMATION SecurityInfo,
- OUT PSID *ppsidOwner,
- OUT PSID *ppsidGroup,
- OUT PACL *ppDacl,
- OUT PACL *ppSacl,
- OUT PSECURITY_DESCRIPTOR *ppSecurityDescriptor),
- (pObjectName, ObjectType, SecurityInfo, ppsidOwner, ppsidGroup,
- ppDacl, ppSacl, ppSecurityDescriptor));
- #define GetNamedSecurityInfoA fspr_winapi_GetNamedSecurityInfoA
- #undef GetNamedSecurityInfo
- #define GetNamedSecurityInfo fspr_winapi_GetNamedSecurityInfoA
- APR_DECLARE_LATE_DLL_FUNC(DLL_WINADVAPI, BOOL, WINAPI, GetSecurityInfo, 0, (
- IN HANDLE handle,
- IN SE_OBJECT_TYPE ObjectType,
- IN SECURITY_INFORMATION SecurityInfo,
- OUT PSID *ppsidOwner,
- OUT PSID *ppsidGroup,
- OUT PACL *ppDacl,
- OUT PACL *ppSacl,
- OUT PSECURITY_DESCRIPTOR *ppSecurityDescriptor),
- (handle, ObjectType, SecurityInfo, ppsidOwner, ppsidGroup,
- ppDacl, ppSacl, ppSecurityDescriptor));
- #define GetSecurityInfo fspr_winapi_GetSecurityInfo
- APR_DECLARE_LATE_DLL_FUNC(DLL_SHSTDAPI, LPWSTR *, WINAPI, CommandLineToArgvW, 0, (
- LPCWSTR lpCmdLine,
- int *pNumArgs),
- (lpCmdLine, pNumArgs));
- #define CommandLineToArgvW fspr_winapi_CommandLineToArgvW
- #endif /* !defined(_WIN32_WCE) && !defined(WINNT) */
- #if !defined(_WIN32_WCE)
- APR_DECLARE_LATE_DLL_FUNC(DLL_NTDLL, DWORD, WINAPI, NtQueryTimerResolution, 0, (
- ULONG *pMaxRes, /* Minimum NS Resolution */
- ULONG *pMinRes, /* Maximum NS Resolution */
- ULONG *pCurRes), /* Current NS Resolution */
- (pMaxRes, pMinRes, pCurRes));
- #define QueryTimerResolution fspr_winapi_NtQueryTimerResolution
- APR_DECLARE_LATE_DLL_FUNC(DLL_NTDLL, DWORD, WINAPI, NtSetTimerResolution, 0, (
- ULONG ReqRes, /* Requested NS Clock Resolution */
- BOOL Acquire, /* Aquire (1) or Release (0) our interest */
- ULONG *pNewRes), /* The NS Clock Resolution granted */
- (ReqRes, Acquire, pNewRes));
- #define SetTimerResolution fspr_winapi_NtSetTimerResolution
- /* ### These are ULONG_PTR values, but that's int32 for all we care
- * until the Win64 port is prepared.
- */
- typedef struct PBI {
- DWORD ExitStatus;
- PVOID PebBaseAddress;
- ULONG AffinityMask;
- LONG BasePriority;
- ULONG UniqueProcessId;
- ULONG InheritedFromUniqueProcessId;
- } PBI, *PPBI;
- APR_DECLARE_LATE_DLL_FUNC(DLL_NTDLL, DWORD, WINAPI, NtQueryInformationProcess, 0, (
- HANDLE hProcess, /* Obvious */
- INT info, /* Use 0 for PBI documented above */
- PVOID pPI, /* The PIB buffer */
- ULONG LenPI, /* Use sizeof(PBI) */
- ULONG *pSizePI), /* returns pPI buffer used (may pass NULL) */
- (hProcess, info, pPI, LenPI, pSizePI));
- #define QueryInformationProcess fspr_winapi_NtQueryInformationProcess
- APR_DECLARE_LATE_DLL_FUNC(DLL_NTDLL, DWORD, WINAPI, NtQueryObject, 0, (
- HANDLE hObject, /* Obvious */
- INT info, /* Use 0 for PBI documented above */
- PVOID pOI, /* The PIB buffer */
- ULONG LenOI, /* Use sizeof(PBI) */
- ULONG *pSizeOI), /* returns pPI buffer used (may pass NULL) */
- (hObject, info, pOI, LenOI, pSizeOI));
- #define QueryObject fspr_winapi_NtQueryObject
- #endif /* !defined(_WIN32_WCE) */
- #endif /* ! MISC_H */
|