2010-10-28 14 views
6

me gustaría evitar la carga de archivos DLL maliciosos que pueden ser posibles a través del acceso del directorio de trabajo actual como se describe en http://msdn.microsoft.com/en-us/library/ff919712(VS.85).aspxCómo llamar a la función WinAPI SetDllDirectory() en Delphi?

La solución implementada en nuestras aplicaciones C++ era hacer una llamada API de Windows a SetDllDirectory (""), que eliminaría efectivamente el directorio de trabajo actual de la ruta de búsqueda de carga DLL de Windows. Sin embargo, parece que esta solución no está disponible para nuestras aplicaciones Delphi porque la función SetDllDirectory() no existe.

¿Existe una llamada equivalente en Delphi que haga lo mismo que SetDllDirectory ("")? ¡Gracias!

+1

Si desea utilizar una función en la API de Windows (es decir, una función ** en Windows **, que se ve igual en cualquier idioma) que no está declarada en 'Windows.pas', en general es realmente fácil de declararlo usted mismo. Todo lo que necesita es la información en MSDN, donde se especifican los tipos de datos del argumento y el resultado, al igual que el archivo DLL. En la mayoría de los casos, los tipos utilizados allí se pueden usar incluso en Delphi (como HBRUSH). , HWND, etc.), o puede usar un tipo equivalente (como 'cardinal' o' THWND'). Simplemente no te olvides de establecer la convención de llamadas a 'stdcall'. –

Respuesta

4

¿Llamar a SetDllDirectory ('') no funciona? Veo que está declarado correctamente en las últimas versiones de Windows.pas. Si tiene una versión de Delphi en la que no está declarada, puede actualizar a la última versión de Delphi o declararla usted mismo.

Actualización: Y listo ... Jens acaba de publicar la declaración.

6

Esto debe hacer el truco:

function SetDllDirectory(lpPathName:PWideChar): Bool; stdcall; external 'kernel32.dll' name 'SetDllDirectoryW'; 
+0

Tenga en cuenta que está vinculado de forma estática a la función, por lo que la aplicación requerirá al menos XP SP1 para ejecutarse. Si necesita ejecutar versiones anteriores, entonces debe cargar dinámicamente la función a través de GetProcAddress(). –

+0

En una función de versión Delphi pre-Unicode SetDllDirectory (lpPathName: PAnsiChar): Bool; stdcall; nombre externo 'kernel32.dll' 'SetDllDirectoryA'; se puede usar también –

+0

@ Remy: Técnicamente correcto, pero si usaron SetDllDirectory en sus aplicaciones C++ antes, supongo que eso no sería un problema. –

3
uses DSiWin32; 

if not DSiSetDllDirectory('path') then 
    .... 

DSiSetDllDirectory también se hará cargo de la vinculación dinámica y fallará sin problemas en los sistemas de pre-SP1 XP.

DSiWin32 se lanza como un software gratuito.

Cuestiones relacionadas