¿Cómo reemplazar las llamadas a funciones WinAPI en el proyecto MS VC++ con mi propia implementación (el nombre y los parámetros establecidos son los mismos)?

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

  •  09-06-2019
  •  | 
  •  

Pregunta

Necesito reemplazar todas las llamadas WinAPI del

  • Crea un archivo,
  • leer archivo,
  • establecer puntero de archivo,
  • CerrarManillar

con mi propia implementación (que usa lectura de archivos de bajo nivel a través de Bluetooth).El código donde se reemplazarán las funciones es Video File Player y ya funciona con los archivos de disco duro normales.También es necesario que el reproductor de video aún pueda reproducir archivos desde el disco duro, si el archivo en la entrada del reproductor de video es un archivo de disco duro normal.

¿Cuál es la mejor práctica para tal tarea?

¿Fue útil?

Solución

Te sugiero que sigas estos pasos:

  1. Escriba un conjunto de funciones contenedoras, por ejemplo MyCreateFile, MyReadFile, etc., que inicialmente simplemente llamen a la API correspondiente y pasen los mismos argumentos, sin modificar.
  2. Utilice su editor de texto para buscar todas las llamadas a las API originales y reemplácelas con llamadas a sus nuevas funciones contenedoras.
  3. Pruebe que la aplicación aún funcione correctamente.
  4. Modifique las funciones del contenedor para adaptarlas a sus propios fines.

Tenga en cuenta que CreateFile es una macro que se expande a CreateFileW o CreateFileA, dependiendo de si UNICODE está definido.Considere usar LPCTSTR y el Funciones TCHAR para que su aplicación pueda construirse como ANSI o Unicode.

No utilice #define, como se sugiere en otras respuestas aquí, ya que esto solo generará problemas de mantenimiento y, como Maximilian señala correctamente, no es una buena práctica.

Otros consejos

Podrías simplemente escribir tus nuevas funciones en un espacio de nombres personalizado.p.ej.

namespace Bluetooth
{
  void CreateFile(/*params*/);
  void etc...
}

Luego en tu código, lo único que tendrías que cambiar es:

if (::CreateFile(...))
{
}

a

if (Bluetooth::CreateFile(...))
{
}

¡Fácil!:)

Si está intentando interceptar llamadas a estas API desde otra aplicación, considere Desvíos.

Si puede editar el código, simplemente debe volver a escribirlo para usar una API personalizada que haga lo que desea.En su defecto, utilice la técnica de Maximilian, pero tenga en cuenta que es un horror de mantenimiento.

Si no puede editar el código, puede parchear las tablas de importación para redirigir las llamadas a su propio código.Una descripción de esta técnica se puede encontrar en Este artículo - busque la sección titulada "Espionaje mediante alteración de la tabla de direcciones de importación".

Esto es peligroso, pero si tienes cuidado puedes hacerlo funcionar.También echa un vistazo Desvíos de Microsoft, que hace el mismo tipo de cosas pero no requiere que te metas con los parches.

Si realmente quieres secuestrar la API, mira jeringa.dll (L-GPL).

No creo que esta sea una buena práctica, pero debería funcionar si la colocas en un archivo de inclusión que esté incluido en todos los lugares donde se llama la función que deseas cambiar:

#define CreateFile MyCreateFile

HRESULT MyCreateFile(whatever the params are);

La implementación de MyCreateFile se parece a esto:

#undef CreateFile
HRESULT MyCreateFile(NobodyCanRememberParamListsLikeThat params)
{
    if (InputIsNormalFile())
        CreateFile(params);
    else
        // do your thing
}

Básicamente, hace que cada llamada a CreateFile sea una llamada a MyCreateFile donde puede decidir si desea utilizar su propia implementación o la original.

Descargo de responsabilidad:Creo que hacer esto es feo y no lo haría.Prefiero buscar y reemplazar todas las ocurrencias o algo así.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top