diff --git a/libretro-common/vfs/vfs_implementation_uwp.cpp b/libretro-common/vfs/vfs_implementation_uwp.cpp index 814b738609..b6d514e65a 100644 --- a/libretro-common/vfs/vfs_implementation_uwp.cpp +++ b/libretro-common/vfs/vfs_implementation_uwp.cpp @@ -54,171 +54,172 @@ using namespace Windows::Storage::FileProperties; #include #include #include +#include namespace { - void windowsize_path(wchar_t* path) - { - /* UWP deals with paths containing / instead of + void windowsize_path(wchar_t* path) + { + /* UWP deals with paths containing / instead of * \ way worse than normal Windows */ - /* and RetroArch may sometimes mix them + /* and RetroArch may sometimes mix them * (e.g. on archive extraction) */ - if (!path) - return; + if (!path) + return; - while (*path) - { - if (*path == '/') - *path = '\\'; - ++path; - } - } + while (*path) + { + if (*path == '/') + *path = '\\'; + ++path; + } + } } namespace { - /* Damn you, UWP, why no functions for that either */ - template - concurrency::task GetItemFromPathAsync(Platform::String^ path) - { - static_assert(false, "StorageFile and StorageFolder only"); - } - template<> - concurrency::task GetItemFromPathAsync(Platform::String^ path) - { - return concurrency::create_task(StorageFile::GetFileFromPathAsync(path)); - } - template<> - concurrency::task GetItemFromPathAsync(Platform::String^ path) - { - return concurrency::create_task(StorageFolder::GetFolderFromPathAsync(path)); - } + /* Damn you, UWP, why no functions for that either */ + template + concurrency::task GetItemFromPathAsync(Platform::String^ path) + { + static_assert(false, "StorageFile and StorageFolder only"); + } + template<> + concurrency::task GetItemFromPathAsync(Platform::String^ path) + { + return concurrency::create_task(StorageFile::GetFileFromPathAsync(path)); + } + template<> + concurrency::task GetItemFromPathAsync(Platform::String^ path) + { + return concurrency::create_task(StorageFolder::GetFolderFromPathAsync(path)); + } - template - concurrency::task GetItemInFolderFromPathAsync(StorageFolder^ folder, Platform::String^ path) - { - static_assert(false, "StorageFile and StorageFolder only"); - } - template<> - concurrency::task GetItemInFolderFromPathAsync(StorageFolder^ folder, Platform::String^ path) - { - if (path->IsEmpty()) - retro_assert(false); /* Attempt to read a folder as a file - this really should have been caught earlier */ - return concurrency::create_task(folder->GetFileAsync(path)); - } - template<> - concurrency::task GetItemInFolderFromPathAsync(StorageFolder^ folder, Platform::String^ path) - { - if (path->IsEmpty()) - return concurrency::create_task(concurrency::create_async([folder]() { return folder; })); - return concurrency::create_task(folder->GetFolderAsync(path)); - } + template + concurrency::task GetItemInFolderFromPathAsync(StorageFolder^ folder, Platform::String^ path) + { + static_assert(false, "StorageFile and StorageFolder only"); + } + template<> + concurrency::task GetItemInFolderFromPathAsync(StorageFolder^ folder, Platform::String^ path) + { + if (path->IsEmpty()) + retro_assert(false); /* Attempt to read a folder as a file - this really should have been caught earlier */ + return concurrency::create_task(folder->GetFileAsync(path)); + } + template<> + concurrency::task GetItemInFolderFromPathAsync(StorageFolder^ folder, Platform::String^ path) + { + if (path->IsEmpty()) + return concurrency::create_task(concurrency::create_async([folder]() { return folder; })); + return concurrency::create_task(folder->GetFolderAsync(path)); + } } namespace { - /* A list of all StorageFolder objects returned using from the file picker */ - Platform::Collections::Vector accessible_directories; + /* A list of all StorageFolder objects returned using from the file picker */ + Platform::Collections::Vector accessible_directories; - concurrency::task TriggerPickerAddDialog() - { - auto folderPicker = ref new Windows::Storage::Pickers::FolderPicker(); - folderPicker->SuggestedStartLocation = Windows::Storage::Pickers::PickerLocationId::Desktop; - folderPicker->FileTypeFilter->Append("*"); + concurrency::task TriggerPickerAddDialog() + { + auto folderPicker = ref new Windows::Storage::Pickers::FolderPicker(); + folderPicker->SuggestedStartLocation = Windows::Storage::Pickers::PickerLocationId::Desktop; + folderPicker->FileTypeFilter->Append("*"); - return concurrency::create_task(folderPicker->PickSingleFolderAsync()).then([](StorageFolder^ folder) { - if (folder == nullptr) - throw ref new Platform::Exception(E_ABORT, L"Operation cancelled by user"); + return concurrency::create_task(folderPicker->PickSingleFolderAsync()).then([](StorageFolder^ folder) { + if (folder == nullptr) + throw ref new Platform::Exception(E_ABORT, L"Operation cancelled by user"); - /* TODO: check for duplicates */ - accessible_directories.Append(folder); - return folder->Path; - }); - } + /* TODO: check for duplicates */ + accessible_directories.Append(folder); + return folder->Path; + }); + } - template - concurrency::task LocateStorageItem(Platform::String^ path) - { - /* Look for a matching directory we can use */ - for each (StorageFolder^ folder in accessible_directories) - { + template + concurrency::task LocateStorageItem(Platform::String^ path) + { + /* Look for a matching directory we can use */ + for each (StorageFolder^ folder in accessible_directories) + { std::wstring file_path; - std::wstring folder_path = folder->Path->Data(); + std::wstring folder_path = folder->Path->Data(); size_t folder_path_size = folder_path.size(); - /* Could be C:\ or C:\Users\somebody - remove the trailing slash to unify them */ - if (folder_path[folder_path_size - 1] == '\\') - folder_path.erase(folder_path_size - 1); + /* Could be C:\ or C:\Users\somebody - remove the trailing slash to unify them */ + if (folder_path[folder_path_size - 1] == '\\') + folder_path.erase(folder_path_size - 1); - file_path = path->Data(); + file_path = path->Data(); - if (file_path.find(folder_path) == 0) - { - /* Found a match */ - file_path = file_path.length() > folder_path.length() + if (file_path.find(folder_path) == 0) + { + /* Found a match */ + file_path = file_path.length() > folder_path.length() ? file_path.substr(folder_path.length() + 1) : L""; - return concurrency::create_task(GetItemInFolderFromPathAsync(folder, ref new Platform::String(file_path.data()))); - } - } + return concurrency::create_task(GetItemInFolderFromPathAsync(folder, ref new Platform::String(file_path.data()))); + } + } - /* No matches - try accessing directly, and fallback to user prompt */ - return concurrency::create_task(GetItemFromPathAsync(path)).then([&](concurrency::task item) { - try - { - T^ storageItem = item.get(); - return concurrency::create_task(concurrency::create_async([storageItem]() { return storageItem; })); - } - catch (Platform::AccessDeniedException^ e) - { - Windows::UI::Popups::MessageDialog^ dialog = - ref new Windows::UI::Popups::MessageDialog("Path \"" + path + "\" is not currently accessible. Please open any containing directory to access it."); - dialog->Commands->Append(ref new Windows::UI::Popups::UICommand("Open file picker")); - dialog->Commands->Append(ref new Windows::UI::Popups::UICommand("Cancel")); - return concurrency::create_task(dialog->ShowAsync()).then([path](Windows::UI::Popups::IUICommand^ cmd) { - if (cmd->Label == "Open file picker") - { - return TriggerPickerAddDialog().then([path](Platform::String^ added_path) { - /* Retry */ - return LocateStorageItem(path); - }); - } - else - { - throw ref new Platform::Exception(E_ABORT, L"Operation cancelled by user"); - } - }); - } - }); - } + /* No matches - try accessing directly, and fallback to user prompt */ + return concurrency::create_task(GetItemFromPathAsync(path)).then([&](concurrency::task item) { + try + { + T^ storageItem = item.get(); + return concurrency::create_task(concurrency::create_async([storageItem]() { return storageItem; })); + } + catch (Platform::AccessDeniedException^ e) + { + Windows::UI::Popups::MessageDialog^ dialog = + ref new Windows::UI::Popups::MessageDialog("Path \"" + path + "\" is not currently accessible. Please open any containing directory to access it."); + dialog->Commands->Append(ref new Windows::UI::Popups::UICommand("Open file picker")); + dialog->Commands->Append(ref new Windows::UI::Popups::UICommand("Cancel")); + return concurrency::create_task(dialog->ShowAsync()).then([path](Windows::UI::Popups::IUICommand^ cmd) { + if (cmd->Label == "Open file picker") + { + return TriggerPickerAddDialog().then([path](Platform::String^ added_path) { + /* Retry */ + return LocateStorageItem(path); + }); + } + else + { + throw ref new Platform::Exception(E_ABORT, L"Operation cancelled by user"); + } + }); + } + }); + } - IStorageItem^ LocateStorageFileOrFolder(Platform::String^ path) - { - if (!path || path->IsEmpty()) - return nullptr; + IStorageItem^ LocateStorageFileOrFolder(Platform::String^ path) + { + if (!path || path->IsEmpty()) + return nullptr; - if (*(path->End() - 1) == '\\') - { - /* Ends with a slash, so it's definitely a directory */ - return RunAsyncAndCatchErrors([&]() { - return concurrency::create_task(LocateStorageItem(path)); - }, nullptr); - } - else - { - /* No final slash - probably a file (since RetroArch usually slash-terminates dirs), but there is still a chance it's a directory */ - IStorageItem^ item; - item = RunAsyncAndCatchErrors([&]() { - return concurrency::create_task(LocateStorageItem(path)); - }, nullptr); - if (!item) - { - item = RunAsyncAndCatchErrors([&]() { - return concurrency::create_task(LocateStorageItem(path)); - }, nullptr); - } - return item; - } - } + if (*(path->End() - 1) == '\\') + { + /* Ends with a slash, so it's definitely a directory */ + return RunAsyncAndCatchErrors([&]() { + return concurrency::create_task(LocateStorageItem(path)); + }, nullptr); + } + else + { + /* No final slash - probably a file (since RetroArch usually slash-terminates dirs), but there is still a chance it's a directory */ + IStorageItem^ item; + item = RunAsyncAndCatchErrors([&]() { + return concurrency::create_task(LocateStorageItem(path)); + }, nullptr); + if (!item) + { + item = RunAsyncAndCatchErrors([&]() { + return concurrency::create_task(LocateStorageItem(path)); + }, nullptr); + } + return item; + } + } } @@ -226,65 +227,88 @@ namespace /* Wraps a raw buffer into a WinRT object */ /* https://stackoverflow.com/questions/10520335/how-to-wrap-a-char-buffer-in-a-winrt-ibuffer-in-c */ class NativeBuffer : - public Microsoft::WRL::RuntimeClass, - ABI::Windows::Storage::Streams::IBuffer, - Windows::Storage::Streams::IBufferByteAccess> + public Microsoft::WRL::RuntimeClass, + ABI::Windows::Storage::Streams::IBuffer, + Windows::Storage::Streams::IBufferByteAccess> { public: - virtual ~NativeBuffer() - { - } + virtual ~NativeBuffer() + { + } - HRESULT __stdcall RuntimeClassInitialize( + HRESULT __stdcall RuntimeClassInitialize( byte *buffer, uint32_t capacity, uint32_t length) - { - m_buffer = buffer; - m_capacity = capacity; - m_length = length; - return S_OK; - } + { + m_buffer = buffer; + m_capacity = capacity; + m_length = length; + return S_OK; + } - HRESULT __stdcall Buffer(byte **value) - { - if (m_buffer == nullptr) - return E_INVALIDARG; - *value = m_buffer; - return S_OK; - } + HRESULT __stdcall Buffer(byte **value) + { + if (m_buffer == nullptr) + return E_INVALIDARG; + *value = m_buffer; + return S_OK; + } - HRESULT __stdcall get_Capacity(uint32_t *value) - { - *value = m_capacity; - return S_OK; - } + HRESULT __stdcall get_Capacity(uint32_t *value) + { + *value = m_capacity; + return S_OK; + } - HRESULT __stdcall get_Length(uint32_t *value) - { - *value = m_length; - return S_OK; - } + HRESULT __stdcall get_Length(uint32_t *value) + { + *value = m_length; + return S_OK; + } - HRESULT __stdcall put_Length(uint32_t value) - { - if (value > m_capacity) - return E_INVALIDARG; - m_length = value; - return S_OK; - } + HRESULT __stdcall put_Length(uint32_t value) + { + if (value > m_capacity) + return E_INVALIDARG; + m_length = value; + return S_OK; + } private: - byte *m_buffer; - uint32_t m_capacity; - uint32_t m_length; + byte *m_buffer; + uint32_t m_capacity; + uint32_t m_length; }; IBuffer^ CreateNativeBuffer(void* buf, uint32_t capacity, uint32_t length) { - Microsoft::WRL::ComPtr nativeBuffer; - Microsoft::WRL::Details::MakeAndInitialize(&nativeBuffer, (byte *)buf, capacity, length); - auto iinspectable = (IInspectable *)reinterpret_cast(nativeBuffer.Get()); - IBuffer ^buffer = reinterpret_cast(iinspectable); - return buffer; + Microsoft::WRL::ComPtr nativeBuffer; + Microsoft::WRL::Details::MakeAndInitialize(&nativeBuffer, (byte *)buf, capacity, length); + auto iinspectable = (IInspectable *)reinterpret_cast(nativeBuffer.Get()); + IBuffer ^buffer = reinterpret_cast(iinspectable); + return buffer; +} + +/* Get a Win32 file handle out of IStorageFile */ +/* https://stackoverflow.com/questions/42799235/how-can-i-get-a-win32-handle-for-a-storagefile-or-storagefolder-in-uwp */ +HRESULT GetHandleFromStorageFile(Windows::Storage::StorageFile^ file, HANDLE* handle, HANDLE_ACCESS_OPTIONS accessMode) +{ + Microsoft::WRL::ComPtr abiPointer(reinterpret_cast(file)); + Microsoft::WRL::ComPtr handleAccess; + if (SUCCEEDED(abiPointer.As(&handleAccess))) { + HANDLE hFile = INVALID_HANDLE_VALUE; + + if (SUCCEEDED(handleAccess->Create(accessMode, + HANDLE_SHARING_OPTIONS::HSO_SHARE_READ, + HANDLE_OPTIONS::HO_NONE, + nullptr, + &hFile))) { + *handle = hFile; + + return S_OK; + } + } + + return E_FAIL; } #ifdef VFS_FRONTEND @@ -293,13 +317,14 @@ struct retro_vfs_file_handle struct libretro_vfs_implementation_file #endif { - IRandomAccessStream^ fp; - IBuffer^ bufferp; - char* buffer; - char* orig_path; - size_t buffer_size; - int buffer_left; - size_t buffer_fill; + IRandomAccessStream^ fp; + IBuffer^ bufferp; + HANDLE file_handle; + char* buffer; + char* orig_path; + size_t buffer_size; + int buffer_left; + size_t buffer_fill; }; libretro_vfs_implementation_file *retro_vfs_file_open_impl( @@ -307,128 +332,251 @@ libretro_vfs_implementation_file *retro_vfs_file_open_impl( { char dirpath[PATH_MAX_LENGTH]; char filename[PATH_MAX_LENGTH]; + wchar_t *path_wide; wchar_t *dirpath_wide; wchar_t *filename_wide; + Platform::String^ path_str; Platform::String^ filename_str; Platform::String^ dirpath_str; - if (!path || !*path) - return NULL; + HANDLE file_handle = INVALID_HANDLE_VALUE; + DWORD desireAccess; + DWORD creationDisposition; + + if (!path || !*path) + return NULL; /* Something tried to access files from current directory. * This is not allowed on UWP. */ - if (!path_is_absolute(path)) - return NULL; + if (!path_is_absolute(path)) + return NULL; /* Trying to open a directory as file?! */ - if (PATH_CHAR_IS_SLASH(path[strlen(path) - 1])) - return NULL; + if (PATH_CHAR_IS_SLASH(path[strlen(path) - 1])) + return NULL; dirpath[0] = filename[0] = '\0'; - fill_pathname_basedir(dirpath, path, sizeof(dirpath)); - dirpath_wide = utf8_to_utf16_string_alloc(dirpath); - windowsize_path(dirpath_wide); - dirpath_str = ref new Platform::String(dirpath_wide); - free(dirpath_wide); + path_wide = utf8_to_utf16_string_alloc(path); + windowsize_path(path_wide); + path_str = ref new Platform::String(path_wide); + free(path_wide); - fill_pathname_base(filename, path, sizeof(filename)); - filename_wide = utf8_to_utf16_string_alloc(filename); - filename_str = ref new Platform::String(filename_wide); - free(filename_wide); + fill_pathname_basedir(dirpath, path, sizeof(dirpath)); + dirpath_wide = utf8_to_utf16_string_alloc(dirpath); + windowsize_path(dirpath_wide); + dirpath_str = ref new Platform::String(dirpath_wide); + free(dirpath_wide); - retro_assert(!dirpath_str->IsEmpty() && !filename_str->IsEmpty()); + fill_pathname_base(filename, path, sizeof(filename)); + filename_wide = utf8_to_utf16_string_alloc(filename); + filename_str = ref new Platform::String(filename_wide); + free(filename_wide); - return RunAsyncAndCatchErrors([&]() { - return concurrency::create_task(LocateStorageItem(dirpath_str)).then([&](StorageFolder^ dir) { - if (mode == RETRO_VFS_FILE_ACCESS_READ) - return dir->GetFileAsync(filename_str); - else - return dir->CreateFileAsync(filename_str, (mode & RETRO_VFS_FILE_ACCESS_UPDATE_EXISTING) != 0 ? - CreationCollisionOption::OpenIfExists : CreationCollisionOption::ReplaceExisting); - }).then([&](StorageFile^ file) { - FileAccessMode accessMode = (mode == RETRO_VFS_FILE_ACCESS_READ) ? - FileAccessMode::Read : FileAccessMode::ReadWrite; - return file->OpenAsync(accessMode); - }).then([&](IRandomAccessStream^ fpstream) { - libretro_vfs_implementation_file *stream = (libretro_vfs_implementation_file*)calloc(1, sizeof(*stream)); - if (!stream) - return (libretro_vfs_implementation_file*)NULL; + retro_assert(!dirpath_str->IsEmpty() && !filename_str->IsEmpty()); - stream->orig_path = strdup(path); - stream->fp = fpstream; - stream->fp->Seek(0); - /* Preallocate a small buffer for manually buffered I/O, - * makes short read faster */ - int buf_size = 8 * 1024; - stream->buffer = (char*)malloc(buf_size); - stream->bufferp = CreateNativeBuffer(stream->buffer, buf_size, 0); - stream->buffer_left = 0; - stream->buffer_fill = 0; - stream->buffer_size = buf_size; - return stream; - }); - }, NULL); + /* Try Win32 first, this should work in AppData */ + if (mode == RETRO_VFS_FILE_ACCESS_READ) { + desireAccess = GENERIC_READ; + creationDisposition = OPEN_ALWAYS; + } + else { + desireAccess = GENERIC_WRITE; + creationDisposition = (mode & RETRO_VFS_FILE_ACCESS_UPDATE_EXISTING) != 0 ? + OPEN_ALWAYS : CREATE_ALWAYS; + } + file_handle = CreateFile2(path_str->Data(), desireAccess, FILE_SHARE_READ, creationDisposition, NULL); + if (file_handle != INVALID_HANDLE_VALUE) { + libretro_vfs_implementation_file* stream = (libretro_vfs_implementation_file*)calloc(1, sizeof(*stream)); + if (!stream) + return (libretro_vfs_implementation_file*)NULL; + + stream->orig_path = strdup(path); + stream->fp = nullptr; + stream->file_handle = file_handle; + stream->buffer_left = 0; + stream->buffer_fill = 0; + return stream; + } + + /* Fallback to WinRT */ + return RunAsyncAndCatchErrors([&]() { + return concurrency::create_task(LocateStorageItem(dirpath_str)).then([&](StorageFolder^ dir) { + if (mode == RETRO_VFS_FILE_ACCESS_READ) + return dir->GetFileAsync(filename_str); + else + return dir->CreateFileAsync(filename_str, (mode & RETRO_VFS_FILE_ACCESS_UPDATE_EXISTING) != 0 ? + CreationCollisionOption::OpenIfExists : CreationCollisionOption::ReplaceExisting); + }).then([&](StorageFile ^file) { + + HANDLE_CREATION_OPTIONS creationOptions; + HANDLE_ACCESS_OPTIONS handleAccess; + HRESULT hr; + + /* Try to use IStorageItemHandleAccess to get the file handle, + * with that we can use Win32 APIs for subsequent reads/writes + */ + if (mode == RETRO_VFS_FILE_ACCESS_READ) { + handleAccess = HANDLE_ACCESS_OPTIONS::HAO_READ; + creationOptions = HANDLE_CREATION_OPTIONS::HCO_OPEN_ALWAYS; + } else { + handleAccess = HANDLE_ACCESS_OPTIONS::HAO_WRITE; + creationOptions = (mode & RETRO_VFS_FILE_ACCESS_UPDATE_EXISTING) != 0 ? + HANDLE_CREATION_OPTIONS::HCO_OPEN_ALWAYS : HANDLE_CREATION_OPTIONS::HCO_CREATE_ALWAYS; + + } + hr = GetHandleFromStorageFile(file, &file_handle, handleAccess); + + if (SUCCEEDED(hr)) { + /* Success, let's return a null pointer and continue */ + return concurrency::create_task([&]() { return (IRandomAccessStream^) nullptr; }); + } else { + /* Failed, open a WinRT buffer of the file */ + FileAccessMode accessMode = (mode == RETRO_VFS_FILE_ACCESS_READ) ? + FileAccessMode::Read : FileAccessMode::ReadWrite; + return concurrency::create_task(file->OpenAsync(accessMode)); + } + }).then([&](IRandomAccessStream^ fpstream) { + libretro_vfs_implementation_file *stream = (libretro_vfs_implementation_file*)calloc(1, sizeof(*stream)); + if (!stream) + return (libretro_vfs_implementation_file*)NULL; + + stream->orig_path = strdup(path); + stream->fp = fpstream; + stream->file_handle = file_handle; + stream->buffer_left = 0; + stream->buffer_fill = 0; + + if (fpstream) { + /* We are using WinRT. + * Preallocate a small buffer for manually buffered I/O, + * makes short read faster */ + stream->fp->Seek(0); + int buf_size = 8 * 1024; + stream->buffer = (char*)malloc(buf_size); + stream->bufferp = CreateNativeBuffer(stream->buffer, buf_size, 0); + stream->buffer_size = buf_size; + } else { + /* If we can use Win32 file api, buffering shouldn't be necessary */ + stream->buffer = NULL; + stream->bufferp = nullptr; + stream->buffer_size = 0; + } + return stream; + }); + }, NULL); } int retro_vfs_file_close_impl(libretro_vfs_implementation_file *stream) { - if (!stream || !stream->fp) - return -1; + if (!stream || (!stream->fp && stream->file_handle == INVALID_HANDLE_VALUE)) + return -1; - /* Apparently, this is how you close a file in WinRT */ - /* Yes, really */ - stream->fp = nullptr; - free(stream->buffer); + if (stream->file_handle != INVALID_HANDLE_VALUE) { + CloseHandle(stream->file_handle); + } else { + /* Apparently, this is how you close a file in WinRT */ + /* Yes, really */ + stream->fp = nullptr; + free(stream->buffer); + } - return 0; + return 0; } int retro_vfs_file_error_impl(libretro_vfs_implementation_file *stream) { - return false; /* TODO */ + return false; /* TODO */ } int64_t retro_vfs_file_size_impl(libretro_vfs_implementation_file *stream) { - if (!stream || !stream->fp) - return 0; - return stream->fp->Size; + if (!stream || (!stream->fp && stream->file_handle == INVALID_HANDLE_VALUE)) + return 0; + + if (stream->file_handle != INVALID_HANDLE_VALUE) { + LARGE_INTEGER sz; + if (GetFileSizeEx(stream->file_handle, &sz)) { + return sz.QuadPart; + } else { + return 0; + } + } else { + return stream->fp->Size; + } + } int64_t retro_vfs_file_truncate_impl(libretro_vfs_implementation_file *stream, int64_t length) { - if (!stream || !stream->fp) - return -1; - stream->fp->Size = length; - return 0; + if (!stream || (!stream->fp && stream->file_handle == INVALID_HANDLE_VALUE)) + return -1; + + if (stream->file_handle != INVALID_HANDLE_VALUE) { + int64_t p = retro_vfs_file_tell_impl(stream); + retro_vfs_file_seek_impl(stream, length, RETRO_VFS_SEEK_POSITION_START); + SetEndOfFile(stream->file_handle); + + if (p < length) { + retro_vfs_file_seek_impl(stream, p, RETRO_VFS_SEEK_POSITION_START); + } + } else { + stream->fp->Size = length; + } + + return 0; } int64_t retro_vfs_file_tell_impl(libretro_vfs_implementation_file *stream) { - if (!stream || !stream->fp) - return -1; - return stream->fp->Position - stream->buffer_left; + LARGE_INTEGER _offset; + LARGE_INTEGER out; + _offset.QuadPart = 0; + + if (!stream || (!stream->fp && stream->file_handle == INVALID_HANDLE_VALUE)) + return -1; + + if (stream->file_handle != INVALID_HANDLE_VALUE) { + SetFilePointerEx(stream->file_handle, _offset, &out, FILE_CURRENT); + return out.QuadPart; + } else { + return stream->fp->Position - stream->buffer_left; + } } int64_t retro_vfs_file_seek_impl( libretro_vfs_implementation_file *stream, int64_t offset, int seek_position) { - if (!stream || !stream->fp) + LARGE_INTEGER _offset; + _offset.QuadPart = offset; + + if (!stream || (!stream->fp && stream->file_handle == INVALID_HANDLE_VALUE)) return -1; switch (seek_position) { case RETRO_VFS_SEEK_POSITION_START: - stream->fp->Seek(offset); + if (stream->file_handle != INVALID_HANDLE_VALUE) { + SetFilePointerEx(stream->file_handle, _offset, NULL, FILE_BEGIN); + } else { + stream->fp->Seek(offset); + } break; case RETRO_VFS_SEEK_POSITION_CURRENT: - stream->fp->Seek(retro_vfs_file_tell_impl(stream) + offset); + if (stream->file_handle != INVALID_HANDLE_VALUE) { + SetFilePointerEx(stream->file_handle, _offset, NULL, FILE_CURRENT); + } else { + stream->fp->Seek(retro_vfs_file_tell_impl(stream) + offset); + } break; case RETRO_VFS_SEEK_POSITION_END: - stream->fp->Seek(stream->fp->Size - offset); + if (stream->file_handle != INVALID_HANDLE_VALUE) { + SetFilePointerEx(stream->file_handle, _offset, NULL, FILE_END); + } else { + stream->fp->Seek(stream->fp->Size - offset); + } break; } @@ -442,135 +590,165 @@ int64_t retro_vfs_file_read_impl( libretro_vfs_implementation_file *stream, void *s, uint64_t len) { int64_t ret; - int64_t bytes_read = 0; + int64_t bytes_read = 0; IBuffer^ buffer; - if (!stream || !stream->fp || !s) - return -1; + if (!stream || (!stream->fp && stream->file_handle == INVALID_HANDLE_VALUE) || !s) + return -1; - if (len <= stream->buffer_size) + if (stream->file_handle != INVALID_HANDLE_VALUE) { + DWORD _bytes_read; + ReadFile(stream->file_handle, (char*)s, len, &_bytes_read, NULL); + return (int64_t)_bytes_read; + } + else { - /* Small read, use manually buffered I/O */ - if (stream->buffer_left < len) + if (len <= stream->buffer_size) { - /* Exhaust the buffer */ - memcpy(s, - &stream->buffer[stream->buffer_fill - stream->buffer_left], - stream->buffer_left); - len -= stream->buffer_left; - bytes_read += stream->buffer_left; - stream->buffer_left = 0; - - /* Fill buffer */ - stream->buffer_left = RunAsyncAndCatchErrors([&]() { - return concurrency::create_task(stream->fp->ReadAsync(stream->bufferp, stream->bufferp->Capacity, InputStreamOptions::None)).then([&](IBuffer^ buf) { - retro_assert(stream->bufferp == buf); - return (int64_t)stream->bufferp->Length; - }); - }, -1); - stream->buffer_fill = stream->buffer_left; - - if (stream->buffer_left == -1) - { - stream->buffer_left = 0; - stream->buffer_fill = 0; - return -1; - } - + /* Small read, use manually buffered I/O */ if (stream->buffer_left < len) { - /* EOF */ - memcpy(&((char*)s)[bytes_read], - stream->buffer, stream->buffer_left); - bytes_read += stream->buffer_left; + /* Exhaust the buffer */ + memcpy(s, + &stream->buffer[stream->buffer_fill - stream->buffer_left], + stream->buffer_left); + len -= stream->buffer_left; + bytes_read += stream->buffer_left; stream->buffer_left = 0; + + /* Fill buffer */ + stream->buffer_left = RunAsyncAndCatchErrors([&]() { + return concurrency::create_task(stream->fp->ReadAsync(stream->bufferp, stream->bufferp->Capacity, InputStreamOptions::None)).then([&](IBuffer^ buf) { + retro_assert(stream->bufferp == buf); + return (int64_t)stream->bufferp->Length; + }); + }, -1); + stream->buffer_fill = stream->buffer_left; + + if (stream->buffer_left == -1) + { + stream->buffer_left = 0; + stream->buffer_fill = 0; + return -1; + } + + if (stream->buffer_left < len) + { + /* EOF */ + memcpy(&((char*)s)[bytes_read], + stream->buffer, stream->buffer_left); + bytes_read += stream->buffer_left; + stream->buffer_left = 0; + return bytes_read; + } + + memcpy(&((char*)s)[bytes_read], stream->buffer, len); + bytes_read += len; + stream->buffer_left -= len; return bytes_read; } - memcpy(&((char*)s)[bytes_read], stream->buffer, len); - bytes_read += len; - stream->buffer_left -= len; - return bytes_read; - } - - /* Internal buffer already contains requested amount */ - memcpy(s, + /* Internal buffer already contains requested amount */ + memcpy(s, &stream->buffer[stream->buffer_fill - stream->buffer_left], len); - stream->buffer_left -= len; - return len; + stream->buffer_left -= len; + return len; + } + + /* Big read exceeding buffer size, + * exhaust small buffer and read rest in one go */ + memcpy(s, &stream->buffer[stream->buffer_fill - stream->buffer_left], stream->buffer_left); + len -= stream->buffer_left; + bytes_read += stream->buffer_left; + stream->buffer_left = 0; + + buffer = CreateNativeBuffer(&((char*)s)[bytes_read], len, 0); + ret = RunAsyncAndCatchErrors([&]() { + return concurrency::create_task(stream->fp->ReadAsync(buffer, buffer->Capacity - bytes_read, InputStreamOptions::None)).then([&](IBuffer^ buf) { + retro_assert(buf == buffer); + return (int64_t)buffer->Length; + }); + }, -1); + + if (ret == -1) + return -1; + return bytes_read + ret; } - - /* Big read exceeding buffer size, - * exhaust small buffer and read rest in one go */ - memcpy(s, &stream->buffer[stream->buffer_fill - stream->buffer_left], stream->buffer_left); - len -= stream->buffer_left; - bytes_read += stream->buffer_left; - stream->buffer_left = 0; - - buffer = CreateNativeBuffer(&((char*)s)[bytes_read], len, 0); - ret = RunAsyncAndCatchErrors([&]() { - return concurrency::create_task(stream->fp->ReadAsync(buffer, buffer->Capacity - bytes_read, InputStreamOptions::None)).then([&](IBuffer^ buf) { - retro_assert(buf == buffer); - return (int64_t)buffer->Length; - }); - }, -1); - - if (ret == -1) - return -1; - return bytes_read + ret; } int64_t retro_vfs_file_write_impl( libretro_vfs_implementation_file *stream, const void *s, uint64_t len) { IBuffer^ buffer; - if (!stream || !stream->fp || !s) + if (!stream || (!stream->fp && stream->file_handle == INVALID_HANDLE_VALUE) || !s) return -1; - /* const_cast to remove const modifier is undefined behaviour, but the buffer is only read, should be safe */ - buffer = CreateNativeBuffer(const_cast(s), len, len); - return RunAsyncAndCatchErrors([&]() { + if (stream->file_handle != INVALID_HANDLE_VALUE) { + DWORD bytes_written; + WriteFile(stream->file_handle, s, len, &bytes_written, NULL); + return (int64_t)bytes_written; + } else { + /* const_cast to remove const modifier is undefined behaviour, but the buffer is only read, should be safe */ + buffer = CreateNativeBuffer(const_cast(s), len, len); + return RunAsyncAndCatchErrors([&]() { return concurrency::create_task(stream->fp->WriteAsync(buffer)).then([&](unsigned int written) { - return (int64_t)written; - }); + return (int64_t)written; + }); }, -1); + } } int retro_vfs_file_flush_impl(libretro_vfs_implementation_file *stream) { - if (!stream || !stream->fp) - return -1; + if (!stream || (!stream->fp && stream->file_handle == INVALID_HANDLE_VALUE) || !stream->fp) + return -1; - return RunAsyncAndCatchErrors([&]() { - return concurrency::create_task(stream->fp->FlushAsync()).then([&](bool this_value_is_not_even_documented_wtf) { - /* The bool value may be reporting an error or something, but just leave it alone for now */ - /* https://github.com/MicrosoftDocs/winrt-api/issues/841 */ - return 0; - }); - }, -1); + if (stream->file_handle != INVALID_HANDLE_VALUE) { + FlushFileBuffers(stream->file_handle); + return 0; + } else { + return RunAsyncAndCatchErrors([&]() { + return concurrency::create_task(stream->fp->FlushAsync()).then([&](bool this_value_is_not_even_documented_wtf) { + /* The bool value may be reporting an error or something, but just leave it alone for now */ + /* https://github.com/MicrosoftDocs/winrt-api/issues/841 */ + return 0; + }); + }, -1); + } } int retro_vfs_file_remove_impl(const char *path) { wchar_t *path_wide; Platform::String^ path_str; + BOOL result; - if (!path || !*path) - return -1; + if (!path || !*path) + return -1; - path_wide = utf8_to_utf16_string_alloc(path); - windowsize_path(path_wide); - path_str = ref new Platform::String(path_wide); - free(path_wide); + path_wide = utf8_to_utf16_string_alloc(path); + windowsize_path(path_wide); + path_str = ref new Platform::String(path_wide); + free(path_wide); - return RunAsyncAndCatchErrors([&]() { - return concurrency::create_task(LocateStorageItem(path_str)).then([&](StorageFile^ file) { - return file->DeleteAsync(StorageDeleteOption::PermanentDelete); - }).then([&]() { - return 0; - }); - }, -1); + /* Try Win32 first, this should work in AppData */ + result = DeleteFileW(path_str->Data()); + if (result) { + return 0; + } else { + DWORD err = GetLastError(); + if (err == ERROR_FILE_NOT_FOUND) return -1; + + /* Fallback to WinRT */ + return RunAsyncAndCatchErrors([&]() { + return concurrency::create_task(LocateStorageItem(path_str)).then([&](StorageFile^ file) { + return file->DeleteAsync(StorageDeleteOption::PermanentDelete); + }).then([&]() { + return 0; + }); + }, -1); + } } /* TODO: this may not work if trying to move a directory */ @@ -585,52 +763,52 @@ int retro_vfs_file_rename_impl(const char *old_path, const char *new_path) Platform::String^ new_file_name_str; if (!old_path || !*old_path || !new_path || !*new_path) - return -1; + return -1; new_file_name[0] = '\0'; new_dir_path [0] = '\0'; - old_path_wide = utf8_to_utf16_string_alloc(old_path); - old_path_str = ref new Platform::String(old_path_wide); - free(old_path_wide); + old_path_wide = utf8_to_utf16_string_alloc(old_path); + old_path_str = ref new Platform::String(old_path_wide); + free(old_path_wide); - fill_pathname_basedir(new_dir_path, new_path, sizeof(new_dir_path)); - new_dir_path_wide = utf8_to_utf16_string_alloc(new_dir_path); - windowsize_path(new_dir_path_wide); - new_dir_path_str = ref new Platform::String(new_dir_path_wide); - free(new_dir_path_wide); + fill_pathname_basedir(new_dir_path, new_path, sizeof(new_dir_path)); + new_dir_path_wide = utf8_to_utf16_string_alloc(new_dir_path); + windowsize_path(new_dir_path_wide); + new_dir_path_str = ref new Platform::String(new_dir_path_wide); + free(new_dir_path_wide); - fill_pathname_base(new_file_name, new_path, sizeof(new_file_name)); - new_file_name_wide = utf8_to_utf16_string_alloc(new_file_name); - new_file_name_str = ref new Platform::String(new_file_name_wide); - free(new_file_name_wide); + fill_pathname_base(new_file_name, new_path, sizeof(new_file_name)); + new_file_name_wide = utf8_to_utf16_string_alloc(new_file_name); + new_file_name_str = ref new Platform::String(new_file_name_wide); + free(new_file_name_wide); - retro_assert(!old_path_str->IsEmpty() && !new_dir_path_str->IsEmpty() && !new_file_name_str->IsEmpty()); + retro_assert(!old_path_str->IsEmpty() && !new_dir_path_str->IsEmpty() && !new_file_name_str->IsEmpty()); - return RunAsyncAndCatchErrors([&]() { - concurrency::task old_file_task = concurrency::create_task(LocateStorageItem(old_path_str)); - concurrency::task new_dir_task = concurrency::create_task(LocateStorageItem(new_dir_path_str)); - return concurrency::create_task([&] { - /* Run these two tasks in parallel */ - /* TODO: There may be some cleaner way to express this */ - concurrency::task_group group; - group.run([&] { return old_file_task; }); - group.run([&] { return new_dir_task; }); - group.wait(); - }).then([&]() { - return old_file_task.get()->MoveAsync(new_dir_task.get(), new_file_name_str, NameCollisionOption::ReplaceExisting); - }).then([&]() { - return 0; - }); - }, -1); + return RunAsyncAndCatchErrors([&]() { + concurrency::task old_file_task = concurrency::create_task(LocateStorageItem(old_path_str)); + concurrency::task new_dir_task = concurrency::create_task(LocateStorageItem(new_dir_path_str)); + return concurrency::create_task([&] { + /* Run these two tasks in parallel */ + /* TODO: There may be some cleaner way to express this */ + concurrency::task_group group; + group.run([&] { return old_file_task; }); + group.run([&] { return new_dir_task; }); + group.wait(); + }).then([&]() { + return old_file_task.get()->MoveAsync(new_dir_task.get(), new_file_name_str, NameCollisionOption::ReplaceExisting); + }).then([&]() { + return 0; + }); + }, -1); } const char *retro_vfs_file_get_path_impl(libretro_vfs_implementation_file *stream) { - /* should never happen, do something noisy so caller can be fixed */ - if (!stream) - abort(); - return stream->orig_path; + /* should never happen, do something noisy so caller can be fixed */ + if (!stream) + abort(); + return stream->orig_path; } int retro_vfs_stat_impl(const char *path, int32_t *size) @@ -638,83 +816,120 @@ int retro_vfs_stat_impl(const char *path, int32_t *size) wchar_t *path_wide; Platform::String^ path_str; IStorageItem^ item; + DWORD file_info; - if (!path || !*path) - return 0; + if (!path || !*path) + return 0; - path_wide = utf8_to_utf16_string_alloc(path); - windowsize_path(path_wide); - path_str = ref new Platform::String(path_wide); - free(path_wide); + path_wide = utf8_to_utf16_string_alloc(path); + windowsize_path(path_wide); + path_str = ref new Platform::String(path_wide); + free(path_wide); - item = LocateStorageFileOrFolder(path_str); - if (!item) - return 0; + /* Try Win32 first, this should work in AppData */ + file_info = GetFileAttributesW(path_str->Data()); + if (file_info != INVALID_FILE_ATTRIBUTES) { + HANDLE file_handle = CreateFile2(path_str->Data(), GENERIC_READ, FILE_SHARE_READ, OPEN_ALWAYS, NULL); + if (file_handle != INVALID_HANDLE_VALUE) { + LARGE_INTEGER sz; + if (GetFileSizeEx(file_handle, &sz)) { + if (size) *size = sz.QuadPart; + } + CloseHandle(file_handle); + } + return (file_info & FILE_ATTRIBUTE_DIRECTORY) ? RETRO_VFS_STAT_IS_VALID | RETRO_VFS_STAT_IS_DIRECTORY : RETRO_VFS_STAT_IS_VALID; + } else { + DWORD err = GetLastError(); + if (err == ERROR_FILE_NOT_FOUND) return 0; - return RunAsyncAndCatchErrors([&]() { - return concurrency::create_task(item->GetBasicPropertiesAsync()).then([&](BasicProperties^ properties) { - if (size) - *size = properties->Size; - return item->IsOfType(StorageItemTypes::Folder) ? RETRO_VFS_STAT_IS_VALID | RETRO_VFS_STAT_IS_DIRECTORY : RETRO_VFS_STAT_IS_VALID; - }); - }, 0); + /* Fallback to WinRT */ + item = LocateStorageFileOrFolder(path_str); + if (!item) + return 0; + + return RunAsyncAndCatchErrors([&]() { + return concurrency::create_task(item->GetBasicPropertiesAsync()).then([&](BasicProperties^ properties) { + if (size) + *size = properties->Size; + return item->IsOfType(StorageItemTypes::Folder) ? RETRO_VFS_STAT_IS_VALID | RETRO_VFS_STAT_IS_DIRECTORY : RETRO_VFS_STAT_IS_VALID; + }); + }, 0); + } } int retro_vfs_mkdir_impl(const char *dir) { Platform::String^ parent_path_str; Platform::String^ dir_name_str; - wchar_t *dir_name_wide, *parent_path_wide; + Platform::String^ dir_str; + wchar_t *dir_name_wide, *parent_path_wide, *dir_wide; char *dir_local, *tmp; char parent_path[PATH_MAX_LENGTH]; char dir_name[PATH_MAX_LENGTH]; - if (!dir || !*dir) - return -1; + BOOL result; + + if (!dir || !*dir) + return -1; dir_name[0] = '\0'; /* If the path ends with a slash, we have to remove * it for basename to work */ - dir_local = strdup(dir); - tmp = dir_local + strlen(dir_local) - 1; + dir_local = strdup(dir); + tmp = dir_local + strlen(dir_local) - 1; - if (PATH_CHAR_IS_SLASH(*tmp)) - *tmp = 0; + if (PATH_CHAR_IS_SLASH(*tmp)) + *tmp = 0; - fill_pathname_base(dir_name, dir_local, sizeof(dir_name)); - dir_name_wide = utf8_to_utf16_string_alloc(dir_name); - dir_name_str = ref new Platform::String(dir_name_wide); - free(dir_name_wide); + dir_wide = utf8_to_utf16_string_alloc(dir_local); + windowsize_path(dir_wide); + dir_str = ref new Platform::String(dir_wide); + free(dir_wide); - fill_pathname_parent_dir(parent_path, dir_local, sizeof(parent_path)); - parent_path_wide = utf8_to_utf16_string_alloc(parent_path); - windowsize_path(parent_path_wide); - parent_path_str = ref new Platform::String(parent_path_wide); - free(parent_path_wide); + fill_pathname_base(dir_name, dir_local, sizeof(dir_name)); + dir_name_wide = utf8_to_utf16_string_alloc(dir_name); + dir_name_str = ref new Platform::String(dir_name_wide); + free(dir_name_wide); - retro_assert(!dir_name_str->IsEmpty() + fill_pathname_parent_dir(parent_path, dir_local, sizeof(parent_path)); + parent_path_wide = utf8_to_utf16_string_alloc(parent_path); + windowsize_path(parent_path_wide); + parent_path_str = ref new Platform::String(parent_path_wide); + free(parent_path_wide); + + retro_assert(!dir_name_str->IsEmpty() && !parent_path_str->IsEmpty()); - free(dir_local); + free(dir_local); - return RunAsyncAndCatchErrors([&]() { - return concurrency::create_task(LocateStorageItem( - parent_path_str)).then([&](StorageFolder^ parent) { - return parent->CreateFolderAsync(dir_name_str); - }).then([&](concurrency::task new_dir) { - try - { - new_dir.get(); - } - catch (Platform::COMException^ e) - { - if (e->HResult == HRESULT_FROM_WIN32(ERROR_ALREADY_EXISTS)) - return -2; - throw; - } - return 0; - }); - }, -1); + /* Try Win32 first, this should work in AppData */ + result = CreateDirectoryW(dir_str->Data(), NULL); + if (result) { + return 0; + } else { + DWORD err = GetLastError(); + if (err == ERROR_ALREADY_EXISTS) return -2; + + /* Fallback to WinRT */ + return RunAsyncAndCatchErrors([&]() { + return concurrency::create_task(LocateStorageItem( + parent_path_str)).then([&](StorageFolder^ parent) { + return parent->CreateFolderAsync(dir_name_str); + }).then([&](concurrency::task new_dir) { + try + { + new_dir.get(); + } + catch (Platform::COMException^ e) + { + if (e->HResult == HRESULT_FROM_WIN32(ERROR_ALREADY_EXISTS)) + return -2; + throw; + } + return 0; + }); + }, -1); + } } #ifdef VFS_FRONTEND @@ -723,79 +938,79 @@ struct retro_vfs_dir_handle struct libretro_vfs_implementation_dir #endif { - IVectorView^ directory; - IIterator^ entry; - char *entry_name; + IVectorView^ directory; + IIterator^ entry; + char *entry_name; }; libretro_vfs_implementation_dir *retro_vfs_opendir_impl(const char *name, bool include_hidden) { wchar_t *name_wide; Platform::String^ name_str; - libretro_vfs_implementation_dir *rdir; + libretro_vfs_implementation_dir *rdir; - if (!name || !*name) - return NULL; + if (!name || !*name) + return NULL; - rdir = (libretro_vfs_implementation_dir*)calloc(1, sizeof(*rdir)); - if (!rdir) - return NULL; + rdir = (libretro_vfs_implementation_dir*)calloc(1, sizeof(*rdir)); + if (!rdir) + return NULL; - name_wide = utf8_to_utf16_string_alloc(name); - windowsize_path(name_wide); - name_str = ref new Platform::String(name_wide); - free(name_wide); + name_wide = utf8_to_utf16_string_alloc(name); + windowsize_path(name_wide); + name_str = ref new Platform::String(name_wide); + free(name_wide); - rdir->directory = RunAsyncAndCatchErrors^>([&]() { - return concurrency::create_task(LocateStorageItem(name_str)).then([&](StorageFolder^ folder) { - return folder->GetItemsAsync(); - }); - }, nullptr); + rdir->directory = RunAsyncAndCatchErrors^>([&]() { + return concurrency::create_task(LocateStorageItem(name_str)).then([&](StorageFolder^ folder) { + return folder->GetItemsAsync(); + }); + }, nullptr); - if (rdir->directory) - return rdir; + if (rdir->directory) + return rdir; - free(rdir); - return NULL; + free(rdir); + return NULL; } bool retro_vfs_readdir_impl(libretro_vfs_implementation_dir *rdir) { - if (!rdir->entry) - { - rdir->entry = rdir->directory->First(); - return rdir->entry->HasCurrent; - } + if (!rdir->entry) + { + rdir->entry = rdir->directory->First(); + return rdir->entry->HasCurrent; + } return rdir->entry->MoveNext(); } const char *retro_vfs_dirent_get_name_impl( libretro_vfs_implementation_dir *rdir) { - if (rdir->entry_name) - free(rdir->entry_name); - rdir->entry_name = utf16_to_utf8_string_alloc( + if (rdir->entry_name) + free(rdir->entry_name); + rdir->entry_name = utf16_to_utf8_string_alloc( rdir->entry->Current->Name->Data()); - return rdir->entry_name; + return rdir->entry_name; } bool retro_vfs_dirent_is_dir_impl(libretro_vfs_implementation_dir *rdir) { - return rdir->entry->Current->IsOfType(StorageItemTypes::Folder); + return rdir->entry->Current->IsOfType(StorageItemTypes::Folder); } int retro_vfs_closedir_impl(libretro_vfs_implementation_dir *rdir) { - if (!rdir) - return -1; + if (!rdir) + return -1; - if (rdir->entry_name) - free(rdir->entry_name); - rdir->entry = nullptr; - rdir->directory = nullptr; + if (rdir->entry_name) + free(rdir->entry_name); + rdir->entry = nullptr; + rdir->directory = nullptr; - free(rdir); - return 0; + free(rdir); + return 0; } bool uwp_drive_exists(const char *path) @@ -818,9 +1033,9 @@ bool uwp_drive_exists(const char *path) char* uwp_trigger_picker(void) { - return RunAsyncAndCatchErrors([&]() { - return TriggerPickerAddDialog().then([](Platform::String^ path) { - return utf16_to_utf8_string_alloc(path->Data()); - }); - }, NULL); + return RunAsyncAndCatchErrors([&]() { + return TriggerPickerAddDialog().then([](Platform::String^ path) { + return utf16_to_utf8_string_alloc(path->Data()); + }); + }, NULL); } diff --git a/pkg/msvc-uwp/RetroArch-msvc2017-UWP/Package.appxmanifest b/pkg/msvc-uwp/RetroArch-msvc2017-UWP/Package.appxmanifest index c919d56d52..e78aed10a9 100644 --- a/pkg/msvc-uwp/RetroArch-msvc2017-UWP/Package.appxmanifest +++ b/pkg/msvc-uwp/RetroArch-msvc2017-UWP/Package.appxmanifest @@ -1,6 +1,6 @@  - + RetroArch diff --git a/pkg/msvc-uwp/RetroArch-msvc2017-UWP/RetroArch-msvc2017-UWP.vcxproj b/pkg/msvc-uwp/RetroArch-msvc2017-UWP/RetroArch-msvc2017-UWP.vcxproj index ee7d801743..77e5d34da2 100644 --- a/pkg/msvc-uwp/RetroArch-msvc2017-UWP/RetroArch-msvc2017-UWP.vcxproj +++ b/pkg/msvc-uwp/RetroArch-msvc2017-UWP/RetroArch-msvc2017-UWP.vcxproj @@ -234,17 +234,17 @@ - RetroArch-msvc2017-UWP_TemporaryKey.pfx False False x86|x64|arm|arm64 1 OnApplicationRun Always - 9B43DF279626773ACE2F840BB021FE212ABD871C + B86DAF5EC706754FEBABD0B011B0C4C3C2F73251 SHA256 True 0 + True @@ -256,7 +256,7 @@ $(MSBuildProjectDirectory);$(MSBuildProjectDirectory)\..\..\..\;$(MSBuildProjectDirectory)\..\..\..\deps\rcheevos\include;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include\compat\zlib;$(MSBuildProjectDirectory)\..\..\..\deps;$(MSBuildProjectDirectory)\..\..\..\deps\glslang;$(MSBuildProjectDirectory)\..\..\..\deps\SPIRV-Cross;$(MSBuildProjectDirectory)\..\..\..\deps\stb;$(MSBuildProjectDirectory)\..\..\..\gfx\include;%(AdditionalIncludeDirectories) - /bigobj %(AdditionalOptions) + /bigobj %(AdditionalOptions) /utf-8 4453;28204 WIN32;HAVE_MAIN;HAVE_DYNAMIC;HAVE_XAUDIO2;RARCH_INTERNAL;HAVE_CC_RESAMPLER;WANT_GLSLANG;HAVE_GLSLANG;HAVE_BUILTINGLSLANG;HAVE_SLANG;HAVE_SPIRV_CROSS;HAVE_ONLINE_UPDATER;HAVE_UPDATE_ASSETS;HAVE_UPDATE_CORES;HAVE_D3D;HAVE_D3D11;HAVE_D3D12;ENABLE_HLSL;RC_DISABLE_LUA;HAVE_CHEEVOS;HAVE_RUNAHEAD;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;HAVE_XMB;HAVE_OZONE;HAVE_SHADERPIPELINE;DEBUG;_DEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_XINPUT;HAVE_XINPUT2;HAVE_XAUDIO;HAVE_DIRECTX;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_NETPLAYDISCOVERY;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;HAVE_OVERLAY;HAVE_RGUI;HAVE_MENU;HAVE_GFX_WIDGETS;HAVE_CONFIGFILE;HAVE_PATCH;HAVE_DSP_FILTER;HAVE_VIDEO_FILTER;HAVE_REWIND;HAVE_SCREENSHOTS;HAVE_CHEATS;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_AUDIOMIXER;HAVE_RWAV;HAVE_STB_FONT;HAVE_STATIC_DUMMY;HAVE_STATIC_VIDEO_FILTERS;HAVE_STATIC_AUDIO_FILTERS @@ -271,7 +271,7 @@ $(MSBuildProjectDirectory);$(MSBuildProjectDirectory)\..\..\..\;$(MSBuildProjectDirectory)\..\..\..\deps\rcheevos\include;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include\compat\zlib;$(MSBuildProjectDirectory)\..\..\..\deps;$(MSBuildProjectDirectory)\..\..\..\deps\glslang;$(MSBuildProjectDirectory)\..\..\..\deps\SPIRV-Cross;$(MSBuildProjectDirectory)\..\..\..\deps\stb;$(MSBuildProjectDirectory)\..\..\..\gfx\include;%(AdditionalIncludeDirectories) - /bigobj %(AdditionalOptions) + /bigobj %(AdditionalOptions) /utf-8 4453;28204 WIN32;HAVE_MAIN;HAVE_DYNAMIC;HAVE_XAUDIO2;RARCH_INTERNAL;HAVE_CC_RESAMPLER;WANT_GLSLANG;HAVE_GLSLANG;HAVE_BUILTINGLSLANG;HAVE_SLANG;HAVE_SPIRV_CROSS;HAVE_ONLINE_UPDATER;HAVE_UPDATE_ASSETS;HAVE_UPDATE_CORES;HAVE_D3D;HAVE_D3D11;HAVE_D3D12;ENABLE_HLSL;RC_DISABLE_LUA;HAVE_CHEEVOS;HAVE_RUNAHEAD;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_XMB;HAVE_OZONE;HAVE_SHADERPIPELINE;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;NDEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_XINPUT;HAVE_XINPUT2;HAVE_XAUDIO;HAVE_DIRECTX;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_NETPLAYDISCOVERY;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;HAVE_OVERLAY;HAVE_MENU;HAVE_GFX_WIDGETS;HAVE_CONFIGFILE;HAVE_PATCH;HAVE_DSP_FILTER;HAVE_VIDEO_FILTER;HAVE_REWIND;HAVE_SCREENSHOTS;HAVE_CHEATS;HAVE_RGUI;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_AUDIOMIXER;HAVE_RWAV;HAVE_STB_FONT;HAVE_STATIC_DUMMY;HAVE_STATIC_VIDEO_FILTERS;HAVE_STATIC_AUDIO_FILTERS @@ -286,7 +286,7 @@ $(MSBuildProjectDirectory);$(MSBuildProjectDirectory)\..\..\..\;$(MSBuildProjectDirectory)\..\..\..\deps\rcheevos\include;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include\compat\zlib;$(MSBuildProjectDirectory)\..\..\..\deps;$(MSBuildProjectDirectory)\..\..\..\deps\glslang;$(MSBuildProjectDirectory)\..\..\..\deps\SPIRV-Cross;$(MSBuildProjectDirectory)\..\..\..\deps\stb;$(MSBuildProjectDirectory)\..\..\..\gfx\include;$(MSBuildProjectDirectory)\..\..\..\gfx\include\ANGLE;%(AdditionalIncludeDirectories) - /bigobj %(AdditionalOptions) + /bigobj %(AdditionalOptions) /utf-8 4453;28204 WIN32;HAVE_MAIN;HAVE_DYNAMIC;HAVE_XAUDIO2;RARCH_INTERNAL;HAVE_CC_RESAMPLER;WANT_GLSLANG;HAVE_GLSLANG;HAVE_BUILTINGLSLANG;HAVE_SLANG;HAVE_SPIRV_CROSS;HAVE_ONLINE_UPDATER;HAVE_UPDATE_ASSETS;HAVE_UPDATE_CORES;HAVE_D3D;HAVE_D3D11;HAVE_D3D12;ENABLE_HLSL;RC_DISABLE_LUA;HAVE_CHEEVOS;HAVE_RUNAHEAD;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_XMB;HAVE_OZONE;HAVE_SHADERPIPELINE;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;NDEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_XINPUT;HAVE_XINPUT2;HAVE_XAUDIO;HAVE_DIRECTX;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_NETPLAYDISCOVERY;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;HAVE_OVERLAY;HAVE_MENU;HAVE_GFX_WIDGETS;HAVE_CONFIGFILE;HAVE_PATCH;HAVE_DSP_FILTER;HAVE_VIDEO_FILTER;HAVE_REWIND;HAVE_SCREENSHOTS;HAVE_CHEATS;HAVE_RGUI;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_AUDIOMIXER;HAVE_RWAV;HAVE_STB_FONT;HAVE_STATIC_DUMMY;HAVE_STATIC_VIDEO_FILTERS;HAVE_STATIC_AUDIO_FILTERS;HAVE_ANGLE;HAVE_OPENGL;HAVE_OPENGLES;HAVE_OPENGLES2;HAVE_GLSL @@ -301,7 +301,7 @@ $(MSBuildProjectDirectory);$(MSBuildProjectDirectory)\..\..\..\;$(MSBuildProjectDirectory)\..\..\..\deps\rcheevos\include;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include\compat\zlib;$(MSBuildProjectDirectory)\..\..\..\deps;$(MSBuildProjectDirectory)\..\..\..\deps\glslang;$(MSBuildProjectDirectory)\..\..\..\deps\SPIRV-Cross;$(MSBuildProjectDirectory)\..\..\..\deps\stb;$(MSBuildProjectDirectory)\..\..\..\gfx\include;%(AdditionalIncludeDirectories) - /bigobj %(AdditionalOptions) + /bigobj %(AdditionalOptions) /utf-8 4453;28204 WIN32;HAVE_MAIN;HAVE_DYNAMIC;HAVE_XAUDIO2;RARCH_INTERNAL;HAVE_CC_RESAMPLER;WANT_GLSLANG;HAVE_GLSLANG;HAVE_BUILTINGLSLANG;HAVE_SLANG;HAVE_SPIRV_CROSS;HAVE_ONLINE_UPDATER;HAVE_UPDATE_ASSETS;HAVE_UPDATE_CORES;HAVE_D3D;HAVE_D3D11;HAVE_D3D12;ENABLE_HLSL;RC_DISABLE_LUA;HAVE_CHEEVOS;HAVE_RUNAHEAD;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;HAVE_XMB;HAVE_OZONE;HAVE_SHADERPIPELINE;DEBUG;_DEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_XINPUT;HAVE_XINPUT2;HAVE_XAUDIO;HAVE_DIRECTX;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_NETPLAYDISCOVERY;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;HAVE_OVERLAY;HAVE_RGUI;HAVE_MENU;HAVE_GFX_WIDGETS;HAVE_CONFIGFILE;HAVE_PATCH;HAVE_DSP_FILTER;HAVE_VIDEO_FILTER;HAVE_REWIND;HAVE_SCREENSHOTS;HAVE_CHEATS;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_AUDIOMIXER;HAVE_RWAV;HAVE_STB_FONT;HAVE_STATIC_DUMMY;HAVE_STATIC_VIDEO_FILTERS;HAVE_STATIC_AUDIO_FILTERS @@ -316,7 +316,7 @@ $(MSBuildProjectDirectory);$(MSBuildProjectDirectory)\..\..\..\;$(MSBuildProjectDirectory)\..\..\..\deps\rcheevos\include;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include\compat\zlib;$(MSBuildProjectDirectory)\..\..\..\deps;$(MSBuildProjectDirectory)\..\..\..\deps\glslang;$(MSBuildProjectDirectory)\..\..\..\deps\SPIRV-Cross;$(MSBuildProjectDirectory)\..\..\..\deps\stb;$(MSBuildProjectDirectory)\..\..\..\gfx\include;$(MSBuildProjectDirectory)\..\..\..\gfx\include\ANGLE;%(AdditionalIncludeDirectories) - /bigobj %(AdditionalOptions) + /bigobj %(AdditionalOptions) /utf-8 4453;28204 WIN32;HAVE_MAIN;HAVE_DYNAMIC;HAVE_XAUDIO2;RARCH_INTERNAL;HAVE_CC_RESAMPLER;WANT_GLSLANG;HAVE_GLSLANG;HAVE_BUILTINGLSLANG;HAVE_SLANG;HAVE_SPIRV_CROSS;HAVE_ONLINE_UPDATER;HAVE_UPDATE_ASSETS;HAVE_UPDATE_CORES;HAVE_D3D;HAVE_D3D11;HAVE_D3D12;ENABLE_HLSL;RC_DISABLE_LUA;HAVE_CHEEVOS;HAVE_RUNAHEAD;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;HAVE_XMB;HAVE_OZONE;HAVE_SHADERPIPELINE;DEBUG;_DEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_XINPUT;HAVE_XINPUT2;HAVE_XAUDIO;HAVE_DIRECTX;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_NETPLAYDISCOVERY;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;HAVE_OVERLAY;HAVE_RGUI;HAVE_MENU;HAVE_GFX_WIDGETS;HAVE_CONFIGFILE;HAVE_PATCH;HAVE_DSP_FILTER;HAVE_VIDEO_FILTER;HAVE_REWIND;HAVE_SCREENSHOTS;HAVE_CHEATS;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_AUDIOMIXER;HAVE_RWAV;HAVE_STB_FONT;HAVE_STATIC_DUMMY;HAVE_STATIC_VIDEO_FILTERS;HAVE_STATIC_AUDIO_FILTERS;HAVE_ANGLE;HAVE_OPENGL;HAVE_OPENGLES;HAVE_OPENGLES2;HAVE_GLSL @@ -331,7 +331,7 @@ $(MSBuildProjectDirectory);$(MSBuildProjectDirectory)\..\..\..\;$(MSBuildProjectDirectory)\..\..\..\deps\rcheevos\include;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include\compat\zlib;$(MSBuildProjectDirectory)\..\..\..\deps;$(MSBuildProjectDirectory)\..\..\..\deps\glslang;$(MSBuildProjectDirectory)\..\..\..\deps\SPIRV-Cross;$(MSBuildProjectDirectory)\..\..\..\deps\stb;$(MSBuildProjectDirectory)\..\..\..\gfx\include;%(AdditionalIncludeDirectories) - /bigobj %(AdditionalOptions) + /bigobj %(AdditionalOptions) /utf-8 4453;28204 WIN32;HAVE_MAIN;HAVE_DYNAMIC;HAVE_XAUDIO2;RARCH_INTERNAL;HAVE_CC_RESAMPLER;WANT_GLSLANG;HAVE_GLSLANG;HAVE_BUILTINGLSLANG;HAVE_SLANG;HAVE_SPIRV_CROSS;HAVE_ONLINE_UPDATER;HAVE_UPDATE_ASSETS;HAVE_UPDATE_CORES;HAVE_D3D;HAVE_D3D11;HAVE_D3D12;ENABLE_HLSL;RC_DISABLE_LUA;HAVE_CHEEVOS;HAVE_RUNAHEAD;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_XMB;HAVE_OZONE;HAVE_SHADERPIPELINE;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;NDEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_XINPUT;HAVE_XINPUT2;HAVE_XAUDIO;HAVE_DIRECTX;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_NETPLAYDISCOVERY;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;HAVE_OVERLAY;HAVE_MENU;HAVE_GFX_WIDGETS;HAVE_CONFIGFILE;HAVE_PATCH;HAVE_DSP_FILTER;HAVE_VIDEO_FILTER;HAVE_REWIND;HAVE_SCREENSHOTS;HAVE_CHEATS;HAVE_RGUI;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_AUDIOMIXER;HAVE_RWAV;HAVE_STB_FONT;HAVE_STATIC_DUMMY;HAVE_STATIC_VIDEO_FILTERS;HAVE_STATIC_AUDIO_FILTERS @@ -346,7 +346,7 @@ $(MSBuildProjectDirectory);$(MSBuildProjectDirectory)\..\..\..\;$(MSBuildProjectDirectory)\..\..\..\deps\rcheevos\include;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include\compat\zlib;$(MSBuildProjectDirectory)\..\..\..\deps;$(MSBuildProjectDirectory)\..\..\..\deps\glslang;$(MSBuildProjectDirectory)\..\..\..\deps\SPIRV-Cross;$(MSBuildProjectDirectory)\..\..\..\deps\stb;$(MSBuildProjectDirectory)\..\..\..\gfx\include;$(MSBuildProjectDirectory)\..\..\..\gfx\include\ANGLE;%(AdditionalIncludeDirectories) - /bigobj %(AdditionalOptions) + /bigobj %(AdditionalOptions) /utf-8 4453;28204 WIN32;HAVE_MAIN;HAVE_DYNAMIC;HAVE_XAUDIO2;RARCH_INTERNAL;HAVE_CC_RESAMPLER;WANT_GLSLANG;HAVE_GLSLANG;HAVE_BUILTINGLSLANG;HAVE_SLANG;HAVE_SPIRV_CROSS;HAVE_ONLINE_UPDATER;HAVE_UPDATE_ASSETS;HAVE_UPDATE_CORES;HAVE_D3D;HAVE_D3D11;HAVE_D3D12;ENABLE_HLSL;RC_DISABLE_LUA;HAVE_CHEEVOS;HAVE_RUNAHEAD;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_XMB;HAVE_OZONE;HAVE_SHADERPIPELINE;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;NDEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_XINPUT;HAVE_XINPUT2;HAVE_XAUDIO;HAVE_DIRECTX;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_NETPLAYDISCOVERY;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;HAVE_OVERLAY;HAVE_MENU;HAVE_GFX_WIDGETS;HAVE_CONFIGFILE;HAVE_PATCH;HAVE_DSP_FILTER;HAVE_VIDEO_FILTER;HAVE_REWIND;HAVE_SCREENSHOTS;HAVE_CHEATS;HAVE_RGUI;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_AUDIOMIXER;HAVE_RWAV;HAVE_STB_FONT;HAVE_STATIC_DUMMY;HAVE_STATIC_VIDEO_FILTERS;HAVE_STATIC_AUDIO_FILTERS;HAVE_ANGLE;HAVE_OPENGL;HAVE_OPENGLES;HAVE_OPENGLES2;HAVE_GLSL @@ -361,7 +361,7 @@ $(MSBuildProjectDirectory);$(MSBuildProjectDirectory)\..\..\..\;$(MSBuildProjectDirectory)\..\..\..\deps\rcheevos\include;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include\compat\zlib;$(MSBuildProjectDirectory)\..\..\..\deps;$(MSBuildProjectDirectory)\..\..\..\deps\glslang;$(MSBuildProjectDirectory)\..\..\..\deps\SPIRV-Cross;$(MSBuildProjectDirectory)\..\..\..\deps\stb;$(MSBuildProjectDirectory)\..\..\..\gfx\include;%(AdditionalIncludeDirectories) - /bigobj %(AdditionalOptions) + /bigobj %(AdditionalOptions) /utf-8 4453;28204 WIN32;HAVE_MAIN;HAVE_DYNAMIC;HAVE_XAUDIO2;RARCH_INTERNAL;HAVE_CC_RESAMPLER;WANT_GLSLANG;HAVE_GLSLANG;HAVE_BUILTINGLSLANG;HAVE_SLANG;HAVE_SPIRV_CROSS;HAVE_ONLINE_UPDATER;HAVE_UPDATE_ASSETS;HAVE_UPDATE_CORES;HAVE_D3D;HAVE_D3D11;HAVE_D3D12;ENABLE_HLSL;RC_DISABLE_LUA;HAVE_CHEEVOS;HAVE_RUNAHEAD;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;HAVE_XMB;HAVE_OZONE;HAVE_SHADERPIPELINE;DEBUG;_DEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_XINPUT;HAVE_XINPUT2;HAVE_XAUDIO;HAVE_DIRECTX;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_NETPLAYDISCOVERY;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;HAVE_OVERLAY;HAVE_RGUI;HAVE_MENU;HAVE_GFX_WIDGETS;HAVE_CONFIGFILE;HAVE_PATCH;HAVE_DSP_FILTER;HAVE_VIDEO_FILTER;HAVE_REWIND;HAVE_SCREENSHOTS;HAVE_CHEATS;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_AUDIOMIXER;HAVE_RWAV;HAVE_STB_FONT;HAVE_STATIC_DUMMY;HAVE_STATIC_VIDEO_FILTERS;HAVE_STATIC_AUDIO_FILTERS ProgramDatabase @@ -377,7 +377,7 @@ $(MSBuildProjectDirectory);$(MSBuildProjectDirectory)\..\..\..\;$(MSBuildProjectDirectory)\..\..\..\deps\rcheevos\include;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include\compat\zlib;$(MSBuildProjectDirectory)\..\..\..\deps;$(MSBuildProjectDirectory)\..\..\..\deps\glslang;$(MSBuildProjectDirectory)\..\..\..\deps\SPIRV-Cross;$(MSBuildProjectDirectory)\..\..\..\deps\stb;$(MSBuildProjectDirectory)\..\..\..\gfx\include;$(MSBuildProjectDirectory)\..\..\..\gfx\include\ANGLE;%(AdditionalIncludeDirectories) - /bigobj %(AdditionalOptions) + /bigobj %(AdditionalOptions) /utf-8 4453;28204 WIN32;HAVE_MAIN;HAVE_DYNAMIC;HAVE_XAUDIO2;RARCH_INTERNAL;HAVE_CC_RESAMPLER;WANT_GLSLANG;HAVE_GLSLANG;HAVE_BUILTINGLSLANG;HAVE_SLANG;HAVE_SPIRV_CROSS;HAVE_ONLINE_UPDATER;HAVE_UPDATE_ASSETS;HAVE_UPDATE_CORES;HAVE_D3D;HAVE_D3D11;HAVE_D3D12;ENABLE_HLSL;RC_DISABLE_LUA;HAVE_CHEEVOS;HAVE_RUNAHEAD;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;HAVE_XMB;HAVE_OZONE;HAVE_SHADERPIPELINE;DEBUG;_DEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_XINPUT;HAVE_XINPUT2;HAVE_XAUDIO;HAVE_DIRECTX;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_NETPLAYDISCOVERY;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;HAVE_OVERLAY;HAVE_RGUI;HAVE_MENU;HAVE_GFX_WIDGETS;HAVE_CONFIGFILE;HAVE_PATCH;HAVE_DSP_FILTER;HAVE_VIDEO_FILTER;HAVE_REWIND;HAVE_SCREENSHOTS;HAVE_CHEATS;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_AUDIOMIXER;HAVE_RWAV;HAVE_STB_FONT;HAVE_STATIC_DUMMY;HAVE_STATIC_VIDEO_FILTERS;HAVE_STATIC_AUDIO_FILTERS;HAVE_ANGLE;HAVE_OPENGL;HAVE_OPENGLES;HAVE_OPENGLES2;HAVE_GLSL ProgramDatabase @@ -393,7 +393,7 @@ $(MSBuildProjectDirectory);$(MSBuildProjectDirectory)\..\..\..\;$(MSBuildProjectDirectory)\..\..\..\deps\rcheevos\include;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include\compat\zlib;$(MSBuildProjectDirectory)\..\..\..\deps;$(MSBuildProjectDirectory)\..\..\..\deps\glslang;$(MSBuildProjectDirectory)\..\..\..\deps\SPIRV-Cross;$(MSBuildProjectDirectory)\..\..\..\deps\stb;$(MSBuildProjectDirectory)\..\..\..\gfx\include;%(AdditionalIncludeDirectories) - /bigobj %(AdditionalOptions) + /bigobj %(AdditionalOptions) /utf-8 4453;28204 WIN32;HAVE_MAIN;HAVE_DYNAMIC;HAVE_XAUDIO2;RARCH_INTERNAL;HAVE_CC_RESAMPLER;WANT_GLSLANG;HAVE_GLSLANG;HAVE_BUILTINGLSLANG;HAVE_SLANG;HAVE_SPIRV_CROSS;HAVE_ONLINE_UPDATER;HAVE_UPDATE_ASSETS;HAVE_UPDATE_CORES;HAVE_D3D;HAVE_D3D11;HAVE_D3D12;ENABLE_HLSL;RC_DISABLE_LUA;HAVE_CHEEVOS;HAVE_RUNAHEAD;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_XMB;HAVE_OZONE;HAVE_SHADERPIPELINE;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;NDEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_XINPUT;HAVE_XINPUT2;HAVE_XAUDIO;HAVE_DIRECTX;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_NETPLAYDISCOVERY;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;HAVE_OVERLAY;HAVE_MENU;HAVE_GFX_WIDGETS;HAVE_CONFIGFILE;HAVE_PATCH;HAVE_DSP_FILTER;HAVE_VIDEO_FILTER;HAVE_REWIND;HAVE_SCREENSHOTS;HAVE_CHEATS;HAVE_RGUI;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_AUDIOMIXER;HAVE_RWAV;HAVE_STB_FONT;HAVE_STATIC_DUMMY;HAVE_STATIC_VIDEO_FILTERS;HAVE_STATIC_AUDIO_FILTERS @@ -408,7 +408,7 @@ $(MSBuildProjectDirectory);$(MSBuildProjectDirectory)\..\..\..\;$(MSBuildProjectDirectory)\..\..\..\deps\rcheevos\include;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include\compat\zlib;$(MSBuildProjectDirectory)\..\..\..\deps;$(MSBuildProjectDirectory)\..\..\..\deps\glslang;$(MSBuildProjectDirectory)\..\..\..\deps\SPIRV-Cross;$(MSBuildProjectDirectory)\..\..\..\deps\stb;$(MSBuildProjectDirectory)\..\..\..\gfx\include;$(MSBuildProjectDirectory)\..\..\..\gfx\include\ANGLE;%(AdditionalIncludeDirectories) - /bigobj %(AdditionalOptions) + /bigobj %(AdditionalOptions) /utf-8 4453;28204 WIN32;HAVE_MAIN;HAVE_DYNAMIC;HAVE_XAUDIO2;RARCH_INTERNAL;HAVE_CC_RESAMPLER;WANT_GLSLANG;HAVE_GLSLANG;HAVE_BUILTINGLSLANG;HAVE_SLANG;HAVE_SPIRV_CROSS;HAVE_ONLINE_UPDATER;HAVE_UPDATE_ASSETS;HAVE_UPDATE_CORES;HAVE_D3D;HAVE_D3D11;HAVE_D3D12;ENABLE_HLSL;RC_DISABLE_LUA;HAVE_CHEEVOS;HAVE_RUNAHEAD;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_XMB;HAVE_OZONE;HAVE_SHADERPIPELINE;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;NDEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_XINPUT;HAVE_XINPUT2;HAVE_XAUDIO;HAVE_DIRECTX;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_NETPLAYDISCOVERY;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;HAVE_OVERLAY;HAVE_MENU;HAVE_GFX_WIDGETS;HAVE_CONFIGFILE;HAVE_PATCH;HAVE_DSP_FILTER;HAVE_VIDEO_FILTER;HAVE_REWIND;HAVE_SCREENSHOTS;HAVE_CHEATS;HAVE_RGUI;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_AUDIOMIXER;HAVE_RWAV;HAVE_STB_FONT;HAVE_STATIC_DUMMY;HAVE_STATIC_VIDEO_FILTERS;HAVE_STATIC_AUDIO_FILTERS;HAVE_ANGLE;HAVE_OPENGL;HAVE_OPENGLES;HAVE_OPENGLES2;HAVE_GLSL @@ -423,7 +423,7 @@ $(MSBuildProjectDirectory);$(MSBuildProjectDirectory)\..\..\..\;$(MSBuildProjectDirectory)\..\..\..\deps\rcheevos\include;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include\compat\zlib;$(MSBuildProjectDirectory)\..\..\..\deps;$(MSBuildProjectDirectory)\..\..\..\deps\glslang;$(MSBuildProjectDirectory)\..\..\..\deps\SPIRV-Cross;$(MSBuildProjectDirectory)\..\..\..\deps\stb;$(MSBuildProjectDirectory)\..\..\..\gfx\include;%(AdditionalIncludeDirectories) - /bigobj %(AdditionalOptions) + /bigobj %(AdditionalOptions) /utf-8 4453;28204 WIN32;HAVE_MAIN;HAVE_DYNAMIC;HAVE_XAUDIO2;RARCH_INTERNAL;HAVE_CC_RESAMPLER;WANT_GLSLANG;HAVE_GLSLANG;HAVE_BUILTINGLSLANG;HAVE_SLANG;HAVE_SPIRV_CROSS;HAVE_ONLINE_UPDATER;HAVE_UPDATE_ASSETS;HAVE_UPDATE_CORES;HAVE_D3D;HAVE_D3D11;HAVE_D3D12;ENABLE_HLSL;RC_DISABLE_LUA;HAVE_CHEEVOS;HAVE_RUNAHEAD;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;HAVE_XMB;HAVE_OZONE;HAVE_SHADERPIPELINE;DEBUG;_DEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_XINPUT;HAVE_XINPUT2;HAVE_XAUDIO;HAVE_DIRECTX;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_NETPLAYDISCOVERY;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;HAVE_OVERLAY;HAVE_RGUI;HAVE_MENU;HAVE_GFX_WIDGETS;HAVE_CONFIGFILE;HAVE_PATCH;HAVE_DSP_FILTER;HAVE_VIDEO_FILTER;HAVE_REWIND;HAVE_SCREENSHOTS;HAVE_CHEATS;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_AUDIOMIXER;HAVE_RWAV;HAVE_STB_FONT;HAVE_STATIC_DUMMY;HAVE_STATIC_VIDEO_FILTERS;HAVE_STATIC_AUDIO_FILTERS ProgramDatabase @@ -439,7 +439,7 @@ $(MSBuildProjectDirectory);$(MSBuildProjectDirectory)\..\..\..\;$(MSBuildProjectDirectory)\..\..\..\deps\rcheevos\include;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include\compat\zlib;$(MSBuildProjectDirectory)\..\..\..\deps;$(MSBuildProjectDirectory)\..\..\..\deps\glslang;$(MSBuildProjectDirectory)\..\..\..\deps\SPIRV-Cross;$(MSBuildProjectDirectory)\..\..\..\deps\stb;$(MSBuildProjectDirectory)\..\..\..\gfx\include;%(AdditionalIncludeDirectories) - /bigobj %(AdditionalOptions) + /bigobj %(AdditionalOptions) /utf-8 4453;28204 WIN32;HAVE_MAIN;HAVE_DYNAMIC;HAVE_XAUDIO2;RARCH_INTERNAL;HAVE_CC_RESAMPLER;WANT_GLSLANG;HAVE_GLSLANG;HAVE_BUILTINGLSLANG;HAVE_SLANG;HAVE_SPIRV_CROSS;HAVE_ONLINE_UPDATER;HAVE_UPDATE_ASSETS;HAVE_UPDATE_CORES;HAVE_D3D;HAVE_D3D11;HAVE_D3D12;ENABLE_HLSL;RC_DISABLE_LUA;HAVE_CHEEVOS;HAVE_RUNAHEAD;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_XMB;HAVE_OZONE;HAVE_SHADERPIPELINE;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;NDEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_XINPUT;HAVE_XINPUT2;HAVE_XAUDIO;HAVE_DIRECTX;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_NETPLAYDISCOVERY;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;HAVE_OVERLAY;HAVE_MENU;HAVE_GFX_WIDGETS;HAVE_CONFIGFILE;HAVE_PATCH;HAVE_DSP_FILTER;HAVE_VIDEO_FILTER;HAVE_REWIND;HAVE_SCREENSHOTS;HAVE_CHEATS;HAVE_RGUI;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_AUDIOMIXER;HAVE_RWAV;HAVE_STB_FONT;HAVE_STATIC_DUMMY;HAVE_STATIC_VIDEO_FILTERS;HAVE_STATIC_AUDIO_FILTERS @@ -454,7 +454,7 @@ $(MSBuildProjectDirectory);$(MSBuildProjectDirectory)\..\..\..\;$(MSBuildProjectDirectory)\..\..\..\deps\rcheevos\include;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include\compat\zlib;$(MSBuildProjectDirectory)\..\..\..\deps;$(MSBuildProjectDirectory)\..\..\..\deps\glslang;$(MSBuildProjectDirectory)\..\..\..\deps\SPIRV-Cross;$(MSBuildProjectDirectory)\..\..\..\deps\stb;$(MSBuildProjectDirectory)\..\..\..\gfx\include;$(MSBuildProjectDirectory)\..\..\..\gfx\include\ANGLE;%(AdditionalIncludeDirectories) - /bigobj %(AdditionalOptions) + /bigobj %(AdditionalOptions) /utf-8 4453;28204 WIN32;HAVE_MAIN;HAVE_DYNAMIC;HAVE_XAUDIO2;RARCH_INTERNAL;HAVE_CC_RESAMPLER;WANT_GLSLANG;HAVE_GLSLANG;HAVE_BUILTINGLSLANG;HAVE_SLANG;HAVE_SPIRV_CROSS;HAVE_ONLINE_UPDATER;HAVE_UPDATE_ASSETS;HAVE_UPDATE_CORES;HAVE_D3D;HAVE_D3D11;HAVE_D3D12;ENABLE_HLSL;RC_DISABLE_LUA;HAVE_CHEEVOS;HAVE_RUNAHEAD;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_XMB;HAVE_OZONE;HAVE_SHADERPIPELINE;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;NDEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_XINPUT;HAVE_XINPUT2;HAVE_XAUDIO;HAVE_DIRECTX;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_NETPLAYDISCOVERY;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;HAVE_OVERLAY;HAVE_MENU;HAVE_GFX_WIDGETS;HAVE_CONFIGFILE;HAVE_PATCH;HAVE_DSP_FILTER;HAVE_VIDEO_FILTER;HAVE_REWIND;HAVE_SCREENSHOTS;HAVE_CHEATS;HAVE_RGUI;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_AUDIOMIXER;HAVE_RWAV;HAVE_STB_FONT;HAVE_STATIC_DUMMY;HAVE_STATIC_VIDEO_FILTERS;HAVE_STATIC_AUDIO_FILTERS;HAVE_ANGLE;HAVE_OPENGL;HAVE_OPENGLES;HAVE_OPENGLES2;HAVE_GLSL;HAVE_EGL @@ -469,7 +469,7 @@ $(MSBuildProjectDirectory);$(MSBuildProjectDirectory)\..\..\..\;$(MSBuildProjectDirectory)\..\..\..\deps\rcheevos\include;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include\compat\zlib;$(MSBuildProjectDirectory)\..\..\..\deps;$(MSBuildProjectDirectory)\..\..\..\deps\glslang;$(MSBuildProjectDirectory)\..\..\..\deps\SPIRV-Cross;$(MSBuildProjectDirectory)\..\..\..\deps\stb;$(MSBuildProjectDirectory)\..\..\..\gfx\include;$(MSBuildProjectDirectory)\..\..\..\gfx\include\ANGLE;%(AdditionalIncludeDirectories) - /bigobj %(AdditionalOptions) + /bigobj %(AdditionalOptions) /utf-8 4453;28204 WIN32;HAVE_MAIN;HAVE_DYNAMIC;HAVE_XAUDIO2;RARCH_INTERNAL;HAVE_CC_RESAMPLER;WANT_GLSLANG;HAVE_GLSLANG;HAVE_BUILTINGLSLANG;HAVE_SLANG;HAVE_SPIRV_CROSS;HAVE_ONLINE_UPDATER;HAVE_UPDATE_ASSETS;HAVE_UPDATE_CORES;HAVE_D3D;HAVE_D3D11;HAVE_D3D12;ENABLE_HLSL;RC_DISABLE_LUA;HAVE_CHEEVOS;HAVE_RUNAHEAD;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;HAVE_XMB;HAVE_OZONE;HAVE_SHADERPIPELINE;DEBUG;_DEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_XINPUT;HAVE_XINPUT2;HAVE_XAUDIO;HAVE_DIRECTX;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_NETPLAYDISCOVERY;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;HAVE_OVERLAY;HAVE_RGUI;HAVE_MENU;HAVE_GFX_WIDGETS;HAVE_CONFIGFILE;HAVE_PATCH;HAVE_DSP_FILTER;HAVE_VIDEO_FILTER;HAVE_REWIND;HAVE_SCREENSHOTS;HAVE_CHEATS;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_AUDIOMIXER;HAVE_RWAV;HAVE_STB_FONT;HAVE_STATIC_DUMMY;HAVE_STATIC_VIDEO_FILTERS;HAVE_STATIC_AUDIO_FILTERS;HAVE_ANGLE;HAVE_OPENGL;HAVE_OPENGLES;HAVE_OPENGLES2;HAVE_GLSL @@ -484,7 +484,7 @@ $(MSBuildProjectDirectory);$(MSBuildProjectDirectory)\..\..\..\;$(MSBuildProjectDirectory)\..\..\..\deps\rcheevos\include;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include\compat\zlib;$(MSBuildProjectDirectory)\..\..\..\deps;$(MSBuildProjectDirectory)\..\..\..\deps\glslang;$(MSBuildProjectDirectory)\..\..\..\deps\SPIRV-Cross;$(MSBuildProjectDirectory)\..\..\..\deps\stb;$(MSBuildProjectDirectory)\..\..\..\gfx\include;$(MSBuildProjectDirectory)\..\..\..\gfx\include\ANGLE;%(AdditionalIncludeDirectories) - /bigobj %(AdditionalOptions) + /bigobj %(AdditionalOptions) /utf-8 4453;28204 WIN32;HAVE_MAIN;HAVE_DYNAMIC;HAVE_XAUDIO2;RARCH_INTERNAL;HAVE_CC_RESAMPLER;WANT_GLSLANG;HAVE_GLSLANG;HAVE_BUILTINGLSLANG;HAVE_SLANG;HAVE_SPIRV_CROSS;HAVE_ONLINE_UPDATER;HAVE_UPDATE_ASSETS;HAVE_UPDATE_CORES;HAVE_D3D;HAVE_D3D11;HAVE_D3D12;ENABLE_HLSL;RC_DISABLE_LUA;HAVE_CHEEVOS;HAVE_RUNAHEAD;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;HAVE_XMB;HAVE_OZONE;HAVE_SHADERPIPELINE;DEBUG;_DEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_XINPUT;HAVE_XINPUT2;HAVE_XAUDIO;HAVE_DIRECTX;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_NETPLAYDISCOVERY;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;HAVE_OVERLAY;HAVE_RGUI;HAVE_MENU;HAVE_GFX_WIDGETS;HAVE_CONFIGFILE;HAVE_PATCH;HAVE_DSP_FILTER;HAVE_VIDEO_FILTER;HAVE_REWIND;HAVE_SCREENSHOTS;HAVE_CHEATS;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_AUDIOMIXER;HAVE_RWAV;HAVE_STB_FONT;HAVE_STATIC_DUMMY;HAVE_STATIC_VIDEO_FILTERS;HAVE_STATIC_AUDIO_FILTERS;HAVE_ANGLE;HAVE_OPENGL;HAVE_OPENGLES;HAVE_OPENGLES2;HAVE_GLSL ProgramDatabase @@ -538,6 +538,7 @@ + @@ -635,4 +636,4 @@ - + \ No newline at end of file diff --git a/pkg/msvc-uwp/RetroArch-msvc2017-UWP/RetroArch-msvc2017-UWP.vcxproj.filters b/pkg/msvc-uwp/RetroArch-msvc2017-UWP/RetroArch-msvc2017-UWP.vcxproj.filters index 659a23e637..0260b1e5fd 100644 --- a/pkg/msvc-uwp/RetroArch-msvc2017-UWP/RetroArch-msvc2017-UWP.vcxproj.filters +++ b/pkg/msvc-uwp/RetroArch-msvc2017-UWP/RetroArch-msvc2017-UWP.vcxproj.filters @@ -39,6 +39,9 @@ uwp + + uwp + diff --git a/pkg/msvc-uwp/RetroArch-msvc2017-UWP/RetroArch-msvc2017-UWP_TemporaryKey.pfx b/pkg/msvc-uwp/RetroArch-msvc2017-UWP/RetroArch-msvc2017-UWP_TemporaryKey.pfx index 5313392b1a..ea119d5c2f 100644 Binary files a/pkg/msvc-uwp/RetroArch-msvc2017-UWP/RetroArch-msvc2017-UWP_TemporaryKey.pfx and b/pkg/msvc-uwp/RetroArch-msvc2017-UWP/RetroArch-msvc2017-UWP_TemporaryKey.pfx differ diff --git a/uwp/uwp_file_handle_access.h b/uwp/uwp_file_handle_access.h new file mode 100644 index 0000000000..e7eaea911e --- /dev/null +++ b/uwp/uwp_file_handle_access.h @@ -0,0 +1,93 @@ +#pragma once + +// These are copied from WindowsStorageCOM.h +// You can remove this header file once the real file has been updated +// to fix the WINAPI_PARTITION_DESKTOP block + +typedef interface IOplockBreakingHandler IOplockBreakingHandler; +typedef interface IStorageItemHandleAccess IStorageItemHandleAccess; +typedef interface IStorageFolderHandleAccess IStorageFolderHandleAccess; + +#ifdef __cplusplus +extern "C" { +#endif + + typedef /* [v1_enum] */ + enum HANDLE_OPTIONS { + HO_NONE = 0, + HO_OPEN_REQUIRING_OPLOCK = 0x40000, + HO_DELETE_ON_CLOSE = 0x4000000, + HO_SEQUENTIAL_SCAN = 0x8000000, + HO_RANDOM_ACCESS = 0x10000000, + HO_NO_BUFFERING = 0x20000000, + HO_OVERLAPPED = 0x40000000, + HO_WRITE_THROUGH = 0x80000000 + } HANDLE_OPTIONS; + + DEFINE_ENUM_FLAG_OPERATORS(HANDLE_OPTIONS); + typedef /* [v1_enum] */ + enum HANDLE_ACCESS_OPTIONS { + HAO_NONE = 0, + HAO_READ_ATTRIBUTES = 0x80, + HAO_READ = 0x120089, + HAO_WRITE = 0x120116, + HAO_DELETE = 0x10000 + } HANDLE_ACCESS_OPTIONS; + + DEFINE_ENUM_FLAG_OPERATORS(HANDLE_ACCESS_OPTIONS); + typedef /* [v1_enum] */ + enum HANDLE_SHARING_OPTIONS { + HSO_SHARE_NONE = 0, + HSO_SHARE_READ = 0x1, + HSO_SHARE_WRITE = 0x2, + HSO_SHARE_DELETE = 0x4 + } HANDLE_SHARING_OPTIONS; + + DEFINE_ENUM_FLAG_OPERATORS(HANDLE_SHARING_OPTIONS); + typedef /* [v1_enum] */ + enum HANDLE_CREATION_OPTIONS { + HCO_CREATE_NEW = 0x1, + HCO_CREATE_ALWAYS = 0x2, + HCO_OPEN_EXISTING = 0x3, + HCO_OPEN_ALWAYS = 0x4, + HCO_TRUNCATE_EXISTING = 0x5 + } HANDLE_CREATION_OPTIONS; + + EXTERN_C const IID IID_IOplockBreakingHandler; + MIDL_INTERFACE("826ABE3D-3ACD-47D3-84F2-88AAEDCF6304") + IOplockBreakingHandler : public IUnknown + { + public: + virtual HRESULT STDMETHODCALLTYPE OplockBreaking(void) = 0; + }; + + EXTERN_C const IID IID_IStorageItemHandleAccess; + MIDL_INTERFACE("5CA296B2-2C25-4D22-B785-B885C8201E6A") + IStorageItemHandleAccess : public IUnknown + { + public: + virtual HRESULT STDMETHODCALLTYPE Create( + /* [in] */ HANDLE_ACCESS_OPTIONS accessOptions, + /* [in] */ HANDLE_SHARING_OPTIONS sharingOptions, + /* [in] */ HANDLE_OPTIONS options, + /* [optional][in] */ __RPC__in_opt IOplockBreakingHandler * oplockBreakingHandler, + /* [system_handle][retval][out] */ __RPC__deref_out_opt HANDLE * interopHandle) = 0; + }; + + EXTERN_C const IID IID_IStorageFolderHandleAccess; + MIDL_INTERFACE("DF19938F-5462-48A0-BE65-D2A3271A08D6") + IStorageFolderHandleAccess : public IUnknown + { + public: + virtual HRESULT STDMETHODCALLTYPE Create( + /* [string][in] */ __RPC__in_string LPCWSTR fileName, + /* [in] */ HANDLE_CREATION_OPTIONS creationOptions, + /* [in] */ HANDLE_ACCESS_OPTIONS accessOptions, + /* [in] */ HANDLE_SHARING_OPTIONS sharingOptions, + /* [in] */ HANDLE_OPTIONS options, + /* [optional][in] */ __RPC__in_opt IOplockBreakingHandler * oplockBreakingHandler, + /* [system_handle][retval][out] */ __RPC__deref_out_opt HANDLE * interopHandle) = 0; + }; +#ifdef __cplusplus +} +#endif