读windows核心编程

记录下几个以前不是很清楚的东西

1、那么,系统在创建新的线程时,是如何知道要分配这个数据块的呢?答案是它并不知道。系统
并不知道应用程序是用C/C++来写的,不知道你调用的函数并非天生就是线程安全的。保证线
程安全是程序员的责任。创建新线程时,一定不要调用操作系统的CreateThread函数。相反,
必须调用C/C++运行库函数_beginthreadex:

在多线程环境中会出问题的C/C++运行库变量和函数有errno,_doserrno,strtok,_wcstok,
strerror,_strerror,tmpnam,tmpfile,asctime,_wasctime,gmtime,_ecvt和_fcvt等等。

 

2.(windows核心编程)所以,当你的应用程序运行时,它可能会泄漏内核对象;但当进程终止运行,系统能保证一切都被正确清除。顺便说一下,这适用于所有内核对象、资源(包括GDI对象在内)以及内存块

对于semaphore,他作为一个内核对象,应该在程序关闭的时候关掉,但是信号并未释放?和解?那么如果多进程中某个进程崩溃了,那这个信号永远不会释放?

 

3.interlock系列函数不需要搭配volatile,这是因为传给interlock的是变量的地址,函数要取得值,必须从内存中获得

 

4. 内存,virualfree只需要第一个参数就可以了,因为系统会自己记录,所以free不需要带参数就行,但是delete为啥要带[]

虚拟内存前2g为用户空间,后两层为内核空间

进程必须有默认堆,操作系统api会调用他来分配内存,需要关注下google的tcmalloc实现方式,因为他的malloc free等是跟线程相关的,高速

多线程创建堆时,一定不要设置heap_no_serialize,避免多线程同步

小容量可用heapalloc,>1m要用virtualalloc ,heapsize可以获得这块内存的实际大小

virtualalloc预订4g空间中的地址段或者实际分配内存,根据第三个参数

heapalloc直接分配内存

(还需找本操作系统的书细读,太久没看了,都忘光了)

基地址重映射工具rebase


5.dll,如果dll malloc,主进程free,在某一个采用静态链接的情况下free会失败,不解,虽然静态编译下,每个文件都有malloc的实现代码,但是应该是同一个版本的吧?ida后找到答案 动态链接的malloc是在私有堆上开辟的内存,静态的是默认堆,所以。。。

搜索dll的目录顺序:包含可执行文件的目录,system32,system,windows,进程当前目录,path环境目录,可在注册表session manager中修改顺序

延迟载入特性,前段时间写了个双核浏览器,想让exe在缺少chrome.dll的情况下只使用ie内核,但是没找到办法,或许可以用这个方式实现。 delayloadapp以后看看这个代码

 

6.seh

__try __finally除非exitthread,process,terminatethread,process 来终止,其他都会执行到finally

并不是所有的finally都可以被执行,比如栈耗尽,程序会直接dump

vista后,错误报告进程在另一个独立的进程里,是否类似breakpad?都是采用发送消息给错误处理程序,然后阻塞线程,等待错误处理完成

windows还有一套叫做重启管理的api?

 

3.绝对不要调用的C/C++运行库函数

C/C++运行库还包括以下两个函数:
unsigned long _beginthread(
void (__cdecl *start_address)(void *),
unsigned stack_size,
void *arglist);
和:
void _endthread(void);
新的_beginthreadex和_endthreadex函数已经取代了这两个传统的函数。如你所见,_beginthread
函数的参数较少,所以和全功能的_beginthreadex函数相比,它的局限性较大。例如,使用
_beginthread函数,你不能创建具有安全属性的线程,不能创建可以挂起的线程,也不能获得
线程ID值。_endthread函数的情况与此类似:它是无参数的,这意味着线程的退出代码被硬编
码为0。
_endthread函数还存在另一个鲜为人知的问题。_endthread函数在调用ExitThread前,会调用
CloseHandle,向其传入新线程的句柄。为了理解这为什么会成为一个问题,来看看以下代码:
DWORD dwExitCode;
HANDLE hThread = _beginthread(...);
GetExitCodeThread(hThread, &dwExitCode);
CloseHandle(hThread);
在第一个线程调用GetExitCodeThread之前,新建的线程就可能已经执行,返回,并终止运行
了。如果发生上述情况, hThread就是无效的,因为_endthread已关闭了新线程的句柄。不用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值