Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Исключение при загрузке DLL / 25 сообщений из 36, страница 1 из 2
27.02.2007, 10:23
    #34356700
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Исключение при загрузке DLL
Привет всем!

Столкнулся с паранормальными явлениями Что делать не знаю. У меня все работает, у пользователя при мне работает, а когда пользователь подольше поработает, начинает вылетать.

Написал filetest.dll для контроля за процессами запускаемыми из моей проги (отслеживается открытие общих файлов для избежания их монопольного открытия у меня). Моя прога написана на Visual FoxPro 6.0SP5, DLL win32-проект MSVC6SP5
Функционал вкратце такой:
1. Родительская (моя) прога подгружает filetest.dll и инициализирует
2. При инициализации создается именованная область памяти (CreateFileMapping()) куда помешается pid и имена контролируемых файлов
3. В родительском процессе dll перехватывает вызовы CreateProcess(), LoadLibrary(), LoadLibraryEx()
При вызове CreateProcess(), происходит создание процесса с флагом CREATE_SUSPENDED, затем в этот процесс внедряется эта же dll (через CreateRemoteThread()), после этого запускается дочерний процесс (ResumeThread())
4. В дочернем процессе происходит перехват CreateProcess(), LoadLibrary(), LoadLibraryEx(), CreateFile(), CloseHandle()
При инициализации в дочернем процессе подцепляется именованная область памяти только для чтения OpenFileMapping(FILE_MAP_READ, FALSE, pcszName), и при открытии файла CreateFile(), если он подпадает под список контролируемых, его хэндл запоминается в массив.

