24#include <wx/filename.h>
40#if !defined( __MINGW32__ )
64#define FileFullDirectoryInformation ( (FILE_INFORMATION_CLASS) 2 )
71#if defined( _MSC_VER ) || !defined( USE_MSYS2_FALLBACK )
74 HANDLE hFile = INVALID_HANDLE_VALUE;
75 hFile = CreateFileW( aPath.wc_str(),
80 FILE_FLAG_SEQUENTIAL_SCAN,
83 if (hFile == INVALID_HANDLE_VALUE)
88 int fd = _open_osfhandle(
reinterpret_cast<intptr_t
>( hFile ), 0 );
97 FILE* fp = _fdopen( fd, aMode.c_str() );
108 return wxFopen( aPath, aMode );
118 if( GetFileSecurity( aSrc.wc_str(),
119 OWNER_SECURITY_INFORMATION | GROUP_SECURITY_INFORMATION | DACL_SECURITY_INFORMATION,
127 BYTE* pSD =
new BYTE[dwSize];
129 PSECURITY_DESCRIPTOR pSD =
static_cast<PSECURITY_DESCRIPTOR
>(
new BYTE[dwSize] );
135 if( !GetFileSecurity( aSrc.wc_str(),
136 OWNER_SECURITY_INFORMATION | GROUP_SECURITY_INFORMATION
137 | DACL_SECURITY_INFORMATION, pSD, dwSize, &dwSize ) )
144 if( !SetFileSecurity( aDest.wc_str(),
145 OWNER_SECURITY_INFORMATION | GROUP_SECURITY_INFORMATION
146 | DACL_SECURITY_INFORMATION, pSD ) )
159 DWORD attrs = GetFileAttributesW( aFilePath.wc_str() );
161 if( attrs == INVALID_FILE_ATTRIBUTES )
167 DWORD attrsToRemove = FILE_ATTRIBUTE_READONLY | FILE_ATTRIBUTE_HIDDEN;
169 if( attrs & attrsToRemove )
171 attrs &= ~attrsToRemove;
172 return SetFileAttributesW( aFilePath.wc_str(), attrs ) != 0;
182 if( ( GetFileAttributesW( aFileName.fn_str() ) & FILE_ATTRIBUTE_HIDDEN ) )
195 if( aFilename.GetVolume().Length() == 1 )
197 aFilename.SetVolume(
"\\\\?\\" + aFilename.GetVolume() +
":" );
198 else if( aFilename.GetVolume().Length() > 1
199 && aFilename.GetVolume().StartsWith( wxT(
"\\\\" ) )
200 && !aFilename.GetVolume().StartsWith( wxT(
"\\\\?" ) ) )
205 aFilename.SetVolume(
"\\\\?\\UNC" + aFilename.GetVolume().Mid( 1 ) );
206 else if( aFilename.GetVolume().StartsWith( wxT(
"\\\\?" ) )
207 && aFilename.GetDirs().size() >= 2
208 && aFilename.GetDirs()[0] ==
"UNC" )
214 aFilename.SetVolume(
"\\\\?\\UNC\\" + aFilename.GetDirs()[1] );
215 aFilename.RemoveDir( 0 );
216 aFilename.RemoveDir( 0 );
223 long long timestamp = 0;
228 static PFN_NtQueryDirectoryFile pNtQueryDirectoryFile =
nullptr;
230 if( !pNtQueryDirectoryFile )
232 HMODULE ntdll = GetModuleHandleW(
L"ntdll.dll" );
236 pNtQueryDirectoryFile =
237 (PFN_NtQueryDirectoryFile) GetProcAddress( ntdll,
"NtQueryDirectoryFile" );
241 if( !pNtQueryDirectoryFile )
244 std::wstring dirPath( aDirPath.t_str() );
246 if( !dirPath.empty() && dirPath.back() !=
L'\\' )
252 if( dirPath.size() >= 2 && dirPath[0] ==
L'\\' && dirPath[1] ==
L'\\' )
254 if( dirPath.size() >= 4 && dirPath[2] ==
L'?' && dirPath[3] ==
L'\\' )
262 ntPath =
L"\\\\?\\UNC\\" + dirPath.substr( 2 );
268 ntPath =
L"\\\\?\\" + dirPath;
271 HANDLE hDir = CreateFileW( ntPath.c_str(), FILE_LIST_DIRECTORY,
272 FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
nullptr,
273 OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS,
nullptr );
275 if( hDir == INVALID_HANDLE_VALUE )
278 std::wstring pattern( aFilespec.t_str() );
281 alignas(
sizeof( LONGLONG ) )
char buffer[64 * 1024];
283 IO_STATUS_BLOCK iosb;
285 bool firstQuery =
true;
289 status = pNtQueryDirectoryFile( hDir,
nullptr,
nullptr,
nullptr, &iosb, buffer,
291 nullptr, firstQuery ? TRUE : FALSE );
306 && PathMatchSpecW( fileName.c_str(), pattern.c_str() ) )
328 m_fileHandle = CreateFileW( aFileName.wc_str(), GENERIC_READ, FILE_SHARE_READ,
329 nullptr, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,
nullptr );
331 if( m_fileHandle == INVALID_HANDLE_VALUE )
333 m_fileHandle =
nullptr;
334 throw std::runtime_error( std::string(
"Cannot open file: " )
335 + aFileName.ToStdString() );
338 LARGE_INTEGER fileSize;
340 if( !GetFileSizeEx( m_fileHandle, &fileSize ) )
342 CloseHandle( m_fileHandle );
343 m_fileHandle =
nullptr;
344 throw std::runtime_error( std::string(
"Cannot determine file size: " )
345 + aFileName.ToStdString() );
348 m_size =
static_cast<size_t>( fileSize.QuadPart );
352 CloseHandle( m_fileHandle );
353 m_fileHandle =
nullptr;
357 m_mapHandle = CreateFileMappingW( m_fileHandle,
nullptr, PAGE_READONLY, 0, 0,
nullptr );
361 CloseHandle( m_fileHandle );
362 m_fileHandle =
nullptr;
367 void* ptr = MapViewOfFile( m_mapHandle, FILE_MAP_READ, 0, 0, 0 );
371 CloseHandle( m_mapHandle );
372 m_mapHandle =
nullptr;
373 CloseHandle( m_fileHandle );
374 m_fileHandle =
nullptr;
379 m_data =
static_cast<const uint8_t*
>( ptr );
385 if( m_data && m_mapHandle )
386 UnmapViewOfFile( m_data );
389 CloseHandle( m_mapHandle );
392 CloseHandle( m_fileHandle );
wxString result
Test unit parsing edge cases and error handling.
typedef FILE_INFORMATION_CLASS
struct _FILE_FULL_DIR_INFORMATION FILE_FULL_DIR_INFORMATION
typedef NTSTATUS(NTAPI *PFN_NtQueryDirectoryFile)(HANDLE
struct _FILE_FULL_DIR_INFORMATION * PFILE_FULL_DIR_INFORMATION
#define FileFullDirectoryInformation