Pourquoi devrais-je obtenir un GPF dans DLLMain lorsqu'il est exécuté en tant qu'utilisateur restreint?

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

  •  21-08-2019
  •  | 
  •  

Question

Pourquoi est-ce code plantage lorsqu'il est exécuté en tant qu'utilisateur restreint, mais pas lorsqu'il est exécuté en tant qu'administrateur de la machine?

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

Le code se bloque sur le retour ... et je ne sais pas pourquoi.

Je reçois:

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

En outre, _AtlModule.DLLMain ressemble à ceci:

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
}

Nous importons l'ATL DLL et essayé lier statiquement et ... pas de chance.


UPDATE

Utilisation ProcMon, je reçois un dépassement de mémoire tampon ici:

RegQueryValue HKU \ S-1-5-21-448539723-854245398-1957994488-1005 \ Software \ Microsoft \ Windows \ CurrentVersion \ Explorer \ Shell Folders \ Cache DÉBORDEMENT DE TAMPON Longueur: 144

Qu'est-ce que cela signifie?

Était-ce utile?

La solution

Lorsque vous obtenez une erreur disant que vous ne pouvez pas référencer une mémoire à un emplacement 0x0000 ..., cela signifie généralement votre code tente de faire référence à une variable membre d'un objet, mais les points de pointeur d'objet à NULL. Dans ce cas, la variable membre est 0x34 octets dans l'objet. En outre deviner, étant donné qu'il échoue uniquement lors de l'exécution sous un utilisateur restreint, je dirais une opération qui est censé renvoyer un pointeur vers un objet échoue en raison de l'insuffisance des droits. Si le pointeur de retour n'a pas été testé pour être nul, le code continue de fonctionner jusqu'à ce que quelqu'un essaie de lire une de ses variables membres, à quel point vous l'accident.

ce que je ferais est déboguer à fond le code et rechercher des NULLs suspects. , Vous pouvez également lancer votre application sous AppVerifier avec le LuaPriv tester sur. Si ma conjecture est correcte, certains appels d'API seraient signalées défaillances, qui se manifeste dans votre code comme NULLs retour. AppVerifier devrait également vous fournir la trace de la pile, de sorte que vous serez en mesure de trouver facilement la racine du problème.

Autres conseils

Jason,

Où êtes-vous déclarez m_hInstance? Est-il statique au-dessus DllMain? Juste essayer d'obtenir quelques détails sur le code.

Vous ne dites pas vraiment ce que vous entendez par « plantage » de sorte qu'il est difficile de dire. Le code ne fait rien en particulier qui va provoquer un accident, donc probablement l'appel au module ATL exige des privilèges DllMain d'administration et à défaut à cause de cela.

Essayez d'exécuter le ProcMon utilitaire et voir si vous pouvez repérer une différence. Vous devez activer le filtrage sur, sinon il y aura probablement trop sortie à patauger dans.

Une chose à vérifier si vous utilisez la DLL ATL (au lieu de la bibliothèque statique):. Assurez-vous que vous obtenez la même version de la DLL dans les deux cas

On dirait que nous avons retracé RDCOMClient, qui est utilisé pour exécuter l'objet COM à l'intérieur de R.

Les réponses de Tout le monde a aidé. Merci.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top