1 /**
2  * WinPR: Windows Portable Runtime
3  * Process Environment Functions
4  *
5  * Copyright 2012 Marc-Andre Moreau <marcandre.moreau@gmail.com>
6  * Copyright 2013 Thincast Technologies GmbH
7  * Copyright 2013 DI (FH) Martin Haimberger <martin.haimberger@thincast.com>
8  *
9  * Licensed under the Apache License, Version 2.0 (the "License");
10  * you may not use this file except in compliance with the License.
11  * You may obtain a copy of the License at
12  *
13  *     http://www.apache.org/licenses/LICENSE-2.0
14  *
15  * Unless required by applicable law or agreed to in writing, software
16  * distributed under the License is distributed on an "AS IS" BASIS,
17  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18  * See the License for the specific language governing permissions and
19  * limitations under the License.
20  */
21 
22 #ifndef WINPR_ENVIRONMENT_H
23 #define WINPR_ENVIRONMENT_H
24 
25 #include <winpr/winpr.h>
26 #include <winpr/wtypes.h>
27 
28 #ifndef _WIN32
29 
30 #ifdef __cplusplus
31 extern "C"
32 {
33 #endif
34 
35 	WINPR_API DWORD GetCurrentDirectoryA(DWORD nBufferLength, LPSTR lpBuffer);
36 	WINPR_API DWORD GetCurrentDirectoryW(DWORD nBufferLength, LPWSTR lpBuffer);
37 
38 	WINPR_API BOOL SetCurrentDirectoryA(LPCSTR lpPathName);
39 	WINPR_API BOOL SetCurrentDirectoryW(LPCWSTR lpPathName);
40 
41 	WINPR_API DWORD SearchPathA(LPCSTR lpPath, LPCSTR lpFileName, LPCSTR lpExtension,
42 	                            DWORD nBufferLength, LPSTR lpBuffer, LPSTR* lpFilePart);
43 	WINPR_API DWORD SearchPathW(LPCWSTR lpPath, LPCWSTR lpFileName, LPCWSTR lpExtension,
44 	                            DWORD nBufferLength, LPWSTR lpBuffer, LPWSTR* lpFilePart);
45 
46 	WINPR_API LPSTR GetCommandLineA(VOID);
47 	WINPR_API LPWSTR GetCommandLineW(VOID);
48 
49 	WINPR_API BOOL NeedCurrentDirectoryForExePathA(LPCSTR ExeName);
50 	WINPR_API BOOL NeedCurrentDirectoryForExePathW(LPCWSTR ExeName);
51 
52 #ifdef __cplusplus
53 }
54 #endif
55 
56 #ifdef UNICODE
57 #define GetCurrentDirectory GetCurrentDirectoryW
58 #define SetCurrentDirectory SetCurrentDirectoryW
59 #define SearchPath SearchPathW
60 #define GetCommandLine GetCommandLineW
61 #define NeedCurrentDirectoryForExePath NeedCurrentDirectoryForExePathW
62 #else
63 #define GetCurrentDirectory GetCurrentDirectoryA
64 #define SetCurrentDirectory SetCurrentDirectoryA
65 #define SearchPath SearchPathA
66 #define GetCommandLine GetCommandLineA
67 #define NeedCurrentDirectoryForExePath NeedCurrentDirectoryForExePathA
68 #endif
69 
70 #endif
71 
72 #if !defined(_WIN32) || defined(_UWP)
73 
74 #ifdef __cplusplus
75 extern "C"
76 {
77 #endif
78 
79 	WINPR_API DWORD GetEnvironmentVariableA(LPCSTR lpName, LPSTR lpBuffer, DWORD nSize);
80 	WINPR_API DWORD GetEnvironmentVariableW(LPCWSTR lpName, LPWSTR lpBuffer, DWORD nSize);
81 
82 	WINPR_API BOOL SetEnvironmentVariableA(LPCSTR lpName, LPCSTR lpValue);
83 	WINPR_API BOOL SetEnvironmentVariableW(LPCWSTR lpName, LPCWSTR lpValue);
84 
85 	/**
86 	 * A brief history of the GetEnvironmentStrings functions:
87 	 * http://blogs.msdn.com/b/oldnewthing/archive/2013/01/17/10385718.aspx
88 	 */
89 
90 	WINPR_API LPCH GetEnvironmentStrings(VOID);
91 	WINPR_API LPWCH GetEnvironmentStringsW(VOID);
92 
93 	WINPR_API BOOL SetEnvironmentStringsA(LPCH NewEnvironment);
94 	WINPR_API BOOL SetEnvironmentStringsW(LPWCH NewEnvironment);
95 
96 	WINPR_API DWORD ExpandEnvironmentStringsA(LPCSTR lpSrc, LPSTR lpDst, DWORD nSize);
97 	WINPR_API DWORD ExpandEnvironmentStringsW(LPCWSTR lpSrc, LPWSTR lpDst, DWORD nSize);
98 
99 	WINPR_API BOOL FreeEnvironmentStringsA(LPCH lpszEnvironmentBlock);
100 	WINPR_API BOOL FreeEnvironmentStringsW(LPWCH lpszEnvironmentBlock);
101 
102 #ifdef __cplusplus
103 }
104 #endif
105 
106 #ifdef UNICODE
107 #define GetEnvironmentVariable GetEnvironmentVariableW
108 #define SetEnvironmentVariable SetEnvironmentVariableW
109 #define GetEnvironmentStrings GetEnvironmentStringsW
110 #define SetEnvironmentStrings SetEnvironmentStringsW
111 #define ExpandEnvironmentStrings ExpandEnvironmentStringsW
112 #define FreeEnvironmentStrings FreeEnvironmentStringsW
113 #else
114 #define GetEnvironmentVariable GetEnvironmentVariableA
115 #define SetEnvironmentVariable SetEnvironmentVariableA
116 #define GetEnvironmentStringsA GetEnvironmentStrings
117 #define SetEnvironmentStrings SetEnvironmentStringsA
118 #define ExpandEnvironmentStrings ExpandEnvironmentStringsA
119 #define FreeEnvironmentStrings FreeEnvironmentStringsA
120 #endif
121 
122 #endif
123 
124 #ifdef __cplusplus
125 extern "C"
126 {
127 #endif
128 
129 	WINPR_API LPCH MergeEnvironmentStrings(PCSTR original, PCSTR merge);
130 
131 	WINPR_API DWORD GetEnvironmentVariableEBA(LPCSTR envBlock, LPCSTR lpName, LPSTR lpBuffer,
132 	                                          DWORD nSize);
133 	WINPR_API BOOL SetEnvironmentVariableEBA(LPSTR* envBlock, LPCSTR lpName, LPCSTR lpValue);
134 
135 	WINPR_API char** EnvironmentBlockToEnvpA(LPCH lpszEnvironmentBlock);
136 
137 #ifdef __cplusplus
138 }
139 #endif
140 
141 #endif /* WINPR_ENVIRONMENT_H */
142