Win32 GetLasrError 实现

来源:互联网 发布:淘宝直通车怎样设置 编辑:程序博客网 时间:2024/05/29 13:10
 Windows编程人员都知道windows下有一个函数

DWORD GetLastError(VOID);
用于返回调用函数的错误信息。他是怎么实现的呢?
大家知道进程只是一个容器,线程的容器,所有的指令在线程下运行。 一个应用程序最少有一个线程,称为主线程,主线程可以创建辅助线程。每个线程都有自己的一块专有内存区域,_tiddata(多线程,C运行库errno)。
当程序(线程)运行了一个函数后,会将错误信息设置到_tiddata的_terrno变量中。
_tiddata的源码在VS src mtdll.h中。我的在
D:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\crt\src下。
节选一点点如下:

/* Structure for each thread's data */struct _tiddata {    unsigned long   _tid;       /* thread ID */    uintptr_t _thandle;         /* thread handle */    int     _terrno;            /* errno value */   void *      _initaddr;      /* initial user thread address */    。。。。    };

这样当我们调用GetLastError时,只需要将_terrno的值返回即可。
DOWRD GetLastError()
{
_piddate ptd = _getptd_noexit();
return (&ptd->_terrno);
}
实际上当然不是这样简单的,我只是举个列子。实际上是通过TLSGetValue获取主调线程数据块地址。
TLS-线程区域存储空间。

参考《windows核心编程》

0 0
原创粉丝点击