информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Сетевые кракеры и правда о деле ЛевинаSpanning Tree Protocol: недокументированное применениеПортрет посетителя
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Три миллиона электронных замков... 
 Doom на газонокосилках 
 Умер Никлаус Вирт 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
[Win32] Как вызвать FreeLibraryAndExitThread из VC++? 27.06.01 14:13  Число просмотров: 954
Автор: Vital Статус: Незарегистрированный пользователь
<"чистая" ссылка>
> (Вопрос в том, как нормально вызвать (с закрытием всего
> открытого, и очищением всего выделенного, в том числе и не
> мной), а не просто вызвать:)

Помню у Рихтера что-то было про _endthreadex() посмотри,
а так как

The FreeLibraryAndExitThread function is implemented as:

FreeLibrary(hModule);
ExitThread(dwExitCode);

то может сделать так

FreeLibrary(hModule);
_endthreadex(dwExitCode);

А вообще он писал, что утечка памяти не происходит,
если фукция потока возвращает управление
<programming>
[Win32] Как вызвать FreeLibraryAndExitThread из VC++? 27.06.01 09:28  
Автор: Бяша <Biasha> Статус: Member
<"чистая" ссылка>
(Вопрос в том, как нормально вызвать (с закрытием всего открытого, и очищением всего выделенного, в том числе и не мной), а не просто вызвать:)
[Win32] Как вызвать FreeLibraryAndExitThread из VC++? 29.06.01 15:57  
Автор: Red Plait Статус: Незарегистрированный пользователь
<"чистая" ссылка>
> (Вопрос в том, как нормально вызвать (с закрытием всего
> открытого, и очищением всего выделенного, в том числе и не
> мной), а не просто вызвать:)
Если тебя интересует именно очистка всего, выделенного C runtime library, то все будет пучком - при выгрузке DLL будет вызвана ее entry point с fdwReason == DLL_PROCESS_DETACH и C run-time все за собой почистит автоматически, а потом OS завершит твой поток
[Win32] Всё ещё веселее 30.06.01 07:09  
Автор: Бяша <Biasha> Статус: Member
<"чистая" ссылка>
> Если тебя интересует именно очистка всего, выделенного C
> runtime library, то все будет пучком - при выгрузке DLL
> будет вызвана ее entry point с fdwReason ==
> DLL_PROCESS_DETACH и C run-time все за собой почистит
> автоматически, а потом OS завершит твой поток
Правда? Что при выгрузке длл, рантайм совсем всё ещё раз проверяет, и чистит? Хорошо, если так - ссылку дай, где это написано, чтоб я спокоен был.

Но этого мало:)
Дело в том, что эта dll загружена с флагом LOAD_LIBRARY_AS_DATAFILE, и поток, код которого в ней и который нужно завершить, создан другим потоком процесса.
Так что никакого DETACH не будет.
[Win32] Как вызвать FreeLibraryAndExitThread из VC++? 28.06.01 11:50  
Автор: XR <eXtremal Research> Статус: The Elderman
<"чистая" ссылка>
> (Вопрос в том, как нормально вызвать
>(с закрытием всего открытого, и очищением всего выделенного, в том числе и не
> мной),

А более конкретно ?

> а не просто вызвать:)

Дык ее обычно просто вызывают и все ... ее смысл в том что если DLL
создает собственный поток то в этом потоке вызов Subj-eвой функции
выгружает эту DLL и корректно завершает сей поток ... Некорректный код
на эту тему был в данной нитке уже приведен :)

PS: Обычно чего то почистить руками можно в

DllMain()

в секции

case: DLL_PROCESS_DETACH

или

case: DLL_THREAD_DETACH



которая вызывается потоком вызвавшим либо FreeLibrary
либо ExitProcess
[Win32] Как вызвать FreeLibraryAndExitThread из VC++? 29.06.01 03:14  
Автор: Бяша <Biasha> Статус: Member
<"чистая" ссылка>
> А более конкретно ?
Короче как мне получить гарантию, что всё, что должно сделаться между _endthread и ExitThread сделается, и при этом выгрузить библиотеку и завершить поток в ней.

> Дык ее обычно просто вызывают и все ... ее смысл в том что
> если DLL
> создает собственный поток то в этом потоке вызов Subj-eвой
> функции
> выгружает эту DLL и корректно завершает сей поток ...
Есть у меня поток, код которого в dll причём только этот поток может выгрузить dll. То есть FreeLibraryAndExitThread - именно то, что мне нужно, но я боюсь, что если я её просто вызову, то останется не освобождённой всё то, что было выделено рантайм библиотеками сишными до входа в процедуру моего потока.

