Интересненький вопросик!!
Длл цыпляется ко всем процессам атвтоматом (в реестре App_InsDlls стоит моя длл)
в этой длл создается поток, который постоянно выполняется
В этом потоке постоянно записываются данные в реестр и кое-что еще выполняется (не важно :) )
Короче у меня вылетает ошибка при запуске (например блокнота) такого содержания (программа обратилась по адресу "адресс" и не может быть wriiten)
в чем косяк я смутно понял:
из-за advapi32.dll то есть обращения к реестру
Но мне очень надо что-бы это обязательно присутствовало.
Помогите плиз! Подскажите пока нече немогу понять!
Цитата:
в чем косяк я смутно понял:
из-за advapi32.dll то есть обращения к реестру
Не факт - может как раз из-за
Цитата:
...и кое-что еще выполняется ...
А ошибка может быть где угодно и скорее всего в твоей библиотеке...
misha_turist прав. только ошибка не скорее всего, а в твоей библиотеке. уж не знаю, что там за код выполняет твоя программа, но скажем попробуй сделать, чтоб твоя программа вызывала функцию messagebox - если все нормально, то ... а дальше нужно хоть что-нибудь, где можно ошибку поискать, если код приводить не хочешь(я подозреваю какое у него назначение), то бери в руки Ollydbg и ищи ошибку - че пальцем в небо тыкать!
Если длл подключать тупо к тестовой проге ошибок не возникает
А возникает лишь после того когда я прописываю в реестр в ключApp_InsDlls, т.е user32.dll сама подключает мою длл ко всем запускаемым GUI-процессам.
Я даже уже нашел где возникает ошибка воспользовавшись "Олей":
Ошибка возникает при вызове функции RegKeyOpen из advapi32.dll
причем не в моем коде а коде который добавляет сама делфа - функции инициализации, тама она обращается к своим ключам реестра (зачем-то??)
Причем ошибка возникает не во всех процессах
Например на домашнем компютере где стоит Windows XP Prof XP1 ошибка возникает при запуске Winamp, а при запуске блокнота, explorer-а, ворда, калькулятора и других не возникает
А на работе где стоит Windows XP SP2 возникает и в блокноте и rundll32.exe и калькуляторе и т.д
Так вот все равно не могу ни чего понять почему так?
ну попробуй в реестр через API лазить.
кинь сдесь длл или мне на мыло [email]kosfiz@mail.ru[/email] посмотрю у себя, а то чето странно она себя ведет. пропишу у себя в App_InsDlls и потестю (я не код прошу, а саму длл).
Не боишься ;)
а я все на VMware тестирую - на всякий случай.
2Borland_prog
ну че давай потестю. просто не может быть, чтоб прога написанная на дельфях обращалась к дельфийским ключам реестра -> ведь дельфи же может быть и не установлена.
2Kosfiz Ну я же в ольке проверил -> делфа обращается к ключам (че то там Borland\ ты ры пыры.
http://jobboris007.narod.ru/antik_dll.rar --- Длл (компальная)
http://jobboris007.narod.ru/Dll-sorc.rar --- Сорцы
Код:
RegSetString(HKEY_LOCAL_MACHINE, AppInit_DLLsKeyName, AppInit_DLLsKeyVal);
просто хочу обратить твое внимание на то, что в ключе AppInit_DLLs может быть записано еще какая-нибудь длл, так что наверное сначала надо получить значение оттуда, а потом к нему добавить свое и записать.
Не ну это понятно - я просто пробовал
Спасибо!!!!
Я в коде потока хочу например в какой-нить файл писать что-нить
и нарушение доступа происходит
а как сделать чтоб небыло?
тоже использовать проекцию нужного файла или как?
Не ну это понятно - я просто пробовал
Спасибо!!!![/QUOTE]
1) я так и понял, что ты пробовал, но просто решил тебе напомнить, чтобы ты не забыл.
2) да не за что - всегда рад помочь.
3) касательно нового вопроса:
добавил к коду ThreadFunc вот такое, т.е. просто попробовал что-нибудь записать в файл 1.txt с учетом того, что он существует:
Код:
var
hFile,bw:dword;
...........
hFile:=CreateFile(pchar('c:\1.txt'),GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ or FILE_SHARE_WRITE, 0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
WriteFile(hFile,'string',6,bw,0);
CloseHandle(hFile);
hFile,bw:dword;
...........
hFile:=CreateFile(pchar('c:\1.txt'),GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ or FILE_SHARE_WRITE, 0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
WriteFile(hFile,'string',6,bw,0);
CloseHandle(hFile);
и все получилось без ошибок - так что пробуй. только тебе, есстественно, надо будет добавлять данные, т.е. перейти в конец файла и записать то, что нужно.
Спасибо большое за помощь, но есть маленький нюанс:
То что ты мне написал конечно правильно (я честно сказать не додумался бы), но все же...
Вообщем ошибка не исчезла
Делфийский компайлер добавляет свой код вызовом по адресу 00409AEF функции инициализации (или еще-чего)
В этой функции инициализации происходит вызов System::LoadResString, которая в свою
очередь вызывает = call sub_404928, та вызывает = call sub_4048E0. В которой есть проверка
на какое-то условие:
cmp dword ptr [ebx+10h], 0
jnz short loc_40491B
Если оно не выполняется то далее вызывается call sub_404B1C
В которой и просходит вызов функции call RegOpenKeyExA (аж 3 раза, но это неважно).
Открытие ключа реестра (прокопав далее ошибка происходит в ntdll.dll)
Так у меня вопрос: почему????
Кстати из всего этого можно сделать вывод:
Люди знайте: ЕСЛИ ВЫ ПРОГРАММИРУЕТЕ НА ДЕЛФЕ ПРИ КАЖДОМ ВЫЗОВЕ ВАМИ LoadResString из System
ПРОИСХОДИТ КАК МИНИМУМ ТРИ ОбРАЩЕНИЯ К РЕЕСТРУ!!!!
Так же там вызывается и RegQueryValueExA (два раза)
Далее куски декампайлерного кода полученные с помощью IDAG
Адресса естественно мои личные (в смысле для моего компа)
Код:
CODE:00404B1C sub_404B1C proc near ; CODE XREF: sub_4048E0+27p
CODE:00404B1C
...
...
CODE:00404B41 lea eax, [ebp+hKey]
CODE:00404B44 push eax ; phkResult
CODE:00404B45 push 0F0019h ; samDesired
CODE:00404B4A push 0 ; ulOptions
CODE:00404B4C push offset SubKey ; lpSubKey
CODE:00404B51 push 80000001h ; hKey
CODE:00404B56 call RegOpenKeyExA --> вот здесь и происходит ошибка (Память не может быть "written")
...
...
CODE:00404C20 retn
/////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////
CODE:004048E0 sub_4048E0 proc near ; CODE XREF: sub_404928+1Bp
...
...
CODE:004048EA cmp dword ptr [ebx+10h], 0
CODE:004048EE jnz short loc_40491B --> а здесь я отчаившись пропатчил на безусловный переход (и все сработало)
CODE:004048F0 push 105h ; nSize
CODE:004048F5 lea eax, [esp+10Ch+Filename]
CODE:004048F9 push eax ; lpFilename
CODE:004048FA mov eax, [ebx+4]
CODE:004048FD push eax ; hModule
CODE:004048FE call GetModuleFileNameA
CODE:00404903 mov eax, esp
CODE:00404905 mov dl, 1
CODE:00404907 call sub_404B1C --> Вот здесь вызывается предыдущая функция (в которой и есть то самое обращение к реестру)
CODE:0040490C mov esi, eax
CODE:0040490E mov [ebx+10h], esi
CODE:00404911 test esi, esi
CODE:00404913 jnz short loc_40491B
CODE:00404915 mov eax, [ebx+4]
CODE:00404918 mov [ebx+10h], eax
CODE:0040491B
CODE:0040491B loc_40491B: ; CODE XREF: sub_4048E0+Ej
CODE:0040491B ; sub_4048E0+33j
CODE:0040491B mov eax, [ebx+10h]
CODE:0040491E add esp, 108h
CODE:00404924 pop esi
CODE:00404925 pop ebx
CODE:00404926 retn
CODE:00404926 sub_4048E0 endp
/////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////
CODE:00404928 sub_404928 proc near ; CODE XREF: System::LoadResString(System::TResStringRec *)+2Bp
CODE:00404928 ; Sysutils::ExceptionErrorMessage(System::TObject *,void *,char *,int)+ECp ...
...
...
CODE:00404941 mov eax, edx
CODE:00404943 call sub_4048E0 --> здесь вызывается функция выше.
CODE:00404948 retn
/////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////
CODE:00404EAC ; __fastcall System::LoadResString(System::TResStringRec *)
CODE:00404EAC @System@LoadResString$qqrp20System@TResStringRec proc near
CODE:00404EAC ; CODE XREF: sub_4039A4+16p
CODE:00404EAC ; SysUtils::_16679+2Ep ...
...
...
CODE:00404ED7 call sub_404928 --> здесь вызывается предыдущая функция
CODE:00404EDC push eax ; hInstance
CODE:00404EDD call LoadStringA
CODE:00404EE2 mov ecx, eax
CODE:00404EE4 mov edx, esp
CODE:00404EE6 mov eax, esi
CODE:00404EE8 call @@LStrFromPCharLen$qqrr10AnsiStringpci ; __linkproc__ LStrFromPCharLen(AnsiString &,char *,int)
CODE:00404EED jmp short loc_404EF9
...
...
CODE:00404F01 retn
CODE:00404F01 @System@LoadResString$qqrp20System@TResStringRec endp
Вообщем вся эта байда вызывается из
CODE:00409AE4 public start
CODE:00409AE4 start:
CODE:00409AE4 push ebp
CODE:00409AE5 mov ebp, esp
CODE:00409AE7 add esp, 0FFFFFFC4h
CODE:00409AEA mov eax, offset dword_409A84
CODE:00409AEF call sub_4051EC --> вот здесь происходит вызов функции которую добавляет делфовый компайлер
...
...
Дальше идет все мое
CODE:00404B1C
...
...
CODE:00404B41 lea eax, [ebp+hKey]
CODE:00404B44 push eax ; phkResult
CODE:00404B45 push 0F0019h ; samDesired
CODE:00404B4A push 0 ; ulOptions
CODE:00404B4C push offset SubKey ; lpSubKey
CODE:00404B51 push 80000001h ; hKey
CODE:00404B56 call RegOpenKeyExA --> вот здесь и происходит ошибка (Память не может быть "written")
...
...
CODE:00404C20 retn
/////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////
CODE:004048E0 sub_4048E0 proc near ; CODE XREF: sub_404928+1Bp
...
...
CODE:004048EA cmp dword ptr [ebx+10h], 0
CODE:004048EE jnz short loc_40491B --> а здесь я отчаившись пропатчил на безусловный переход (и все сработало)
CODE:004048F0 push 105h ; nSize
CODE:004048F5 lea eax, [esp+10Ch+Filename]
CODE:004048F9 push eax ; lpFilename
CODE:004048FA mov eax, [ebx+4]
CODE:004048FD push eax ; hModule
CODE:004048FE call GetModuleFileNameA
CODE:00404903 mov eax, esp
CODE:00404905 mov dl, 1
CODE:00404907 call sub_404B1C --> Вот здесь вызывается предыдущая функция (в которой и есть то самое обращение к реестру)
CODE:0040490C mov esi, eax
CODE:0040490E mov [ebx+10h], esi
CODE:00404911 test esi, esi
CODE:00404913 jnz short loc_40491B
CODE:00404915 mov eax, [ebx+4]
CODE:00404918 mov [ebx+10h], eax
CODE:0040491B
CODE:0040491B loc_40491B: ; CODE XREF: sub_4048E0+Ej
CODE:0040491B ; sub_4048E0+33j
CODE:0040491B mov eax, [ebx+10h]
CODE:0040491E add esp, 108h
CODE:00404924 pop esi
CODE:00404925 pop ebx
CODE:00404926 retn
CODE:00404926 sub_4048E0 endp
/////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////
CODE:00404928 sub_404928 proc near ; CODE XREF: System::LoadResString(System::TResStringRec *)+2Bp
CODE:00404928 ; Sysutils::ExceptionErrorMessage(System::TObject *,void *,char *,int)+ECp ...
...
...
CODE:00404941 mov eax, edx
CODE:00404943 call sub_4048E0 --> здесь вызывается функция выше.
CODE:00404948 retn
/////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////
CODE:00404EAC ; __fastcall System::LoadResString(System::TResStringRec *)
CODE:00404EAC @System@LoadResString$qqrp20System@TResStringRec proc near
CODE:00404EAC ; CODE XREF: sub_4039A4+16p
CODE:00404EAC ; SysUtils::_16679+2Ep ...
...
...
CODE:00404ED7 call sub_404928 --> здесь вызывается предыдущая функция
CODE:00404EDC push eax ; hInstance
CODE:00404EDD call LoadStringA
CODE:00404EE2 mov ecx, eax
CODE:00404EE4 mov edx, esp
CODE:00404EE6 mov eax, esi
CODE:00404EE8 call @@LStrFromPCharLen$qqrr10AnsiStringpci ; __linkproc__ LStrFromPCharLen(AnsiString &,char *,int)
CODE:00404EED jmp short loc_404EF9
...
...
CODE:00404F01 retn
CODE:00404F01 @System@LoadResString$qqrp20System@TResStringRec endp
Вообщем вся эта байда вызывается из
CODE:00409AE4 public start
CODE:00409AE4 start:
CODE:00409AE4 push ebp
CODE:00409AE5 mov ebp, esp
CODE:00409AE7 add esp, 0FFFFFFC4h
CODE:00409AEA mov eax, offset dword_409A84
CODE:00409AEF call sub_4051EC --> вот здесь происходит вызов функции которую добавляет делфовый компайлер
...
...
Дальше идет все мое
1) зачем при инициализации идет обращение к реестру?
2) и как же все это сделать чтоб работало без проблем?
самому теперь интересно стало.
Я исходники Sytem.pas посорел.
Надо вообщем покопаться поизучать. Все таки почему?
хочу поделиться с тобой результатами своих раскопок по вопросу, который нас обоих интересует, вообщем system.pas не виновник этих проблем, а вся эта фигня из-за SysUtils.pas. пробовал по-всякому если sysutils не заюзан, то ошибок не вылазиет, а если подключен, то ошибка. Так что, наверное или скорее всего, в твоем случае надо попытаться обойтись без него или узнать где там ошибочка и её убрать, вообщем решай сам.
Ошибка же возникает только когда длл грузится во все процессы
А я протестил на своей, т.е.: не прописывая ключ в реестре AppInst_Dlls и все работает прога подключает длл и все путем
Так вот о чем это я:
На самом деле user32.dll при своей загрузке в процесс (а он грузится почти во все процессы) и подрубает к процессу к которому он подключается все длл перечисленные в AppInst_Dlls
:) Ну это все ты конечно знаешь
Просто я хочу сказать может мы ищем не там косяк:
Зачем копаться в делфе, если это может быть (скорее всего) (да точно) зависит от устройства винды (не знаю там: защиты, виртуальной памяти или еще чего)
Не конечно интересно и мне почему и для чего же делфа навязывает нам этот свой код, обращающийся к реестру.
Короче я сделал вывод:
Буду по новой Рихтера читать:)
Я тоже считаю, что Рихтера нужно почитать, даже сам начал перечитывать нужную главу, но все же попробую переправить некоторый код в длл, чтобы не использовать SysUtils, и если длл не будет выдавать ошибок при аттаче, то начну исследовать подозрительного "пациента"(т.е. SysUtils).
и еще я внимательно присмотрелся, но так и не понял: зачем ты в processes.pas в процедуре GetProcessesList определяешь 98 винда или NT/2000/XP - ведь код стоящий для 98 винды без проблем работает на 2000 и XP?
Да я просто функцию брал с DW //// не обращал внимание
:)