Изза чего может падать ShellExecute
От: nauro Украина  
Дата: 10.02.11 16:47
Оценка:
Привет всем.
Происходит креш программы (точнее, программы-инсталятора) при вызове ShellExecuteEx. Присходит сие только на Windows Vista.
try/catch ясное дело не помогает ибо при вызове ShellExecuteEx программа сразу здыхает (естественно с вызовом окна винды, о том что приложение сдохло, че сним делать). Может кто сталкивался с таким? Сразу оговорюсь, что не в параметрах дело, ибо даже вызов безобидного notepad.exe с помошью ShellExecuteEx в этом учатке кода (даже с verb-ом "runas") падает.
Еще инфа по вызову: Программа1 вызывает Программу2 с помошью CreateProcess, а Программа2 в свою очередь хочет вызвать Программу3 с помошью ShellExecuteEx, и тут креш Программы2.
Всем буду признателен хоть за какую-нибудь информацию.
-----------------------------------------
тут может быть ваша реклама
shellexecute shellexecuteex crash vista
Re: Изза чего может падать ShellExecute
От: Pavel Dvorkin Россия  
Дата: 10.02.11 17:54
Оценка: 1 (1)
Здравствуйте, nauro, Вы писали:

N>Привет всем.

N>Происходит креш программы (точнее, программы-инсталятора) при вызове ShellExecuteEx. Присходит сие только на Windows Vista.
N>try/catch ясное дело не помогает ибо при вызове ShellExecuteEx программа сразу здыхает (естественно с вызовом окна винды, о том что приложение сдохло, че сним делать).

__try — __except надо, а не try-catch. И в обработчике посмотреть код исключения (GetExceptionCode)

Сразу "здыхать" программа сама не может, это сложный процесс. Вот убить ее можно сразу.


>Может кто сталкивался с таким? Сразу оговорюсь, что не в параметрах дело, ибо даже вызов безобидного notepad.exe с помошью ShellExecuteEx в этом учатке кода (даже с verb-ом "runas") падает.


Это скорее говорит о том, что дело именно в параметрах.

N>Еще инфа по вызову: Программа1 вызывает Программу2 с помошью CreateProcess, а Программа2 в свою очередь хочет вызвать Программу3 с помошью ShellExecuteEx, и тут креш Программы2.

N>Всем буду признателен хоть за какую-нибудь информацию.

Если только под Вистой, скорее всего — нет прав.
With best regards
Pavel Dvorkin
Re: Из-за чего может падать ShellExecute
От: LGB Канада  
Дата: 10.02.11 18:38
Оценка:
Здравствуйте, nauro, Вы писали:

N>Происходит креш программы (точнее, программы-инсталятора) при вызове ShellExecuteEx. Присходит сие только на Windows Vista.


А на чистой Vista-машине тоже падает? Может быть, установлена какая-нибудь кривая прога, например, тулбар для IE или вроде того.
Re: Изза чего может падать ShellExecute
От: shasa  
Дата: 10.02.11 21:13
Оценка:
Здравствуйте, nauro, Вы писали:
N>Привет всем.
N>Происходит креш программы (точнее, программы-инсталятора) при вызове ShellExecuteEx.

У тебя в программе где то в другом месте ошибка обращения к памяти, скорее всего ищи в функциях работы со строками, где нибудь наверное запортил '\0' в конце строки. А лучше напиши сообщение системы, а то так не очень понятно что за "креш".
Re[2]: Изза чего может падать ShellExecute
От: nauro Украина  
Дата: 11.02.11 07:36
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>__try — __except надо, а не try-catch. И в обработчике посмотреть код исключения (GetExceptionCode)

