![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C++ Win32
文章平均质量分 86
magictong
欢迎转载,但希望留下点痕迹,谢谢^_^
展开
-
Win32位程序(64位系统)文件对话框的文件重定向问题
最近有客户反馈,使用我们提供的安全软件,在一些特殊场景(譬如信任文件),无法找到C:\Windows\System32下面一个指定的文件的文件(客户是想加白这个目录下面的一个文件)。收到反馈后,我们试验了下,发现真的有问题,不过初步判断应该就是x64系统上面的文件重定向问题(无法在文件对话框看到真正的c:\windows\system32下的子文件夹或者文件的原因是,被重定向到了c:\windows\syswow64下面,看到的都是这个目录下的文件和文件夹)。然而真正去解决的时候发现,bug比想象中难修复。原创 2020-04-18 17:13:45 · 8209 阅读 · 2 评论 -
关于 win32 下磁盘的遍历方法
最近要写个在线专杀的东东,虽然是专杀(本来只要清除几个特定的文件和杀几个特定的进程,然后把用户的注册表恢复正常,很多病毒木马最喜欢干的一件事情就是写 映像劫持 然后机器一重启,安全相关的软件全部玩完了,不过这也没什么技术含量,利用了操作系统的“漏洞”而已),但是因为是 磁碟机,这个病毒(木马)很恶心,是感染型的,你磁盘上的exe文件可以全部给你感染成一个个的“小磁碟机”,很恐怖,呵呵,所原创 2008-08-07 21:39:00 · 3557 阅读 · 0 评论 -
error LNK2001: unresolved external symbol __imp__
这是一个很常见的链接错误,像下面链接错误是因为找不到win32下面网络通信的库,因为这个库不常用,所以VC默认是不加载的: MyClient.obj : error LNK2001: unresolved external symbol __imp__WSACleanup@0MyClient.obj : error LNK2001: unresolved external symbol原创 2008-09-03 15:26:00 · 10638 阅读 · 1 评论 -
ring3层一种占用文件的方法
前段时间,一个测试工程师问我关于怎样长时间的占用一个文件,而使别的程序无法再访问这个文件,想起以前很多病毒木马经常劫持hosts文件不放,除非你找到占用文件的程序,并强行结束掉,否则怎么也访问不了hosts文件,病毒通过劫持这个文件来达到劫持你的域名的目的,很有可能你输入了www.baidu.com,访问的却是一个带颜色的网站,并稀里哗啦在后台下了上百个病毒,扯远了,呵呵。 其实sdk里原创 2008-09-17 19:49:00 · 2292 阅读 · 1 评论 -
“池化技术”漫谈 - 线程池,内存池,连接池……
池化技术 - 简单点来说,就是提前保存大量的资源,以备不时之需,O(∩_∩)O,对于线程,内存,oracle的连接对象等等,这些都是资源,程序中当你创建一个线程或者在堆上申请一块内存时,都涉及到很多系统调用,也是非常消耗CPU的,如果你的程序需要很多类似的工作线程或者需要频繁的申请释放小块内存,如果没有在这方面进行优化,那很有可能这部分代码将会成为影响你整个程序性能的瓶颈。池化技术主要有线程池,内原创 2008-10-25 21:31:00 · 14232 阅读 · 0 评论 -
volatile关键字的说明以及测试
volatile关键字是一种类似const等等的类型修饰符,是C/C++中一个比较生僻的并且用得比较少的关键字,今天想说说它,是因为上次去TX面试的时候,被面试官问到,幸好前一天我在《C和指针》上面看到一个例子,就临时查了下这个关键字的作用。这个关键字的作用是,用它声明的类型变量不允许编译器进行优化处理,其实你申明的变量看起来你自己的程序没有改动它,但是它很可能被某些编译器未知的因素更改,比如:操原创 2008-10-29 15:21:00 · 2889 阅读 · 0 评论 -
CMap 使用注意说明(English)
IntroductionProgrammers like me, learnt STL::map before CMap always think CMap is difficult to use, and always try to use CMap in the way as a STL::map. In this article, I will explain more infor转载 2008-12-31 15:00:00 · 2943 阅读 · 0 评论 -
通过内核对象在服务程序和桌面程序之间通信的小问题
关于在通过 事件对象 在服务程序和普通桌面应用程序相互之间通信的问题,分类情况进行讨论:1、普通桌面应用程序中创建事件,服务程序中打开事件 XP的情况普通桌面应用程序中创建:m_hEvent = ::CreateEvent(NULL, FALSE, FALSE, TEXT("{67BDE5D7-C2FC-49f5-9096-C255AB791B75}"));服务程序中打开并置其为有原创 2009-01-07 14:31:00 · 3296 阅读 · 0 评论 -
C缺陷与陷阱(笔记)[转]
在网上发现的,感觉非常不错,就转载到这里。这本书也真的很不错,值得一看,我已经看过二遍了,有空准备再看一遍,最近在看《C与指针》,也是权威级作品啊。 C语言像一把雕刻刀,锋利,并且在技师手中非常有用。和任何锋利的工具一样,C会伤到那些不能掌握它的人。本文介绍C语言伤害粗心的人的方法,以及如何避免伤害。第一部分研究了当程序被划分为记号时会发生的问题。第二部分继续研究了当程序的记号被编译器转载 2008-11-26 21:25:00 · 1321 阅读 · 1 评论 -
svn 垃圾清理
以前使用svn进行代码版本管理,svn还是很强大的,能几个人同时对同一个文件进行修改,只要修改的不是同一处代码,svn会自动进行代码合并,如果万一冲突了也不要紧,手动进行冲突处理吧,哈哈。现在不用svn了,以前的代码里面有很多svn留下的垃圾,也就是隐藏的.svn文件夹和里面的文件,可以占到40%的空间,一个个手动去清理,要烦死,故写了个小工具自动清理svn垃圾。原理很简单,遍历文件夹,发现是.s原创 2009-02-08 23:55:00 · 4976 阅读 · 2 评论 -
VC 函数调用的 汇编代码 浅析
摘要:主要谈谈vc里面函数调用汇编成汇编代码的情形,首先针对之前的一个小程序,说说vc编译器的优化。 例子程序:#include using namespace std;int main(int argc, char* argv[]) { int i=10; int a = i; cout //下面汇编语句的作用就是改变内存中i的值,但是又不让编译器知道 __as原创 2008-12-04 23:46:00 · 1955 阅读 · 0 评论 -
一个文件遍历小函数的设计
之前写过 关于 win32 下磁盘的遍历方法,URL:http://blog.csdn.net/magictong/archive/2008/08/07/2784420.aspx,下面是将里面实现的磁盘遍历函数重新设计了一下,因为磁盘遍历,文件夹遍历在很多时候还是很常见的,为了不修改遍历的函数体,我将处理文件的部分交由一个回调函数去处理,这样的话,你甚至可以把下面的代码写在dll里面,需要进行文件原创 2008-12-03 21:34:00 · 1523 阅读 · 0 评论 -
怎样让窗口不显示在任务栏和ALT+TAB中
之前想弄个像QQ旋风那样的悬浮窗口,就研究了下怎么让窗口不显示在任务栏中,方法其实很简单就是将窗口的扩张属性设置成WS_EX_TOOLWINDOW,MSDN中对该属性有详细介绍,代码如下: ::SetWindowLong(m_hWnd, GWL_EXSTYLE, WS_EX_TOOLWINDOW ); 但是这样一来窗口的其他的扩展属性不管有没有,肯定是全没有,因此可以用下面的方法原创 2008-12-10 00:34:00 · 8285 阅读 · 2 评论 -
User breakpoint called from code at 0x7740240f 已解决
今天在调试QQ医生时,突然蹦出来了这么个错误,使上了浑身解数,也没有定位到问题所在,只知道在 delete 一个堆上的对象时,程序就崩溃了,弹出了下面的对话框: 挺奇怪的吧,而且往往之前还弹出一个对话框: 提示说堆内存被破坏,有时候这样的错误在比较小的程序里面也许不会对整个程序造成破坏,依然能够继续运行,但是千万不要放过,像这种破坏堆内存的隐藏BUG,说不准哪天就会造原创 2009-02-26 20:55:00 · 14144 阅读 · 3 评论 -
MFC 中 Tooltip 实现的几种方式
方法一:利用CWnd本身自身支持的tooptip来实现,这种方法适用给控件增加tooltip,非常方便和简单方法如下:1、在窗口中增加消息映射ON_NOTIFY_EX(TTN_NEEDTEXT, 0, SetTipText)SetTipText是个回调函数,名字叫什么无所谓,符合原型就行了,原型下面会说。 2、EnableToolTips(TRUE),使用这个方法调用这个函数是必不可少原创 2008-12-17 13:20:00 · 19785 阅读 · 6 评论 -
将后台窗口激活到前台的方法
下面这种方法是我见到的最理想的,还有一些其他的方法,像通过SetWindowsPos这个API设置窗口的Z-oder到最顶层,再设置回去。还有通过把当前窗口设置到底层,然后激活目标窗口等等方法。HWND hCurWnd = NULL; DWORD dwMyID; DWORD dwCurID; hCurWnd = ::GetForegroundWin原创 2008-12-24 12:44:00 · 9124 阅读 · 0 评论 -
让程序只运行一个实例的四种方法
源代码下载:http://d.download.csdn.net/down/907655/magictong 综述:让一个程序只运行一个实例的方法有多种,但是原理都类似,也就是在程序创建前,有窗口的程序在窗口创建前,检查系统中是否已经设置了某些特定标志了,如果有说明已经有一个实例在运行了,则当前程序通知用户怎样怎样,然后程序退出,当然方法有这么多,各自也就有自己的优缺点了。原创 2008-12-25 13:16:00 · 14981 阅读 · 5 评论 -
关于线程安全退出
...m_hEvent = ::CreateEvent(NULL, FALSE, FALSE, NULL);...while (TRUE){ // 等待 ::WaitForSingleObject(pThis->m_hEvent, INFINITE); if (pThis->GetStop()) { // 取消 break; } pThis原创 2009-04-01 18:47:00 · 4155 阅读 · 0 评论 -
使用AnimateWindow来实现窗口淡入淡出
如果是在VC6下进行编译,应引入下面的预编译宏,注意放在windows.h的前面#undef WINVER #define WINVER 0x500为什么要引入上面的宏呢?看看winuser.h里面该API的声明就明白了:#if(WINVER >= 0x0500)WINUSERAPIBOOLWINAPIAnimateWindow( HWND hWnd, DWORD dwTi原创 2009-04-14 23:49:00 · 5105 阅读 · 4 评论 -
判断当前窗口是否是全屏的山寨版和官方版
山寨版很好很强大:简单介绍一下,这是我用过的,获取屏幕的四个顶点(具体检测的时候可以向屏幕的中心剪一个像素,譬如检测 1,1而不是0,0)所在窗口的句柄,如果四个句柄都相同,则认为是全屏状态,其实有个问题,有些程序全屏的时候,还会有窗口弹出来,典型的像播放软件,全屏的时候,下面还有一个工具栏,这个工具栏和后面的播放窗口是不同的,所以检测失败了。对这种方法加强就是,获取四个点窗口所在的进程原创 2009-04-16 22:06:00 · 6617 阅读 · 2 评论 -
STL:循环删除容器中元素的方法和陷阱
算法大师Donald Knuth:不成熟的优化是一切恶果的根源(Permature optimization is the root of all evil )。 STL中的容器主要是两种:序列式容器和关联式容器。下面讲到的都是我在开发中曾经遇到过的一些问题,有些例子我做了修改,我想初学STL的人基本都会遇到这些问题。序列式容器:vector list string等等关联式容原创 2009-04-14 23:36:00 · 5033 阅读 · 1 评论 -
windows 剪贴板监控
迅雷下载或者旋风下载都有一个很有意思的剪贴板监控功能,当你打开剪贴板监控时,如果你复制了一个下载的URL,这两个程序都会弹出来下载框来让你去下载,显得很智能,昨天发现灵格斯词霸也有个剪贴板取词功能。上个月写了个智能注册表定位器,输入一段注册表字符串,能为你打开注册表编辑器并定位到相应的注册表位置,有个哥么说想智能点,当我复制注册表字符串时,给我自动拷贝到输入框去啊,后来就研究了一下剪贴板监控,原创 2009-04-19 18:53:00 · 18472 阅读 · 3 评论 -
MFC中CListCtrl的排序 简介
1、消息处理:LVN_COLUMNCLICK消息,可以控件自己处理,也可以外面的DLG处理。CListCtrl自己处理:ON_NOTIFY_REFLECT(LVN_COLUMNCLICK, OnLvnColumnClick),OnLvnColumnClick函数就是获取点击的第几列,然后调用SortItems函数。 2、实现一个CALLBACK 排序回调函数,这个函数不是你调用的,是原创 2009-04-06 11:30:00 · 2634 阅读 · 0 评论 -
CString的几个使用点滴
以前一直觉得CString已经用的很熟练,不过前几天又因为错误的使用CString,引发了一个非常难发现的bug,所以决定把CSting使用的一点心得分享一下。1、看MSDN上CString的详细介绍才是王道,虽然是英文的,但是一定要硬着头皮看完,吃透。 2、直接查看CString的实现源码,我相信看完了并且理解之后,你绝对会有恍然大悟的感觉。 3、CString内部原创 2009-05-04 20:14:00 · 2693 阅读 · 0 评论 -
FreeLibraryAndExitThread DLL中线程的安全退出
首先我们先来看一下FreeLibraryAndExitThread这个APIVOID FreeLibraryAndExitThread( HMODULE hModule, DWORD dwExitCode); MSDN:The FreeLibraryAndExitThread function decrements the reference count of a loa原创 2009-07-22 23:52:00 · 11558 阅读 · 6 评论 -
suspend造成死锁的例子和原因分析
今天loris分享了一个关于使用suspend造成死锁的例子,部分代码如下:UINT AFX_CDECL ThreadTest(LPVOID pvParam){ while (TRUE) { HMODULE hHandle = ::LoadLibrary("Common.dll"); if (hHandle) { void *pFun = (void原创 2009-05-08 18:02:00 · 3800 阅读 · 0 评论 -
对回调函数进行简单封装
封装的原则很简单,子类通过继承基类的一个虚方法,将回调转到子类的成员函数里面,从而可以使用子类成员函数的一些私有方法和成员。 // ---- code// .h#ifndef __KCBBASE_H__#define __KCBBASE_H__// -------------------------------------------------------------原创 2009-05-20 22:30:00 · 2504 阅读 · 0 评论 -
怎么把const_iterator强制转化成iterator
今天在使用STL中的mutilmap时遇到了一个比较郁闷的问题,STL的一些函数只能接受iterator作为参数,不能传const_iterator类型的参数,既不存在两种迭代器的隐式转换,使用const_cast也是不行的,编译怎么也通不过,看stl的源码const_iterator和iterator两个之间还真没啥血缘关系,在网上搜索了一下资料,然来STL也考虑了这一问题,使用了一原创 2009-08-17 23:34:00 · 4798 阅读 · 0 评论 -
关于网络字节序和主机字节序
什么是字节序?是指整数在内存中保存的顺序。 字节序有两种: a.Little endinan 低位存储在内存的低地址,高位存储在内存的高地址; b.Big endian 高位存储在内存的低地址,低位存储在内存的高地址; 举个简单的例子:DWORD dwCount = 0x01020304;这样的一个双字节变量在内存中如下分布0013FF原创 2009-08-21 15:00:00 · 11297 阅读 · 3 评论 -
#ifndef……#define……#endif与#pragma once
这两套宏是用于C++头文件中防止头文件重复包含的,使用方法如下:1、#ifndef……#define……#endif#ifndef __ABOUTWNDUI_H__#define __ABOUTWNDUI_H__// Todo// code// ......#endif /* __ABOUTWNDUI_H__ */ 2、#pragma on原创 2009-08-25 20:26:00 · 2186 阅读 · 0 评论 -
全屏检测(补)
4月16日的时候写了一篇检测当前是否有窗口处于全屏状态的短文,判断当前窗口是否是全屏的山寨版和官方版(http://blog.csdn.net/magictong/archive/2009/04/16/4085477.aspx),后来发现所谓的“官方版”也是有局限性的,因为这种方法是靠系统不停的发送一个全屏还是非全屏状态来决定是否有全屏窗口存在的,但是如果你正在使用QQ影音看电影,全屏原创 2009-09-15 20:34:00 · 2531 阅读 · 0 评论 -
fatal error LNK1103: debugging information corrupt; recompile module
今天在写一个SetWinEventHook的程序时,编译通过,link时,弹出了如下的错误:Linking...uuid.lib(oleidl_i.obj) : fatal error LNK1103: debugging information corrupt; recompile module 囧,第一反应是google一下,看来遇到这个问题的还不少,仔细回想了下原创 2009-10-25 16:10:00 · 24130 阅读 · 13 评论 -
SetWinEventHook 事件钩子
相信消息钩子大家听的比较多,消息钩子能够在应用程序处理系统消息之前将其截获,提前处理并可以决定是否继续将消息往下传送,有些windows事件并没有消息对应,譬如弹出菜单,切换窗口,获得焦点,滚动条滚动等等,要截获这些事件可以使用SetWinEventHook,它的原型如下:HWINEVENTHOOK WINAPI SetWinEventHook( __in UINT event原创 2009-11-01 01:26:00 · 15064 阅读 · 1 评论 -
vista下开机启动 简单绕过UAC的方法
背景 vista下,如果不开启UAC,那就没有我下面要说的问题了,呵呵。下面说的都是在vista开启UAC的前提下说的,win7也适用。 在vista下,系统开启了UAC,如果你的软件通过manifest进行了提权(提升到管理员权限),那么exe上面会打上一个“小盾”的图标,这种程序启动的时候,会激活UAC保护机制,弹一个全局对话框出来询问用户是否允许启动,这就是微软标榜的灰常原创 2009-11-13 01:24:00 · 8428 阅读 · 9 评论 -
复习C++中的几个不常用关键字
今天听到一个朋友来TX面试,又问到了生僻的C++关键字,那个汗,记得我那个时候面试的时候也被问到过,特总结如下: bad_typeid 很生僻,基本在几年的开发中没有用过,要理解bad_typeid这个关键字,首先得看下typeid这个关键字的使用,下面是一段英文描述:The typeid operator will accept a pointer原创 2010-01-06 00:32:00 · 3102 阅读 · 8 评论 -
VS2005强大的条件断点功能
今天在调一个漏洞修复的crash的时候,进入了一个很大的循环,循环不停地检测是否有当前漏洞,断点打在循环体里面,已知出问题的漏洞的KB号,但是如果要在刚好扫描到这个KB号的时候断下来,还有点小麻烦,我又不想改代码用if断下来,其实VS2005做到这个非常简单,设置条件断点就行了,在断点的右边单击右键会弹出断点条件设置菜单: 然后再点击 Condition...原创 2010-03-29 20:44:00 · 6531 阅读 · 3 评论 -
VC6下 try catch 在release下的杯具
IDE:VC6 今天遇到一个小问题,把我郁闷了好久,××医生的VulEngine不时在wcsstr处发生crash,加了一番强大的参数检查后,再加上了强大的try catch,其实不是很喜欢用try和catch,总觉得一个完美的程序,应该代码的每一处都可以被程序员控制的,我倾向如对函数的返回值和参数进行强制的检查,当然这就要求你自己设计的函数必须也得满足这些要求,不过事情原创 2010-04-19 23:59:00 · 6039 阅读 · 1 评论 -
怎样判定应用程序自身运行在“兼容模式”下?
我们的程序有时候需要精确的判定当前运行在哪个系统下面,也就是说程序的某个功能可能需要知道当前运行在哪个真正的操作系统下,而操作系统提供了一个兼容模式功能,就是用户可以设置某个程序运行在某个模拟的更低的版本的操作系统下面,这是有好处的,因为某些程序在某些更高版本的操作系统下面可能发生兼容性问题而无法运行。在设置兼容模式运行后,程序里面调用ring3层的GetVersionEx得到的将是模拟的的操作系统版本,而不是真正的操作系统版本。原创 2010-08-21 18:35:00 · 8605 阅读 · 2 评论 -
x64系统的判断和x64下文件和注册表访问的重定向(1)
怎样判断当前的应用程序运行在x64系统下面?x64下面的文件访问和注册表访问要注意什么呢?原创 2010-08-25 23:04:00 · 3423 阅读 · 0 评论 -
x64系统的判断和x64下文件和注册表访问的重定向(2)
关于注册表的重定向:需要这个技术的原因是需要在x64系统上面把32位程序和64位程序分离开。这种技术有个强大的名字叫WOW64,注意不是魔兽世界64级哦,哈哈。出于一些特殊的目的,一些注册表键被分成了两个部分原创 2010-09-18 02:28:00 · 4662 阅读 · 5 评论