Предотвращение выполнения данных с помощью служб Windows

Я использую 64-разрядную версию Windows 7 Ultimate.

У меня есть служба Windows (написанная на C #), которая вызывает DLL, выпущенную крупным поставщиком телекоммуникационных услуг здесь, в Южной Африке (TELKOM). Эта dll называется MPIEst.dll, и я считаю, что она написана на C ++. У парня по ссылке (http://social.msdn.microsoft.com/Forums/en-US/windowscompatibility/thread/a7e5aafc-bb52-42c3-a3b7-19cb4cfbf6d5/) была такая же проблема, как и у меня.

Проведя небольшое исследование, я обнаружил, что DEP (Data Execution Prevention) виноват в ошибке «Невозможно загрузить DLL 'MPIest.dll': Недействительный доступ к области памяти. (Исключение из HRESULT: 0x800703E6)». Поэтому я подумал: «Хорошо, это просто ... давайте выключим DEP для всего компьютера и посмотрим, что произойдет». Так что я делаю это, и результат становится еще более странным ... Служба Windows работает успешно, как будто ничего не происходит, но все вызовы DLL вообще ничего не делают.

Я знаю это, потому что, когда я написал обычное консольное приложение C #, которое использует DLL, методы DLL возвращали значения и работали правильно, но при запуске из службы Windows методы DLL возвращают ненулевой результат, что означает, что что-то пошло неправильный. Дело в том, что нет документации, в которой говорится, что означают коды возврата.

В любом случае, суть в том, что какое-то отключение DEP для всей системы не влияет на службу Windows. Кто-нибудь сталкивался с этим раньше? Служба Windows и консольное приложение вызывают один и тот же код и делают одно и то же, но консольное приложение работает правильно, в то время как службы Windows молча ничего не делают, но DEP отключен для всей системы.

Заранее спасибо.


person CODES_ONLY    schedule 10.02.2012    source источник


Ответы (1)


Нашел решение. На самом деле решение двоякое. Сначала есть DEP, который вам нужно отключить для всего компьютера, а затем перезагрузить компьютер (это потому, что нельзя отключить DEP для службы Windows через панель управления).

Затем, во-вторых, я использовал приложение «ProcessMonitor», чтобы посмотреть, что за кулисами делают служба Windows и файл MPIEst.dll с ОС Windows. Оказывается, DLL искала файл, от которого она зависела (client.mpi), в папке системного каталога, хотя файл находился в том же каталоге, что и исполняемый файл службы Windows. Поэтому я добавил код для копирования необходимых файлов в системный каталог, и все заработало.

person CODES_ONLY    schedule 13.02.2012