> PS: Обычно чего то почистить руками можно в
> DllMain()
> в секции
> case: DLL_PROCESS_DETACH
> или
> case: DLL_THREAD_DETACH
> которая вызывается потоком вызвавшим либо FreeLibrary
> либо ExitProcess
Но как это сделать? Я же не знаю что чистить - это не моё, а vc++'ное.
Да мне и незачем там этим заниматься, кстати, - я и так могу вписать всё до FreeLibraryAndExitThread, но не знаю что, поскольку это не моя задача очищать не моё.

Поэтому мне нужен библиотечный аналог для этой функции. Такой же, как _endthread для ExitThread. Или может есть другой способ: например функция, выполняющая _endthread, но не вызывающая ExitThread - думаю такой нет.
[Win32] Как вызвать FreeLibraryAndExitThread из VC++? 29.06.01 10:21  
Автор: XR <eXtremal Research> Статус: The Elderman
Отредактировано 29.06.01 10:23  Количество правок: 1
<"чистая" ссылка>
> > А более конкретно ?
> Короче как мне получить гарантию, что всё, что должно
> сделаться между _endthread и ExitThread сделается, и при
> этом выгрузить библиотеку и завершить поток в ней.

Очень туманно излагаешь ... что значит ВСЕ?
или ты хочешь VC-шный аналог FreeLibraryAndExitThread() ???
проаналогХЗ не работал с VC лет несколько где то версии позже 4.1
но по МОЕМУ разумению он нах..(рен) ненужен...

>
> > Дык ее обычно просто вызывают и все ... ее смысл в том
> что
> > если DLL
> > создает собственный поток то в этом потоке вызов
> Subj-eвой
> > функции
> > выгружает эту DLL и корректно завершает сей поток ...
> Есть у меня поток, код которого в dll причём только этот
> поток может выгрузить dll. То есть FreeLibraryAndExitThread
> - именно то, что мне нужно, но я боюсь, что если я её
> просто вызову, то останется не освобождённой всё то, что
> было выделено рантайм библиотеками сишными до входа в
> процедуру моего потока.

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

Так что пробуй использовать subj


>
> > PS: Обычно чего то почистить руками можно в
> > DllMain()
> > в секции
> > case: DLL_PROCESS_DETACH
> > или
> > case: DLL_THREAD_DETACH
> > которая вызывается потоком вызвавшим либо FreeLibrary
> > либо ExitProcess
> Но как это сделать? Я же не знаю что чистить - это не моё,
> а vc++'ное.

То что не знаешь не чисти ...
RTL имеет свой механизм очистки ты ж не RTL пытаешся выгрузить я надеюсь :))

> Да мне и незачем там этим заниматься, кстати, - я и так
> могу вписать всё до FreeLibraryAndExitThread, но не знаю
> что, поскольку это не моя задача очищать не моё.
> Поэтому мне нужен библиотечный аналог для этой функции.
> Такой же, как _endthread для ExitThread. Или может есть
> другой способ: например функция, выполняющая _endthread, но
> не вызывающая ExitThread - думаю такой нет.

а чего по этому поводу говорит документация то ?
или на худой конец сделай дамп RTL
[Win32] Да, я хочу VC-шный аналог 30.06.01 07:23  
Автор: Бяша <Biasha> Статус: Member
<"чистая" ссылка>
> или ты хочешь VC-шный аналог FreeLibraryAndExitThread()
> ???
Так точно.

> проаналогХЗ не работал с VC лет несколько где то версии
> позже 4.1
> но по МОЕМУ разумению он нах..(рен) ненужен...
Чего же это? Тогда и _endthread не нужен.

> или опять же ищи аналог ... но, как мне кажется, RTL вряд
> ли плодит какие
> то ресурсы при загрузке DLL ... зачем ей это ... она сама
загрузка длл здесь не причём - её не было. Я боюсь за то, что она наплодила при создании потока.

> за собой чистит
> при выгрузке себя.
Dll загружена как DATAFILE соответственно ни загрузки ни выгрузки.

> Так что пробуй использовать subj
Дак я всегда могу - жалко только процесс. Что-то ж в нём останется от _beginthread.

> а чего по этому поводу говорит документация то ?
> или на худой конец сделай дамп RTL
мне ничего не говорит - потому и спрашиваю :)

