Index: dll/win32/shell32/CDefView.cpp =================================================================== --- dll/win32/shell32/CDefView.cpp (revision 69557) +++ dll/win32/shell32/CDefView.cpp (working copy) @@ -1070,7 +1070,8 @@ { if(InitList()) { - FillList(); + if(FAILED(FillList())) + return -1; } } @@ -2237,7 +2238,7 @@ Create(m_hWndParent, prcView, NULL, WS_CHILD | WS_TABSTOP, 0, 0U); if (m_hWnd == NULL) - return E_FAIL; + return HRESULT_FROM_WIN32(ERROR_CANCELLED); *phWnd = m_hWnd; Index: dll/win32/shell32/folders/CFSFolder.cpp =================================================================== --- dll/win32/shell32/folders/CFSFolder.cpp (revision 69557) +++ dll/win32/shell32/folders/CFSFolder.cpp (working copy) @@ -267,6 +267,17 @@ DWORD dwFlags, LPENUMIDLIST *ppEnumIDList) { + HRESULT hr; + + if (FAILED(SHFindFirstFile(sPathTarget))) + { + RETRY_DATA* retryData; + retryData = (RETRY_DATA*)SHAlloc(sizeof(RETRY_DATA)); + StringCchCopyW(retryData->szDrive, MAX_PATH, sPathTarget); + hr = DialogBoxParamW(shell32_hInstance, MAKEINTRESOURCE(1024), hwndOwner, RetryDlgProc, (LPARAM)retryData); + if (hr == IDCANCEL) + return HRESULT_FROM_WIN32(ERROR_CANCELLED); + } return ShellObjectCreatorInit(sPathTarget, dwFlags, IID_IEnumIDList, ppEnumIDList); } @@ -1668,4 +1679,66 @@ return hr; } return hr; +} + +INT_PTR CALLBACK RetryDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + SHFILEINFOW* psfi; + RETRY_DATA* retryData; + WCHAR szFormat[MAX_PATH] = {0}; + WCHAR szDrive[MAX_PATH] = {0}; + + retryData = (RETRY_DATA*)GetWindowLong(hwndDlg, DWL_USER); + + switch (uMsg) + { + case WM_INITDIALOG: + retryData = reinterpret_cast(lParam); + retryData->hDlg = hwndDlg; + SetWindowLong(hwndDlg, DWL_USER, lParam); + + /* set message text */ + GetDlgItemTextW(hwndDlg, 12291, szFormat, MAX_PATH); + StringCchPrintfW(szDrive, MAX_PATH, szFormat, retryData->szDrive[0]); + SetDlgItemTextW(hwndDlg, 12291, szDrive); + + /* set icon */ + StringCchCopyW(szDrive, MAX_PATH, retryData->szDrive); + PathStripToRoot(szDrive); + psfi = (SHFILEINFOW*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(SHFILEINFOW)); + SHGetFileInfoW(szDrive, FILE_ATTRIBUTE_DIRECTORY, psfi, sizeof(SHFILEINFOW), SHGFI_ICON | SHGFI_ADDOVERLAYS); + SendDlgItemMessageW(hwndDlg, 12297, STM_SETICON, (WPARAM)psfi->hIcon, 0); + HeapFree(GetProcessHeap(), 0, psfi); + SetTimer(hwndDlg, 1, 2000, NULL); + break; + case WM_COMMAND: + if (wParam == IDCANCEL) + EndDialog(hwndDlg, IDCANCEL); + break; + case WM_TIMER: + if(SUCCEEDED(SHFindFirstFile(retryData->szDrive))) + EndDialog(retryData->hDlg, 4); + break; + default: + return false; + } + return true; +} + +HRESULT SHFindFirstFile(LPCWSTR lpFilePath) +{ + WIN32_FIND_DATAW stffile; + HANDLE hFile; + WCHAR szPath[MAX_PATH]; + + wcscpy(szPath, lpFilePath); + PathAddBackslashW(szPath); + wcscat(szPath, L"*.*"); + + hFile = FindFirstFileW(szPath, &stffile); + if (hFile == INVALID_HANDLE_VALUE) + return E_FAIL; + else + FindClose(hFile); + return S_OK; } \ No newline at end of file Index: dll/win32/shell32/folders/CFSFolder.h =================================================================== --- dll/win32/shell32/folders/CFSFolder.h (revision 69557) +++ dll/win32/shell32/folders/CFSFolder.h (working copy) @@ -23,6 +23,14 @@ #ifndef _CFSFOLDER_H_ #define _CFSFOLDER_H_ +struct RETRY_DATA +{ + HWND hDlg; + WCHAR szDrive[MAX_PATH]; +}; + +INT_PTR CALLBACK RetryDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); +HRESULT SHFindFirstFile(LPCWSTR lpFilePath); WCHAR *BuildPathsList(LPCWSTR wszBasePath, int cidl, LPCITEMIDLIST *pidls); class CFSFolder : Index: dll/win32/shell32/lang/en-US.rc =================================================================== --- dll/win32/shell32/lang/en-US.rc (revision 69557) +++ dll/win32/shell32/lang/en-US.rc (working copy) @@ -631,6 +631,16 @@ PUSHBUTTON "No", IDNO, 180, 55, 50, 14 END +1024 DIALOGEX 0, 0, 227, 69 +STYLE DS_SHELLFONT | DS_MODALFRAME | DS_NOIDLEMSG | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE +CAPTION "Insert disk" +FONT 8, "MS Shell Dlg" +BEGIN + ICON 12297, 12297, 7, 7, 21, 20 + LTEXT "Please insert a disk into drive %c:.", 12291, 70, 7, 152, 23 + PUSHBUTTON "Cancel", 2, 169, 47, 50, 14 +END + STRINGTABLE BEGIN /* columns in the shellview */ Index: dll/win32/browseui/shellbrowser.cpp =================================================================== --- dll/win32/browseui/shellbrowser.cpp (revision 69557) +++ dll/win32/browseui/shellbrowser.cpp (working copy) @@ -981,6 +981,7 @@ ::SendMessage(fCurrentShellViewWindow, WM_SETREDRAW, 1, 0); if (windowUpdateIsLocked) LockWindowUpdate(FALSE); + ::RedrawWindow(fCurrentShellViewWindow, NULL, NULL, RDW_INVALIDATE); SetCursor(saveCursor); return hResult; } @@ -1965,7 +1966,12 @@ HRESULT STDMETHODCALLTYPE CShellBrowser::BrowseObject(LPCITEMIDLIST pidl, UINT wFlags) { - return BrowseToPIDL(pidl, BTP_UPDATE_CUR_HISTORY | BTP_UPDATE_NEXT_HISTORY); + HRESULT hr; + + hr = BrowseToPIDL(pidl, BTP_UPDATE_CUR_HISTORY | BTP_UPDATE_NEXT_HISTORY); + if (hr == HRESULT_FROM_WIN32(ERROR_CANCELLED)) + return S_OK; + return hr; } HRESULT STDMETHODCALLTYPE CShellBrowser::GetViewStateStream(DWORD grfMode, IStream **ppStrm)