外派去微软MS面试的一些东西

来源:百度文库 编辑:神马文学网 时间:2024/04/30 16:45:31
1. 我问一下Windows方面的问题,安全性方面的。帐户登录Windows后,个人信息是怎样被加载到进程中的,是怎么实现的? Windows资源分配和执行的最小单位是什么?文件夹的权限是什么时候、怎样被确定的,Windows是怎么实现这个权限的?
NT/2000中交互式的登陆支持是由WinLogon调用GINA DLL实现的,GINA DLL提供了一个交互式的界面为用户登陆提供认证请求。在WinLogon初始化时,就向系统注册截获CTRL+ALT+DEL消息,所以其他程序就无法得到CTRL+ALT+DEL的消息。
看来基本就是WinLogon.exe这个进程了,而具体执行为GINA DLL。
WinLogon会和GINA DLL进行交互,缺省是MSGINA.DLL(在System32目录下),WlxInitialize、WlxActivateUserShell便是其中输出,当然不止这两个,还有别的。前者进行自身的初始化,后者激活用户的外壳(shell)程序。Windows就是用这个DLL来实现用户名+口令的身份认证的,但是开发人员可以用自己的GINA代替msgina.dll。
这个“用户的shell程序”,我猜想就是explorer.exe,然后所有的窗口都是由它产生的,至于如何产生,不是很了解,不想丢人,不写了,书上应该有
 
在NTFS中,与文件相关的每个信息单元,包括文件名、文件的拥有者、文件的时间标记、文件的内容等,都是当作文件属性(NTFS Object Attribute, NTFS对象属性)来实现的。每个文件属性都对应着一个流(即一个简单的字符序列)
每个流都有其各自的分配大小(已预留的磁盘空间),实际大小(实际使用了多少字节空间),以及有效的数据长度(初始化了多少数据流)等等。
NTFS文件有一个缺省数据流,该流没有名称。应用程序可以创建其他的具有名称的数据流,且可通过指定名称来访问这些数据流。
第一个问题就傻眼,我只回答了,资源分配的最小单位是进程,执行的最小单位是线程,不知道对不对(关于(1)系统与进程、(2)进程和线程的关系,我在想是不是可以这样来类比:(1)的关系就像(2)的关系;一个系统里可以同时进行N多个进程,一个进程有N>=1个线程。)
这里我自然而来又想到另外一个问题,到底什么是进程同步,什么是线程同步,进程同步和线程同步有什么区别?
这个问题中的其它子问题我一概不知,请赐教。
2. 听说过Kerberos吗?是什么东西?用来干什么的?
没有听说过。网上查过之后,说是什么用来加密的,对称加密什么的,不是很懂。
3. 什么是Fiber?
Fiber是光纤的意思(我是念物理的,我估计面试官那时已经FT了)。
Fiber是纤程,是UNIX里的一些概念,类似于Windows里面的线程,但是要把代码从UNIX移植到Windows里面时,需要进行ConvertThreadToFiber的转换(这是书上看来的,我就觉得奇怪了,为什么不是ConvertFiberToThread? 因为是从UNIX移植到Windows!)
4. 怎样在一个单向链表的当前指针前面插入一个结点?
我就奇了怪了,怎么可能在单向链表中的当前指针前面插入一个结点呢,我看的数据结构的书上,是同时记住两个指针的,一个是currPtr(当前指针),另一个是prevPtr,所以这样是很容易办到的。但是面试官要求就一个当前指针,这可怎么操作啊?可能是我理解错了,或者是他要什么答案。我当时回答时,只说了从head一个个找直到找到当前head为此(其实这样也是要使用prevPtr的)
假设当前指向节点a,我们在它之后添加一个节点b,然后把a,b的“值”互换,目的就达到了.
5. 在User Mode时,调用Windows API, 就转入了Kernel层面,请问有些什么变化?
什么什么变化啊?什么叫做User Mode,什么叫做Kernel层面啊?
6. 你知道try catch这些东西的嵌套使用吗?怎样使用,应注意些什么?
不知道。从来没有用try catch.可能平常写的都是小程序,也用不着,所以当时就载了,因为不懂错误处理的面试者,面试官看了肯定乱摇头。估计他又FT了。
注意外层捕获一般异常,内部再捕获具体异常,处理完毕及时抛出相应异常.
7. 一个已经编译的程序在运行时,怎样对它进行调试?
编译好了脱离了编译器而运行了,还能调试吗?我FT了。
8. 在调试一个循环时,如果设置断点,那么每次进入循环碰到这个断点都会停下来,当然可以在里面设置监视变量,但是这样做修改了源代码,请问有什么办法吗?
还真没有这么调试过,我都是直接设置监视变量的。用assert()?
9. C/C++中有两套动态分配:(1)malloc() free() (2)new delete 请问能交互使用吗,要注意些什么,你能作些什么评论吗?
FT,我的原则是用了malloc就一要用free来释放,用了new就用delete,这个应该总归没有错的吧?这两个的唯一区别是,在使用抽象类型Class时,前者不会调用Constructor/Destructor,而后者会。我还能作些什么评论呢?
10. 用free可不可以翻译链表内存?
不可以,但是我知道只是这样回答应该是不对的。我又说,如果只是free(head)了,那么只是把头结点给释放了,其它后面所有的结点内存还是在的,但是它们由于头结点的丢失而永远不会被retrieve到了。(这个就是内存泄漏的一种吧?)
如果确实要用free来释放链表内存的话,就应该遍历链表,释放每个结点。
11. 我们在定义一个函数时:
type f(arglist...)
{
/*
编译器会在这里加些什么?
*/
int a, b;/* 程序员定义一些函数体现内的变量 */
char x, y;
....
return;
/*
编译器会在这里又加些什么?
*/
}
我其实是不懂他要问些什么。我只知道,从main()过来执行f()时,要进行f参数的初始化(副本Copy),退出时撤销内建变量和副本Copy。编译器还做些什么呢?
函数调用方式分为几种cdecl stdcall等等 具体可以在网上艘以下
调用者在将函数参数以及调用者执行的当前地址进行压栈以后,然后被调用者执行时再取出栈里的数据,进行相应的操作
在被调用者退出时,弹出保存的地址,并使堆栈复原。返回到调用者里继续执行
12. C/C++编译器对没有初始化的内存区域是怎样处理的,有哪些初始化工作?(实际上是进行了初始化,请问有哪几种)
这个我倒真是不知道,我就随便说了,我看到过一个没有初始化的变量用来输出调试时,会看到0xcccccccc。面试官说这几是其中一种,请问还有其它的吗?我说不知道。
13. 多个文件中的全局变量是什么时候定义、分配空间和初始化?