Проблема такая - все работает, но через какое-то время (довольно большое, несколько часов), при очередном вызове дочерней проги (любой, а их несколько) происходит исключение при загрузке dll (far'ом смотрю в модулях процесса нет filetest.dll) Все закрываешь, заново открываешь, опять работает.

У меня есть такое подозрение, что как-то портится блок разделяемой памяти в родительском процессе, т.к. дочерние процессы открывают его с режиме только на чтение. Написал прогу, которая выводит содержимое этого блока - в моменты вылетов содержимое нормальное.

Все что-только можно окружил обработкой исключений, включая DllMain():
Код: plaintext
1.
2.
3.
4.
5.
__try
{
...
}
__except(EXCEPTION_EXECUTE_HANDLER) {WriteToLog("EXEPTION: DLL_PROCESS_ATTACH");}
Но есть еще несколько глобальных переменных, в том числе объекты, конструкторы которых отрабатывают до DllMain(), но там в конструкторах только простейшие операции по инициализации свойств (типа pszDllFile = NULL) В основном код в DllMain() внутри обработчика исключений.

В общем - не знаю как это все безобразие отладить.
...
Рейтинг: 0 / 0
27.02.2007, 16:50
    #34358314
maXmo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Исключение при загрузке DLL
Dima TУ меня все работает, у пользователя при мне работает, а когда пользователь подольше поработает, начинает вылетать.постой рядом с пользователем подольше. Попробуй вести лог.
Dima Tпроисходит исключениеи какое?
...
Рейтинг: 0 / 0
28.02.2007, 08:20
    #34359308
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Исключение при загрузке DLL
maXmo Dima TУ меня все работает, у пользователя при мне работает, а когда пользователь подольше поработает, начинает вылетать.постой рядом с пользователем подольше. Попробуй вести лог. Dima Tпроисходит исключениеи какое?
Рядом не стоял, но как только начинало вылетать - radmin`ом цеплялся, смотрел - родительская прога нормально работает, при попытке запустить дочерний процесс "программа выполнила недопустимую операцию, позвоните куда надо ...", причем в дочернем, родительский продолжает работать. В журнале событий "Приложение": Application ErrorОшибка приложения child.exe, версия 0.0.0.0, модуль kernel32.dll, версия 5.1.2600.2180, адрес 0x00082f9c
Сообщение одинаковое на разных дочерних exe. Как бы узнать что по адресу 0x00082f9c находится.
Лог буду делать, постепенно вычислять строку, других мыслей пока нет.
...
Рейтинг: 0 / 0
28.02.2007, 11:14
    #34359870
maXmo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Исключение при загрузке DLL
на чём пишешь? На С/winapi? Overlapped чтение/запись в файл делаешь?
...
Рейтинг: 0 / 0
28.02.2007, 11:23
    #34359913
maXmo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Исключение при загрузке DLL
блин… насколько я помню, винда не говорит «просто ошибка». Она указывает причину, типа «память недоступна для записи». По крайней мере, когда у меня возникала ошибка в kernel32.dll, я всегда видел, что это за ошибка. Попробуй скомпилить прогу на с++, перехватить исключение и слить в лог стектрейс. Можно открыть ещё что-нибудь и сливать туда перехватываемые вызовы.
...
Рейтинг: 0 / 0
28.02.2007, 12:13
    #34360133
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Исключение при загрузке DLL
maXmoблин… насколько я помню, винда не говорит «просто ошибка». Она указывает причину, типа «память недоступна для записи». По крайней мере, когда у меня возникала ошибка в kernel32.dll, я всегда видел, что это за ошибка. Попробуй скомпилить прогу на с++, перехватить исключение и слить в лог стектрейс. Можно открыть ещё что-нибудь и сливать туда перехватываемые вызовы.

Честно говоря внимательно не читал, смотрел журнал событий. Сегодня уже все было и прога сегодня не нужна, следующий раз завтра, если сообщение о вылете выскочит, обещали не трогать и мне показать, скриншоты покажу.

Прога (dll) написана на MSVC6SP5 проект Win32 Dinamic Link Library. Я так понимаю это С++
Родительская прога (моя), которая подгружает dll - Visual FoxPro 6 SP5
Дочерние проги (чужие) - дельфи и что-то еще.

Я подозреваю что сглючивает на этапе загрузки dll в дочерний процесс, т.к. в момент исключения этой dll еще нет в списке модулей процесса, а когда стартует все нормально, то она там есть. Но на момент исключения другие модули есть, хотя процесс еще в состоянии SUSPENDED, т.е., как я понимаю, остальные модули подгружены при загрузке моей dll

Пока добавлю протоколирование всех шагов в dllmain(), может хоть что-то прояснится
...
Рейтинг: 0 / 0
28.02.2007, 12:58
    #34360345
maXmo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Исключение при загрузке DLL
Dima TКак бы узнать что по адресу 0x00082f9c находится.согласно моей kernel32.dll это внутренняя функция, так что без стека не разобрать. Можно ещё дочерний процесс запускать в режиме дебуга, тогда процесс-дебаггер будет получать уведомления обо всех исключениях.

Dima TДочерние проги (чужие) - дельфи и что-то еще.то есть менять их ты не можешь?
Кстати, заметь, происходит ли исключение до того, как ты начинаешь внедрять свою длл или уже в процессе. То есть веди ещё лог действий родительского процесса при запуске дочернего.
...
Рейтинг: 0 / 0
28.02.2007, 13:01
    #34360363
maXmo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Исключение при загрузке DLL
Dima TПрога (dll) написана на MSVC6SP5 проект Win32 Dinamic Link Library. Я так понимаю это С++в с++ можно воспользоваться обычными для с++ try, catch и с++ными исключениями и попытаться выжать из них максимум информации.
...
Рейтинг: 0 / 0
28.02.2007, 13:41
    #34360522
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Исключение при загрузке DLL
maXmoв с++ можно воспользоваться обычными для с++ try, catch и с++ными исключениями и попытаться выжать из них максимум информации.

Я в коде исключения совсем не использую. Только для перехвата ошибок типа обращения к несуществующей памяти. Эти ошибки протоколируются.
Код: plaintext
1.
2.
3.
4.
__try
{
...
}
__except(EXCEPTION_EXECUTE_HANDLER) {WriteToLog("EXEPTION: ...");}
Такими блоками окружены все функции, вызываемые извне (DLLmain(), WriteToLog(), перехватываемые и т.д.)
В логе пусто. Пробовал принудительно писать по нулевому указателю - перехватывается, в лог пишется.

Добавил записи в лог по каждой команде dllmain() и по всем перехватываемым функциям, и контроль целостности общего блока памяти по CRC. Обновлю, может завтра более конкретные симптомы будут.
...
Рейтинг: 0 / 0
28.02.2007, 14:10
    #34360658
Исключение при загрузке DLL
Препаршиво такие вещи отлаживать. Пара вопросов - как перхватываем? И начиная с определённого момента все проги падают, или через раз глючит.
Самое простое, что в таких случаях можно сделать - понавтыкать вывод отладочных сообщений, где только можно, и мониторить их. Благо с пользователем рядом находитесь.
Хотя судя по тому, что через несколько часов баги появляются - что-то где-то переполняется, хотя почему дочерний процес при этом падает, а не родительский не очень ясно.
...
Рейтинг: 0 / 0
01.03.2007, 08:43
    #34362365
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Исключение при загрузке DLL
Вчера вечером сам гонял у клиента, глюки стали через раз, причем без какой-то периодичности. Вылет происходит до начала работы DllMain(), т.е. в момент исключения нез записи в лог, хотя первая строка DllMain() - запись в лог. На своем компе повторить то же не удается, все работает
Что касается сообщения об ошибке - XP почему-то не дает описание типа "запись/чтение", выскакивает предложение отправить отчет в MS, в подробностях отчета инфа о загруженных модулях (в буфер обмена не копируется, а скриншотов пришлось бы штук 20 сделать) и сообщение Подпись ошибки:AppName: start.exe AppVer: 5.3.1.40 ModName: kernel32.dll
ModVer: 5.1.2600.2180 Offset: 00082f9cОбщий блок памяти не причем - CRC не меняется, да и не доходит до его использования.
Как я понимаю загрузка DLL происходит в такой последовательности:
1. Подгружаются требуемые системные библиотеки
2. Создаются глобальные переменные, для объектов отрабатывают конструкторы
3. Выполняется DllMain()
Код такой (однотипные места поубирал):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
struct SHAREDMEMORY
{
	DWORD dwCRC;
	...
} *pstrSM;
#define LISTPROCESS_SIZE  100 
struct LISTPROCESS
{
	DWORD dwPID;
	HMODULE hModule;
} strLP[LISTPROCESS_SIZE];
...
HookAPI oHook;
GeneralMemory oGM;
Event oLockLP;
...
LPBYTE pbConv = NULL;
BYTE szKey[KEY_SIZE];
...
VOID inline WriteToDebugLog(LPCSTR pcszText)
{
...
}
...
BOOL WINAPI My_CreateProcessA(LPCSTR lpApplicationName, ...)
{
...
}
BOOL APIENTRY DllMain( HMODULE hModule, DWORD  ul_reason_for_call, LPVOID lpReserved)
{
	WriteToDebugLog("DllMain()");
	...
}

// Конструкторы объектов
GeneralMemory::GeneralMemory()
{
	pvMem = NULL;
	hFileMap = NULL;
}

HookAPI::HookAPI()
{
	pszDllFile = NULL;
	hThisModule = NULL;
	pAdrProc = NULL;
	dwAdrSize =  0 ;
	lSetHook = FALSE;
}

Event::Event()
{
	hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
}
...
Рейтинг: 0 / 0
01.03.2007, 08:56
    #34362393
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Исключение при загрузке DLL
Косяк похоже надо искать где-то на этапе внедрения dll, происходит это так:
в родительском процессе перехватывается CreateProcessA()
создается дочерний процесс с флагом CREATE_SUSPENDED
затем через CreateRemoteThread() запускается LoadLibraryA() для моей dll.
Код такой:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
// Ловушка в родительском процессе
BOOL WINAPI My_CreateProcessA(LPCSTR lpApplicationName, LPSTR lpCommandLine, LPSECURITY_ATTRIBUTES lpProcessAttributes, LPSECURITY_ATTRIBUTES lpThreadAttributes, BOOL bInheritHandles, DWORD dwCreationFlags, LPVOID lpEnvironment, LPCSTR lpCurrentDirectory, LPSTARTUPINFOA lpStartupInfo, LPPROCESS_INFORMATION lpProcessInformation)
{
	BOOL lOk = CreateProcessA(lpApplicationName, lpCommandLine, lpProcessAttributes, lpThreadAttributes, bInheritHandles, dwCreationFlags | CREATE_SUSPENDED, lpEnvironment, lpCurrentDirectory, lpStartupInfo, lpProcessInformation);
	__try
	{
		if(lOk)
		{
			__try
			{
				oHook.InjectDll(lpProcessInformation->hProcess);
			}
			__finally
			{
				if((dwCreationFlags & CREATE_SUSPENDED) ==  0 ) ResumeThread(lpProcessInformation->hThread);
			}
		}
	}
	__except(EXCEPTION_EXECUTE_HANDLER) {WriteToLog("EXEPTION: CreateProcessA()");}
	return lOk;
}

// Внедрение DLL во внешний процесс
BOOL HookAPI::InjectDll(HANDLE hProcess)
{
	BOOL lOk = FALSE;
	PSTR pszRemoteFile = NULL;
	HANDLE hThread = NULL;
	__try
	{
		if(pszDllFile != NULL)
		{
			// Выделяем память в удаленном процессе
			INT iLen = lstrlen(pszDllFile) +  1 ;
			pszRemoteFile = (PSTR) VirtualAllocEx(hProcess, NULL, iLen, MEM_COMMIT, PAGE_READWRITE);
			// Копируем pcszDll
			if(pszRemoteFile != NULL && WriteProcessMemory(hProcess, pszRemoteFile, (PVOID) pszDllFile, iLen, NULL))
			{
				// Получаем адрес LoadLibraryW в Kernel32
				PTHREAD_START_ROUTINE pfnThread = (PTHREAD_START_ROUTINE) LoadLibraryA;
				if(pfnThread != NULL)
				{
					hThread = CreateRemoteThread(hProcess, NULL,  0 , pfnThread, pszRemoteFile,  0 , NULL);
					if(hThread != NULL)
					{
						WaitForSingleObject(hThread, INFINITE);
						lOk = TRUE;
					}
				}
			}
		}
	}
	__finally
	{
		// Освобождаем память
		if(pszRemoteFile != NULL) VirtualFreeEx(hProcess, pszRemoteFile,  0 , MEM_RELEASE);
		if(hThread != NULL) CloseHandle(hThread);
	}
	return lOk;
}
...
Рейтинг: 0 / 0
01.03.2007, 09:48
    #34362528
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Исключение при загрузке DLL
Кажется нашел косяк. Внедрение строится на предположении что kernel32.dll всегда грузится по одному и тому же адресу и адрес LoadLibraryA() во всех процессах одинаковый.
Адрес LoadLibraryA() 0x7c882f9c, т.е. 7C800000 адрес модуля kernel32.dll, и смещение 00082f9c про которое в исключении и пишется.

Вот список модулей у вылетевшего процесса Far processinfo Base Size Path (version info is not displayed)
00400000 1F000 C:\Child\child.exe
7C900000 B1000 C:\WINDOWS\system32\ntdll.dll
7C800000 F6000 C:\WINDOWS\system32\kernel32.dll
77D30000 90000 C:\WINDOWS\system32\user32.dll
77F10000 46000 C:\WINDOWS\system32\GDI32.dll
77DC0000 AC000 C:\WINDOWS\system32\advapi32.dll
77E70000 91000 C:\WINDOWS\system32\RPCRT4.dll
77110000 8C000 C:\WINDOWS\system32\oleaut32.dll
77C00000 58000 C:\WINDOWS\system32\msvcrt.dll
774D0000 13C000 C:\WINDOWS\system32\ole32.dll
77BF0000 8000 C:\WINDOWS\system32\version.dll
699D0000 16000 C:\WINDOWS\system32\faultrep.dll
769A0000 B4000 C:\WINDOWS\system32\USERENV.dll
76330000 10000 C:\WINDOWS\system32\WINSTA.dll
5BD50000 54000 C:\WINDOWS\system32\NETAPI32.dll
76F40000 8000 C:\WINDOWS\system32\WTSAPI32.dll
77910000 F4000 C:\WINDOWS\system32\SETUPAPI.dll
77F60000 76000 C:\WINDOWS\system32\SHLWAPI.dll
77B30000 22000 C:\WINDOWS\system32\Apphelp.dll Вроде как все загружено как надо, хотя не факт что win останавливает все потоки при необработанном исключении в одном из них, возможно они дозагрузились после исключения.

Только как его лечить? модуль вроде как загружен, т.к. в исключении упоминается kernel32.dll, а не безымянная память. То ли он не успевает проинициализироваться до конца, можно конечно попробовать Sleep() воткнуть перед CreateRemoteThread(), но на сколько? и хватит ли его? А если вообще третий процесс на себя процессорное время забрал? Может AVP еще свой вклад вносит. Может у клиента еще что в этот момент крутится или после активной работы своп активней идет.

Если исключение происходит в точке входа в LoadLibraryA(), то параметры точно не причем?

Рихтера читал про механизмы внедрения и перехвата, может что упустил, надо будет перечитать еще раз. Как-то это должно проверяться?
...
Рейтинг: 0 / 0
01.03.2007, 10:03
    #34362571
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Исключение при загрузке DLL
Самое обидное что я уже пытался смотреть что находится по адресу 0x00082f9c в kernel32.dll с помощью утилиты depends из VS, она пишет LoadLibraryA() EntryPoint 0x00001D77, а в отладчике 0x00082f9c
...
Рейтинг: 0 / 0
01.03.2007, 16:33
    #34364263
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Исключение при загрузке DLL
Поставил Sleep(500) - сам гонял ни разу не сглючило, завтра посмотрю что у пользователя будет
...
Рейтинг: 0 / 0
01.03.2007, 16:53
    #34364361
maXmo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Исключение при загрузке DLL
Dima TСамое обидное что я уже пытался смотреть что находится по адресу 0x00082f9c в kernel32.dll с помощью утилиты depends из VS, она пишет LoadLibraryA() EntryPoint 0x00001D77, а в отладчике 0x00082f9cну дык функции из дллки ведь через релокейшны подключаются, поэтому адреса разные.
...
Рейтинг: 0 / 0
01.03.2007, 16:53
    #34364363
maXmo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Исключение при загрузке DLL
возьми да посмотри, какой код по адресу 0x00082f9c
...
Рейтинг: 0 / 0
01.03.2007, 17:45
    #34364603
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Исключение при загрузке DLL
Dima TВылет происходит до начала работы DllMain(), т.е. в момент исключения нез записи в лог, хотя первая строка DllMain() - запись в лог.Как именно пишешь в лог? Какими функциями? Через c-runtime или через winapi? Если первое - то опаньки.

Вот это читал?
MSDNWarning The entry-point function should perform only simple initialization or termination tasks. It must not call the LoadLibrary or LoadLibraryEx function (or a function that calls these functions), because this may create dependency loops in the DLL load order. This can result in a DLL being used before the system has executed its initialization code. Similarly, the entry-point function must not call the FreeLibrary function (or a function that calls FreeLibrary), because this can result in a DLL being used after the system has executed its termination code.

It is safe to call other functions in Kernel32.dll, because this DLL is guaranteed to be loaded in the process address space when the entry-point function is called. It is common for the entry-point function to create synchronization objects such as critical sections and mutexes, and use TLS. Do not call the registry functions, because they are located in Advapi32.dll. If you are dynamically linking with the C run-time library, do not call malloc; instead, call HeapAlloc.

Calling imported functions other than those located in Kernel32.dll may result in problems that are difficult to diagnose. For example, calling User, Shell, and COM functions can cause access violation errors, because some functions in their DLLs call LoadLibrary to load other system components. Conversely, calling those functions during termination can cause access violation errors because the corresponding component may already have been unloaded or uninitialized.
...
Рейтинг: 0 / 0
02.03.2007, 09:51
    #34365656
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Исключение при загрузке DLL
maXmoну дык функции из дллки ведь через релокейшны подключаются, поэтому адреса разные. Я так и подумал
maXmoвозьми да посмотри, какой код по адресу 0x00082f9cЭто реальная точка входа в LoadLibraryA()
GetProcAddress(GetModuleHandle("kernel32.dll"), "LoadLibraryA") = 0x7c882f9c, где 0x7c800000 адрес kernel32.dll White OwlКак именно пишешь в лог? Какими функциями? Через c-runtime или через winapi? Если первое - то опаньки.Второе CreateFile(), WriteFile(). С-runtime в этой DLL старался по минимому использовать.
White OwlВот это читал?Не читал. Но как я понимаю, в моем случае, операционка не всегда успевает спроецировать код kernel32.dll в адресное пространство процесса и мой внедренный поток получает точку входа в несуществующей памяти и если я обращусь по адресу в таблице импорта получу тот же результат.

Вобщем эти вопросы в целом понятны. Остается непонятным главный вопрос: "Как проверить завершилась ли загрузка kernel32.dll?"
Еще раз о сути проблемы (я похоже с показом исходников переборщил):
Код: plaintext
1.
CreateProcess(..., CREATE_SUSPENDED, ...);
CreateRemoteThread(hProcess, GetModuleHandle("kernel32.dll"), "LoadLibraryA"), ...);
При таком раскладе иногда происходит вылет, потому что процесс еще не закончил создаваться, а я уже трэд там запускаю. Вчера Рихтера почитал, как лечить не нашел, но есть фраза "CreateProcess может вернуть TRUE, а процесс не создаться, например, по причине отсутствия одной из его DLL". А примеры внедрения там рассматриваются в уже существующие процессы.
Именно этой причиной ошибки можно объяснить, то что у себя я ее повторить не могу на том же софте, т.к. у пользователя Cel 2ГГц 256 Мб, а у меня PM 1.5 ГГц 512 Мб, т.е. у меня железо помощнее и такая ситуация не возникает.

Пока поставил Sleep(500) в середину, пользователь уже трудиться, пока все нормально, подожду вечера. Только я до конца не уверен, что полсекунды хватит на все случаи, может завтра они параллельно какую-нибудь софтину запустят, которая активно процессор занимает.
...
Рейтинг: 0 / 0
02.03.2007, 11:54
    #34366170
maXmo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Исключение при загрузке DLL
ждать можно функцией WaitForInputIdle. Посмотри ещё функцию EnumerateLoadedModules64.
Кстати, не вижу, где ты закрываешь хендл дочернего процесса.
...
Рейтинг: 0 / 0
02.03.2007, 13:25
    #34366540
maXmo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Исключение при загрузке DLL
Dima TПрога (dll) написана на MSVC6SP5 проект Win32 Dinamic Link Library. Я так понимаю это С++кстати, посмотри зависимости, не грузится ли при её запуске лишних дллей.
...
Рейтинг: 0 / 0
02.03.2007, 15:08
    #34367095
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Исключение при загрузке DLL
maXmoждать можно функцией WaitForInputIdle. Посмотри ещё функцию EnumerateLoadedModules64.
Кстати, не вижу, где ты закрываешь хендл дочернего процесса.
Если правильно понял MSDN - WaitForInputIdle() ожидает создание очереди сообщений и ее освобождение. В моем случае этого просто не дождаться, т.к. CREATE_SUSPENDED.
EnumerateLoadedModules64() - сейчас поиспытываю.
Хэндлы не закрываю, т.к. My_CreateProcessA() это функция-ловушка для перехвата CreateProcessA() и в родительском и в дочерних процессах, т.е. закрывает тот код, который вызвал CreateProcessA()

Только я рано радовался. Закончилось все сегодня опять вылетом (как только первое исключение произошло я Radmin`ом подцепился):
1. Начало вылетать все стабильно, т.е. после первого глюка больше я не смог создать ни один дочерний процесс, пробовал из разных мест программы, в т.ч. из тех где утром работало. Стабильно kernel32.dll 0x00082f9c
2. Все закрыл, т.е. моя dll выгружена из всех процессов, запустил заново, глюки избирательно в непонятном порядке, то запустится, то нет, чаще запускалось.

