30#define WIN32_NO_STATUS
37#define WINE_MOUNTMGR_EXTENSIONS
45#define BLOCK_SIZE 2048
46#define SUPERBLOCK_SIZE BLOCK_SIZE
47#define SYMBOLIC_LINK_QUERY 0x0001
49#define CDFRAMES_PERSEC 75
50#define CDFRAMES_PERMIN (CDFRAMES_PERSEC * 60)
51#define FRAME_OF_ADDR(a) ((a)[1] * CDFRAMES_PERMIN + (a)[2] * CDFRAMES_PERSEC + (a)[3])
52#define FRAME_OF_TOC(toc, idx) FRAME_OF_ADDR((toc)->TrackData[(idx) - (toc)->FirstTrack].Address)
54#define GETWORD(buf,off) MAKEWORD(buf[(off)],buf[(off+1)])
55#define GETLONG(buf,off) MAKELONG(GETWORD(buf,off),GETWORD(buf,off+2))
76 attr.RootDirectory = 0;
80 attr.SecurityQualityOfService =
NULL;
110 attr.RootDirectory = 0;
112 attr.ObjectName = &nt_name;
114 attr.SecurityQualityOfService =
NULL;
126 struct mountmgr_unix_drive
data;
135 if (curdir[1] !=
':' || curdir[2] !=
'\\')
return DRIVE_UNKNOWN;
136 data.letter = curdir[0];
188 attr.RootDirectory = 0;
190 attr.ObjectName = &nt_name;
192 attr.SecurityQualityOfService =
NULL;
209 fsname, fsname_len );
236 filename_len,
flags, fsnameW, fsname_len)))
257 DWORD i, i_size = 1024, o_size = 1024;
258 WCHAR *nonpersist_name;
280 FIXME(
"Mounted Folders are not yet supported\n");
302 lstrcpyW( symlink_name,
L"\\DosDevices\\" );
304 symlink_name[
lstrlenW(symlink_name)-1] = 0;
310 TRACE(
"read_nt_symlink got stat=%lx, for %s, got <%s>\n",
status,
322 input->DeviceNameOffset =
sizeof(*input);
324 i_size =
input->DeviceNameOffset +
input->DeviceNameLength;
326 output->
Size = o_size;
330 output, o_size, &br,
NULL ))
345 p = (
WCHAR*)((
char *)output + o1->SymbolicLinkNameOffset);
346 r = (
char *)output + o1->UniqueIdOffset;
347 TRACE(
"found symlink=%s, unique=%s, devname=%s\n",
351 o1->DeviceNameLength/
sizeof(
WCHAR)));
356 if ((o1->SymbolicLinkNameLength/
sizeof(
WCHAR))+2 >
size)
362 volume[o1->SymbolicLinkNameLength /
sizeof(
WCHAR)] = 0;
385 WCHAR link_name[15] =
L"\\DosDevices\\";
477 attr.RootDirectory = 0;
478 attr.ObjectName = &nt_name;
481 attr.SecurityQualityOfService =
NULL;
523 attr.RootDirectory = 0;
524 attr.ObjectName = &nt_name;
527 attr.SecurityQualityOfService =
NULL;
536 if(
info->ObjectName.Length == 2*
sizeof(
WCHAR) &&
info->ObjectName.Buffer[1] ==
':')
537 bitmask |= 1 << (
info->ObjectName.Buffer[0] -
'A');
559 if (drives & (1 <<
drive))
602 switch (
info.DeviceType)
656 if (totalfree) totalfree->
QuadPart =
info.AvailableAllocationUnits.QuadPart *
units;
690 cluster_sectors, sector_bytes, free_clusters, total_clusters );
702 if (
info.TotalAllocationUnits.QuadPart *
units > 0x7fffffff) {
703 info.TotalAllocationUnits.QuadPart = 0x7fffffff /
units;
704 if (
info.AvailableAllocationUnits.QuadPart *
units > 0x7fffffff)
705 info.AvailableAllocationUnits.QuadPart = 0x7fffffff /
units;
708 while(
info.TotalAllocationUnits.QuadPart > 65535 ) {
709 info.TotalAllocationUnits.QuadPart /= 2;
710 info.AvailableAllocationUnits.QuadPart /= 2;
711 info.SectorsPerAllocationUnit *= 2;
715 if (cluster_sectors) *cluster_sectors =
info.SectorsPerAllocationUnit;
716 if (sector_bytes) *sector_bytes =
info.BytesPerSector;
717 if (free_clusters) *free_clusters =
info.AvailableAllocationUnits.u.LowPart;
718 if (total_clusters) *total_clusters =
info.TotalAllocationUnits.u.LowPart;
719 TRACE(
"%#08lx, %#08lx, %#08lx, %#08lx\n",
info.SectorsPerAllocationUnit,
info.BytesPerSector,
720 info.AvailableAllocationUnits.u.LowPart,
info.TotalAllocationUnits.u.LowPart);
741 static const WCHAR global_prefix[4] = {
'\\',
'?',
'?',
'\\'};
743 && !
memcmp(
path->Buffer, global_prefix,
sizeof(global_prefix))
744 &&
path->Buffer[5] ==
':' &&
path->Buffer[6] ==
'\\';
803 WCHAR ret_path[4] = {current_drive[0],
':',
'\\', 0};
889 volume_path[0] =
towupper(volume_path[0]);
930 static const WCHAR dosdevicesW[] = {
'\\',
'D',
'o',
's',
'D',
'e',
'v',
'i',
'c',
'e',
's',
'\\'};
939 TRACE(
"%s, %p, %lu, %p\n",
debugstr_w(volumename), volumepathname, buflen, returnlen);
941 if (!volumename || (
len =
lstrlenW( volumename )) != 49)
963 if (!
target->NumberOfMountPoints)
969 path = volumepathname;
970 for (
i = 0;
i <
target->NumberOfMountPoints;
i++)
973 if (
target->MountPoints[
i].DeviceNameOffset)
978 size =
sizeof(*spec) + device_len;
987 else if (
target->MountPoints[
i].UniqueIdOffset)
992 size =
sizeof(*spec) + id_len;
1001 if (!
link)
continue;
1002 for (
j = 0;
j <
link->NumberOfMountPoints;
j++)
1004 const WCHAR *linkname;
1006 if (!
link->MountPoints[
j].SymbolicLinkNameOffset)
continue;
1007 linkname = (
const WCHAR *)((
const char *)
link +
link->MountPoints[
j].SymbolicLinkNameOffset);
1009 if (
link->MountPoints[
j].SymbolicLinkNameLength ==
sizeof(dosdevicesW) + 2 *
sizeof(
WCHAR) &&
1013 if (volumepathname &&
len < buflen)
1026 else if (volumepathname)
1028 volumepathname[
len] = 0;
1031 if (returnlen) *returnlen =
len + 1;
1093 while (
data->Size <
data->NumberOfMountPoints)
1095 static const WCHAR volumeW[] = {
'\\',
'?',
'?',
'\\',
'V',
'o',
'l',
'u',
'm',
'e',
'{',};
1100 if (
size <
sizeof(volumeW) ||
memcmp(
link, volumeW,
sizeof(volumeW) ))
continue;
1159 if (label_len < info->VolumeLabelLength /
sizeof(
WCHAR) + 1)
1170 if (filename_len ||
flags || fsname)
1181 if (fsname_len < info->FileSystemNameLength /
sizeof(
WCHAR) + 1)
1186 memcpy( fsname,
info->FileSystemName,
info->FileSystemNameLength );
1187 fsname[
info->FileSystemNameLength /
sizeof(
WCHAR)] = 0;
1189 if (filename_len) *filename_len =
info->MaximumComponentNameLength;
NTSTATUS NtQueryObject(IN HANDLE Handle, IN OBJECT_INFO_CLASS ObjectInformationClass, OUT PVOID ObjectInformation, IN ULONG ObjectInformationLength, OUT PULONG ReturnLength)
int memcmp(void *Buffer1, void *Buffer2, ACPI_SIZE Count)
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
static const WCHAR nameW[]
#define FILE_DIRECTORY_FILE
#define FILE_NON_DIRECTORY_FILE
#define ERROR_NOT_ENOUGH_MEMORY
#define ERROR_INSUFFICIENT_BUFFER
BOOL WINAPI DeviceIoControl(IN HANDLE hDevice, IN DWORD dwIoControlCode, IN LPVOID lpInBuffer OPTIONAL, IN DWORD nInBufferSize OPTIONAL, OUT LPVOID lpOutBuffer OPTIONAL, IN DWORD nOutBufferSize OPTIONAL, OUT LPDWORD lpBytesReturned OPTIONAL, IN LPOVERLAPPED lpOverlapped OPTIONAL)
static __inline BOOL set_ntstatus(NTSTATUS status)
static const WCHAR rootW[]
#define ERROR_INVALID_PARAMETER
#define GetCurrentDirectoryW(x, y)
#define INVALID_HANDLE_VALUE
static __inline const char * debugstr_an(const char *s, int n)
#define HeapFree(x, y, z)
#define ERROR_INVALID_NAME
UINT WINAPI GetDriveTypeA(IN LPCSTR lpRootPathName)
BOOL WINAPI FindNextVolumeW(IN HANDLE handle, IN LPWSTR volume, IN DWORD len)
BOOL WINAPI GetVolumeInformationW(IN LPCWSTR lpRootPathName, IN LPWSTR lpVolumeNameBuffer, IN DWORD nVolumeNameSize, OUT LPDWORD lpVolumeSerialNumber OPTIONAL, OUT LPDWORD lpMaximumComponentLength OPTIONAL, OUT LPDWORD lpFileSystemFlags OPTIONAL, OUT LPWSTR lpFileSystemNameBuffer OPTIONAL, IN DWORD nFileSystemNameSize)
BOOL WINAPI GetVolumeInformationA(IN LPCSTR lpRootPathName, IN LPSTR lpVolumeNameBuffer, IN DWORD nVolumeNameSize, OUT LPDWORD lpVolumeSerialNumber OPTIONAL, OUT LPDWORD lpMaximumComponentLength OPTIONAL, OUT LPDWORD lpFileSystemFlags OPTIONAL, OUT LPSTR lpFileSystemNameBuffer OPTIONAL, IN DWORD nFileSystemNameSize)
HANDLE WINAPI FindFirstVolumeW(IN LPWSTR volume, IN DWORD len)
BOOL WINAPI GetVolumePathNameW(IN LPCWSTR lpszFileName, IN LPWSTR lpszVolumePathName, IN DWORD cchBufferLength)
BOOL WINAPI FindVolumeClose(IN HANDLE hFindVolume)
BOOL WINAPI GetVolumePathNamesForVolumeNameW(IN LPCWSTR lpszVolumeName, IN LPWSTR lpszVolumePathNames, IN DWORD cchBufferLength, OUT PDWORD lpcchReturnLength)
WCHAR * file_name_AtoW(LPCSTR name, BOOL alloc)
DWORD file_name_WtoA(LPCWSTR src, INT srclen, LPSTR dest, INT destlen)
DWORD WINAPI GetVersion(void)
static BOOL is_dos_path(const UNICODE_STRING *path)
BOOL WINAPI DECLSPEC_HOTPATCH GetDiskFreeSpaceExA(LPCSTR root, PULARGE_INTEGER avail, PULARGE_INTEGER total, PULARGE_INTEGER totalfree)
#define SYMBOLIC_LINK_QUERY
static BOOL resolve_symlink(UNICODE_STRING *path)
static MOUNTMGR_MOUNT_POINTS * query_mount_points(HANDLE mgr, MOUNTMGR_MOUNT_POINT *input, DWORD insize)
BOOL WINAPI DECLSPEC_HOTPATCH DefineDosDeviceW(DWORD flags, const WCHAR *device, const WCHAR *target)
BOOL WINAPI DECLSPEC_HOTPATCH GetDiskFreeSpaceExW(LPCWSTR root, PULARGE_INTEGER avail, PULARGE_INTEGER total, PULARGE_INTEGER totalfree)
BOOL WINAPI DeleteVolumeMountPointW(LPCWSTR mountpoint)
static DWORD get_mountmgr_drive_type(LPCWSTR root)
BOOL WINAPI DECLSPEC_HOTPATCH GetDiskFreeSpaceA(LPCSTR root, LPDWORD cluster_sectors, LPDWORD sector_bytes, LPDWORD free_clusters, LPDWORD total_clusters)
UINT WINAPI DECLSPEC_HOTPATCH GetLogicalDriveStringsW(UINT len, LPWSTR buffer)
DWORD WINAPI QueryDosDeviceW(LPCWSTR devname, LPWSTR target, DWORD bufsize)
static BOOL open_device_root(LPCWSTR root, HANDLE *handle)
DWORD WINAPI DECLSPEC_HOTPATCH GetLogicalDrives(void)
UINT WINAPI DECLSPEC_HOTPATCH GetDriveTypeW(LPCWSTR root)
BOOL WINAPI DECLSPEC_HOTPATCH GetDiskFreeSpaceW(LPCWSTR root, LPDWORD cluster_sectors, LPDWORD sector_bytes, LPDWORD free_clusters, LPDWORD total_clusters)
BOOL WINAPI GetVolumeInformationByHandleW(HANDLE handle, WCHAR *label, DWORD label_len, DWORD *serial, DWORD *filename_len, DWORD *flags, WCHAR *fsname, DWORD fsname_len)
static NTSTATUS read_nt_symlink(const WCHAR *name, WCHAR *target, DWORD size)
@ FileAttributeTagInformation
#define FILE_OPEN_REPARSE_POINT
#define FILE_SYNCHRONOUS_IO_NONALERT
struct _FILE_FS_ATTRIBUTE_INFORMATION FILE_FS_ATTRIBUTE_INFORMATION
@ FileFsDeviceInformation
@ FileFsAttributeInformation
@ FileFsVolumeInformation
GLuint GLuint GLsizei count
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
GLdouble GLdouble GLdouble r
GLuint GLsizei GLsizei * length
GLenum GLuint GLsizei bufsize
GLenum GLenum GLenum input
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint GLint GLint j
static const WCHAR labelW[]
_CRTIMP size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
#define OBJ_CASE_INSENSITIVE
NTSYSAPI NTSTATUS WINAPI RtlDuplicateUnicodeString(int, const UNICODE_STRING *, UNICODE_STRING *)
NTSYSAPI ULONG WINAPI RtlNtStatusToDosError(NTSTATUS)
const unsigned char size_t insize
unsigned char size_t * outsize
LPWSTR WINAPI lstrcatW(LPWSTR lpString1, LPCWSTR lpString2)
#define memcpy(s1, s2, n)
BOOL WINAPI GetVolumeNameForVolumeMountPointW(IN LPCWSTR VolumeMountPoint, OUT LPWSTR VolumeName, IN DWORD VolumeNameLength)
#define ERROR_FILE_NOT_FOUND
static const WCHAR label[]
static HANDLE PIO_APC_ROUTINE PVOID PIO_STATUS_BLOCK io
#define InitializeObjectAttributes(p, n, a, r, s)
#define IOCTL_MOUNTMGR_QUERY_POINTS
#define MOUNTMGR_DOS_DEVICE_NAME
NTSYSAPI ULONG NTAPI RtlIsDosDeviceName_U(_In_ PCWSTR Name)
NTSYSAPI BOOLEAN NTAPI RtlDosPathNameToNtPathName_U(_In_opt_z_ PCWSTR DosPathName, _Out_ PUNICODE_STRING NtPathName, _Out_opt_ PCWSTR *NtFileNamePart, _Out_opt_ PRTL_RELATIVE_NAME_U DirectoryInfo)
#define SYMBOLIC_LINK_ALL_ACCESS
NTSYSAPI NTSTATUS NTAPI NtOpenFile(OUT PHANDLE phFile, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes, OUT PIO_STATUS_BLOCK pIoStatusBlock, IN ULONG ShareMode, IN ULONG OpenMode)
#define FILE_REMOTE_DEVICE
#define FILE_READ_ATTRIBUTES
#define FILE_LIST_DIRECTORY
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
NTSYSAPI NTSTATUS NTAPI NtQueryInformationFile(IN HANDLE hFile, OUT PIO_STATUS_BLOCK pIoStatusBlock, OUT PVOID FileInformationBuffer, IN ULONG FileInformationBufferLength, IN FILE_INFORMATION_CLASS FileInfoClass)
#define FILE_SHARE_DELETE
NTSTATUS NTAPI NtClose(IN HANDLE Handle)
#define FILE_ATTRIBUTE_DIRECTORY
NTSYSAPI VOID NTAPI RtlFreeUnicodeString(PUNICODE_STRING UnicodeString)
#define FILE_REMOVABLE_MEDIA
#define FILE_ATTRIBUTE_REPARSE_POINT
NTSTATUS NTAPI NtQueryAttributesFile(IN POBJECT_ATTRIBUTES ObjectAttributes, OUT PFILE_BASIC_INFORMATION FileInformation)
NTSTATUS NTAPI NtOpenDirectoryObject(OUT PHANDLE DirectoryHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes)
NTSTATUS NTAPI NtQueryDirectoryObject(IN HANDLE DirectoryHandle, OUT PVOID Buffer, IN ULONG BufferLength, IN BOOLEAN ReturnSingleEntry, IN BOOLEAN RestartScan, IN OUT PULONG Context, OUT PULONG ReturnLength OPTIONAL)
NTSTATUS NTAPI NtMakeTemporaryObject(IN HANDLE ObjectHandle)
NTSTATUS NTAPI NtQuerySymbolicLinkObject(IN HANDLE LinkHandle, OUT PUNICODE_STRING LinkTarget, OUT PULONG ResultLength OPTIONAL)
NTSTATUS NTAPI NtCreateSymbolicLinkObject(OUT PHANDLE LinkHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes, IN PUNICODE_STRING LinkTarget)
NTSTATUS NTAPI NtOpenSymbolicLinkObject(OUT PHANDLE LinkHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes)
#define FILE_DEVICE_DISK_FILE_SYSTEM
#define FILE_DEVICE_CD_ROM_FILE_SYSTEM
#define FILE_DEVICE_NETWORK_FILE_SYSTEM
#define FILE_DEVICE_VIRTUAL_DISK
struct _FILE_FS_VOLUME_INFORMATION FILE_FS_VOLUME_INFORMATION
_Check_return_ _CRTIMP int __cdecl wcsncmp(_In_reads_or_z_(_MaxCount) const wchar_t *_Str1, _In_reads_or_z_(_MaxCount) const wchar_t *_Str2, _In_ size_t _MaxCount)
#define DECLSPEC_HOTPATCH
NTSTATUS NTAPI NtQueryVolumeInformationFile(HANDLE FileHandle, PIO_STATUS_BLOCK IoStatusBlock, PVOID FsInformation, ULONG Length, FS_INFORMATION_CLASS FsInformationClass)
MOUNTMGR_MOUNT_POINT MountPoints[1]
ULONG NumberOfMountPoints
USHORT SymbolicLinkNameLength
ULONG SymbolicLinkNameOffset
#define RTL_CONSTANT_STRING(s)
#define STATUS_INFO_LENGTH_MISMATCH
#define DRIVE_NO_ROOT_DIR
DWORD WINAPI GetLastError(void)
#define DDD_RAW_TARGET_PATH
#define DDD_REMOVE_DEFINITION
#define ERROR_PATH_NOT_FOUND
#define ERROR_NO_VOLUME_ID
#define ERROR_NO_MORE_FILES
#define ERROR_DIR_NOT_ROOT
#define ERROR_FILENAME_EXCED_RANGE
#define ERROR_NOT_A_REPARSE_POINT
#define IO_REPARSE_TAG_MOUNT_POINT