newapis.h 8.2 KB

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