wine之call_window_proc

参考:

  1. wine 8.14
    作用:此函数的作用是执行window procedure.
static result call_window_proc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam, enum message_type type, BOOL same_thread, enum wm_char_mapping mapping, BOOL ansi_dst)
{
    ......
    
    if(msg & 0x80000000)
          return handle_internal_message(hwnd, msg, wparam, lparam);

    if(!is_current_thread_window(hwnd)) return 0;

     packed_size =user_message_size(hwnd, msg, wparam, lparam, type == MSG_OTHER_PROCESS, ansi);

      ......

      cwp.message = msg;
      ......
      call_message_hooks(WH_CALLWNDPROC, HC_ACTION, same_thread, (LPARAM)&cmp, sizeof(cmp), packed_size, ansi);

      ......
    
      if(!init_window_call_params(params, hwnd, msg, wparam, lparam, ansi_dst, mapping))
      {
        ......
      }
      if(type == MSG_OTHER_PROCESS) params->ansi = FALSE;
      if(packed_size)
          pack_user_message((char *)params + offset, packed_size, msg, wparam, lparam, ansi);

      result = dispatch_win_proc_params(params, offset+packed_size, &ret_ptr, &ret_len);

       ......


      cwpret.lResult = result;
      ......

      call_window_hooks(WH_CALLWNDPROCRET, HC_ACTION, same_thread, (LPARAM)&cwpret, sizeof(cwpret), packed_size, ansi);
   
}

首先对msg、hwnd的合理性进行检查,之后需要在调用window procedure之前执行WH_CALLWNDPROC hooks,调用window procedure之后执行 WH_CALLWNDPROCRECT,这么做的原因请参考https://learn.microsoft.com/en-us/windows/win32/winmsg/about-hooks#wh_callwndproc-and-wh_callwndprocret。 在函数init_window_call_params和pack_user_message对 param进行处理之后,函数dispatch_win_proc_params执行具体的调用window procedure的操作。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容