[HOOK求助]对EnumPrinterW下钩子

蓉城浮世 2010-04-29 01:37:50
我想HOOK EnumPrinterW函数,为什么总是没有效呀

高手帮忙指正一下,重分答谢


//使用Detours库的

#include <windows.h>
#include <Winspool.h>
#include <detours.h> //*IMPORTANT: Look at path if compiler error

#pragma comment(lib, "detoured.lib")
#pragma comment(lib, "detours.lib")

//Prototypes
BOOL (WINAPI *pEnumPrintersW)(DWORD,LPWSTR,DWORD,LPBYTE,DWORD,LPDWORD,LPDWORD) = EnumPrintersW;
BOOL WINAPI MyEnumPrintersW(DWORD,LPWSTR,DWORD,LPBYTE,DWORD,LPDWORD,LPDWORD);

BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
switch(ul_reason_for_call)
{
case DLL_PROCESS_ATTACH: //Do standard detouring
DisableThreadLibraryCalls((HMODULE)hModule);
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
DetourAttach(&(PVOID&)pEnumPrintersW, MyEnumPrintersW);
if(DetourTransactionCommit() == NO_ERROR)
OutputDebugString("EnumPrinters detoured successfully");
break;
case DLL_PROCESS_DETACH:
DetourTransactionBegin(); //Detach
DetourUpdateThread(GetCurrentThread());
DetourDetach(&(PVOID&)pEnumPrintersW, MyEnumPrintersW);
DetourTransactionCommit();
break;
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
break;
}
return TRUE;
}

extern "C" _declspec(dllexport) int InstallHook()
{
return 1;
}


BOOL WINAPI MyEnumPrintersW(DWORD Flags,LPWSTR Name,DWORD Level,LPBYTE pPrinterEnum,DWORD cbBuf,LPDWORD pcbNeeded,LPDWORD pcReturned)
{
::MessageBox(NULL, "Success", "Notify", MB_OK);
return pEnumPrintersW(Flags,Name,Level,pPrinterEnum,cbBuf,pcbNeeded,pcReturned);
}
...全文
209 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
蓉城浮世 2010-04-29
  • 打赏
  • 举报
回复
已搞定。

windows的文档真不全。 应该hook winspool.drv里面的EnumPrinterW函数
尹成 2010-04-29
  • 打赏
  • 举报
回复
帖子都沉底了,帮楼主顶下
蓉城浮世 2010-04-29
  • 打赏
  • 举报
回复
两种都没有效果,高手指点一下
蓉城浮世 2010-04-29
  • 打赏
  • 举报
回复

//使用跳转的
#include <windows.h>
#include <stdio.h>
#include <Winspool.h>
#define SIZE 6

typedef BOOL (WINAPI *pEnumPrintersW)(DWORD,LPWSTR,DWORD,LPBYTE,DWORD,LPDWORD,LPDWORD);
BOOL WINAPI MyEnumPrintersW(DWORD,LPWSTR,DWORD,LPBYTE,DWORD,LPDWORD,LPDWORD);


void BeginRedirect(LPVOID);

pEnumPrintersW pOrigEPWAddress = NULL;
BYTE oldBytes[SIZE] = {0};
BYTE JMP[SIZE] = {0};
DWORD oldProtect, myProtect = PAGE_EXECUTE_READWRITE;

BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch(ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
pOrigEPWAddress = (pEnumPrintersW)GetProcAddress(LoadLibrary("Spoolss.dll"), "EnumPrintersW");
if(pOrigEPWAddress == NULL)
return FALSE;
//BeginRedirect(MyMessageBoxW);
break;
case DLL_PROCESS_DETACH:
memcpy(pOrigEPWAddress, oldBytes, SIZE);
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
break;
}
return TRUE;
}

extern "C" _declspec(dllexport) int InstallHook()
{
if(pOrigEPWAddress != NULL)
BeginRedirect(MyEnumPrintersW);
else
return 0;
return 1;
}

void BeginRedirect(LPVOID newFunction)
{
BYTE tempJMP[SIZE] = {0xE9, 0x90, 0x90, 0x90, 0x90, 0xC3};
memcpy(JMP, tempJMP, SIZE);
DWORD JMPSize = ((DWORD)newFunction - (DWORD)pOrigEPWAddress - 5);
VirtualProtect((LPVOID)pOrigEPWAddress, SIZE,
PAGE_EXECUTE_READWRITE, &oldProtect);
memcpy(oldBytes, pOrigEPWAddress, SIZE);
memcpy(&JMP[1], &JMPSize, 4);
memcpy(pOrigEPWAddress, JMP, SIZE);
VirtualProtect((LPVOID)pOrigEPWAddress, SIZE, oldProtect, NULL);
}

BOOL WINAPI MyEnumPrintersW(DWORD Flags,LPWSTR Name,DWORD Level,LPBYTE pPrinterEnum,DWORD cbBuf,LPDWORD pcbNeeded,LPDWORD pcReturned)
{
MessageBox(NULL, "1", "2", MB_OK);
VirtualProtect((LPVOID)pOrigEPWAddress, SIZE, myProtect, NULL);
memcpy(pOrigEPWAddress, oldBytes, SIZE);
BOOL retValue = EnumPrintersW(Flags,Name,Level,pPrinterEnum,cbBuf,pcbNeeded,pcReturned);
memcpy(pOrigEPWAddress, JMP, SIZE);
VirtualProtect((LPVOID)pOrigEPWAddress, SIZE, oldProtect, NULL);
return retValue;
}

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