Por que eu recebo uma falha no DLLMain quando executado como um usuário restrito?

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

  •  21-08-2019
  •  | 
  •  

Pergunta

Porque é que este código falhando quando executado como um usuário restrito, mas não quando executado como um administrador da máquina?

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

O código está falhando no retorno ... e eu não sei porquê.

Eu estou recebendo:

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

Além disso, _AtlModule.DLLMain esta aparência:

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
}

Estamos importando o ATL DLL, e tentou ligar estaticamente bem ... sem sorte.


Atualizar

Usando ProcMon, recebo um buffer overflow aqui:

RegQueryValue HKU \ S-1-5-21-448539723-854245398-1957994488-1005 \ Software \ Microsoft \ Windows \ CurrentVersion \ Explorer \ Shell Folders \ Cache BUFFER OVERFLOW Comprimento: 144

O que isso significa?

Foi útil?

Solução

Quando você receber um erro dizendo que você não pode fazer referência a uma memória em algum 0x0000 ... localização, que normalmente significa que seu código está tentando fazer referência a uma variável de membro de algum objeto, mas o ponteiro do objeto aponta para NULL. Neste caso, a variável de membro é 0x34 bytes para o objecto. Além disso adivinhar, dado que só falha quando rodando sob um usuário restrito, eu diria alguma operação que deve retornar um ponteiro para um objeto falhar devido a direitos insuficientes. Se o ponteiro retornado não é testado por ser nulo, o código continuará funcionando até que alguém tenta ler uma de suas variáveis ??de membro, no ponto em que você começa o acidente.

o que eu faria é completamente depurar o código e olhar para NULLs suspeitos. Além disso, você pode querer executar seu aplicativo sob AppVerifier com o LuaPriv teste ativado. Se meu palpite estiver correto, algumas chamadas de API falhas seria relatado, que se manifesta em seu código como nulos retornados. AppVerifier deve também fornecer-lhe o rastreamento de pilha, então você vai ser capaz de encontrar facilmente a raiz do problema.

Outras dicas

Jason,

Onde você está declarando m_hInstance? É estática acima de DllMain? Apenas tentando obter mais alguns detalhes sobre o código.

Você não realmente dizer o que você quer dizer com "cair" por isso é difícil dizer. O código está fazendo nada em particular que irá causar um acidente, então provavelmente a chamada para o DllMain módulo de ATL está exigindo privilégios de administrador e não por causa disso.

Tente executar o ProcMon utilidade e veja se você pode manchar uma diferença. Você vai ter que virar filtragem, caso contrário provavelmente haverá muita saída para percorrer.

Uma coisa para verificar se você está usando o ATL DLL (em vez da biblioteca estática):. Certifique-se de que você está recebendo a mesma versão do DLL em ambos os casos

Parece que traçou RDCOMClient, que é usado para executar o objeto COM dentro de R.

As respostas de Todo mundo ajudou. Obrigado.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top