请教一个64位WIN7下进行COM HOOK的问题。
我HOOK了 IFileOperation 的 CopyItems MoveItems PerformOperations 这些操作,在32位WIN7上运行良好,但在64位WIN7上完全不行。
于是我写了一个非常小的DEMO工程,代码如下:
#include <windows.h>
#include <stdio.h>
size_t WINAPI HookVtbl(void* pObject, size_t classIdx, size_t methodIdx, size_t newMethod)
{
size_t** vtbl = (size_t**)pObject;
DWORD oldProtect = 0;
size_t oldMethod = vtbl[classIdx][methodIdx];
VirtualProtect(vtbl[classIdx] + sizeof(size_t*) * methodIdx, sizeof(size_t*), PAGE_READWRITE, &oldProtect);
vtbl[classIdx][methodIdx] = newMethod;
VirtualProtect(vtbl[classIdx] + sizeof(size_t*) * methodIdx, sizeof(size_t*), oldProtect, &oldProtect);
return oldMethod;
}
class A
{
public:
virtual void printa()
{
printf("print in A\n");
}
virtual void print(int i, int j, int k)
{
printf("print in A\n");
}
virtual void print2(int i, int j, int k)
{
printf("print2 in A\n");
}
};
void WINAPI print(int i, int j, int k)
{
printf("print in global name space %d %d %d\n", i, j, k);
}
void WINAPI print2(int i, int j, int k)
{
printf("print2 in global name space %d %d %d\n", i, j, k);
}
int main()
{
printf("sizeof(int) = %d\n", sizeof(int));
printf("sizeof(size_t) = %d\n", sizeof(size_t));
A* a = new A();
int old = NULL;
size_t oldSizeT = NULL;
size_t oldSize2 = NULL;
oldSizeT = HookVtbl(a, 0, 1, (size_t)print);
oldSize2 = HookVtbl(a, 0, 2, (size_t)print2);
a->print(1, 2 ,3);
a->print2(1, 2 ,3);
HookVtbl(a, 0, 1, oldSizeT);
HookVtbl(a, 0, 2, oldSize2);
a->print(1, 2 ,3);
a->print2(1, 2 ,3);
}
#include <windows.h>
#include <stdio.h>
size_t WINAPI HookVtbl(void* pObject, size_t classIdx, size_t methodIdx, size_t newMethod)
{
size_t** vtbl = (size_t**)pObject;
DWORD oldProtect = 0;
size_t oldMethod = vtbl[classIdx][methodIdx];
VirtualProtect(vtbl[classIdx] + sizeof(size_t*) * methodIdx, sizeof(size_t*), PAGE_READWRITE, &oldProtect);
vtbl[classIdx][methodIdx] = newMethod;
VirtualProtect(vtbl[classIdx] + sizeof(size_t*) * methodIdx, sizeof(size_t*), oldProtect, &oldProtect);
return oldMethod;
}
class A
{
public:
virtual void printa()
{
printf("print in A\n");
}
virtual void print(int i, int j, int k)
{
printf("print in A\n");
}
virtual void print2(int i, int j, int k)
{
printf("print2 in A\n");
}
};
void WINAPI print(
#ifdef _WIN64
int t,
#endif
int i, int j, int k)
{
printf("print in global name space %d %d %d\n", i, j, k);
}
void WINAPI print2(
#ifdef _WIN64
int t,
#endif
int i, int j, int k)
{
printf("print2 in global name space %d %d %d\n", i, j, k);
}
int main()
{
printf("sizeof(int) = %d\n", sizeof(int));
printf("sizeof(size_t) = %d\n", sizeof(size_t));
A* a = new A();
int old = NULL;
size_t oldSizeT = NULL;
size_t oldSize2 = NULL;
oldSizeT = HookVtbl(a, 0, 1, (size_t)print);
oldSize2 = HookVtbl(a, 0, 2, (size_t)print2);
a->print(1, 2 ,3);
a->print2(1, 2 ,3);
HookVtbl(a, 0, 1, oldSizeT);
HookVtbl(a, 0, 2, oldSize2);
a->print(1, 2 ,3);
a->print2(1, 2 ,3);
}