Похоже теория об неуспевании инициализации процесса с треском провалилась :(
Думал, может вместо имени dll какая-нибудь ерунда подается в LoadLibrary(), но если подать строку с неправильным именем, то дочерний процесс работает, только моя dll не подгружается, что логично. Если NULL, то вылетает, но в ошибке не kernel32.dll 0x00082f9c, а другой адрес пишется.

Похоже надо начинать диагностику сначала. Попробую все убрать в дочернем процессе, т.е. чтобы только внедрение в дочерний и никаких в нем перехватов. А там либо искать косяк в том что останется, либо поэтапно добавлять отключенное.

Может кто мысль еще какую подкинет?

Мне эта ситуация начинает напоминать анекдот: "Если программа выполняет мистические действия, значит вы написали что-то невероятно глупое"
...
Рейтинг: 0 / 0
02.03.2007, 19:15
    #34368124
Паля
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Исключение при загрузке DLL
Dima T
Мне эта ситуация начинает напоминать анекдот: "Если программа выполняет мистические действия, значит вы написали что-то невероятно глупое"

точно.

(отслеживается открытие общих файлов для избежания их монопольного открытия у меня)

Это вы неправильно выразились просто или на самом деле _ТОЛЬКО_ для этого всё это безумие???
8-/.

винда не даст вам открыть монопольно файл если он кем-то открыт.
Если это фокспры глюк (вылетает там или чего) - надо просто обработать ошибку. (Напишите dll которая будет пытаться открыть монопольно и возвращать bool в фокс :-) )

