swigger’s BLOG
醉卧沙场君莫笑 古来征战几人回-
透明窗口,连鼠标键盘事件也不接受,全透明
Posted on 八月 1st, 2009 No commentswindows的透明窗口,如果设置了LWA_ALPHA和WS_EX_TRANSPARENT,就会连鼠标键盘事件也给透明过去,这个功能还不错。可以在屏上显示水印。
关键代码:
SetWindowLong(m_hWnd, GWL_EXSTYLE, WS_EX_LAYERED|WS_EX_TRANSPARENT|WS_EX_TOPMOST);
SetLayeredWindowAttributes(m_hWnd, RGB(0,0,0), 120, LWA_ALPHA);
SetWindowPos(m_hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOACTIVATE|SWP_NOSIZE|SWP_NOMOVE|SWP_SHOWWINDOW);demo代码:
static LRESULT WINAPI UIWndProcBase(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { if (msg == WM_PAINT) { PAINTSTRUCT ps; BeginPaint(hWnd, &ps); //OnPaint(ps.hdc); EndPaint(hWnd, &ps); } else if (msg == WM_DESTROY) { PostQuitMessage(0); } return DefWindowProc(hWnd, msg, wParam, lParam); } void UIRun() { WNDCLASSEX wc = {sizeof(wc)}; wc.hInstance = GetModuleHandle(0); wc.lpszClassName = _T("uiclassname"); wc.lpfnWndProc = &UIWndProcBase; wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); RegisterClassEx(&wc); wstring ws = L"aaabbcd"; HWND hParent = CreateWindowExW(WS_EX_TRANSPARENT, _T("EDIT"), _T(""), WS_POPUP, 0, 0, 100, 100, 0, NULL, wc.hInstance, NULL); HWND m_hWnd = CreateWindowEx(0, wc.lpszClassName, ws.c_str(), WS_POPUP, 0, 0, 100, 100, hParent, NULL, wc.hInstance, NULL); SetWindowLong(m_hWnd, GWL_EXSTYLE, WS_EX_LAYERED|WS_EX_TRANSPARENT|WS_EX_TOPMOST); SetLayeredWindowAttributes(m_hWnd, RGB(0,0,0), 120, LWA_ALPHA); SetWindowPos(m_hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOACTIVATE|SWP_NOSIZE|SWP_NOMOVE|SWP_SHOWWINDOW); MSG msg; while (GetMessage(&msg, 0, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } } int main() { UIRun(); return 0; } -
flash只支持部分自定义协议
Posted on 七月 20th, 2009 No commentsIE支持一种Asynchronous Pluggable Protocols的格式,然而,flash不能处理通过这种方式定义的自定义协议,在flash.ocx中有一份列表,列表外的自定义协议是不能用的,包括res协议,不能用。
0374675E <>/$ 55 PUSH EBP 0374675F |. 8BEC MOV EBP,ESP 03746761 |. 83EC 2C SUB ESP,2C 03746764 |. A1 D0449B03 MOV EAX,DWORD PTR DS:[39B44D0] 03746769 |. 33C5 XOR EAX,EBP 0374676B |. 8945 FC MOV DWORD PTR SS:[EBP-4],EAX 0374676E |. 53 PUSH EBX 0374676F |. 8B5D 0C MOV EBX,DWORD PTR SS:[EBP+C] 03746772 |. 56 PUSH ESI 03746773 |. 8B75 08 MOV ESI,DWORD PTR SS:[EBP+8] 03746776 |. 57 PUSH EDI 03746777 |. 8BCB MOV ECX,EBX 03746779 |. 895D E4 MOV DWORD PTR SS:[EBP-1C],EBX 0374677C |. E8 8D9EF0FF CALL Flash10b.0365060E 03746781 |. 68 E0BD9103 PUSH Flash10b.0391BDE0 ; ASCII "http://" 03746786 |. 56 PUSH ESI 03746787 |. E8 7085F2FF CALL <Flash10b.lead_cmp> 0374678C |. 59 POP ECX 0374678D |. 59 POP ECX 0374678E |. 85C0 TEST EAX,EAX 03746790 |. 0F85 82020000 JNZ Flash10b.03746A18 03746796 |. 68 14BE9103 PUSH Flash10b.0391BE14 ; ASCII "https://" 0374679B |. 56 PUSH ESI 0374679C |. E8 5B85F2FF CALL <Flash10b.lead_cmp> 037467A1 |. 59 POP ECX 037467A2 |. 59 POP ECX 037467A3 |. 85C0 TEST EAX,EAX 037467A5 |. 0F85 6D020000 JNZ Flash10b.03746A18 037467AB |. 68 70DD9103 PUSH Flash10b.0391DD70 ; ASCII "ftp://" 037467B0 |. 56 PUSH ESI 037467B1 |. E8 4685F2FF CALL <Flash10b.lead_cmp> 037467B6 |. 59 POP ECX 037467B7 |. 59 POP ECX 037467B8 |. 85C0 TEST EAX,EAX 037467BA |. 0F85 58020000 JNZ Flash10b.03746A18 037467C0 |. BF 300D9203 MOV EDI,Flash10b.03920D30 ; ASCII "file://" 037467C5 |. 57 PUSH EDI 037467C6 |. 56 PUSH ESI 037467C7 |. E8 3085F2FF CALL <Flash10b.lead_cmp> 037467CC |. 59 POP ECX 037467CD |. 59 POP ECX 037467CE |. 85C0 TEST EAX,EAX 037467D0 |. 0F85 42020000 JNZ Flash10b.03746A18 037467D6 |. 68 64349203 PUSH Flash10b.03923464 ; ASCII "mk:@MSITStore:" 037467DB |. 56 PUSH ESI 037467DC |. E8 1B85F2FF CALL <Flash10b.lead_cmp> 037467E1 |. 59 POP ECX 037467E2 |. 59 POP ECX 037467E3 |. 85C0 TEST EAX,EAX 037467E5 |. 0F85 2D020000 JNZ Flash10b.03746A18 037467EB |. 68 5C349203 PUSH Flash10b.0392345C ; ASCII "Ms-its:" 037467F0 |. 56 PUSH ESI 037467F1 |. E8 0685F2FF CALL <Flash10b.lead_cmp> 037467F6 |. 59 POP ECX 037467F7 |. 59 POP ECX 037467F8 |. 85C0 TEST EAX,EAX 037467FA |. 0F85 18020000 JNZ Flash10b.03746A18 03746800 |. 68 54349203 PUSH Flash10b.03923454 ; ASCII "mhtml:" 03746805 |. 56 PUSH ESI 03746806 |. E8 F184F2FF CALL <Flash10b.lead_cmp> 0374680B |. 59 POP ECX 0374680C |. 59 POP ECX 0374680D |. 85C0 TEST EAX,EAX 0374680F |. 0F85 03020000 JNZ Flash10b.03746A18 03746815 |. 68 4C349203 PUSH Flash10b.0392344C ; ASCII "wmhtml:" 0374681A |. 56 PUSH ESI 0374681B |. E8 DC84F2FF CALL <Flash10b.lead_cmp> 03746820 |. 59 POP ECX 03746821 |. 59 POP ECX 03746822 |. 85C0 TEST EAX,EAX 03746824 |. 0F85 EE010000 JNZ Flash10b.03746A18 0374682A |. 68 3C349203 PUSH Flash10b.0392343C ; ASCII "vnd.ms.wmhtml:" 0374682F |. 56 PUSH ESI 03746830 |. E8 C784F2FF CALL <Flash10b.lead_cmp> 03746835 |. 59 POP ECX 03746836 |. 59 POP ECX 03746837 |. 85C0 TEST EAX,EAX 03746839 |. 0F85 D9010000 JNZ Flash10b.03746A18 0374683F |. 68 34349203 PUSH Flash10b.03923434 ; ASCII "etc:" 03746844 |. 56 PUSH ESI 03746845 |. E8 B284F2FF CALL <Flash10b.lead_cmp> 0374684A |. 59 POP ECX 0374684B |. 59 POP ECX 0374684C |. 85C0 TEST EAX,EAX 0374684E |. 0F85 C4010000 JNZ Flash10b.03746A18 03746854 |. 68 E01A9203 PUSH Flash10b.03921AE0 ; ASCII "ms-help:" 03746859 |. 56 PUSH ESI 0374685A |. E8 9D84F2FF CALL <Flash10b.lead_cmp> 0374685F |. 59 POP ECX 03746860 |. 59 POP ECX 03746861 |. 85C0 TEST EAX,EAX 03746863 |. 0F85 AF010000 JNZ Flash10b.03746A18 03746869 |. 68 2C349203 PUSH Flash10b.0392342C ; ASCII "hcp:" 0374686E |. 56 PUSH ESI 0374686F |. E8 8884F2FF CALL <Flash10b.lead_cmp> 03746874 |. 59 POP ECX 03746875 |. 59 POP ECX 03746876 |. 85C0 TEST EAX,EAX 03746878 |. 0F85 9A010000 JNZ Flash10b.03746A18 0374687E |. 68 20349203 PUSH Flash10b.03923420 ; ASCII "msencdata:" 03746883 |. 56 PUSH ESI 03746884 |. E8 7384F2FF CALL <Flash10b.lead_cmp> 03746889 |. 59 POP ECX 0374688A |. 59 POP ECX 0374688B |. 85C0 TEST EAX,EAX 0374688D |. 0F85 85010000 JNZ Flash10b.03746A18 -
XP不能禁用的一些服务
Posted on 六月 3rd, 2009 No commentsTCP/IP NetBIOS Helper : 访问其它机器的共享所需要。
其它待补充。
-
masm造weak symbol
Posted on 四月 24th, 2009 No commentsmasm或ml.exe可以用alias造weak external symbol,这样可以起到链接时有就选用户提供的,无就选系统默认的这样一个功能。这个语法很简单,但不好找。以前找了又忘了,特记下:
alias <sym2> = <sym1>
这次是在这里搜到的:
-
php和mysql支持utf8
Posted on 四月 15th, 2009 No comments老生常谈了,网上很多文,我再多写一篇!
1. my.cnf里加上:
[client]
default-character-set=utf8[mysqld]
default-character-set=utf8重启mysqld,连上去看看:
mysql> SHOW VARIABLES LIKE '%character%';SHOW VARIABLES LIKE 'collation%'; +--------------------------+----------------------------+ | Variable_name | Value | +--------------------------+----------------------------+ | character_set_client | utf8 | | character_set_connection | utf8 | | character_set_database | utf8 | | character_set_filesystem | binary | | character_set_results | utf8 | | character_set_server | utf8 | | character_set_system | utf8 | | character_sets_dir | /usr/share/mysql/charsets/ | +--------------------------+----------------------------+ 8 rows in set (0.00 sec) +----------------------+-----------------+ | Variable_name | Value | +----------------------+-----------------+ | collation_connection | utf8_general_ci | | collation_database | utf8_general_ci | | collation_server | utf8_general_ci | +----------------------+-----------------+ 3 rows in set (0.00 sec)2. php里也要改,写个函数:
<?php function connect_db($dbname) { global $mysql_addr, $mysql_user, $mysql_pass; $dbcon = mysql_connect($mysql_addr, $mysql_user, $mysql_pass); mysql_query("SET NAMES 'utf8'; SET CHARACTER_SET_CLIENT=utf8; " ."SET CHARACTER_SET_RESULTS=utf8; ", $dbcon); if ($dbname) { mysql_select_db($dbname, $dbcon); } return $dbcon; } ?>3. 数据库可以改一下:
alter database mydb CHARACTER SET ‘utf8′ ;
alter table tablename CHARACTER SET ‘utf8′;
不过这两句不会改内容,如果内容原来不是utf8的字节,就要导出导入了.
-
修改了一个setacl的BUG
Posted on 四月 7th, 2009 No commentssetacl在处理注册表时有问题,写得不对。修改如下:
csetacl.cpp:
--- CSetACL.cpp.old 2009-04-06 23:44:41.000000000 +0800 +++ CSetACL.cpp 2009-04-06 23:57:16.000000000 +0800 @@ -2288,7 +2288,7 @@ m_nAPIError = RegOpenKeyEx (hRemoteKey ? hRemoteKey : hMainKey, sSubkeyPath, 0, KEY_ENUMERATE_SUB_KEYS | KEY_EXECUTE, &hOpenStd); // We now know the key exists. Let's try some black magic and open it like a backup program - if (hOpenStd && (m_nAPIError == ERROR_SUCCESS || m_nAPIError == ERROR_ACCESS_DENIED)) + if (hOpenStd || m_nAPIError == ERROR_ACCESS_DENIED) { DWORD nNewCreated = 0; DWORD nErrTmp = 0; @@ -2307,6 +2307,7 @@ if (hOpenBckp && nErrTmp == ERROR_SUCCESS) { *hSubKey = hOpenBckp; + m_nAPIError = ERROR_SUCCESS; // The standard key is not needed RegCloseKey (hOpenStd);设置注册表权限方法:
setacl -ot reg -on HKEY_LOCAL_MACHINE\aaaa\hehe -rec yes -actn setowner -ownr n:Administrators -actn clear -clr dacl -actn setprot -op dacl:np
-
使hdtune扫硬盘时可以从某个位置开始
Posted on 四月 4th, 2009 No commentshdtune扫硬盘坏道,很慢。为了让它可以从某个位置开始,调了一下:
004089F5 . 57 PUSH EDI ; /lParam 004089F6 <blockpos> . 8B7C24 1C MOV EDI,DWORD PTR SS:[ESP+1C] ; | 004089FA . 8946 1A MOV DWORD PTR DS:[ESI+1A],EAX ; | 004089FD . 57 PUSH EDI ; |wParam 004089FE . 68 0E040000 PUSH 40E ; |Message = WM_USER+14. 00408A03 . 51 PUSH ECX ; |hWnd 00408A04 . FF15 FC964700 CALL DWORD PTR DS:[4796FC] ; \SendMessageA在 blockpos处,修改esp+1c里的值,就可以了。
总的来说,hdtune把硬盘分为很多个格子,每行50个,总共有很多行。每一个小格扫完后,就发送这个自定义的消息 WM_USER+14来通知主线程画一个色块。绿色表示无问题,红色表示有问题。运行到blockpos这一行时,把这个值改掉,即可定义到第n个格子。第0个为左上,第49个为第一行最后一个,依此类推。
-
重装com+
Posted on 三月 25th, 2009 No comments不知为何,给xp装iis发现装不了。装到一半安装界面死了,重启依旧。
换作普通人,此时只能重装系统了。没办法,谁让我是IT民工,拿出windbg慢慢调。发现创建一个com+对象时,进入NtRequestWaitReplyPort后死等了。猜是com+问题,好像我以前禁用过com+。
运行 dcomcnfg,其界面直接死掉。晕,再调,发现还是这个com+对象的问题,写段小程序验证,一样是死锁:
CoInitialize(0);
CLSID clsid;
CLSIDFromString(L”{182C40F0-32E4-11D0-818B-00A0C9231C29}”, &clsid);
MULTI_QI qi = {0};
qi.pIID = &IID_IUnknown;
CoCreateInstanceEx(clsid, 0, CLSCTX_LOCAL_SERVER, 0, 1, &qi);if (qi.pItf) qi.pItf->Release();
CoUninitialize();可见的确是com+问题。注册表中删掉这个clsid,发现dcomcnfg可以运行出界面了,但进入后有些操作还是报错。启动msdtc就报错。
用msdtc -resetlog 重置log后,msdtc服务(Distributed Transaction Coordinator)可以启动了。原因是我曾经删掉了C:\WINDOWS\system32\MsDtc下的LOG文件。微软真TM搞笑,没有了LOG你直接创建不行吗,还要像模像样的搞个命令行参数重置LOG。多此一举。
但恢复备分的clsid发现还是出错,只能重装com+了:
- 去掉光驱和虚拟光驱里的光盘或映象。保证第2步不会被系统自动找回dll
- 删 C:\WINDOWS\system32\dllcache\clbcatq.dll
- 重命令 C:\WINDOWS\system32\clbcatq.dll 为其它名如 ~clbcatq.dll
- 删 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\COM3 键
- 重启系统
- 删目录 c:\windows\Registration
- 复制 c:\windows\inf\sysoc.inf 到 c:\sysoc.inf,打开c:\sysoc.inf,找到com=那一行,去掉hide字样
- 运行命令: sysocmgr /y /i:C:\sysoc.inf ,可以看到com+并发现已经被勾选。直接点下一步安装com+。安装成功。
- 运行dcomcnfg检查是否真的成功。
- 重启系统。
OK, 这样com+就正常了,iis也能正常安装了。
-
关windows自动运行的一种暴力方式
Posted on 三月 13th, 2009 No comments关windows自动运行倒底有几种方法,我是说不清了。至少有一种是从组策略里关。不过这样关还不彻底,程序是不会自动运行了,但是右键菜单里还有,还会加载光驱的图标。不保险。
有一种暴力的方式是,直接让windows不去读取 autorun.ini, 这样光盘自定义的图标都不会显示出来,只显示默认光驱图标的。其原理是,利用windows已经有的重定向ini的技术,把ini重定向到注册表中的一个不存在的分支,从而破坏自动运行机制。
实现步骤:把以下内容存成 anti-autorun.reg ,导入到注册表即可。或者简单一点,直接点此下载运行。
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\IniFileMapping\autorun.inf]
@=”#USR:Software\\Microsoft\\Non_exist_node” -
识别域控制器
Posted on 三月 7th, 2009 No comments有些东西,知道的发现它很简单,不知道的无从下手。这不就是一例。
想把一台linux加入到域中,网上记录倒是不少,但是都有个公共的特点,一开始就要输入域控制器和域里的kerberos服务器IP。在windows下,入域很简单,根本不用知道什么IP,在机器名那里改改就进去了。如果整个域是自己做的,那自然知道域控的IP。但如果不是自己做的,是在已经做好的环境如公司里,咋办呢?
事实上,windows能找到,说明事情是有解的,只是解该怎样找的问题。搜了一圈也终于找到了,答案很简单,那就是微软有个nltest.exe的小工具,下回来运行一下就搞定了:
用:
nltest /DCLIST:DOMAINNAME
取得域里的控制器列表。它还会列入主域控制器(PDC)用
nltest /DSGETDC:DOMAINNAME /KDC
可以得到kerberos的IP。这就终于可以进行下面的尝试了。微软的工具是个安装包,我把文件提出来后压缩上传了,可点此处下载。


