Por que eu recebo uma falha no DLLMain quando executado como um usuário restrito?
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?
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.