зы. иными словами : НАХРЕНА ЭТО ВСЁ ? :-)
...
Рейтинг: 0 / 0
02.03.2007, 19:35
    #34368168
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Исключение при загрузке DLL
Dima TНаписал filetest.dll для контроля за процессами запускаемыми из моей проги (отслеживается открытие общих файлов для избежания их монопольного открытия у меня).Кстати да, для решения ЭТОЙ задачи достаточно один раз открыть файл в режиме общего доступа и держать его открытым. Все последующие попытки открыть файл монопольно завершаться ошибкой. Перефразирую вопрос Паля: А нельзя ли эту задачу решить менее хакерскими методами?
...
Рейтинг: 0 / 0
03.03.2007, 09:46
    #34368588
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Исключение при загрузке DLL
Палязы. иными словами : НАХРЕНА ЭТО ВСЁ ? :-)Ладно, колюсь :) Думал сразу такой вопрос кто-нибудь задаст. На самом деле софтина работет у 500 клиентов (без dll), запускаемые проги от "дружественных" организаций, т.к. клиенты у нас общие. Некоторые повадились пиз...ть инфу у нас и у других, поэтому задачи этой dll:
1. Частичное шифрование базы фокса (некоторых dbf). Средствами фокса это сделать гораздо сложнее и работать будет медленнее, и сопровождать тяжелее. Это работает, но я пока все что с шифрованием связано из кода убрал для отладки.
2. Контроль изнутри за активностью "дружественных" прог, на предмет обращения к нашим dbf-кам, для своевременного реагирования в случае нововведений у них.
3. На сегодня один "шпиенский" процесс периодически виснет и оставляет держать открытыми монопольно наши dbf. Соответственно наша прога не может их открыть. Клиенту мы не можем (по политическим причинам) сказать "эти уроды даже инфу снять не могут по-человечески", поэтому приходится валить все комп клиента и просить перезагрузиться, что все равно дает минус в отношении к нашей проге.
4. Хочется решить задачу универсально с заделом на будущее, т.к. сегодня один гадит, завтра второй начнет.
White Owl...Кстати да, для решения ЭТОЙ задачи достаточно один раз открыть файл в режиме общего доступа и держать его открытым. Все последующие попытки открыть файл монопольно завершаться ошибкой. Перефразирую вопрос Паля: А нельзя ли эту задачу решить менее хакерскими методами?Можно, только вышеописанные проблемы останутся.

На сегодня косяк где-то при внедрении в дочерний процесс Кто нибудь что-то подобное делал? Можете исходниками поделиться?

Я уже две недели пытаюсь косяк найти. Пока сюда постил хоть сам в чем-то разобрался.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Исключение при загрузке DLL / 25 сообщений из 36, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]