source: Daodan/MSYS2/mingw32/i686-w64-mingw32/include/newapis.h@ 1181

Last change on this file since 1181 was 1166, checked in by rossy, 3 years ago

Daodan: Replace MinGW build env with an up-to-date MSYS2 env

File size: 8.2 KB
RevLine 
[1166]1/**
2 * This file has no copyright assigned and is placed in the Public Domain.
3 * This file is part of the mingw-w64 runtime package.
4 * No warranty is given; refer to the file DISCLAIMER.PD within this package.
5 */
6
7#include <_mingw_unicode.h>
8
9#ifdef __cplusplus
10extern "C" {
11#endif
12
13#ifdef WANT_GETDISKFREESPACEEX_WRAPPER
14
15#undef GetDiskFreeSpaceEx
16#define GetDiskFreeSpaceEx _GetDiskFreeSpaceEx
17
18 extern WINBOOL (CALLBACK *GetDiskFreeSpaceEx)(LPCTSTR,PULARGE_INTEGER,PULARGE_INTEGER,PULARGE_INTEGER);
19
20#ifdef COMPILE_NEWAPIS_STUBS
21 static WINBOOL WINAPI Emulate_GetDiskFreeSpaceEx(LPCTSTR ptszRoot,PULARGE_INTEGER pliQuota,PULARGE_INTEGER pliTotal,PULARGE_INTEGER pliFree) {
22 DWORD dwSecPerClus,dwBytesPerSec,dwFreeClus,dwTotalClus;
23 WINBOOL fRc;
24 fRc = GetDiskFreeSpace(ptszRoot,&dwSecPerClus,&dwBytesPerSec,&dwFreeClus,&dwTotalClus);
25 if(fRc) {
26 DWORD dwBytesPerClus = dwSecPerClus *dwBytesPerSec;
27 *(__int64 *)pliQuota = Int32x32To64(dwBytesPerClus,dwFreeClus);
28 if(pliFree) {
29 *pliFree = *pliQuota;
30 }
31 *(__int64 *)pliTotal = Int32x32To64(dwBytesPerClus,dwTotalClus);
32 }
33 return fRc;
34 }
35
36 static WINBOOL WINAPI Probe_GetDiskFreeSpaceEx(LPCTSTR ptszRoot,PULARGE_INTEGER pliQuota,PULARGE_INTEGER pliTotal,PULARGE_INTEGER pliFree) {
37 HINSTANCE hinst;
38 FARPROC fp;
39 WINBOOL fRc;
40 WINBOOL (CALLBACK *RealGetDiskFreeSpaceEx) (LPCTSTR,PULARGE_INTEGER,PULARGE_INTEGER,PULARGE_INTEGER);
41 hinst = GetModuleHandle(TEXT("KERNEL32"));
42 fp = GetProcAddress(hinst,"GetDiskFreeSpaceEx" __MINGW_PROCNAMEEXT_AW);
43 if(fp) {
44 *(FARPROC *)&RealGetDiskFreeSpaceEx = fp;
45 fRc = RealGetDiskFreeSpaceEx(ptszRoot,pliQuota,pliTotal,pliFree);
46 if(fRc || GetLastError()!=ERROR_CALL_NOT_IMPLEMENTED) {
47 GetDiskFreeSpaceEx = RealGetDiskFreeSpaceEx;
48 } else {
49 GetDiskFreeSpaceEx = Emulate_GetDiskFreeSpaceEx;
50 fRc = GetDiskFreeSpaceEx(ptszRoot,pliQuota,pliTotal,pliFree);
51 }
52 } else {
53 GetDiskFreeSpaceEx = Emulate_GetDiskFreeSpaceEx;
54 fRc = GetDiskFreeSpaceEx(ptszRoot,pliQuota,pliTotal,pliFree);
55 }
56 return fRc;
57 }
58
59 WINBOOL (CALLBACK *GetDiskFreeSpaceEx) (LPCTSTR,PULARGE_INTEGER,PULARGE_INTEGER,PULARGE_INTEGER) = Probe_GetDiskFreeSpaceEx;
60#endif
61#endif
62
63#ifdef WANT_GETLONGPATHNAME_WRAPPER
64#include <shlobj.h>
65
66#undef GetLongPathName
67#define GetLongPathName _GetLongPathName
68
69 extern DWORD (CALLBACK *GetLongPathName)(LPCTSTR,LPTSTR,DWORD);
70
71#ifdef COMPILE_NEWAPIS_STUBS
72 static DWORD WINAPI Emulate_GetLongPathName(LPCTSTR ptszShort,LPTSTR ptszLong,DWORD ctchBuf) {
73 LPSHELLFOLDER psfDesk;
74 HRESULT hr;
75 LPITEMIDLIST pidl;
76 TCHAR tsz[MAX_PATH];
77 DWORD dwRc;
78 LPMALLOC pMalloc;
79 if(GetFileAttributes(ptszShort)==0xFFFFFFFF) return 0;
80 dwRc = GetFullPathName(ptszShort,MAX_PATH,tsz,NULL);
81 if(dwRc==0) {
82 } else if(dwRc >= MAX_PATH) {
83 SetLastError(ERROR_BUFFER_OVERFLOW);
84 dwRc = 0;
85 } else {
86 hr = SHGetDesktopFolder(&psfDesk);
87 if(SUCCEEDED(hr)) {
88 ULONG cwchEaten;
89#if defined(UNICODE)
90#ifdef __cplusplus
91 hr = psfDesk->ParseDisplayName(NULL,NULL,tsz,&cwchEaten,&pidl,NULL);
92#else
93 hr = psfDesk->lpVtbl->ParseDisplayName(psfDesk,NULL,NULL,tsz,&cwchEaten,&pidl,NULL);
94#endif
95#else
96 WCHAR wsz[MAX_PATH];
97
98 dwRc = MultiByteToWideChar(AreFileApisANSI() ? CP_ACP : CP_OEMCP,0,tsz,-1,wsz,MAX_PATH);
99 if(dwRc==0) {
100 if(GetLastError()==ERROR_INSUFFICIENT_BUFFER) {
101 SetLastError(ERROR_BUFFER_OVERFLOW);
102 }
103 dwRc = 0;
104 } else {
105#ifdef __cplusplus
106 hr = psfDesk->ParseDisplayName(NULL,NULL,wsz,&cwchEaten,&pidl,NULL);
107#else
108 hr = psfDesk->lpVtbl->ParseDisplayName(psfDesk,NULL,NULL,wsz,&cwchEaten,&pidl,NULL);
109#endif
110#endif
111 if(FAILED(hr)) {
112 if(HRESULT_FACILITY(hr)==FACILITY_WIN32) {
113 SetLastError(HRESULT_CODE(hr));
114 } else {
115 SetLastError(ERROR_INVALID_DATA);
116 }
117 dwRc = 0;
118 } else {
119 dwRc = SHGetPathFromIDList(pidl,tsz);
120 if(dwRc==0 && tsz[0]) {
121 SetLastError(ERROR_INVALID_DATA);
122 } else {
123 dwRc = lstrlen(tsz);
124 if(dwRc + 1 > ctchBuf) {
125 SetLastError(ERROR_INSUFFICIENT_BUFFER);
126 dwRc = dwRc + 1;
127 } else {
128 lstrcpyn(ptszLong,tsz,ctchBuf);
129 }
130 }
131 if(SUCCEEDED(SHGetMalloc(&pMalloc))) {
132#ifdef __cplusplus
133 pMalloc->Free(pidl);
134 pMalloc->Release();
135#else
136 pMalloc->lpVtbl->Free(pMalloc,pidl);
137 pMalloc->lpVtbl->Release(pMalloc);
138#endif
139 }
140 }
141#if !defined(UNICODE)
142 }
143#endif
144#ifdef __cplusplus
145 psfDesk->Release();
146#else
147 psfDesk->lpVtbl->Release(psfDesk);
148#endif
149 }
150 }
151 return dwRc;
152 }
153
154 static DWORD WINAPI Probe_GetLongPathName(LPCTSTR ptszShort,LPTSTR ptszLong,DWORD ctchBuf) {
155 HINSTANCE hinst;
156 FARPROC fp;
157 DWORD dwRc;
158 DWORD (CALLBACK *RealGetLongPathName)(LPCTSTR,LPTSTR,DWORD);
159 hinst = GetModuleHandle(TEXT("KERNEL32"));
160
161 fp = GetProcAddress(hinst,"GetLongPathName" __MINGW_PROCNAMEEXT_AW);
162 if(fp) {
163 *(FARPROC *)&RealGetLongPathName = fp;
164 dwRc = RealGetLongPathName(ptszShort,ptszLong,ctchBuf);
165 if(dwRc || GetLastError()!=ERROR_CALL_NOT_IMPLEMENTED) {
166 GetLongPathName = RealGetLongPathName;
167 } else {
168 GetLongPathName = Emulate_GetLongPathName;
169 dwRc = GetLongPathName(ptszShort,ptszLong,ctchBuf);
170 }
171 } else {
172 GetLongPathName = Emulate_GetLongPathName;
173 dwRc = GetLongPathName(ptszShort,ptszLong,ctchBuf);
174 }
175 return dwRc;
176
177 }
178
179 DWORD (CALLBACK *GetLongPathName)(LPCTSTR,LPTSTR,DWORD) = Probe_GetLongPathName;
180#endif
181#endif
182
183#ifdef WANT_GETFILEATTRIBUTESEX_WRAPPER
184
185#undef GetFileAttributesEx
186#define GetFileAttributesEx _GetFileAttributesEx
187
188 extern WINBOOL (CALLBACK *GetFileAttributesEx)
189 (LPCTSTR,GET_FILEEX_INFO_LEVELS,LPVOID);
190
191#ifdef COMPILE_NEWAPIS_STUBS
192
193 static WINBOOL WINAPI Emulate_GetFileAttributesEx(LPCTSTR ptszFile,GET_FILEEX_INFO_LEVELS level,LPVOID pv) {
194 WINBOOL fRc;
195 if(level==GetFileExInfoStandard) {
196 if(GetFileAttributes(ptszFile)!=0xFFFFFFFF) {
197 HANDLE hfind;
198 WIN32_FIND_DATA wfd;
199 hfind = FindFirstFile(ptszFile,&wfd);
200 if(hfind!=INVALID_HANDLE_VALUE) {
201 LPWIN32_FILE_ATTRIBUTE_DATA pfad = pv;
202 FindClose(hfind);
203 pfad->dwFileAttributes = wfd.dwFileAttributes;
204 pfad->ftCreationTime = wfd.ftCreationTime;
205 pfad->ftLastAccessTime = wfd.ftLastAccessTime;
206 pfad->ftLastWriteTime = wfd.ftLastWriteTime;
207 pfad->nFileSizeHigh = wfd.nFileSizeHigh;
208 pfad->nFileSizeLow = wfd.nFileSizeLow;
209
210 fRc = TRUE;
211 } else {
212 fRc = FALSE;
213 }
214 } else {
215 fRc = FALSE;
216 }
217 } else {
218 SetLastError(ERROR_INVALID_PARAMETER);
219 fRc = FALSE;
220 }
221 return fRc;
222 }
223
224 static WINBOOL WINAPI Probe_GetFileAttributesEx(LPCTSTR ptszFile,GET_FILEEX_INFO_LEVELS level,LPVOID pv) {
225 HINSTANCE hinst;
226 FARPROC fp;
227 WINBOOL fRc;
228 WINBOOL (CALLBACK *RealGetFileAttributesEx)(LPCTSTR,GET_FILEEX_INFO_LEVELS,LPVOID);
229 hinst = GetModuleHandle(TEXT("KERNEL32"));
230 fp = GetProcAddress(hinst,"GetFileAttributesEx" __MINGW_PROCNAMEEXT_AW);
231 if(fp) {
232 *(FARPROC *)&RealGetFileAttributesEx = fp;
233 fRc = RealGetFileAttributesEx(ptszFile,level,pv);
234 if(fRc || GetLastError()!=ERROR_CALL_NOT_IMPLEMENTED) {
235 GetFileAttributesEx = RealGetFileAttributesEx;
236 } else {
237 GetFileAttributesEx = Emulate_GetFileAttributesEx;
238 fRc = GetFileAttributesEx(ptszFile,level,pv);
239 }
240 } else {
241 GetFileAttributesEx = Emulate_GetFileAttributesEx;
242 fRc = GetFileAttributesEx(ptszFile,level,pv);
243 }
244 return fRc;
245 }
246
247 WINBOOL (CALLBACK *GetFileAttributesEx)(LPCTSTR,GET_FILEEX_INFO_LEVELS,LPVOID) = Probe_GetFileAttributesEx;
248#endif
249#endif
250
251#ifdef WANT_ISDEBUGGERPRESENT_WRAPPER
252#define IsDebuggerPresent _IsDebuggerPresent
253
254 extern WINBOOL (CALLBACK *IsDebuggerPresent)(VOID);
255
256#ifdef COMPILE_NEWAPIS_STUBS
257 static WINBOOL WINAPI Emulate_IsDebuggerPresent(VOID) { return FALSE; }
258 static WINBOOL WINAPI Probe_IsDebuggerPresent(VOID) {
259 HINSTANCE hinst;
260 FARPROC fp;
261 WINBOOL (CALLBACK *RealIsDebuggerPresent)(VOID);
262 hinst = GetModuleHandle(TEXT("KERNEL32"));
263 fp = GetProcAddress(hinst,"IsDebuggerPresent");
264 if(fp) {
265 *(FARPROC *)&IsDebuggerPresent = fp;
266 } else {
267 IsDebuggerPresent = Emulate_IsDebuggerPresent;
268 }
269 return IsDebuggerPresent();
270 }
271
272 WINBOOL (CALLBACK *IsDebuggerPresent)(VOID) = Probe_IsDebuggerPresent;
273#endif
274#endif
275
276#ifdef __cplusplus
277}
278#endif
Note: See TracBrowser for help on using the repository browser.