| 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 |
| 10 | extern "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 |