Спасибо за совет, попробовал, "те же яйца, только в профиль". Вылетает сразуже при вызове ShellExecuteEx и ни в __except ни в __finally не заходит.
Может я не так блок обьявляю?
__try
{
   //call ShellExecuteEx
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
   //logging
}
-----------------------------------------
тут может быть ваша реклама
Re[2]: Из-за чего может падать ShellExecute
От: nauro Украина  
Дата: 11.02.11 07:37
Оценка:
Здравствуйте, LGB, Вы писали:

LGB>А на чистой Vista-машине тоже падает? Может быть, установлена какая-нибудь кривая прога, например, тулбар для IE или вроде того.

Да, тоже падает. Причем на 7-ке работет.
-----------------------------------------
тут может быть ваша реклама
Re[2]: Изза чего может падать ShellExecute
От: nauro Украина  
Дата: 11.02.11 07:38
Оценка:
Здравствуйте, shasa, Вы писали:

S>У тебя в программе где то в другом месте ошибка обращения к памяти, скорее всего ищи в функциях работы со строками, где нибудь наверное запортил '\0' в конце строки. А лучше напиши сообщение системы, а то так не очень понятно что за "креш".


Сообщение стандартное, APPCRASH, имя модуля: Secur32.dll.
-----------------------------------------
тут может быть ваша реклама
Re[3]: Изза чего может падать ShellExecute
От: Pavel Dvorkin Россия  
Дата: 11.02.11 07:41
Оценка:
Здравствуйте, nauro, Вы писали:

N>Здравствуйте, Pavel Dvorkin, Вы писали:


PD>>__try — __except надо, а не try-catch. И в обработчике посмотреть код исключения (GetExceptionCode)

N>Спасибо за совет, попробовал, "те же яйца, только в профиль". Вылетает сразуже при вызове ShellExecuteEx и ни в __except ни в __finally не заходит.
N>Может я не так блок обьявляю?
N>
N>__try
N>{
N>   //call ShellExecuteEx
N>}
N>__except(EXCEPTION_EXECUTE_HANDLER)
N>{
N>   //logging
N>}
N>


Все верно.

Можно еще попробовать SetUnhandledExceptionFilter
With best regards
Pavel Dvorkin
Re[4]: Изза чего может падать ShellExecute
От: nauro Украина  
Дата: 11.02.11 07:53
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Можно еще попробовать SetUnhandledExceptionFilter


Мне его вызвать перед вызовом ShellExecuteEx?
-----------------------------------------
тут может быть ваша реклама
Re[5]: Изза чего может падать ShellExecute
От: Pavel Dvorkin Россия  
Дата: 11.02.11 08:13
Оценка:
Здравствуйте, nauro, Вы писали:

PD>>Можно еще попробовать SetUnhandledExceptionFilter


N>Мне его вызвать перед вызовом ShellExecuteEx?


Да. Можно в WinMain.
With best regards
Pavel Dvorkin
Re: Изза чего может падать ShellExecute
От: ononim  
Дата: 11.02.11 08:36
Оценка:
N>Всем буду признателен хоть за какую-нибудь информацию.
CoInitialize позвать не забыли перед ShellExecute'ом?
Как много веселых ребят, и все делают велосипед...
Re[6]: Изза чего может падать ShellExecute
От: nauro Украина  
Дата: 11.02.11 10:25
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Да. Можно в WinMain.

Трындец. И это не помогло. Все-равно креш.
использую так:
LONG WINAPI ExceptionHandler( struct _EXCEPTION_POINTERS *p )
{
    CString errorCode;
    errorCode.AppendFormat(p->ExceptionRecord->ExceptionCode);
    LOG(L"error occured: "+errorCode);
    
    return EXCEPTION_CONTINUE_EXECUTION;
}
...
SetUnhandledExceptionFilter(ExceptionHandler);
LOG(L"executing ShellExecuteEx");
ShellExecuteEx(&seInfo);
...

