- Partly fix launching control panel applets

svn path=/trunk/; revision=35624
This commit is contained in:
Johannes Anderwald 2008-08-25 07:54:19 +00:00
parent 239ad82645
commit d1813375f5

View file

@ -348,7 +348,7 @@ static void Control_DoLaunch(CPanel* panel, HWND hWnd, LPCWSTR wszCmd)
LPWSTR beg = NULL;
LPWSTR end;
WCHAR ch;
LPWSTR ptr, ptr2;
LPCWSTR ptr, ptr2;
WCHAR szName[MAX_PATH];
unsigned sp = 0;
LPWSTR extraPmts = NULL;
@ -359,22 +359,32 @@ static void Control_DoLaunch(CPanel* panel, HWND hWnd, LPCWSTR wszCmd)
ptr = wcsrchr(wszCmd, L'\\');
ptr2 = wcsrchr(wszCmd, L',');
if (!ptr || !ptr2)
return;
if (!ptr2)
{
ptr2 = wszCmd + wcslen(wszCmd) + 1;
}
Length = (ptr2 - ptr - 1);
if (ptr)
ptr++;
else
ptr = wszCmd;
Length = (ptr2 - ptr);
if (Length >= MAX_PATH)
return;
memcpy(szName, ptr + 1, Length * sizeof(WCHAR));
memcpy(szName, (LPVOID)ptr, Length * sizeof(WCHAR));
szName[Length] = L'\0';
hMutex = CreateMutexW(NULL, FALSE, szName);
if ((!hMutex) || (GetLastError() == ERROR_ALREADY_EXISTS))
return;
buffer = HeapAlloc(GetProcessHeap(), 0, (lstrlenW(wszCmd) + 1) * sizeof(*wszCmd));
if (!buffer) return;
if (!buffer)
{
CloseHandle(hMutex);
return;
}
end = lstrcpyW(buffer, wszCmd);
for (;;) {
ch = *end;
@ -399,10 +409,10 @@ static void Control_DoLaunch(CPanel* panel, HWND hWnd, LPCWSTR wszCmd)
end++;
}
while ((ptr = StrChrW(buffer, '"')))
memmove(ptr, ptr+1, lstrlenW(ptr)*sizeof(WCHAR));
memmove((LPVOID)ptr, ptr+1, lstrlenW(ptr)*sizeof(WCHAR));
while ((ptr = StrChrW(extraPmts, '"')))
memmove(ptr, ptr+1, lstrlenW(ptr)*sizeof(WCHAR));
memmove((LPVOID)ptr, ptr+1, lstrlenW(ptr)*sizeof(WCHAR));
TRACE("cmd %s, extra %s, sp %d\n", debugstr_w(buffer), debugstr_w(extraPmts), sp);