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

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

Написал 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
Исключение при загрузке DLL
    #34358314
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TУ меня все работает, у пользователя при мне работает, а когда пользователь подольше поработает, начинает вылетать.постой рядом с пользователем подольше. Попробуй вести лог.
Dima Tпроисходит исключениеи какое?
...
Рейтинг: 0 / 0
Исключение при загрузке DLL
    #34359308
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Исключение при загрузке DLL
    #34359870
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
на чём пишешь? На С/winapi? Overlapped чтение/запись в файл делаешь?
...
Рейтинг: 0 / 0
Исключение при загрузке DLL
    #34359913
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
блин… насколько я помню, винда не говорит «просто ошибка». Она указывает причину, типа «память недоступна для записи». По крайней мере, когда у меня возникала ошибка в kernel32.dll, я всегда видел, что это за ошибка. Попробуй скомпилить прогу на с++, перехватить исключение и слить в лог стектрейс. Можно открыть ещё что-нибудь и сливать туда перехватываемые вызовы.
...
Рейтинг: 0 / 0
Исключение при загрузке DLL
    #34360133
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maXmoблин… насколько я помню, винда не говорит «просто ошибка». Она указывает причину, типа «память недоступна для записи». По крайней мере, когда у меня возникала ошибка в kernel32.dll, я всегда видел, что это за ошибка. Попробуй скомпилить прогу на с++, перехватить исключение и слить в лог стектрейс. Можно открыть ещё что-нибудь и сливать туда перехватываемые вызовы.

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

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

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

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

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

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

Добавил записи в лог по каждой команде dllmain() и по всем перехватываемым функциям, и контроль целостности общего блока памяти по CRC. Обновлю, может завтра более конкретные симптомы будут.
...
Рейтинг: 0 / 0
Исключение при загрузке DLL
    #34360658
Препаршиво такие вещи отлаживать. Пара вопросов - как перхватываем? И начиная с определённого момента все проги падают, или через раз глючит.
Самое простое, что в таких случаях можно сделать - понавтыкать вывод отладочных сообщений, где только можно, и мониторить их. Благо с пользователем рядом находитесь.
Хотя судя по тому, что через несколько часов баги появляются - что-то где-то переполняется, хотя почему дочерний процес при этом падает, а не родительский не очень ясно.
...
Рейтинг: 0 / 0
Исключение при загрузке DLL
    #34362365
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вчера вечером сам гонял у клиента, глюки стали через раз, причем без какой-то периодичности. Вылет происходит до начала работы 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
Исключение при загрузке DLL
    #34362393
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Косяк похоже надо искать где-то на этапе внедрения 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
Исключение при загрузке DLL
    #34362528
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кажется нашел косяк. Внедрение строится на предположении что 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
Исключение при загрузке DLL
    #34362571
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Самое обидное что я уже пытался смотреть что находится по адресу 0x00082f9c в kernel32.dll с помощью утилиты depends из VS, она пишет LoadLibraryA() EntryPoint 0x00001D77, а в отладчике 0x00082f9c
...
Рейтинг: 0 / 0
Исключение при загрузке DLL
    #34364263
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поставил Sleep(500) - сам гонял ни разу не сглючило, завтра посмотрю что у пользователя будет
...
Рейтинг: 0 / 0
Исключение при загрузке DLL
    #34364361
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TСамое обидное что я уже пытался смотреть что находится по адресу 0x00082f9c в kernel32.dll с помощью утилиты depends из VS, она пишет LoadLibraryA() EntryPoint 0x00001D77, а в отладчике 0x00082f9cну дык функции из дллки ведь через релокейшны подключаются, поэтому адреса разные.
...
Рейтинг: 0 / 0
Исключение при загрузке DLL
    #34364363
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
возьми да посмотри, какой код по адресу 0x00082f9c
...
Рейтинг: 0 / 0
Исключение при загрузке DLL
    #34364603
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Исключение при загрузке DLL
    #34365656
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Исключение при загрузке DLL
    #34366170
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ждать можно функцией WaitForInputIdle. Посмотри ещё функцию EnumerateLoadedModules64.
Кстати, не вижу, где ты закрываешь хендл дочернего процесса.
...
Рейтинг: 0 / 0
Исключение при загрузке DLL
    #34366540
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TПрога (dll) написана на MSVC6SP5 проект Win32 Dinamic Link Library. Я так понимаю это С++кстати, посмотри зависимости, не грузится ли при её запуске лишних дллей.
...
Рейтинг: 0 / 0
Исключение при загрузке DLL
    #34367095
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Исключение при загрузке DLL
    #34368124
Паля
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T
Мне эта ситуация начинает напоминать анекдот: "Если программа выполняет мистические действия, значит вы написали что-то невероятно глупое"

точно.

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

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

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

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

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

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


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