естественно в логе последняя запись "executing ShellExecuteEx". Ну и че сним теперь делать.. гребаная виста. Почему в 7-ке все норм, ведь родные системы вроде-бы.
-----------------------------------------
тут может быть ваша реклама
Re[2]: Изза чего может падать ShellExecute
От: nauro Украина  
Дата: 11.02.11 10:27
Оценка:
Здравствуйте, ononim, Вы писали:

N>>Всем буду признателен хоть за какую-нибудь информацию.

O>CoInitialize позвать не забыли перед ShellExecute'ом?
а зачем он нужен? я ведь не использую СОМ.
-----------------------------------------
тут может быть ваша реклама
Re[7]: Изза чего может падать ShellExecute
От: De-Bugger  
Дата: 11.02.11 10:27
Оценка:
Здравствуйте, nauro, Вы писали:

N>ShellExecuteEx(&seInfo);


Покажи заполнение seInfo с момента инициализации.
Re[3]: Изза чего может падать ShellExecute
От: ononim  
Дата: 11.02.11 10:31
Оценка:
N>а зачем он нужен? я ведь не использую СОМ.
Затем что нужен. Читать надо мсдн внимательно. И до конца: http://msdn.microsoft.com/en-us/library/bb762153(VS.85).aspx
Как много веселых ребят, и все делают велосипед...
Re[8]: Изза чего может падать ShellExecute
От: nauro Украина  
Дата: 11.02.11 10:34
Оценка:
Здравствуйте, De-Bugger, Вы писали:

DB>Здравствуйте, nauro, Вы писали:


N>>ShellExecuteEx(&seInfo);


DB>Покажи заполнение seInfo с момента инициализации.

Пжлста. Не проблема. Вместо pathToExecute могу подставить "notepad.exe", а в lpVerb могу заполнить"runas" и nShow SW_MAXIMIZE, все валится при любых раскладах.
SHELLEXECUTEINFO shExecInfo;

shExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);

shExecInfo.fMask = NULL;
shExecInfo.hwnd = NULL;
shExecInfo.lpVerb = L"";
shExecInfo.lpFile = pathToExecute;
shExecInfo.lpParameters = NULL;
shExecInfo.lpDirectory = NULL;
shExecInfo.nShow = SW_HIDE;
shExecInfo.hInstApp = NULL;
-----------------------------------------
тут может быть ваша реклама
Re[4]: Изза чего может падать ShellExecute
От: nauro Украина  
Дата: 11.02.11 12:13
Оценка:
Здравствуйте, ononim, Вы писали:

N>>а зачем он нужен? я ведь не использую СОМ.

O>Затем что нужен. Читать надо мсдн внимательно. И до конца: http://msdn.microsoft.com/en-us/library/bb762153(VS.85).aspx
К сожалению и это не помогло
-----------------------------------------
тут может быть ваша реклама
Re[5]: Изза чего может падать ShellExecute
От: De-Bugger  
Дата: 11.02.11 13:29
Оценка:
Здравствуйте, nauro, Вы писали:

N>К сожалению и это не помогло


А пробовал голое VC приложение Hello World доточить теми 8-ю строчками с вызовом ShellExecute? Почти 100% уверен, что ошибка совсем в другом месте.
Re[5]: Изза чего может падать ShellExecute
От: ononim  
Дата: 11.02.11 15:12
Оценка:
N>>>а зачем он нужен? я ведь не использую СОМ.
O>>Затем что нужен. Читать надо мсдн внимательно. И до конца: http://msdn.microsoft.com/en-us/library/bb762153(VS.85).aspx
N>К сожалению и это не помогло
минимальный код в студию
Как много веселых ребят, и все делают велосипед...
Re[6]: Изза чего может падать ShellExecute
От: nauro Украина  
Дата: 11.02.11 17:20
Оценка:
Здравствуйте, De-Bugger, Вы писали:

DB>Здравствуйте, nauro, Вы писали:


N>>К сожалению и это не помогло


