2012-02-10 2 views
1

Я запускаю Windows 7 Ultimate 64 бит.Предотвращение выполнения данных с помощью служб Windows

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

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

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

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

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

ответ

2

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

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

Смежные вопросы