15,471
社区成员
发帖
与我相关
我的任务
分享
....
//调用UnhookWindowsHookEx卸载hook
...
if(lpvMem)
{
UnmapViewOfFile(lpvMem);
lpvMem = NULL;
}
//写明了卸载掉这块内存
没了...
现在是程序<再次>启动时,发现pvMem不是NULL,而是上次退出时的值....
唯一一点是偶尔调试时由于程序bug,需要强杀那个hook程序。这个造成的?但我声明lpvMem时,已经写了
LPCVOID lpvMem = NULL;
这个变量是包裹在#pragma data_seg里的,有初始值了。
int SetHook(void)
{
lpvMem = NULL;
openSharedMemory();
if(!lpvMem)
{
goto END;
}
来解决,因为初始化函数是手动调用的,可以确保一个dll生命周期内只有一次调用来避免这问题,但到底是为啥还是没搞明白..................
[/quote]
DLL逻辑很简单,不想加入更多代码。
现在临时方案是
在初始化函数加入
int SetHook(void)
{
lpvMem = NULL;
openSharedMemory();
if(!lpvMem)
{
goto END;
}
来解决,因为初始化函数是手动调用的,可以确保一个dll生命周期内只有一次调用来避免这问题,但到底是为啥还是没搞明白..................
[/quote]
从这个看不出你的openSharedMemory函数做了什么,我的方案并没有加多少代码,也就几行。[/quote]
openSharedMemory里打开了共享内存,取了些数据。关键代码是
pvMem = MapViewOfFile(hMapObject, FILE_MAP_ALL_ACCESS, 0, 0, 0);
映射了地址,记录在进程共享变量里的pvMem。之后的操作先判断pvMem是否为空而运行。
由于程序退出了,共享内存已经不再映射,下次运行程序时应再次打开共享内存。打开共享内存的前提是pvMem应为NULL,但现在的效果是再次启动时pvMem还是上次退出的值,导致没有再执行打开共享内存的动作,pvMem指向的是非法地址,后续操作出错。
临时将DLL的入口处把pvMem设成NULL来强迫打开共享内存来回避,但这个问题是怎么造成的没有头绪.........
int SetHook(void)
{
lpvMem = NULL;
openSharedMemory();
if(!lpvMem)
{
goto END;
}
来解决,因为初始化函数是手动调用的,可以确保一个dll生命周期内只有一次调用来避免这问题,但到底是为啥还是没搞明白..................
[/quote]
DLL逻辑很简单,不想加入更多代码。
现在临时方案是
在初始化函数加入
int SetHook(void)
{
lpvMem = NULL;
openSharedMemory();
if(!lpvMem)
{
goto END;
}
来解决,因为初始化函数是手动调用的,可以确保一个dll生命周期内只有一次调用来避免这问题,但到底是为啥还是没搞明白..................
[/quote]
从这个看不出你的openSharedMemory函数做了什么,我的方案并没有加多少代码,也就几行。
int SetHook(void)
{
lpvMem = NULL;
openSharedMemory();
if(!lpvMem)
{
goto END;
}
来解决,因为初始化函数是手动调用的,可以确保一个dll生命周期内只有一次调用来避免这问题,但到底是为啥还是没搞明白..................