DB>А пробовал голое VC приложение Hello World доточить теми 8-ю строчками с вызовом ShellExecute? Почти 100% уверен, что ошибка совсем в другом месте.

Сейчас какраз над этим работаю. Дело в том что не все так просто. В своем посте я указывал, что процедура креша такая: Приложение1 стартует Приложение2 с помошью CreateProcess а Приложение2 в свою очередь стартует ShellExecuteEx с Приложением3 (вот тут креш) и все это под инсталлером (и только под ним и крешится, прямой запуск естественно работает).
-----------------------------------------
тут может быть ваша реклама
Re[6]: Изза чего может падать ShellExecute
От: nauro Украина  
Дата: 11.02.11 17:21
Оценка:
Здравствуйте, ononim, Вы писали:

N>>>>а зачем он нужен? я ведь не использую СОМ.

O>>>Затем что нужен. Читать надо мсдн внимательно. И до конца: http://msdn.microsoft.com/en-us/library/bb762153(VS.85).aspx
N>>К сожалению и это не помогло
O>минимальный код в студию
Попробую воспроизвести на минимальном приложении, если удастся, выложу код.
-----------------------------------------
тут может быть ваша реклама
Re[2]: Изза чего может падать ShellExecute
От: Ops Россия  
Дата: 12.02.11 11:41
Оценка: 1 (1)
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Сразу "здыхать" программа сама не может, это сложный процесс. Вот убить ее можно сразу.


Может-может. А вообще вот хорошо расписано: http://www.rsdn.ru/forum/cpp/3913781.1.aspx
Автор: remark
Дата: 10.08.10
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Re[3]: Изза чего может падать ShellExecute
От: Pavel Dvorkin Россия  
Дата: 12.02.11 16:07
Оценка:
Здравствуйте, Ops, Вы писали:

Ops>Здравствуйте, Pavel Dvorkin, Вы писали:


PD>>Сразу "здыхать" программа сама не может, это сложный процесс. Вот убить ее можно сразу.


Ops>Может-может. А вообще вот хорошо расписано: http://www.rsdn.ru/forum/cpp/3913781.1.aspx
Автор: remark
Дата: 10.08.10


Все это мне хорошо известно. Но, говоря о том, что не может, я вовсе не это имел в виду. Я имел в виду процесс завершения приложения при возникновении критической ошибки. Он подробно рассмотрен у Соломона — Руссиновича.
With best regards
Pavel Dvorkin
Re[7]: Изза чего может падать ShellExecute
От: ononim  
Дата: 12.02.11 16:10
Оценка:
O>>>>Затем что нужен. Читать надо мсдн внимательно. И до конца: http://msdn.microsoft.com/en-us/library/bb762153(VS.85).aspx
N>>>К сожалению и это не помогло
O>>минимальный код в студию
N>Попробую воспроизвести на минимальном приложении, если удастся, выложу код.
и заодно бы в крэшдамп взглянули бы
Как много веселых ребят, и все делают велосипед...
Re[8]: Изза чего может падать ShellExecute
От: nauro Украина  
Дата: 14.02.11 11:26
Оценка:
Здравствуйте, ononim, Вы писали:

O>>>минимальный код в студию

N>>Попробую воспроизвести на минимальном приложении, если удастся, выложу код.
O>и заодно бы в крэшдамп взглянули бы

с минимальным приложением все ок, т.е. без креша.
Обьясните, а где взглянуть на креш дамп? Он куда-то сохраняется по умолчанию?
-----------------------------------------
тут может быть ваша реклама
Re[8]: Изза чего может падать ShellExecute
От: nauro Украина  
Дата: 14.02.11 13:12
Оценка:
Здравствуйте, ononim, Вы писали:

O>и заодно бы в крэшдамп взглянули бы


вот callstack crashdump-a:

