存档

‘Windows SDK’ 分类的存档

SYSTEM权限引发的系列问题

2014年4月20日 8 条评论

Windows下的服务程序(S程序)都是以SYSTEM权限启动的,通过服务程序启动的程序(N程序)自然也会是SYSTEM权限的,而如果开发N的时候没有考虑到SYSTEM权限这种情况,那么有可能N就无法正常的运行于SYSTEM权限下。
场景:客户需要在服务下运行我的程序,在这样的情况下我的程序崩溃了:(为了方便调试,我给程序添加了崩溃转储功能,把DUMP文件拿回来之后用Windbg调试了一下,发现是由于在SYSTEM权限下通过环境变量获取的一些内容发生变化了,通过部分Windows API获取的内[......]

继续阅读

CreateProcess的命令行参数

2013年12月14日 1 条评论

最近使用CreateProcess创建rundll32.exe进程,发现并没有正常加载DLL,后来才发现是命令行参数传错了,CreateProcess并不是我想象的那样,网上找了一下,发现还有许多东西不是想的那么简单。下面的文字翻译自《INFO: Understanding CreateProcess and Command-line Arguments》
创建32位进程时CreateProcess的行为
案例1
如果传递了ApplicationName参数,且CommandLine参数是NUL[......]

继续阅读

MSVC CRT运行库启动代码分析

2013年9月14日 没有评论

在程序进入main/WinMain函数之前,需要先进行C运行库的初始化操作,通过在Visual Studio中调试,通过栈回溯可以找到位于crt0.c中的_tmainCRTStartup函数,这个函数负责进行一些初始化操作,_tmainCRTStartup的上一层调用来自kernel32.dll。这里简单分析一下crt0.c的代码。
实际上,C运行库代码又有两个版本,如果是静态编译的话代码位于crt0.c之中,如果是动态编译的话代码位于crtexe.c之中,这里可以通过项目属性的“配置属性”——[......]

继续阅读

wsprintf居然对缓冲区有长度限制

2012年12月7日 1 条评论

需要在程序中动态生成一个HTML文件,于是尝试用wsprintfA来进行格式化操作,可是结果却很奇怪,仅仅只能写出来一部分,后来仔细一看,居然是1024个字节,查了一下才知道,wsprintf居然对缓冲区有长度限制,可以改用sprintf函数代替。
另一个奇葩点:好久不用MSDN,最近打开MSDN,老提示“帮助正在更新,可能需要几分钟……”,这个进度条一直在闪动,就是没完没了,还卡CPU。试了N次都是这样,网上有的说需要改注册表,可怎么改都不管用啊!尼玛后来想了好久,发现是因为我把控制面板“区域[......]

继续阅读

msvcr90.dll下载9.0.30729.6161 9.0.21022.8

2012年8月10日 没有评论

有个网友问网卡MAC地址修改工具不能正常使用,提示“出现应用程序配置错误”,有关于“应用程序配置不正确”的问题,很多是因为缺少msvcr DLL文件(如msvcr90.dll,可以用Dependency Walker查看)或者版本不对的原因,如果要手工解决问题需要下载正确版本的msvcr DLL文件(已msvcr90.dll为例)并创建一个manifest文件到EXE的所在目录,具体参考Python2.6 py2exe打包程序提示应用程序配置不正确

这里提供9.0.30729.6161和9.0.21022.8两个版本的msvcr90.dll文件下载:
msvcr90.dll 9.0.21022.8
msvcr90.dll 9.0.30729.6161

下载下来后,把对应的DLL以及Manifest文件放在EXE所在目录即可。[......]

使用Windows CryptoAPI计算MD5

2012年7月7日 没有评论

About Windows CryptoAPI: Application programming interface that enables application developers to add authentication, encoding, and encryption to Windows-based applications.

直接使用Windows提供的CryptAcquireContext、CryptCreateHash、CryptHashData、CryptGetHashParam等API就可以计算MD5了,稍微封装了一下,可以算文件或者字符串的MD5值,文件传入UNICODE类型字符串的路径,字符串使用普通的CHAR,因为UNICODE和非UNICODE算出来的MD5不一样(字符串看上去一样,实际的BYTE不一样)。

计算MD5的测试代码如下:[......]

Windows INI文件API不支持UTF-8

2012年4月17日 没有评论

和编码接触的多了新建文件基本都用UTF-8编码了,于是神经质的建了一个UTF-8编码的配置文件,用Windows的GetPrivateProfileString总是获取不到正确的信息,也没有任何错误提示,GetLastError()返回的是S_OK。后来把编码改回ANSI就能正确获取结果了。

不过MSDN里面说INI这种玩意还是少用的好,要用注册表:

Note: This function is provided only for compatibility with 16-bit Windows-based applications.
Applications should store initialization information in the registry.[......]

MFC/Win32 SDK从资源释放文件代码

2011年12月14日 没有评论

准备把一些比较常用的代码放到博客上做一个备份,方便自己日后快速查找。我给这些文章都加一个标签——“代码仓库”。今天贴上来的代码是从资源施放文件的函数,也就是先把一些文件(格式不限)以资源的方式加入到Win32/MFC的工程里面,然后通过代码动态释放,这种做法的好处是可以把很多文件集中在一起,方便用户使用;当然,病毒也经常使用这种技术,释放DLL、SYS之类的。

如果要防止安全软件误报,最好还是先做一个简单的加密,比如异或一个BYTE、增加或减少一个常数之类的,这个还是不加了,要不就显得臃肿了。[......]

Visual Studio调试小技巧

2011年11月22日 2 条评论

记得《Windows核心编程》一书的开头部分讲到了Visual Studio中一个查看错误消息的小技巧,前几天调试程序想用一下,可一时记不起来是什么参数了,所以去网上找了下,发现还有其他小技巧,就顺便记下来,方便以后忘记的时候快速查找。

一、错误代码
不需要GetLastError()之后格式化成数字写Log,然后用Error Lookup查询;或者直接调用API查询对应语言版本的错误信息。在监视窗口中写下$err,hr即可看到详细的错误描述信息,跟Error Lookup一样的效果。[......]

WriteFile写入TCHAR到HTML乱码

2011年11月19日 没有评论

WriteFile写入TCHAR到HTML文件乱码解决方案。给程序加一个导出数据到HTML表格的功能,结果发现HTML页面全是乱码。数据是通过WriteFile这个API写入文件的,是TCHAR字符(开启了UNICODE,就是WCHAR了),测试了IE、Chrome两个浏览器,发现都是乱码。

乱码原因:因为是TCHAR,开启了UNICODE,所以写入的是宽字节;而通常的HTML文件是单字节的,也就是char。不信的话可以随便打开一个网页,然后另存为HTML,接着用十六进制编辑器(如C32Asm)查看这个文件,就会发现时单字节的。而我们写入的是双字节,解析文件时自然会遇到问题。[......]

分类: Windows SDK 标签: , , ,