Почему я получаю GPF в DLLMain при запуске от имени ограниченного пользователя? - PullRequest
3 голосов
/ 14 мая 2009

Почему происходит сбой этого кода при запуске от имени пользователя с ограниченными правами, а не от имени администратора системы?

extern "C" BOOL WINAPI DllMain(HINSTANCE hInstance, 
                               DWORD dwReason, 
                               LPVOID lpReserved)
{
 hInstance;
 m_hInstance=hInstance;
 return _AtlModule.DllMain(dwReason, lpReserved); 
}

Код возвращается при возврате ... и я не знаю почему.

Я получаю:

The instruction at "0x7c90100b" referenced memory at "0x00000034". 
The memory could not be "read".

Кроме того, _AtlModule.DLLMain выглядит так:

inline BOOL WINAPI CAtlDllModuleT<T>::DllMain(DWORD dwReason, LPVOID lpReserved) throw()
{
#if !defined(_ATL_NATIVE_INITIALIZATION)
    dwReason; lpReserved;
#pragma warning(push)
#pragma warning(disable:4483)
    using namespace __identifier("<AtlImplementationDetails>");
#pragma warning(pop)
    if (dwReason == DLL_PROCESS_ATTACH)
    {
        ATLASSERT(DllModuleInitialized == false);
    }
    return TRUE;
#else
    return _DllMain(dwReason, lpReserved);
#endif
}

Мы импортируем DLL-библиотеку ATL и попробовали также статически связать ... не повезло.


UPDATE

Используя ProcMon, я получаю переполнение буфера здесь:

RegQueryValue HKU \ S-1-5-21-448539723-854245398-1957994488-1005 \ Программное обеспечение \ Microsoft \ Windows \ CurrentVersion \ Explorer \ Папки оболочки \ Кэш ПЕРЕПОЛНЕНИЕ БУФЕРА Длина: 144

Что это значит?

Ответы [ 5 ]

2 голосов
/ 14 мая 2009

Когда вы получаете сообщение о том, что вы не можете ссылаться на память в каком-то месте 0x0000 ..., это обычно означает, что ваш код пытается ссылаться на переменную-член некоторого объекта, но указатель объекта указывает на NULL. В этом случае переменная-член составляет 0x34 байта в объекте. Дальнейшее предположение, учитывая, что он работает только при работе с ограниченным пользователем, я бы сказал, что некоторые операции, которые должны вернуть указатель на объект, не выполняются из-за недостаточных прав. Если возвращенный указатель не проверен на нулевое значение, код продолжит работать до тех пор, пока кто-то не попытается прочитать одну из его переменных-членов, после чего вы получите сбой.

Я бы тщательно отладил код и нашел подозрительные значения NULL. Кроме того, вы можете запустить приложение под AppVerifier с включенным тестом LuaPriv. Если мои предположения верны, о некоторых ошибках API-вызовов будет сообщено, что будет отражено в вашем коде как возвращенные значения NULL. AppVerifier также должен предоставить вам трассировку стека, чтобы вы могли легко найти корень проблемы.

2 голосов
/ 14 мая 2009

Джейсон

Где вы объявляете m_hInstance? Это выше статического DllMain? Просто пытаюсь получить более подробную информацию о коде.

1 голос
/ 14 мая 2009

Попробуйте запустить утилиту ProcMon и посмотрите, сможете ли вы найти разницу. Вам придется включить фильтрацию, иначе, скорее всего, будет слишком много выходных данных.

Одна вещь, чтобы проверить, используете ли вы ATL DLL (вместо статической библиотеки): убедитесь, что вы получаете одну и ту же версию DLL в обоих случаях.

1 голос
/ 14 мая 2009

Вы на самом деле не говорите, что вы подразумеваете под "сбой", поэтому трудно сказать. В частности, код не делает ничего такого, что вызовет сбой, поэтому, вероятно, для вызова модуля ATL DllMain требуются права администратора и он не выполняется из-за этого.

0 голосов
/ 15 мая 2009

Похоже, мы отследили RDCOMClient, который используется для запуска COM-объекта внутри R.

Все ответы помогли. Спасибо.

...