基于HOOK 和 状态轮询的 打印机监控,内容抓取,网上例子要么都是介绍如何挂钩子监控,要么是轮询查询打印机状态,很少有两者联合起来监控,兼抓取内容的。先贴下代码。
// PrinterHook.cpp : 定义 DLL 应用程序的导出函数。
//
#include "stdafx.h"
#include "PrinterHook.h"
#define PRINTER_PIPE_NAME "\\\\.\\Pipe\\PrinterPipeName"
//老的函数指针声明
typedef HDC (WINAPI* pOldCreateDCA)(LPCSTR pwszDriver, LPCSTR pwszDevice, LPCSTR pszPort, CONST DEVMODEA * pdm);
typedef HDC (WINAPI* pOldCreateDCW)(LPCWSTR pwszDriver, LPCWSTR pwszDevice, LPCWSTR pszPort, CONST DEVMODEW * pdm);
typedef int (WINAPI* pOldStartDocA)( HDC hdc, CONST DOCINFOA *lpdi);
typedef int (WINAPI* pOldStartDocW)( HDC hdc, CONST DOCINFOW *lpdi);
typedef int (WINAPI* pOldEndDoc)(HDC hdc);
typedef int (WINAPI* pOldStartPage)(HDC hdc);
typedef int (WINAPI* pOldEndtPage)(HDC hdc);
//文字绘制HOOK
typedef BOOL (WINAPI* pOldTextOutA)( HDC hdc, int x, int y, LPCSTR lpString, int c);
typedef BOOL (WINAPI* pOldTextOutW)( HDC hdc, int x, int y, LPCWSTR lpString, int c);
typedef int (WINAPI* pOldDrawTextExA)(HDC hdc,LPSTR lpchText,int cchText,LPRECT lprc, UINT format,LPDRAWTEXTPARAMS lpdtp);
typedef int (WINAPI* pOldDrawTextExW)(HDC hdc,LPWSTR lpchText,int cchText,LPRECT lprc, UINT format,LPDRAWTEXTPARAMS lpdtp);
typedef BOOL (WINAPI* pOldExtTextOutA)( HDC hdc, int x, int y, UINT options, CONST RECT * lprect, LPCSTR lpString, UINT c, CONST INT * lpDx);
typedef BOOL (WINAPI* pOldExtTextOutW)( HDC hdc, int x, int y, UINT options, CONST RECT * lprect, LPCWSTR lpString, UINT c, CONST INT * lpDx);
typedef BOOL (WINAPI* pOldPolyTextOutA)( HDC hdc, CONST POLYTEXTA * ppt, int nstrings);
typedef BOOL (WINAPI* pOldPolyTextOutW)( HDC hdc, CONST POLYTEXTW * ppt, int nstrings);
typedef int (WINAPI* pOldDrawTextA)(HDC hdc, LPCSTR lpchText,int cchText, LPRECT lprc,UINT format);
typedef int (WINAPI* pOldDrawTextW)(HDC hdc, LPCWSTR lpchText,int cchText, LPRECT lprc,UINT format);
typedef LONG (WINAPI* pOldTabbedTextOutA)(HDC hdc,int x,int y,LPCSTR lpString,int chCount,int nTabPositions,CONST INT *lpnTabStopPositions,int nTabOrigin);
typedef LONG (WINAPI* pOldTabbedTextOutW)(HDC hdc,int x,int y,LPCWSTR lpString,int chCount,int nTabPositions,CONST INT *lpnTabStopPositions,int nTabOrigin);
typedef struct _PrintFileInfo
{
FILE* pFile;
DWORD dwPage;
std::string strFileTime;
std::string strFileName;
std::string strDocName;
}PrintFileInfo;
enum
{
emStartCheck,
emReturnResult
};
PVOID g_pOldCreateDCA = NULL;
PVOID g_pOldCreateDCW = NULL;
PVOID g_pOldStartDocA = NULL;
PVOID g_pOldStartDocW = NULL;
PVOID g_pOldEndDoc = NULL;
PVOID g_pOldStartPage = NULL;
PVOID g_pOldEndPage = NULL;
PVOID g_pOldTextOutA = NULL;
PVOID g_pOldTextOutW = NULL;
PVOID g_pOldDrawTextExA = NULL;
PVOID g_pOldDrawTextExW = NULL;
PVOID g_pOldExtTextOutA = NULL;
PVOID g_pOldExtTextOutW = NULL;
PVOID g_pOldPolyTextOutA = NULL;
PVOID g_pOldPolyTextOutW = NULL;
PVOID g_pOldDrawTextA = NULL;
PVOID g_pOldDrawTextW = NULL;
PVOID g_pOldTabbedTextOutA = NULL;
PVOID g_pOldTabbedTextOutW = NULL;
PrintFileInfo PrinterFileInfo = {NULL};
HDC hDc = NULL;
HDC WINAPI CreateDCAHook( LPCSTR pwszDriver, LPCSTR pwszDevice, LPCSTR pszPort, CONST DEVMODEA * pdm);
HDC WINAPI CreateDCWHook( LPCWSTR pwszDriver, LPCWSTR pwszDevice, LPCWSTR pszPort, CONST DEVMODEW * pdm);
int WINAPI StartPageHook(HDC hdc);
int WINAPI EndPageHook(HDC hdc);
int WINAPI StartDocAHook( HDC hdc, CONST DOCINFOA *lpdi);
int WINAPI StartDocWHook( HDC hdc, CONST DOCINFOW *lpdi);
int WINAPI EndDocHook(HDC hdc);
BOOL WINAPI TextOutAHook( HDC hdc, int x, int y, LPCSTR lpString, int c);
BOOL WINAPI TextOutWHook( HDC hdc, int x, int y, LPCWSTR lpString, int c);
int WINAPI DrawTextExAHook( HDC hdc, LPSTR lpchText,int cchText,LPRECT lprc,UINT format,LPDRAWTEXTPARAMS lpdtp);
int WINAPI DrawTextExWHook( HDC hdc, LPWSTR lpchText,int cchText,LPRECT lprc,UINT format,LPDRAWTEXTPARAMS lpdtp);
BOOL WINAPI ExtTextOutAHook( HDC hdc, int x, int y, UINT options, CONST RECT * lprect, LPCSTR lpString, UINT c, CONST INT * lpDx);
BOOL WINAPI ExtTextOutWHook( HDC hdc, int x, int y, UINT options, CONST RECT * lprect, LPCWSTR lpString, UINT c, CONST INT * lpDx);
BOOL WINAPI PolyTextOutAHook( HDC hdc, CONST POLYTEXTA * ppt, int nstrings);
BOOL WINAPI PolyTextOutWHook( HDC hdc, CONST POLYTEXTW * ppt, int nstrings);
int WINAPI DrawTextAHook(HDC hdc, LPCSTR lpchText,int cchText, LPRECT lprc,UINT format);
int WINAPI DrawTextWHook(HDC hdc, LPCWSTR lpchText,int cchText, LPRECT lprc,UINT format);
LONG WINAPI TabbedTextOutAHook(HDC hdc,int x,int y,LPCSTR lpString,int chCount,int nTabPositions,CONST INT *lpnTabStopPositions,int nTabOrigin);
LONG WINAPI TabbedTextOutWHook(HDC hdc,int x,int y,LPCWSTR lpString,int chCount,int nTabPositions,CONST INT *lpnTabStopPositions,int nTabOrigin);
PrinterHook* PrinterHook::m_pInstance = NULL;
PrinterHook::CGarbo PrinterHook::Garbo;
PrinterHook::PrinterHook()
{
}
PrinterHook::~PrinterHook()
{
}
string U2A(const wchar_t* szU)
{
int nRetCode = (int)WideCharToMultiByte (CP_ACP, 0, szU, -1, 0, 0, NULL, NULL) ;
if ( nRetCode ==0 )
{
return "";
}
std::string str(nRetCode-1, '\0');
WideCharToMultiByte (CP_ACP, 0, szU, -1, (char*)(str.c_str()), nRetCode, NULL, NULL) ;
return str;
}
void WriteContextTextA(LPCSTR lpString)
{
if (PrinterFileInfo.pFile != NULL)
{
fwrite(lpString,sizeof(char),strlen(lpString),PrinterFileInfo.pFile);
}
}
string GetDocName(std::string& strDocName)
{
std::string strName = "";
if (!strDocName.empty())
{
strName = strDocName;
size_t pos = strName.find_last_of('\\');
strName = strName.substr(pos+1,strName.length());
pos = strName.find_last_of('.');
if (pos != std::string::npos)
{
strName = strName.substr(0,pos);
}
}
return strName;
}
void WriteContextTextW(LPCWSTR lpString)
{
if (PrinterFileInfo.pFile != NULL)
{
std::string str = U2A(lpString);
fwrite(str.c_str(),sizeof(char),str.length(),PrinterFileInfo.pFile);
}
}
std::wstring GetWString(LPCWSTR lpString,int c)
{
if (lpString == NULL || c == 0)
{
return L"";
}
std::wstring strTmp = L"";
WCHAR* wbuff = new WCHAR[c + 1];
ZeroMemory(wbuff,sizeof(WCHAR)*c + 1);
memcpy_s(wbuff,sizeof(WCHAR)*c,lpString,sizeof(WCHAR)*c);
*(wbuff+c) = 0;
strTmp = wbuff;
strTmp.erase(0,strTmp.find_first_not_of(L" "));
strTmp.erase(strTmp.find_last_not_of(L" ") + 1);
delete [] wbuff;
return strTmp;
}
std::string GetString(LPCSTR lpString,int c)
{
if (lpString == NULL || c == 0)
{
return "";
}
std::string strTmp = "";
CHAR* buff = new CHAR[c + 1];
ZeroMemory(buff,sizeof(CHAR)*c + 1);
memcpy_s(buff,sizeof(CHAR)*c,lpString,sizeof(CHAR)*c);
*(buff+c) = 0;
strTmp = buff;
strTmp.erase(0,strTmp.find_first_not_of(" "));
strTmp.erase(strTmp.find_last_not_of(" ") + 1);
delete [] buff;
return strTmp;
}
void PrinterHook::StartHook()
{
#define STR(str) #str
#define DETOURATTACH(dll,name) \
{g_pOld##name = DetourFindFunction(dll,STR(name));\
DetourAttach(&g_pOld##name,name##Hook);}\
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());//得到当前线程
DETOURATTACH("Gdi32.dll",CreateDCA);
DETOURATTACH("Gdi32.dll",CreateDCW);
DETOURATTACH("Gdi32.dll",StartDocW);
DETOURATTACH("Gdi32.dll",StartDocA);
DETOURATTACH("Gdi32.dll",StartPage);
DETOURATTACH("Gdi32.dll",EndPage);
DETOURATTACH("Gdi32.dll",EndDoc);
//文字相关
DETOURATTACH("Gdi32.dll",TextOutA);
DETOURATTACH("Gdi32.dll",TextOutW);
DETOURATTACH("User32.dll",DrawTextExA);
DETOURATTACH("User32.dll",DrawTextExW);
DETOURATTACH("Gdi32.dll",ExtTextOutA);
DETOURATTACH("Gdi32.dll",ExtTextOutW);
DETOURATTACH("Gdi32.dll",PolyTextOutA);
DETOURATTACH("Gdi32.dll",PolyTextOutW);
DETOURATTACH("User32.dll",DrawTextA);
DETOURATTACH("User32.dll",DrawTextW);
DETOURATTACH("User32.dll",TabbedTextOutA);
DETOURATTACH("User32.dll",TabbedTextOutW);
LONG ret=DetourTransactionCommit();
}
void PrinterHook::StopHook()
{
#define DETOURDETACH(name) \
if (g_pOld##name) \
{\
DetourDetach(&g_pOld##name,name##Hook);\
}\
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
DETOURDETACH(CreateDCA);
DETOURDETACH(CreateDCW);
DETOURDETACH(StartPage);
DETOURDETACH(EndPage);
DETOURDETACH(EndDoc