В крайнем случае (если ничего не подскажете) я могу поступить криво:
Породить поток CreateThread'ом, и не пользоваться сишными функциями (я ничего не забыл?).
[Win32] Да, я хочу VC-шный аналог 30.06.01 15:59  
Автор: XR <eXtremal Research> Статус: The Elderman
<"чистая" ссылка>
> В крайнем случае (если ничего не подскажете) я могу
> поступить криво:
> Породить поток CreateThread'ом, и не пользоваться сишными
> функциями (я ничего не забыл?).

По моему разумению ты паришь себе голову :)

Я всю жизнь пользовался CreateThread и никаких проблем с RTL небыло...
правда всегда имелось ввиду что всякие strtok и errno - могут глючить ...
но список таких функций не так уж велик...

собственно тебе никто не мешеет написать аналог Subj Через _endthreadex
только этот код должен быть помещен в отдельную невыгружаемую (руками) DLL
[Win32] Да, я хочу VC-шный аналог 01.07.01 02:22  
Автор: Бяша <Biasha> Статус: Member
<"чистая" ссылка>
> > В крайнем случае (если ничего не подскажете) я могу
> > поступить криво:
> > Породить поток CreateThread'ом, и не пользоваться
> сишными
> > функциями (я ничего не забыл?).
>
> По моему разумению ты паришь себе голову :)
Наверное:)

> Я всю жизнь пользовался CreateThread и никаких проблем с
> RTL небыло...
> правда всегда имелось ввиду что всякие strtok и errno -
> могут глючить ...
> но список таких функций не так уж велик...
А существует ли этот список где-то? Ну или хотя бы критерий? Ну или хотя бы признак?:)

> собственно тебе никто не мешеет написать аналог Subj Через
> _endthreadex
> только этот код должен быть помещен в отдельную
> невыгружаемую (руками) DLL
А как это "невыгружаемую (руками)"? Было бы неплохо, только не могу придумать как.
[Win32] Да, я хочу VC-шный аналог 02.07.01 13:53  
Автор: XR <eXtremal Research> Статус: The Elderman
<"чистая" ссылка>
> > > В крайнем случае (если ничего не подскажете) я
> могу
> > > поступить криво:
> > > Породить поток CreateThread'ом, и не пользоваться
> А существует ли этот список где-то? Ну или хотя бы
> критерий? Ну или хотя бы признак?:)
Это функции которые используют статические данные из RTL (например запоминают текущий указатель поиска как strtok)
У Рихтера есть небольшой списочек этих функций ...
ecvt, fcvt, gmtime, ...etc.



> > собственно тебе никто не мешеет написать аналог Subj
> Через
> > _endthreadex
> > только этот код должен быть помещен в отдельную
> > невыгружаемую (руками) DLL
> А как это "невыгружаемую (руками)"? Было бы неплохо, только
> не могу придумать как.


Там думать НЕФИГ :))

пишешь DLL с 1 (ОДНОЙ) экспортируемой функцией ....

void MyFreeLibraryAndExitThread(HINSTANCE hDll, DWORD exitCode)
{

FreeLibrary(hDll);
_endthreadex(exitCode);
}

важно то чтобы этот код НЕ ВЫГРУЖАЛСЯ - поэтому в выгружаемую DLL его
нельзя вносить - для чего и создается отдельная DLL...
[Win32] Да, я хочу VC-шный аналог 03.07.01 05:08  
Автор: Бяша <Biasha> Статус: Member
Отредактировано 03.07.01 05:28  Количество правок: 1
<"чистая" ссылка>
> У Рихтера есть небольшой списочек этих функций ...
Мне бы списочек с цифровой подписью от MS :)

> > А как это "невыгружаемую (руками)"? Было бы неплохо,
> только
> > не могу придумать как.
>
> Там думать НЕФИГ :))
>
> пишешь DLL с 1 (ОДНОЙ) экспортируемой функцией ....
>
> важно то чтобы этот код НЕ ВЫГРУЖАЛСЯ - поэтому в
> выгружаемую DLL его
> нельзя вносить - для чего и создается отдельная DLL...
Это плохо, не лучше, чем свою DLL оставить. Я думал, есть способ как-то не самому её выгрузить.
[Win32] Да, я хочу VC-шный аналог 03.07.01 10:05  
Автор: XR <eXtremal Research> Статус: The Elderman
<"чистая" ссылка>
> > У Рихтера есть небольшой списочек этих функций ...
> Мне бы списочек с цифровой подписью от MS :)
>

