- 论坛徽章:
- 9
|
如果LZ的程序是单线程,那么我认为没必要搞那么复杂,直接调用就行了。
如果LZ的程序是多线程,希望用信号去通知主线程做某事的话,那么全局变量是不合适的,如果有两个线程同时去通知的话会有问题;如果是OwnWaterloo的方法,直接用栈上的内存作执行代码也不行,只能是分配出内存作可执行代码,而且硬编码部分也需要修改,大致是这种格式(intel格式汇编):
- pop dword ptr[addr] ;addr要在分配出的同段内存内,取出返回地址
- push param ;压入自定义参数
- call handler ;调用原回调
- mov eax, dword ptr[addr]
- mov [esp], eax ;写回返回地址
- mov [esp+4], alloc_pointer ;将分配首地址写入
- jmp free ;假设内存是malloc出来的,跳到free释放
复制代码 不过还是有一个问题,如果两线程同时调用的话,注册以后signal之前可能会被其他线程重新注册,这样就需要加锁,而需要锁多久却不好判断(发出信号是否意味着可以解锁呢?我觉得似乎还不行)。
感觉这东西没那么容易处理,还不如换一个方法去通知主线程干活。
另外OwnWaterloo兄的0xC7、0x04、0x24应该是弄错了吧? |
|