| /** |
| * This file has no copyright assigned and is placed in the Public Domain. |
| * This file is part of the mingw-w64 runtime package. |
| * No warranty is given; refer to the file DISCLAIMER.PD within this package. |
| */ |
| |
| #include <_mingw_unicode.h> |
| |
| #ifdef __cplusplus |
| extern "C" { |
| #endif |
| |
| #ifdef WANT_GETDISKFREESPACEEX_WRAPPER |
| |
| #undef GetDiskFreeSpaceEx |
| #define GetDiskFreeSpaceEx _GetDiskFreeSpaceEx |
| |
| extern WINBOOL (CALLBACK *GetDiskFreeSpaceEx)(LPCTSTR,PULARGE_INTEGER,PULARGE_INTEGER,PULARGE_INTEGER); |
| |
| #ifdef COMPILE_NEWAPIS_STUBS |
| static WINBOOL WINAPI Emulate_GetDiskFreeSpaceEx(LPCTSTR ptszRoot,PULARGE_INTEGER pliQuota,PULARGE_INTEGER pliTotal,PULARGE_INTEGER pliFree) { |
| DWORD dwSecPerClus,dwBytesPerSec,dwFreeClus,dwTotalClus; |
| WINBOOL fRc; |
| fRc = GetDiskFreeSpace(ptszRoot,&dwSecPerClus,&dwBytesPerSec,&dwFreeClus,&dwTotalClus); |
| if(fRc) { |
| DWORD dwBytesPerClus = dwSecPerClus *dwBytesPerSec; |
| *(__int64 *)pliQuota = Int32x32To64(dwBytesPerClus,dwFreeClus); |
| if(pliFree) { |
| *pliFree = *pliQuota; |
| } |
| *(__int64 *)pliTotal = Int32x32To64(dwBytesPerClus,dwTotalClus); |
| } |
| return fRc; |
| } |
| |
| static WINBOOL WINAPI Probe_GetDiskFreeSpaceEx(LPCTSTR ptszRoot,PULARGE_INTEGER pliQuota,PULARGE_INTEGER pliTotal,PULARGE_INTEGER pliFree) { |
| HINSTANCE hinst; |
| FARPROC fp; |
| WINBOOL fRc; |
| WINBOOL (CALLBACK *RealGetDiskFreeSpaceEx) (LPCTSTR,PULARGE_INTEGER,PULARGE_INTEGER,PULARGE_INTEGER); |
| hinst = GetModuleHandle(TEXT("KERNEL32")); |
| fp = GetProcAddress(hinst,"GetDiskFreeSpaceEx" __MINGW_PROCNAMEEXT_AW); |
| if(fp) { |
| *(FARPROC *)&RealGetDiskFreeSpaceEx = fp; |
| fRc = RealGetDiskFreeSpaceEx(ptszRoot,pliQuota,pliTotal,pliFree); |
| if(fRc || GetLastError()!=ERROR_CALL_NOT_IMPLEMENTED) { |
| GetDiskFreeSpaceEx = RealGetDiskFreeSpaceEx; |
| } else { |
| GetDiskFreeSpaceEx = Emulate_GetDiskFreeSpaceEx; |
| fRc = GetDiskFreeSpaceEx(ptszRoot,pliQuota,pliTotal,pliFree); |
| } |
| } else { |
| GetDiskFreeSpaceEx = Emulate_GetDiskFreeSpaceEx; |
| fRc = GetDiskFreeSpaceEx(ptszRoot,pliQuota,pliTotal,pliFree); |
| } |
| return fRc; |
| } |
| |
| WINBOOL (CALLBACK *GetDiskFreeSpaceEx) (LPCTSTR,PULARGE_INTEGER,PULARGE_INTEGER,PULARGE_INTEGER) = Probe_GetDiskFreeSpaceEx; |
| #endif |
| #endif |
| |
| #ifdef WANT_GETLONGPATHNAME_WRAPPER |
| #include <shlobj.h> |
| |
| #undef GetLongPathName |
| #define GetLongPathName _GetLongPathName |
| |
| extern DWORD (CALLBACK *GetLongPathName)(LPCTSTR,LPTSTR,DWORD); |
| |
| #ifdef COMPILE_NEWAPIS_STUBS |
| static DWORD WINAPI Emulate_GetLongPathName(LPCTSTR ptszShort,LPTSTR ptszLong,DWORD ctchBuf) { |
| LPSHELLFOLDER psfDesk; |
| HRESULT hr; |
| LPITEMIDLIST pidl; |
| TCHAR tsz[MAX_PATH]; |
| DWORD dwRc; |
| LPMALLOC pMalloc; |
| if(GetFileAttributes(ptszShort)==0xFFFFFFFF) return 0; |
| dwRc = GetFullPathName(ptszShort,MAX_PATH,tsz,NULL); |
| if(dwRc==0) { |
| } else if(dwRc >= MAX_PATH) { |
| SetLastError(ERROR_BUFFER_OVERFLOW); |
| dwRc = 0; |
| } else { |
| hr = SHGetDesktopFolder(&psfDesk); |
| if(SUCCEEDED(hr)) { |
| ULONG cwchEaten; |
| #if defined(UNICODE) |
| #ifdef __cplusplus |
| hr = psfDesk->ParseDisplayName(NULL,NULL,tsz,&cwchEaten,&pidl,NULL); |
| #else |
| hr = psfDesk->lpVtbl->ParseDisplayName(psfDesk,NULL,NULL,tsz,&cwchEaten,&pidl,NULL); |
| #endif |
| #else |
| WCHAR wsz[MAX_PATH]; |
| |
| dwRc = MultiByteToWideChar(AreFileApisANSI() ? CP_ACP : CP_OEMCP,0,tsz,-1,wsz,MAX_PATH); |
| if(dwRc==0) { |
| if(GetLastError()==ERROR_INSUFFICIENT_BUFFER) { |
| SetLastError(ERROR_BUFFER_OVERFLOW); |
| } |
| dwRc = 0; |
| } else { |
| #ifdef __cplusplus |
| hr = psfDesk->ParseDisplayName(NULL,NULL,wsz,&cwchEaten,&pidl,NULL); |
| #else |
| hr = psfDesk->lpVtbl->ParseDisplayName(psfDesk,NULL,NULL,wsz,&cwchEaten,&pidl,NULL); |
| #endif |
| #endif |
| if(FAILED(hr)) { |
| if(HRESULT_FACILITY(hr)==FACILITY_WIN32) { |
| SetLastError(HRESULT_CODE(hr)); |
| } else { |
| SetLastError(ERROR_INVALID_DATA); |
| } |
| dwRc = 0; |
| } else { |
| dwRc = SHGetPathFromIDList(pidl,tsz); |
| if(dwRc==0 && tsz[0]) { |
| SetLastError(ERROR_INVALID_DATA); |
| } else { |
| dwRc = lstrlen(tsz); |
| if(dwRc + 1 > ctchBuf) { |
| SetLastError(ERROR_INSUFFICIENT_BUFFER); |
| dwRc = dwRc + 1; |
| } else { |
| lstrcpyn(ptszLong,tsz,ctchBuf); |
| } |
| } |
| if(SUCCEEDED(SHGetMalloc(&pMalloc))) { |
| #ifdef __cplusplus |
| pMalloc->Free(pidl); |
| pMalloc->Release(); |
| #else |
| pMalloc->lpVtbl->Free(pMalloc,pidl); |
| pMalloc->lpVtbl->Release(pMalloc); |
| #endif |
| } |
| } |
| #if !defined(UNICODE) |
| } |
| #endif |
| #ifdef __cplusplus |
| psfDesk->Release(); |
| #else |
| psfDesk->lpVtbl->Release(psfDesk); |
| #endif |
| } |
| } |
| return dwRc; |
| } |
| |
| static DWORD WINAPI Probe_GetLongPathName(LPCTSTR ptszShort,LPTSTR ptszLong,DWORD ctchBuf) { |
| HINSTANCE hinst; |
| FARPROC fp; |
| DWORD dwRc; |
| DWORD (CALLBACK *RealGetLongPathName)(LPCTSTR,LPTSTR,DWORD); |
| hinst = GetModuleHandle(TEXT("KERNEL32")); |
| |
| fp = GetProcAddress(hinst,"GetLongPathName" __MINGW_PROCNAMEEXT_AW); |
| if(fp) { |
| *(FARPROC *)&RealGetLongPathName = fp; |
| dwRc = RealGetLongPathName(ptszShort,ptszLong,ctchBuf); |
| if(dwRc || GetLastError()!=ERROR_CALL_NOT_IMPLEMENTED) { |
| GetLongPathName = RealGetLongPathName; |
| } else { |
| GetLongPathName = Emulate_GetLongPathName; |
| dwRc = GetLongPathName(ptszShort,ptszLong,ctchBuf); |
| } |
| } else { |
| GetLongPathName = Emulate_GetLongPathName; |
| dwRc = GetLongPathName(ptszShort,ptszLong,ctchBuf); |
| } |
| return dwRc; |
| |
| } |
| |
| DWORD (CALLBACK *GetLongPathName)(LPCTSTR,LPTSTR,DWORD) = Probe_GetLongPathName; |
| #endif |
| #endif |
| |
| #ifdef WANT_GETFILEATTRIBUTESEX_WRAPPER |
| |
| #undef GetFileAttributesEx |
| #define GetFileAttributesEx _GetFileAttributesEx |
| |
| extern WINBOOL (CALLBACK *GetFileAttributesEx) |
| (LPCTSTR,GET_FILEEX_INFO_LEVELS,LPVOID); |
| |
| #ifdef COMPILE_NEWAPIS_STUBS |
| |
| static WINBOOL WINAPI Emulate_GetFileAttributesEx(LPCTSTR ptszFile,GET_FILEEX_INFO_LEVELS level,LPVOID pv) { |
| WINBOOL fRc; |
| if(level==GetFileExInfoStandard) { |
| if(GetFileAttributes(ptszFile)!=0xFFFFFFFF) { |
| HANDLE hfind; |
| WIN32_FIND_DATA wfd; |
| hfind = FindFirstFile(ptszFile,&wfd); |
| if(hfind!=INVALID_HANDLE_VALUE) { |
| LPWIN32_FILE_ATTRIBUTE_DATA pfad = pv; |
| FindClose(hfind); |
| pfad->dwFileAttributes = wfd.dwFileAttributes; |
| pfad->ftCreationTime = wfd.ftCreationTime; |
| pfad->ftLastAccessTime = wfd.ftLastAccessTime; |
| pfad->ftLastWriteTime = wfd.ftLastWriteTime; |
| pfad->nFileSizeHigh = wfd.nFileSizeHigh; |
| pfad->nFileSizeLow = wfd.nFileSizeLow; |
| |
| fRc = TRUE; |
| } else { |
| fRc = FALSE; |
| } |
| } else { |
| fRc = FALSE; |
| } |
| } else { |
| SetLastError(ERROR_INVALID_PARAMETER); |
| fRc = FALSE; |
| } |
| return fRc; |
| } |
| |
| static WINBOOL WINAPI Probe_GetFileAttributesEx(LPCTSTR ptszFile,GET_FILEEX_INFO_LEVELS level,LPVOID pv) { |
| HINSTANCE hinst; |
| FARPROC fp; |
| WINBOOL fRc; |
| WINBOOL (CALLBACK *RealGetFileAttributesEx)(LPCTSTR,GET_FILEEX_INFO_LEVELS,LPVOID); |
| hinst = GetModuleHandle(TEXT("KERNEL32")); |
| fp = GetProcAddress(hinst,"GetFileAttributesEx" __MINGW_PROCNAMEEXT_AW); |
| if(fp) { |
| *(FARPROC *)&RealGetFileAttributesEx = fp; |
| fRc = RealGetFileAttributesEx(ptszFile,level,pv); |
| if(fRc || GetLastError()!=ERROR_CALL_NOT_IMPLEMENTED) { |
| GetFileAttributesEx = RealGetFileAttributesEx; |
| } else { |
| GetFileAttributesEx = Emulate_GetFileAttributesEx; |
| fRc = GetFileAttributesEx(ptszFile,level,pv); |
| } |
| } else { |
| GetFileAttributesEx = Emulate_GetFileAttributesEx; |
| fRc = GetFileAttributesEx(ptszFile,level,pv); |
| } |
| return fRc; |
| } |
| |
| WINBOOL (CALLBACK *GetFileAttributesEx)(LPCTSTR,GET_FILEEX_INFO_LEVELS,LPVOID) = Probe_GetFileAttributesEx; |
| #endif |
| #endif |
| |
| #ifdef WANT_ISDEBUGGERPRESENT_WRAPPER |
| #define IsDebuggerPresent _IsDebuggerPresent |
| |
| extern WINBOOL (CALLBACK *IsDebuggerPresent)(VOID); |
| |
| #ifdef COMPILE_NEWAPIS_STUBS |
| static WINBOOL WINAPI Emulate_IsDebuggerPresent(VOID) { return FALSE; } |
| static WINBOOL WINAPI Probe_IsDebuggerPresent(VOID) { |
| HINSTANCE hinst; |
| FARPROC fp; |
| WINBOOL (CALLBACK *RealIsDebuggerPresent)(VOID); |
| hinst = GetModuleHandle(TEXT("KERNEL32")); |
| fp = GetProcAddress(hinst,"IsDebuggerPresent"); |
| if(fp) { |
| *(FARPROC *)&IsDebuggerPresent = fp; |
| } else { |
| IsDebuggerPresent = Emulate_IsDebuggerPresent; |
| } |
| return IsDebuggerPresent(); |
| } |
| |
| WINBOOL (CALLBACK *IsDebuggerPresent)(VOID) = Probe_IsDebuggerPresent; |
| #endif |
| #endif |
| |
| #ifdef __cplusplus |
| } |
| #endif |