[SHELL32] Drive Property Sheet: Run in another thread (#7107)

The drive property sheet was modal,
so it used to lock the main thread.
This PR will unlock by using another
thread.
JIRA issue: CORE-4217
JIRA issue: CORE-11547
In dll/win32/shell32/dialogs/drive.cpp:
- Add DRIVE_PROP_DATA structure.
- Call SHCreateThread function in
  SH_ShowDriveProperties function.
- Clean up the data when they should
  be released.
This commit is contained in:
Katayama Hirofumi MZ 2024-07-08 23:11:02 +09:00 committed by GitHub
parent f9d8665328
commit 0bd933c28c
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -166,9 +166,22 @@ typedef struct _DRIVE_PROP_PAGE
UINT DriveType;
} DRIVE_PROP_PAGE;
BOOL
SH_ShowDriveProperties(WCHAR *pwszDrive, IDataObject *pDataObj)
struct DRIVE_PROP_DATA
{
PWSTR pwszDrive;
IStream *pStream;
};
static DWORD WINAPI
ShowDrivePropThreadProc(LPVOID pParam)
{
CHeapPtr<DRIVE_PROP_DATA, CComAllocator> pPropData((DRIVE_PROP_DATA *)pParam);
CHeapPtr<WCHAR, CComAllocator> pwszDrive(pPropData->pwszDrive);
// Unmarshall IDataObject from IStream
CComPtr<IDataObject> pDataObj;
CoGetInterfaceAndReleaseStream(pPropData->pStream, IID_PPV_ARG(IDataObject, &pDataObj));
HPSXA hpsx = NULL;
HPROPSHEETPAGE hpsp[MAX_PROPERTY_SHEET_PAGE];
CComObject<CDrvDefExt> *pDrvDefExt = NULL;
@ -234,6 +247,37 @@ SH_ShowDriveProperties(WCHAR *pwszDrive, IDataObject *pDataObj)
return ret != -1;
}
BOOL
SH_ShowDriveProperties(WCHAR *pwszDrive, IDataObject *pDataObj)
{
HRESULT hr = SHStrDupW(pwszDrive, &pwszDrive);
if (FAILED_UNEXPECTEDLY(hr))
return FALSE;
// Prepare data for thread
DRIVE_PROP_DATA *pData = (DRIVE_PROP_DATA *)SHAlloc(sizeof(*pData));
if (!pData)
{
SHFree(pwszDrive);
return FALSE;
}
pData->pwszDrive = pwszDrive;
// Marshall IDataObject to IStream
hr = CoMarshalInterThreadInterfaceInStream(IID_IDataObject, pDataObj, &pData->pStream);
if (SUCCEEDED(hr))
{
// Run a property sheet in another thread
if (SHCreateThread(ShowDrivePropThreadProc, pData, CTF_COINIT, NULL))
return TRUE; // Success
pData->pStream->Release();
}
SHFree(pData);
SHFree(pwszDrive);
return FALSE; // Failed
}
static VOID
InsertDefaultClusterSizeForFs(HWND hwndDlg, PFORMAT_DRIVE_CONTEXT pContext)
{