ntdll!KiFastSystemCallRet
ntdll!ZwWaitForMultipleObjects+0xc
kernel32!WaitForMultipleObjectsEx+0x11d
user32!RealMsgWaitForMultipleObjectsEx+0x13c
user32!MsgWaitForMultipleObjects+0x1f
shell32!SHProcessMessagesUntilEventEx+0x51
shell32!CShellExecute::_RunThread+0x6e
shell32!CShellExecute::ExecuteNormal+0x8e
shell32!ShellExecuteNormal+0x33
shell32!ShellExecuteExW+0x62
WARNING: Stack unwind information not available. Following frames may be wrong.
MyApp+0x1e695
MyApp+0x1b2bf
mfc90u+0x6ade3
MyApp+0x5b12b
kernel32!BaseThreadInitThunk+0xe
ntdll!__RtlUserThreadStart+0x23
ntdll!_RtlUserThreadStart+0x1b

Как видно — обрывается на ntdll!KiFastSystemCallRet, но в самом креше пишет что имя модуля Secur32.dll.
-----------------------------------------
тут может быть ваша реклама
Re[9]: Изза чего может падать ShellExecute
От: nauro Украина  
Дата: 14.02.11 13:19
Оценка:
N>Как видно — обрывается на ntdll!KiFastSystemCallRet, но в самом креше пишет что имя модуля Secur32.dll.

Пардон это первый поток, в другом потоке callstack вот-такой:

secur32!CallSPM+0x1a
secur32!SecpGetUserName+0x98
secur32!GetUserNameExW+0x29
secur32!GetUserNameExA+0x58
advapi32!GetUserNameA+0x15
urlmon!CSharedMem::Init+0x54
urlmon!CUrlZoneManager::Initialize+0x39
urlmon!InternetCreateZoneManager+0x87
urlmon!CSecurityManager::EnsureZoneManager+0x1a
urlmon!CSecurityManager::ProcessUrlActionEx2Internal+0x6d
urlmon!CSecurityManager::ProcessUrlAction+0x10e
shlwapi!ZoneCheckUrlExCacheW+0xe5
shlwapi!ZoneCheckUrlExW+0x24
shell32!CExecuteApplication::_ZoneCheckFile+0x40
shell32!CExecuteApplication::_VerifyZoneTrust+0x2d
shell32!CExecuteApplication::_VerifyExecTrust+0x41
shell32!CExecuteApplication::Execute+0x27
shell32!CExecuteAssociation::_DoCommand+0x70
shell32!CExecuteAssociation::_TryApplication+0x3e
shell32!CExecuteAssociation::Execute+0x30

а в 3-тьем, такой:

ntdll!KiFastSystemCallRet
ntdll!ZwWaitForWorkViaWorkerFactory+0xc
ntdll!TppWorkerThread+0x1f6
kernel32!BaseThreadInitThunk+0xe
ntdll!__RtlUserThreadStart+0x23
ntdll!_RtlUserThreadStart+0x1b

-----------------------------------------
тут может быть ваша реклама
Re[10]: Изза чего может падать ShellExecute
От: ononim  
Дата: 14.02.11 13:57
Оценка: 1 (1)
Это получается GetUserName навернулся, крута
hack: попробуйте добавить флажок SEE_MASK_NOZONECHECKS
todo: разберитесь че оно у вас там падает, такого быть не должно
Как много веселых ребят, и все делают велосипед...
Re[11]: Изза чего может падать ShellExecute
От: nauro Украина  
Дата: 14.02.11 15:06
Оценка:
Здравствуйте, ononim, Вы писали:

O>Это получается GetUserName навернулся, крута

O>hack: попробуйте добавить флажок SEE_MASK_NOZONECHECKS
попробовал, да, действительно с этим флагом все ок, т.е. креш-а нету.

O>todo: разберитесь че оно у вас там падает, такого быть не должно

