// HookFindFirstFileEx.cpp : Defines the entry point for the DLL application.
//
#include "stdafx.h"
#include "stdio.h"
#include <Windows.h>
#include "./include/detours.h"
///////////////////////////////////////
#define _WIN32_WINNT 0x0400
/*typedef struct _WIN32_FIND_DATA2
{
DWORD dwFileAttributes;
FILETIME ftCreationTime;
FILETIME ftLastAccessTime;
FILETIME ftLastWriteTime;
DWORD nFileSizeHigh;
DWORD nFileSizeLow;
DWORD dwReserved0;
DWORD dwReserved1;
WCHAR cFileName[MAX_PATH];
WCHAR cAlternateFileName[14];
}
WIN32_FIND_DATA2, *PWIN32_FIND_DATA2;*/
typedef enum _FINDEX_INFO_LEVELS
{
FindExInfoStandard
}
FINDEX_INFO_LEVELS;
typedef enum _FINDEX_SEARCH_OPS
{
FindExSearchNameMatch,
FindExSearchLimitToDirectories,
FindExSearchLimitToDevices
} FINDEX_SEARCH_OPS;
extern "C" HANDLE WINAPI FindFirstFileExA(
LPCTSTR lpFileName,
FINDEX_INFO_LEVELS fInfoLevelId,
LPVOID lpFindFileData,
FINDEX_SEARCH_OPS fSearchOp,
LPVOID lpSearchFilter,
DWORD dwAdditionalFlags
);
extern "C" HANDLE WINAPI FindFirstFileExW(
LPCWSTR lpFileName,
FINDEX_INFO_LEVELS fInfoLevelId,
LPVOID lpFindFileData,
FINDEX_SEARCH_OPS fSearchOp,
LPVOID lpSearchFilter,
DWORD dwAdditionalFlags
);
BOOL InstallProbes();
BOOL UninstallProbes();
DETOUR_TRAMPOLINE( HANDLE WINAPI Real_FindFirstFileExA( LPCTSTR a0, FINDEX_INFO_LEVELS a1, LPVOID a2, FINDEX_SEARCH_OPS a3, LPVOID a4, DWORD a5 ), FindFirstFileExA );
DETOUR_TRAMPOLINE( HANDLE WINAPI Real_FindFirstFileExW( LPCWSTR a0, FINDEX_INFO_LEVELS a1, LPVOID a2, FINDEX_SEARCH_OPS a3, LPVOID a4, DWORD a5 ), FindFirstFileExW );
HANDLE WINAPI MyFindFirstFileExA( LPCTSTR lpFileName,
FINDEX_INFO_LEVELS fInfoLevelId,
LPVOID lpFindFileData,
FINDEX_SEARCH_OPS fSearchOp,
LPVOID lpSearchFilter,
DWORD dwAdditionalFlags );
HANDLE WINAPI MyFindFirstFileExW( LPCWSTR lpFileName,
FINDEX_INFO_LEVELS fInfoLevelId,
LPVOID lpFindFileData,
FINDEX_SEARCH_OPS fSearchOp,
LPVOID lpSearchFilter,
DWORD dwAdditionalFlags );
/////////////////////////////
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
if( DLL_PROCESS_ATTACH == ul_reason_for_call )//dll加载
{
InstallProbes();
}
else if( DLL_PROCESS_DETACH == ul_reason_for_call )//dll卸载
{
UninstallProbes();
}
else;
return TRUE;
}
BOOL InstallProbes()
{
DetourFunctionWithTrampoline( (PBYTE)Real_FindFirstFileExA, (PBYTE)MyFindFirstFileExA );
DetourFunctionWithTrampoline( (PBYTE)Real_FindFirstFileExW, (PBYTE)MyFindFirstFileExW );
#ifdef _DEBUG
OutputDebugString("InstallProbes ok./n");
#endif
return TRUE;
}
BOOL UninstallProbes()
{
DetourRemove( (PBYTE)Real_FindFirstFileExA, (PBYTE)MyFindFirstFileExA );
DetourRemove( (PBYTE)Real_FindFirstFileExW, (PBYTE)MyFindFirstFileExW );
#ifdef _DEBUG
OutputDebugString("UNInstallProbes ok./n");
#endif
return TRUE;
}
////////////////////////////////////////////////////////
HANDLE WINAPI MyFindFirstFileExA( LPCTSTR lpFileName,
FINDEX_INFO_LEVELS fInfoLevelId,
LPVOID lpFindFileData,
FINDEX_SEARCH_OPS fSearchOp,
LPVOID lpSearchFilter,
DWORD dwAdditionalFlags )
{
TCHAR sz[300];
sprintf( sz, "MyFindFirstFileExA :%s /n", lpFileName );
OutputDebugString( sz );
return Real_FindFirstFileExA( lpFileName, fInfoLevelId, lpFindFileData, fSearchOp, lpSearchFilter, dwAdditionalFlags );
}
HANDLE WINAPI MyFindFirstFileExW( LPCWSTR lpFileName,
FINDEX_INFO_LEVELS fInfoLevelId,
LPVOID lpFindFileData,
FINDEX_SEARCH_OPS fSearchOp,
LPVOID lpSearchFilter,
DWORD dwAdditionalFlags )
{
char strTemp[256*2];
TCHAR sz[300];
WideCharToMultiByte( CP_ACP, 0, (LPCWSTR)lpFileName, -1, strTemp, 256, NULL, NULL );
sprintf( sz, "MyFindFirstFileExW :%s /n", strTemp );
OutputDebugString( sz );
return Real_FindFirstFileExW( lpFileName, fInfoLevelId, lpFindFileData, fSearchOp, lpSearchFilter, dwAdditionalFlags );
}
//
#include "stdafx.h"
#include "stdio.h"
#include <Windows.h>
#include "./include/detours.h"
///////////////////////////////////////
#define _WIN32_WINNT 0x0400
/*typedef struct _WIN32_FIND_DATA2
{
DWORD dwFileAttributes;
FILETIME ftCreationTime;
FILETIME ftLastAccessTime;
FILETIME ftLastWriteTime;
DWORD nFileSizeHigh;
DWORD nFileSizeLow;
DWORD dwReserved0;
DWORD dwReserved1;
WCHAR cFileName[MAX_PATH];
WCHAR cAlternateFileName[14];
}
WIN32_FIND_DATA2, *PWIN32_FIND_DATA2;*/
typedef enum _FINDEX_INFO_LEVELS
{
FindExInfoStandard
}
FINDEX_INFO_LEVELS;
typedef enum _FINDEX_SEARCH_OPS
{
FindExSearchNameMatch,
FindExSearchLimitToDirectories,
FindExSearchLimitToDevices
} FINDEX_SEARCH_OPS;
extern "C" HANDLE WINAPI FindFirstFileExA(
LPCTSTR lpFileName,
FINDEX_INFO_LEVELS fInfoLevelId,
LPVOID lpFindFileData,
FINDEX_SEARCH_OPS fSearchOp,
LPVOID lpSearchFilter,
DWORD dwAdditionalFlags
);
extern "C" HANDLE WINAPI FindFirstFileExW(
LPCWSTR lpFileName,
FINDEX_INFO_LEVELS fInfoLevelId,
LPVOID lpFindFileData,
FINDEX_SEARCH_OPS fSearchOp,
LPVOID lpSearchFilter,
DWORD dwAdditionalFlags
);
BOOL InstallProbes();
BOOL UninstallProbes();
DETOUR_TRAMPOLINE( HANDLE WINAPI Real_FindFirstFileExA( LPCTSTR a0, FINDEX_INFO_LEVELS a1, LPVOID a2, FINDEX_SEARCH_OPS a3, LPVOID a4, DWORD a5 ), FindFirstFileExA );
DETOUR_TRAMPOLINE( HANDLE WINAPI Real_FindFirstFileExW( LPCWSTR a0, FINDEX_INFO_LEVELS a1, LPVOID a2, FINDEX_SEARCH_OPS a3, LPVOID a4, DWORD a5 ), FindFirstFileExW );
HANDLE WINAPI MyFindFirstFileExA( LPCTSTR lpFileName,
FINDEX_INFO_LEVELS fInfoLevelId,
LPVOID lpFindFileData,
FINDEX_SEARCH_OPS fSearchOp,
LPVOID lpSearchFilter,
DWORD dwAdditionalFlags );
HANDLE WINAPI MyFindFirstFileExW( LPCWSTR lpFileName,
FINDEX_INFO_LEVELS fInfoLevelId,
LPVOID lpFindFileData,
FINDEX_SEARCH_OPS fSearchOp,
LPVOID lpSearchFilter,
DWORD dwAdditionalFlags );
/////////////////////////////
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
if( DLL_PROCESS_ATTACH == ul_reason_for_call )//dll加载
{
InstallProbes();
}
else if( DLL_PROCESS_DETACH == ul_reason_for_call )//dll卸载
{
UninstallProbes();
}
else;
return TRUE;
}
BOOL InstallProbes()
{
DetourFunctionWithTrampoline( (PBYTE)Real_FindFirstFileExA, (PBYTE)MyFindFirstFileExA );
DetourFunctionWithTrampoline( (PBYTE)Real_FindFirstFileExW, (PBYTE)MyFindFirstFileExW );
#ifdef _DEBUG
OutputDebugString("InstallProbes ok./n");
#endif
return TRUE;
}
BOOL UninstallProbes()
{
DetourRemove( (PBYTE)Real_FindFirstFileExA, (PBYTE)MyFindFirstFileExA );
DetourRemove( (PBYTE)Real_FindFirstFileExW, (PBYTE)MyFindFirstFileExW );
#ifdef _DEBUG
OutputDebugString("UNInstallProbes ok./n");
#endif
return TRUE;
}
////////////////////////////////////////////////////////
HANDLE WINAPI MyFindFirstFileExA( LPCTSTR lpFileName,
FINDEX_INFO_LEVELS fInfoLevelId,
LPVOID lpFindFileData,
FINDEX_SEARCH_OPS fSearchOp,
LPVOID lpSearchFilter,
DWORD dwAdditionalFlags )
{
TCHAR sz[300];
sprintf( sz, "MyFindFirstFileExA :%s /n", lpFileName );
OutputDebugString( sz );
return Real_FindFirstFileExA( lpFileName, fInfoLevelId, lpFindFileData, fSearchOp, lpSearchFilter, dwAdditionalFlags );
}
HANDLE WINAPI MyFindFirstFileExW( LPCWSTR lpFileName,
FINDEX_INFO_LEVELS fInfoLevelId,
LPVOID lpFindFileData,
FINDEX_SEARCH_OPS fSearchOp,
LPVOID lpSearchFilter,
DWORD dwAdditionalFlags )
{
char strTemp[256*2];
TCHAR sz[300];
WideCharToMultiByte( CP_ACP, 0, (LPCWSTR)lpFileName, -1, strTemp, 256, NULL, NULL );
sprintf( sz, "MyFindFirstFileExW :%s /n", strTemp );
OutputDebugString( sz );
return Real_FindFirstFileExW( lpFileName, fInfoLevelId, lpFindFileData, fSearchOp, lpSearchFilter, dwAdditionalFlags );
}