Это не ко мне :)

> > > А как это "невыгружаемую (руками)"? Было бы
> неплохо,
> > только
> > > не могу придумать как.
> >
> > Там думать НЕФИГ :))
> >
> > пишешь DLL с 1 (ОДНОЙ) экспортируемой функцией ....
> >
> > важно то чтобы этот код НЕ ВЫГРУЖАЛСЯ - поэтому в
> > выгружаемую DLL его
> > нельзя вносить - для чего и создается отдельная DLL...

> Это плохо, не лучше, чем свою DLL оставить. Я думал, есть
> способ как-то не самому её выгрузить.

Почему плохо ? Именно ТАК реализована родная subj-евая функция
в kernel32.dll токо там используется ExitThread(....)
вместо RTL-евского аналога.
[Win32] Да, я хочу VC-шный аналог 03.07.01 10:53  
Автор: Бяша <Biasha> Статус: Member
<"чистая" ссылка>
> > Это плохо, не лучше, чем свою DLL оставить. Я думал,
> есть
> > способ как-то не самому её выгрузить.
>
> Почему плохо ? Именно ТАК реализована родная subj-евая
> функция
> в kernel32.dll токо там используется ExitThread(....)
> вместо RTL-евского аналога.
Как почему плохо?
Плохо тем, что эта библиотека так и останется в том процессе - я и свою могу преспокойно там оставить.(практическим вредом можно считать то, что файл с нею нельзя будет трогать:)
[Win32] Да, я хочу VC-шный аналог 03.07.01 11:26  
Автор: XR <eXtremal Research> Статус: The Elderman
Отредактировано 03.07.01 11:28  Количество правок: 1
<"чистая" ссылка>
> > > Это плохо, не лучше, чем свою DLL оставить. Я
> думал,
> > есть
> > > способ как-то не самому её выгрузить.
> >
> > Почему плохо ? Именно ТАК реализована родная subj-евая
> > функция
> > в kernel32.dll токо там используется ExitThread(....)
> > вместо RTL-евского аналога.
> Как почему плохо?
> Плохо тем, что эта библиотека так и останется в том
> процессе - я и свою могу преспокойно там
> оставить.(практическим вредом можно считать то, что файл с
> нею нельзя будет трогать:)

Почему нельзя трогать ?
Если это сделает чужой поток то очень даже можно ...
Причем если ты хочешь сделать эту работу своим потоком то для этого
RTL с ее шредорожалкой не нужна ... поэтому порождаешь нитку API-шным
CreateThread - выгружаешь эту DLL через FreeLibrary а потом выгружаешь
последнюю DLL через стандартую subj-евую функцию ... в общем все умерли :)

BTW: только вот надо ли крутить эти макароны из за сомнительных прелестей RTL ?

PS: а нафига твоему вирусу (судя по ТУ :)) нужна плаыающая точка etc. (RTL) :) ?
[Win32] Это не вирус :) 03.07.01 16:14  
Автор: Бяша <Biasha> Статус: Member
<"чистая" ссылка>
> файл с
> > нею нельзя будет трогать:)
>
> Почему нельзя трогать ?
В смысле перемещать.

> CreateThread - выгружаешь эту DLL через FreeLibrary а потом
> выгружаешь
> последнюю DLL через стандартую subj-евую функцию ... в
> общем все умерли :)
Примерно так, наверное, и сделаю, но мне проще не пользовать сишные функции, чем добавлять ещё одну dll :)

>
> BTW: только вот надо ли крутить эти макароны из за
> сомнительных прелестей RTL ?
>
> PS: а нафига твоему вирусу (судя по ТУ :)) нужна плаыающая
> точка etc. (RTL) :) ?
Это вообще почти совсем мирная программа :)
Prostoe reshenie 03.07.01 21:29  
Автор: + <Mikhail> Статус: Elderman
<"чистая" ссылка>
Napishi svou DLL kak COM object, i kogda vse objects budut ubity v DLL togda reference DLL = 0 i eta dll vygruzitsia is pamiati avtomaticheski:
Example :

