结论非常简单,要先调用 NtInitializeRegistry. 参数见 wrk 中的 ntregapi.h
过程比较复杂,在smss.exe中用bootexecute启动的native程序里,调用 ntsavekey达不到想要的结果。
NtSaveKey会返回0,也就是没有错误。结果文件也会生成,生成的大小看起来也是对的。但是文件里面没有任何内容。所有字节都是0。
调试过程:
1. smss.exe启动的native程序是非常早的,可能是系统还有什么没准备好。试着替换其它程序而不是被smss.exe启动,来看看。
2. 替换winlogon.exe,发现能保存。
3. 替换 csrss.exe,发现也能保存。
4. 由于启动时候,smss创建csrss.exe ,后者再创建winlogon.exe。因此可以知道,在smss.exe调用native exe之后,启动csrss.exe之间,一定发生了什么事,使得ntsavekey在其前不能运行,其后可以运行。
5. 写一个简单的DLL,提供一个函数调用ntsavekey做测试,用lordpe把此DLL添加到smss.exe的依赖里。
6. WINDBG调试smss.exe启动native app后的路径,它每调几个函数就试下DLL中提供的函数看看ntsavekey是否正常。
7. 调试发现,在 NtInitializeRegistry之前,ntsavekey出现异常结果,之后,正常。
8. 结论: NtSaveKey需要用NtInitializeRegistry初始化注册表。