WIN32 SDK thunk 的安全實現

2021-06-01 14:18:03 字數 2882 閱讀 4491

//thunk 的安全實現, 廢話我就少說可,下面用**說明吧

#ifndef _winx_h_

#define _winx_h_

#if _msc_ver > 1000

#pragma once

#endif // _msc_ver > 1000

//此**在xp到win7系統測試可正常執行

//函式模版用到的標記巨集

#ifndef fun_end_flag

//函式結束標記

#define fun_end_flag(x) \

dword winapi x##_end() \

//頭部宣告使用

#define def_end_fun(x) dword winapi x##_end();

//陣列使用

#define item_fun(x) x##_end,

//根據函式名獲取結束函式名

#define get_end_fun(x) x##_end

// 區域性變數的巨集定義

#define def_this_val 0x00000000

#define var_local(type,name,value) type name; __asm;

#endif

//如果定義此巨集

//則使用 templatewinproccode 作為函式模版, 其內容是通過反彙編templatewndproc獲得

//否則根據 templatewndproc 生成函式模版, templatewndproc 是編譯器生成的**

#define use_code_array

#ifdef _debug

#ifndef use_code_array

#define use_code_array //在除錯模式下,強制使用use_code_array巨集

#endif

#endif

//動態分配乙個templatewndproc函式,並讓函式內部變數指標指向pthis

lpvoid newtemplatewndproc(dword pthis);

const unsigned char templatewinproccode=;

class cthunk

virtual ~cthunk()

}virtual lresult windowproc(hwnd hwnd, uint msg, wparam wparam, lparam lparam)=0;

};class cwinx : public cthunk

virtual ~cwinx()

}cwinx& operator=(hwnd hwnd)

inline operator hwnd() const

inline hwnd getsafehwnd()

void attach(hwnd hwndnew)

hwnd detach()

virtual lresult windowproc(hwnd hwnd, uint msg, wparam wparam, lparam lparam)

if (m_subclassproc)

else

}; wceclass.lpfnwndproc = (wndproc)(void *)m_wndproc;

wceclass.cbsize = sizeof(wndclas***);

wceclass.style = dwcsstyle;

wceclass.hinstance = hinstance;

wceclass.lpszmenuname=lpcstr((dwstyle&ws_child)?0:nid);

if (lpicon) wceclass.hicon = (hicon)loadimage(hinstance, lpicon, image_icon, 32, 32, lr_createdibsection);

wceclass.hcursor = loadcursor(null, idc_arrow);

wceclass.hbrbackground = (hbrush) color_btnshadow;

if (lpicon) wceclass.hiconsm = (hicon)loadimage(hinstance, lpicon, image_icon, 16, 16, lr_createdibsection);

sprintf(szclass,"winx:%08x", wceclass.lpfnwndproc);

wceclass.lpszclassname = szclass;

atom atm=registerclas***(&wceclass);

if (atm)

else

}else*/}

return m_hwnd;

} static int messageloop(uint accelid=null)

}return msg.wparam;

}};//視窗函式模版

lresult callback templatewndproc(hwnd hwnd, uint message, wparam wparam, lparam lparam)

fun_end_flag(templatewndproc) //函式結束標記

//設定函式區域性變數值

bool setlocalvar(void *lpfun, unsigned int size, unsigned int val, unsigned int new_val)

{ if (lpfun==null || size<5) return -1;

unsigned char *ptr=(unsigned char *)lpfun;

for (unsigned int i=0;i

Win32的時間型別

在win32時間型別有這樣幾種型別filetime systemtime windowstime 先提個問題,如何計算當前時間100天以後的時間,在win32中。1.systemtime systemtime的定義是這樣 typedef struct systemtime systemtime 很大...

Win32的時間型別

在win32時間型別有這樣幾種型別 filetime systemtime windowstime 先提個問題,如何計算當前時間100天以後的時間,在win32中。1.systemtime systemtime的定義是這樣 typedef struct systemtime systemtime 很...

WIN32彙編的高階語法

1 條件測試語句 操作符和邏輯運算 操 作 用 途 等於變數和運算元之間的比較 不等於變數和運算元之間的比較 大於 變數和運算元之間的比較 大於等於 變數和運算元之間的比較 小於 變數和運算元之間的比較 小於等於 變數和運算元之間的比較 位測試將變數和運算元做 與 操作 邏輯取反 對變數取反或對表示...