mirror of https://github.com/python/cpython
99 lines
2.6 KiB
C
99 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
|