dobavliesh krome svoih export Foo eche:
DllCanUnloadNow()
DllGetClassObject()
Object tebe nuzhen tolko dlia togo chto upravliat` zagruzkoii tvoee dll.
Kogda ty sozdaesh object CoCreateInstance(), tvoia Dll zagruzitsia v pamiat` i poka object suchestvuet dll budet v pamiti. Kak tolko Vse instances tvoego object (v tvoem sluchae tolko odna) budut ubity, to COM vygruzit tvou Dll ( eto kogda zovetsia CoUninitialize()) , no esli problemy vyzyvat` etu CoUninitialize() togda , sozdaii svoi object kak Shellextention dlia Explorera. Dll CanUnloadNow() budet vyzuvat`sia avtomaticheski (by default stoit zaderzhka, no esli est registry key
HKLM\software\microsoft\Windows\CurrentVersion\Explorer\AlwayUnloadDll (Default) = 1 ,togda budet vyzyvatsia DllCanUn. . . nemedlenno) , i vse chto tebe nado budet sdelat` , eto : esli ty hochesh Dll byt` zagruzhennoi togd DllCanUnloadNow() = FALSE, kak tolko reshish izbavitsia DllCanUnloadNow()=TRUE.
Не очень то проще :) 04.07.01 05:16  
Автор: Бяша <Biasha> Статус: Member
<"чистая" ссылка>
> Napishi svou DLL kak COM object, i kogda vse objects budut
> ubity v DLL togda reference DLL = 0 i eta dll vygruzitsia
> is pamiati avtomaticheski:
> Example :
>
> dobavliesh krome svoih export Foo eche:
> DllCanUnloadNow()
> DllGetClassObject()
> Object tebe nuzhen tolko dlia togo chto upravliat`
> zagruzkoii tvoee dll.
> Kogda ty sozdaesh object CoCreateInstance(), tvoia Dll
> zagruzitsia v pamiat` i poka object suchestvuet dll budet v
> pamiti. Kak tolko Vse instances tvoego object (v tvoem
> sluchae tolko odna) budut ubity, to COM vygruzit tvou Dll (
> eto kogda zovetsia CoUninitialize()) , no esli problemy
CoUninitialize нельзя, наверное, вызывать из тех же соображений что нельзя ExitThread

> vyzyvat` etu CoUninitialize() togda , sozdaii svoi object
> kak Shellextention dlia Explorera. Dll CanUnloadNow() budet
А как это сделать? Это долго?

> vyzuvat`sia avtomaticheski (by default stoit zaderzhka, no
> esli est registry key
> HKLM\software\microsoft\Windows\CurrentVersion\Explorer\Alw
> ayUnloadDll (Default) = 1 ,togda budet vyzyvatsia DllCanUn.
> . . nemedlenno) , i vse chto tebe nado budet sdelat` , eto
> : esli ty hochesh Dll byt` zagruzhennoi togd
> DllCanUnloadNow() = FALSE, kak tolko reshish izbavitsia
> DllCanUnloadNow()=TRUE.

В общем выглядит неплохо, только (не) очень я в СОМ (не) разбираюсь.
И не хочется туда ещё и СОМ добавлять.
Так что мне будет проще спокойно создать поток CreateThread'ом и выйти от туда FreeLibraryAndExitThread'ом. Я просто надеялся, что может кто знает аналог этой функции, но похоже разработчики vc++ про неё забыли :).
[Win32] Как вызвать FreeLibraryAndExitThread из VC++? 27.06.01 14:13  
Автор: Vital Статус: Незарегистрированный пользователь
<"чистая" ссылка>
> (Вопрос в том, как нормально вызвать (с закрытием всего
> открытого, и очищением всего выделенного, в том числе и не
> мной), а не просто вызвать:)

Помню у Рихтера что-то было про _endthreadex() посмотри,
а так как

The FreeLibraryAndExitThread function is implemented as:

FreeLibrary(hModule);
ExitThread(dwExitCode);

то может сделать так

FreeLibrary(hModule);
_endthreadex(dwExitCode);

А вообще он писал, что утечка памяти не происходит,
если фукция потока возвращает управление
[Win32] Не знаешь - не отвечай. 28.06.01 02:30  
Автор: Бяша <Biasha> Статус: Member
Отредактировано 01.07.01 02:23  Количество правок: 3
<"чистая" ссылка>
> то может сделать так
>
> FreeLibrary(hModule);
> _endthreadex(dwExitCode);

Для предотвращения подобных глупых ответов поясняю:
FreeLibraryAndExitThread придумана для случая, когда FreeLibrary и ExitThread нужно выполнить одной командой. Этот случай, например, может выглядеть так: есть поток, код которого в dll причём после завершения потока нужно эту библиотеку выгрузить. Почему твой код правильно работать не будет - подумай сам.
Слава богу, хоть, чего её напрямую вызывать нельзя, ты понял:)
1




Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2024 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach