Зачем мне получать GPF в DLLMain при запуске от имени пользователя с ограниченными правами?

StackOverflow https://stackoverflow.com/questions/860880

  •  21-08-2019
  •  | 
  •  

Вопрос

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

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 и также пытаемся связать статически...не повезло.


ОБНОВЛЯТЬ

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

RegqueryValue HKU S-1-5-21-4448539723-854245398-1957994488-1005 Software Microsoft Windows CurrentVersion Explorer Shell Folders Cache Buffer Длина: Длина: Длина: Длина: Microsoft:144

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

Это было полезно?

Решение

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

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

Другие советы

Джейсон,

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top