дык в том то и дело, что я бы сюда не писал, если бы знал КАК разобраться..
-----------------------------------------
тут может быть ваша реклама
Re[12]: Изза чего может падать ShellExecute
От: ononim  
Дата: 14.02.11 16:17
Оценка:
O>>todo: разберитесь че оно у вас там падает, такого быть не должно
N>дык в том то и дело, что я бы сюда не писал, если бы знал КАК разобраться..
Нуна смотреть что за параметры пришли в GetUserNameA если они невалидны — почему невалидны, если валидны — почему мог свалиться secur32!CallSPM+0x1a
Как много веселых ребят, и все делают велосипед...
Re[13]: Изза чего может падать ShellExecute
От: nauro Украина  
Дата: 14.02.11 18:20
Оценка:
Здравствуйте, ononim, Вы писали:

O>Нуна смотреть что за параметры пришли в GetUserNameA если они невалидны — почему невалидны, если валидны — почему мог свалиться secur32!CallSPM+0x1a

сорри, но можете подсказать, как смотреть параметры?
-----------------------------------------
тут может быть ваша реклама
Re[14]: Изза чего может падать ShellExecute
От: ononim  
Дата: 14.02.11 21:36
Оценка:
O>>Нуна смотреть что за параметры пришли в GetUserNameA если они невалидны — почему невалидны, если валидны — почему мог свалиться secur32!CallSPM+0x1a
N>сорри, но можете подсказать, как смотреть параметры?
В windbg начать следует с kv ffff, параметры будут в 3-5 столбцах. Но если вы этого не знаете — скорее всего не разберетесь чо там дальше. Проще будет найти баг методом научного тыка деления отрезка пополам — минимизации кода пока баг не пройдет

А еще мона покопаться вот тут: http://www.google.by/search?hl=ru&q=secur32!CallSPM%2B0x1a&aq=f&aqi=&aql=&oq=
Как много веселых ребят, и все делают велосипед...
Re[15]: Изза чего может падать ShellExecute
От: nauro Украина  
Дата: 15.02.11 13:58
Оценка:
Здравствуйте, ononim, Вы писали:

O>>>Нуна смотреть что за параметры пришли в GetUserNameA если они невалидны — почему невалидны, если валидны — почему мог свалиться secur32!CallSPM+0x1a

N>>сорри, но можете подсказать, как смотреть параметры?
O>В windbg начать следует с kv ffff, параметры будут в 3-5 столбцах. Но если вы этого не знаете — скорее всего не разберетесь чо там дальше. Проще будет найти баг методом научного тыка деления отрезка пополам — минимизации кода пока баг не пройдет
и все-таки, может где-то можно почитать об анализе дампа, а конкретнее — вытягивание параметров со стека?
-----------------------------------------
тут может быть ваша реклама
Re[14]: Изза чего может падать ShellExecute
От: shasa  
Дата: 15.02.11 17:01
Оценка:
Сколько можно флудить? Ответ уже выдан — повреждение данных внутри программы. Что ещё здесь можно обсуждать? Пусть основатель ветки ищет ошибку в своём коде. Советую ветку закрыть.
Re[15]: Изза чего может падать ShellExecute
От: nauro Украина  
Дата: 16.02.11 07:24
Оценка:
Здравствуйте, shasa, Вы писали:

S>Сколько можно флудить? Ответ уже выдан — повреждение данных внутри программы. Что ещё здесь можно обсуждать? Пусть основатель ветки ищет ошибку в своём коде. Советую ветку закрыть.

Мда. Уважаемый, вам что, эта ветка жить мешает? Согласен, два моих последних поста не очень подходят к теме топика, но не так уж и далеко в плане последовательности решения проблемы (может кто-нибудь еще потом спасибо скажет за продолжение темы), и посылать искать ошибку в коде, после того как я обратился сюда имеено потому что НЕ нашел ее, ИМХО, неуважительно. Потому как, откуда вы знаете сколько времени я провел за исканием вышеупомянутой ошибки?
-----------------------------------------
тут может быть ваша реклама
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.