Загрузка нескольких экземпляров dll [HELP] Загрузка нескольких экземп

Тема в разделе "WASM.WIN32", создана пользователем alexparser, 23 фев 2012.

  1. alexparser

    alexparser New Member

    Публикаций:
    0
    Регистрация:
    13 июн 2009
    Сообщения:
    31
    Доброго времени суток!

    Если в каждом процессе загружать свой экземпляр библиотеки то приложение начинает себя странно вести и в результате рушится с ошибкой Access Violation.
    Нашел информацию где рекомендуют для каждого процессе сделать свою копию ф-ла dll, но это как-то совсем коряво :dntknw:
    Можно ли загрузить dll в главном потоке, сохранить адреса ф-ций в глобальной переменной и вызывать их из разных потоков?
    Есть ли вообще решение этой проблемы?

    Заранее спасибо!
     
  2. TrashGen

    TrashGen ТрещГен

    Публикаций:
    0
    Регистрация:
    15 мар 2011
    Сообщения:
    1.186
    Адрес:
    подполье
    >'Если в каждом процессе загружать свой экземпляр библиотеки то приложение начинает себя странно вести и в результате рушится с ошибкой Access Violation.'
    Которое приложение?
    >'Нашел информацию где рекомендуют для каждого процессе сделать свою копию ф-ла dll, но это как-то совсем коряво :dntknw:'
    Зыкий источник информации же.
    >'Можно ли загрузить dll в главном потоке, сохранить адреса ф-ций в глобальной переменной и вызывать их из разных потоков?'
    Можно
    >'Есть ли вообще решение этой проблемы?'
    А есть ли вообще проблема?
     
  3. alexparser

    alexparser New Member

    Публикаций:
    0
    Регистрация:
    13 июн 2009
    Сообщения:
    31
    TrashGen

    >'Можно'
    Не будет ли проблемы если одновременно несколько тредов будут юзать одни и те же ф-ции dll используя ее локальные переменные?

    >'А есть ли вообще проблема?'
    Это мы сейчас и пытаемся выяснить)

    Как какое решение будет оптимальным?
     
  4. TrashGen

    TrashGen ТрещГен

    Публикаций:
    0
    Регистрация:
    15 мар 2011
    Сообщения:
    1.186
    Адрес:
    подполье
    Место под локальные переменные выделяется в стеке. Стек у каждого потока свой. Никаких проблем не вижу.
     
  5. alexparser

    alexparser New Member

    Публикаций:
    0
    Регистрация:
    13 июн 2009
    Сообщения:
    31
    Во первых спасибо!
    Во вторых, только реальные кодеры кодят и портят в столь ранее время, респект!
    Хм, а если не локальные переменные?
    Или при любом раскладе такой подход есть единственно правильный?
     
  6. TrashGen

    TrashGen ТрещГен

    Публикаций:
    0
    Регистрация:
    15 мар 2011
    Сообщения:
    1.186
    Адрес:
    подполье
    >'Во первых спасибо!'
    Всегда пажалста
    >'Во вторых, только реальные кодеры кодят и портят в столь ранее время, респект!'
    Не, у меня просто кот поутру чота оббливалсо на пол довольно громко и я изволил проснуться. Глядя на кошачью бливотену, сразу вспомнил, что не плохо было бы посмотреть новые темы на форуме. Я даже не кодер.
    >'Хм, а если не локальные переменные?'
    Ну никто ж не знает что за библиотеку вы юзаете и что за функции там в ней. Бесспорно можно написать экспортируемую из длл функцию у которой будут проблемы из-за многопоточности. У системных, например, таких проблем быть не должно бы.
    >'Или при любом раскладе такой подход есть единственно правильный?'
    Ох. При каком любом раскладе и какой подход?
     
  7. Malfoy

    Malfoy New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2012
    Сообщения:
    698
    Код (Text):
    1. ; +
    2. ; Проецируем копию образа.
    3. ;
    4. LdrMapViewOfImage proc uses ebx Apis:PAPIS, ImageBase:PVOID, ViewBase:PPVOID
    5. Local FileU[MAX_PATH*2 + sizeof(UNICODE_STRING)]:CHAR
    6. Local ObjAttr:OBJECT_ATTRIBUTES
    7. Local File:HANDLE, Section:HANDLE
    8. Local IoStatus:IO_STATUS_BLOCK
    9. Local ViewSize:ULONG
    10.     mov ecx,ImageBase
    11.     lea eax,FileU
    12.     mov ebx,Apis
    13.     assume ebx:PAPIS
    14.     .if !Ecx
    15.         mov ecx,fs:[TEB.Peb]
    16.         mov ecx,PEB.LoaderLock[ecx]
    17.     .endif
    18.     push NULL
    19.     push sizeof UNICODE_STRING + 2*sizeof MAX_PATH
    20.     push eax
    21.     push MemoryMappedFilenameInformation
    22.     push ecx
    23.     push NtCurrentProcess
    24.     Call [ebx].pZwQueryVirtualMemory
    25.     test eax,eax
    26.     mov ObjAttr.uLength,sizeof(OBJECT_ATTRIBUTES)
    27.     mov ObjAttr.uAttributes,OBJ_CASE_INSENSITIVE
    28.     lea ecx,FileU
    29.     jnz Exit    ; STATUS_INVALID_ADDRESS/STATUS_INVALID_IMAGE_NOT_MZ/STATUS_FILE_INVALID etc.
    30.     mov ObjAttr.hRootDirectory,eax
    31.     mov ObjAttr.pObjectName,ecx
    32.     lea edx,IoStatus
    33.     push FILE_NON_DIRECTORY_FILE or FILE_SYNCHRONOUS_IO_NONALERT
    34.     mov ObjAttr.pSecurityDescriptor,eax
    35.     lea ecx,ObjAttr
    36.     push FILE_SHARE_READ or FILE_SHARE_DELETE
    37.     mov ObjAttr.pSecurityQualityOfService,eax
    38.     push edx
    39.     lea eax,File
    40.     push ecx
    41.     push SYNCHRONIZE or FILE_EXECUTE or FILE_READ_ACCESS
    42.     push eax
    43.     Call [ebx].pZwOpenFile
    44.     test eax,eax
    45.     lea ecx,Section
    46.     jl Exit
    47.     push File
    48.     push SEC_IMAGE
    49.     push PAGE_EXECUTE_READ
    50.     push NULL
    51.     push NULL
    52.     push SECTION_MAP_READ or SECTION_MAP_EXECUTE or SECTION_MAP_WRITE or SECTION_QUERY
    53.     push ecx
    54.     Call [ebx].pZwCreateSection
    55.     test eax,eax
    56.     lea ecx,ViewSize
    57.     .if Zero?
    58.         mov ViewSize,eax
    59.         push PAGE_EXECUTE_READ
    60.         push eax
    61.         push ViewShare
    62.         push ecx
    63.         push eax
    64.         push eax
    65.         push eax
    66.         push ViewBase
    67.         push NtCurrentProcess
    68.         push Section
    69.         Call [ebx].pZwMapViewOfSection
    70.         push eax    ; STATUS_SUCCESS/STATUS_IMAGE_NOT_AT_BASE
    71.         push Section
    72.         Call [ebx].pZwClose
    73.         pop eax
    74.     .endif
    75.     push eax
    76.     push File
    77.     Call [ebx].pZwClose
    78.     pop eax
    79. Exit:
    80.     ret
    81. LdrMapViewOfImage endp