Windows小知识(一)

1、Microsoft将COM从16位Windows移植到WIn32时,做出了一个重要决策:所有需要字符串作为参数的COM接口方法都 只接受Unicode字符串。因为COM一般用于让不同组件彼此间进行“对话”,而Unicode是传递字符串最理想的选择。

2、当资源编译器译完所有资源后,输出文件就是资源的一个二进制形式。资源中的字符串值 (字符串表、对话框模板、菜单等)始终是以Unicode字符串的形式保存的。

3、在每个变量后的内存都会被填充为0xcc,这样是为了能够在自动检测中,检查出缓冲区溢出。

4、_countof是一个宏,来获取字符大小。

5、GetThreadLocale这个来返回系统的语言标识符。

6、IsTextUnicode这个来判断某一个文本内容是否为Unicode编码。

7、一般系统调用函数会有两个版本,分别是Unicode与ANSI两种版本。其实ANSI运行起来更复杂。因为在ANSI内部其实还是调用的Unicode版本的函数,于是就存在一个参数转换的问题,将ANSI参数转换成Unicode,然后再去调用Unicode版本的函数。所以直接调用Unicode版本的函数运行会更快。

8、内核对象可以用一个安全描述符(security descriptor, SD)来保护。

9、内核对象有一个静态成员用来计数,当内核对象被创建时计数值为1,如果有其他进程访问此内核对象(通过特殊的进程共享内核对象的方式)则计数值加1,进程结束,计数值减1,如果计数为0,则系统内核会释放此内核对象。

10、内核对象的作用域是基于进程的,这样做处于安全和健壮型考虑,而且只有通过调用windows api 才能使用内核对象。

11、将NULL作为PSECURITY_ATTRIBUTES参数传入时,返回的句柄是不可继承的。

12、当一个子进程继承了父进程的内核对象的句柄时,句柄在父、子进程中的索引是一样的。

13、对象句柄的继承只会发生在生成子进程的时候发生。假如父进程后来又创建了新的内核对象,并同样将它们的句柄设为可继承的句柄。那么正在运行的子进程是不会继承这些新的句柄的。

14、一个服务的命名内核对象始终位于全局命名空间内。应用程序自己的命名内核对象在会话的命名空间内。不过,我们也可以强制把一个命名对象放入全局命名空间,具体 做法是在其名称前加上“Global”前缀。如:

   HANDLE h = CreateEvent(NULL, FALSE, FALSE, TEXT("Global\MyName"));

也可以将一个内核对象放入到当前会话的命名空间,在名称前加上“Local”前缀,如

  HANDLE h = CreateEvent(NULL, FALSE, FALSE, TEXT("Local\MyName")):

15、Security identifier(安全描述符),SID

16、通过CreateBoundaryDescriptor创建的边界,不要用CloseHandle关闭,而是用DeleteBoundaryDescriptor;

 17、伪句柄其实就是指的是指调用函数的本身线程句柄。

原文地址:https://www.cnblogs.com/wang-can/p/3324378.html