mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 02:15:10 +00:00 
			
		
		
		
	 21c0844742
			
		
	
	
		21c0844742
		
			
		
	
	
	
	
		
			
			* pycore_intrinsics.h does nothing if included twice (add #ifndef and #define). * Update Tools/cases_generator/generate_cases.py to generate the Py_BUILD_CORE test. * _bz2, _lzma, _opcode and zlib extensions now define the Py_BUILD_CORE_MODULE macro to use internal headers (pycore_code.h, pycore_intrinsics.h and pycore_blocks_output_buffer.h).
		
			
				
	
	
		
			98 lines
		
	
	
	
		
			2.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			98 lines
		
	
	
	
		
			2.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| #ifndef Py_INTERNAL_FILEUTILS_WINDOWS_H
 | |
| #define Py_INTERNAL_FILEUTILS_WINDOWS_H
 | |
| #ifdef __cplusplus
 | |
| extern "C" {
 | |
| #endif
 | |
| 
 | |
| #ifndef Py_BUILD_CORE
 | |
| #  error "this header requires Py_BUILD_CORE define"
 | |
| #endif
 | |
| 
 | |
| #ifdef MS_WINDOWS
 | |
| 
 | |
| #if !defined(NTDDI_WIN10_NI) || !(NTDDI_VERSION >= NTDDI_WIN10_NI)
 | |
| typedef struct _FILE_STAT_BASIC_INFORMATION {
 | |
|     LARGE_INTEGER FileId;
 | |
|     LARGE_INTEGER CreationTime;
 | |
|     LARGE_INTEGER LastAccessTime;
 | |
|     LARGE_INTEGER LastWriteTime;
 | |
|     LARGE_INTEGER ChangeTime;
 | |
|     LARGE_INTEGER AllocationSize;
 | |
|     LARGE_INTEGER EndOfFile;
 | |
|     ULONG FileAttributes;
 | |
|     ULONG ReparseTag;
 | |
|     ULONG NumberOfLinks;
 | |
|     ULONG DeviceType;
 | |
|     ULONG DeviceCharacteristics;
 | |
|     ULONG Reserved;
 | |
|     LARGE_INTEGER VolumeSerialNumber;
 | |
|     FILE_ID_128 FileId128;
 | |
| } FILE_STAT_BASIC_INFORMATION;
 | |
| 
 | |
| typedef enum _FILE_INFO_BY_NAME_CLASS {
 | |
|     FileStatByNameInfo,
 | |
|     FileStatLxByNameInfo,
 | |
|     FileCaseSensitiveByNameInfo,
 | |
|     FileStatBasicByNameInfo,
 | |
|     MaximumFileInfoByNameClass
 | |
| } FILE_INFO_BY_NAME_CLASS;
 | |
| #endif
 | |
| 
 | |
| typedef BOOL (WINAPI *PGetFileInformationByName)(
 | |
|     PCWSTR FileName,
 | |
|     FILE_INFO_BY_NAME_CLASS FileInformationClass,
 | |
|     PVOID FileInfoBuffer,
 | |
|     ULONG FileInfoBufferSize
 | |
| );
 | |
| 
 | |
| static inline BOOL _Py_GetFileInformationByName(
 | |
|     PCWSTR FileName,
 | |
|     FILE_INFO_BY_NAME_CLASS FileInformationClass,
 | |
|     PVOID FileInfoBuffer,
 | |
|     ULONG FileInfoBufferSize
 | |
| ) {
 | |
|     static PGetFileInformationByName GetFileInformationByName = NULL;
 | |
|     static int GetFileInformationByName_init = -1;
 | |
| 
 | |
|     if (GetFileInformationByName_init < 0) {
 | |
|         HMODULE hMod = LoadLibraryW(L"api-ms-win-core-file-l2-1-4");
 | |
|         GetFileInformationByName_init = 0;
 | |
|         if (hMod) {
 | |
|             GetFileInformationByName = (PGetFileInformationByName)GetProcAddress(
 | |
|                 hMod, "GetFileInformationByName");
 | |
|             if (GetFileInformationByName) {
 | |
|                 GetFileInformationByName_init = 1;
 | |
|             } else {
 | |
|                 FreeLibrary(hMod);
 | |
|             }
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     if (GetFileInformationByName_init <= 0) {
 | |
|         SetLastError(ERROR_NOT_SUPPORTED);
 | |
|         return FALSE;
 | |
|     }
 | |
|     return GetFileInformationByName(FileName, FileInformationClass, FileInfoBuffer, FileInfoBufferSize);
 | |
| }
 | |
| 
 | |
| static inline BOOL _Py_GetFileInformationByName_ErrorIsTrustworthy(int error)
 | |
| {
 | |
|     switch(error) {
 | |
|         case ERROR_FILE_NOT_FOUND:
 | |
|         case ERROR_PATH_NOT_FOUND:
 | |
|         case ERROR_NOT_READY:
 | |
|         case ERROR_BAD_NET_NAME:
 | |
|         case ERROR_BAD_NETPATH:
 | |
|         case ERROR_BAD_PATHNAME:
 | |
|         case ERROR_INVALID_NAME:
 | |
|         case ERROR_FILENAME_EXCED_RANGE:
 | |
|             return TRUE;
 | |
|         case ERROR_NOT_SUPPORTED:
 | |
|             return FALSE;
 | |
|     }
 | |
|     return FALSE;
 | |
| }
 | |
| 
 | |
| #endif
 | |
| 
 | |
| #endif
 |