<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
<channel>
<title><![CDATA[天杀的Blog - 编程技术]]></title>
<link>http://www.osdiy.com/blog/</link>
<description><![CDATA[一个普通的Win32 ASM程序员]]></description>
<language>zh-cn</language>
<copyright><![CDATA[Copyright 2005 PBlog3 v2.8]]></copyright>
<webMaster><![CDATA[willok@163.com(天杀)]]></webMaster>
<generator>PBlog2 v2.4</generator> 
<image>
	<title>天杀的Blog</title>
	<url>http://www.osdiy.com/blog/images/logos.gif</url>
	<link>http://www.osdiy.com/blog/</link>
	<description>天杀的Blog</description>
</image>

			<item>
			<link>http://www.osdiy.com/blog/article/编程技术/40.htm</link>
			<title><![CDATA[实模式下编程几个有意思的地方]]></title>
			<author>willok@163.com(天杀)</author>
			<category><![CDATA[编程技术]]></category>
			<pubDate>Wed,14 Apr 2010 11:22:22 +0800</pubDate>
			<guid>http://www.osdiy.com/blog/default.asp?id=40</guid>
		<description><![CDATA[实模式下编程几个有意思的地方，留个记录，备忘<br/><br/><br/>1.千万别以为实模式下中断向量就一定在0000:0000的位置，其实这个地址是可以设置的，也就是说IDTR在实模式下同样影响中断向量表。<br/><br/>2.lgdt和lidt这两条指令如果在16位模式下执行，那么基地址仅低24位有效。切记。<br/><br/>3.关于实模式下的4G内存访问，进保护模式，给DS/ES/FS/GS中的一个或多个设置一个4G段，然后切回实模式，用这些段寄存器配合就可以访问4G内存了。<br/>上面的很多人都知道，后面的很多人就不知道了。<br/>我们假设用的FS存储的4G段，Base=0,Limit=4G<br/><br/>(1).为啥切换回实模式还能访问4G？<br/>&nbsp;&nbsp;&nbsp;&nbsp;切换实模式保护模式不会引起段属性的改变，段值并没有实际意义，仅仅在赋值的时候会影响段寄存器对应的一个属性寄存器。这也就是Intel要求模式改变后要紧跟一个长跳转的原因，很多资料上说是为了清指令队列或指令预取，其实都不是，主要是为了改变CS的段属性。<br/><br/>(2).切回实模式后对原来的4G段赋值会怎么样？<br/>&nbsp;&nbsp;&nbsp;&nbsp;很多人总是小心翼翼的呵护自己的4G段，总是担心对其赋值后就没法访问4G数据了。<br/>&nbsp;&nbsp;&nbsp;&nbsp;其实不用但是，经过研究发现，在实模式下对段寄存器进行赋值，改变的仅仅是其基地址而已。比如FS=1000h后，这时候Base变成10000h了，Limit还是4G，注意，这里如果要访问80000h的话就不能再用FS:[80000h]了，而应该用FS:[70000h]，因为你的Base变了。很多人测试发现赋值后再访问的时候数据就错了，从而在今后的代码中小心翼翼去保护这个寄存器。所以，只要知道了原因，心里的负担就没这么重了。<br/><br/>(3).怎么恢复原来的4G段呢？<br/>&nbsp;&nbsp;&nbsp;&nbsp;前面说了，实模式下简单的对段赋值并不会改变段属性，只会改变的是基地址，所以如果你要恢复64K段的话需要再进一次保护模式，在保护模式下加载段值即可。<br/><br/>(4).为什么我的Hook访问4G段后会引起别的程序不正常？<br/>&nbsp;&nbsp;&nbsp;&nbsp;原因前面已经说了，就是4G段回实模式后还是4G段，不管怎么赋值，改变的仅仅是其基地址而已。一般来说不会影响别的程序的，因为4G段你要当作64K段来用也没什么问题的。但是如果有多个程序同时这样用的话就不好说了，一个设置为4G，一个设置为64K，到头来也不知道到底Limit是多少了，可能有人要说了，我把当时的状态保存出来不就可以了吗？呵呵。可能你忘记了一点，段的属性寄存器是无法访问的。]]></description>
		</item>
		
			<item>
			<link>http://www.osdiy.com/blog/article/编程技术/37.htm</link>
			<title><![CDATA[Intel通用SLP Marker发布了，欢迎大家测试]]></title>
			<author>willok@163.com(天杀)</author>
			<category><![CDATA[编程技术]]></category>
			<pubDate>Thu,25 Feb 2010 09:27:00 +0800</pubDate>
			<guid>http://www.osdiy.com/blog/default.asp?id=37</guid>
		<description><![CDATA[应网友要求，特发布Intel通用SLP Marker版本，欢迎大家测试<br/><br/>下载地址:Intel_SLP_Marker.zip<br/><br/>使用方法见前一篇关于DG45ID的文章，链接如下：<a href="http://www.osdiy.com/Blog/article.asp?id=39" target="_blank" rel="external">http://www.osdiy.com/Blog/article.asp?id=39</a><br/><br/>理论上可以通用大部分的Intel原装主板。<br/>需要注意的几点：<br/>1.主板必须提供UEFI Boot选项<br/>2.主板BIOS必须有SLP模块，早期的是不支持的，新的基本上都有<br/>]]></description>
		</item>
		
			<item>
			<link>http://www.osdiy.com/blog/article/编程技术/36.htm</link>
			<title><![CDATA[IRP完成的几种常见错误]]></title>
			<author>willok@163.com(天杀)</author>
			<category><![CDATA[编程技术]]></category>
			<pubDate>Sat,20 Feb 2010 10:14:00 +0800</pubDate>
			<guid>http://www.osdiy.com/blog/default.asp?id=36</guid>
		<description><![CDATA[直接上代码。<br/>第一种：<br/>NTSTATUS DispatchSomething(PDEVICE_OBJECT fidp, PIRP irp)<br/>{<br/>&nbsp;&nbsp;&nbsp;&nbsp;PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION)fido-&gt;DevcieExtension;<br/>&nbsp;&nbsp;&nbsp;&nbsp;IoCopyCurrentIrpStackLocationToNext(irp);<br/>&nbsp;&nbsp;&nbsp;&nbsp;IoSetCompletionRoutine(irp, CompletionRoutine, ...);<br/>&nbsp;&nbsp;&nbsp;&nbsp;NTSTATUS status = IoCallDriver(pdx-&gt;LowerDevice, irp);<br/>&nbsp;&nbsp;&nbsp;&nbsp;if (STATUS_PENDING == status)<br/>&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IoMarkIrpPending(Irp)<br/>&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;return status;<br/>}<br/>这种情况貌似很正确，当下层返回STATUS_PENDING的时候标记一下<br/>其实错就错在当返回STATUS_PENDING的时候这个IRP可能已经完成了，这时候千万不要碰IRP了。<br/><br/><br/>第二种：<br/>NTSTATUS DispatchSomething(PDEVICE_OBJECT fido, PIRP irp)<br/>{<br/>&nbsp;&nbsp;&nbsp;&nbsp;PDEVICE_EXTENSION pdx = fido-&gt;DeviceExtension;<br/>&nbsp;&nbsp;&nbsp;&nbsp;IoMarkIrpPending(irp);<br/>&nbsp;&nbsp;&nbsp;&nbsp;IoCopyCurrrentIrpStackLocationToNext(irp);<br/>&nbsp;&nbsp;&nbsp;&nbsp;IoSetCompletionRoutine(irp, TopDriverCompleteRoutine, ...);<br/>&nbsp;&nbsp;&nbsp;&nbsp;return IoCallDriver(pdx-&gt;LowrDevice, irp);<br/>}<br/>同样，看起来没什么问题，大不了我先标记一下吧。<br/>这里的问题在于IoMarkIrpPending和STATUS_PENDING必须配对使用，这里是标记了要Pending，但是函数却有可能返回了别的值。<br/><br/>第三种：<br/>NTSTATUS DeispatchSomething(PDEVCIE_OBJECT fido, PIRP irp)<br/>{<br/>&nbsp;&nbsp;&nbsp;&nbsp;PDEVICE_EXTENSION pdx = fido-&gt;DeviceExtenson;<br/>&nbsp;&nbsp;&nbsp;&nbsp;KEVENT&nbsp;&nbsp;&nbsp;&nbsp; event;<br/>&nbsp;&nbsp;&nbsp;&nbsp;KeInitializeEvent(&amp;event, NotificaionEvent, FALSE);<br/>&nbsp;&nbsp;&nbsp;&nbsp;IoCopyCurrentIrpStackLocationToNext(irp);<br/>&nbsp;&nbsp;&nbsp;&nbsp;IoSetCompletionRoutine(irp, CompletionRoutine, &amp;event, TRUE,TRUE,TRUE);<br/>&nbsp;&nbsp;&nbsp;&nbsp;IoCallDriver(pdx-&gt;LowerDeviceObject, irp);<br/>&nbsp;&nbsp;&nbsp;&nbsp;KeWaitForSingleObject(&amp;event, ...);<br/>&nbsp;&nbsp;&nbsp;&nbsp;Irp-&gt;IoStatus.Status = status;<br/>&nbsp;&nbsp;&nbsp;&nbsp;IoCompleteRequest(irp, IO_NO_INCREMENT);<br/>&nbsp;&nbsp;&nbsp;&nbsp;return status;<br/>}<br/>NTSTATUS CompletionRoutine(PDEVICE_OBJECT fido, PIRP irp, PVOID pev)<br/>{<br/>&nbsp;&nbsp;&nbsp;&nbsp;if (Irp-&gt;PendingReturned)<br/>&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IoMarkIrpPending(irp);<br/>&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;KeSetEvent((PKEVENT)pev, IO_NO_CREMENT, FALSE);<br/>&nbsp;&nbsp;&nbsp;&nbsp;return STATUS_MORE_PROCESSING_REQUIRED;<br/>}<br/>这个是在完成例程中标记的，如果下层异步完成，则标记，看起来没错，其实也犯了和前一个一样的错误。<br/><br/><br/>第四种：<br/>VOID SomeFunction()<br/>{<br/>&nbsp;&nbsp;&nbsp;&nbsp;PIRP irp = IoBuildAsynchronousFsdRequest(...);<br/>&nbsp;&nbsp;&nbsp;&nbsp;IoSetCompleteRoutine(irp, MyCompleteRoutine, ...);<br/>&nbsp;&nbsp;&nbsp;&nbsp;IoCallDriver(...);<br/>}<br/>NTSTATUS MyCompletionRoutine(PDEVCIE_OBJECT junk, PIRP irp, PVOID context)<br/>{<br/>&nbsp;&nbsp;&nbsp;&nbsp;if (Irp-&gt;PendingReturned)<br/>&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IoMarkIrpPending(irp);<br/>&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;IoFreeIrp(irp);<br/>&nbsp;&nbsp;&nbsp;&nbsp;return STATUS_MORE_PROCESISING_REQUIRED;<br/>}<br/>这种方式为自己构造IRP，然后传递给下层处理。<br/>该情况的错误在于自己构造的IRP没有当前栈，所以也无法调用IoMarkIrpPending<br/><br/><br/>在实际代码编写中一定要注意避免上述几种错误。<br/>]]></description>
		</item>
		
			<item>
			<link>http://www.osdiy.com/blog/article/编程技术/35.htm</link>
			<title><![CDATA[【春节巨献】Intel DG45ID Marker闪亮登场]]></title>
			<author>willok@163.com(天杀)</author>
			<category><![CDATA[编程技术]]></category>
			<pubDate>Sun,14 Feb 2010 12:00:00 +0800</pubDate>
			<guid>http://www.osdiy.com/blog/default.asp?id=35</guid>
		<description><![CDATA[Intel主板的Win7激活一直是个难题，特别是支持UEFI的主板。<br/>我手上的DG45ID就是一个典型，用很多软激活的工具会黑屏或者死机。就连网卡ROM生成SLIC的方式都很难成功，其根本原因就在于主板是全新的UEFI构架，这种方式下的ACPI表存放的内存和传统BIOS方式不太一样，ACPI周边的内存都被UEFI占用，不像传统BIOS中这段内存大部分都是空闲的。<br/><br/>经过我对Intel DG45ID BIOS的研究，写了一个SLP Marker，利用BIOS自带的功能完美解决了Win7的激活问题。该Marker理论上支持所有的Intel UEFI主板，但是我仅测试过Intel DG45ID，所以限制了该程序的使用，如果你有别的Intel主板，请单独与我联系。<br/><br/>DG45ID_Marker.rar下载<br/><br/>本Marker使用说明：<br/>准备一个U盘，并以Fat32方式格式化(务必用Fat32格式化，否则UEFI Boot方式会失败)<br/>根目录下建立\EFI\Boot目录，将下载的bootx64.efi文件解压到该目录。<br/>重启机器，按F2进入BIOS设置界面，在Boot页下将UEFI Boot设置为Enable，保存重启后按F10进入启动菜单，按上下键选择“INTERNAL EFI SHELL:********”回车。<br/>注：星号位置提示内容根据U盘的厂家不同而不同，如没有该项，则请检查U盘是否插入，U盘是否为Fat32格式，是否有\EFI\Boot\bootx64.efi文件。<br/><br/>选择该项后会提示你是否设置成功。按任意键后将会重启。这时候拔出你的U盘，进入操作系统用工具检查SLIC是否已经生成了。<br/><br/>另：本Marker生成的是DELL SLIC 2.1。证书和Win7旗舰版的序列号在压缩包中一起带了，至于怎么激活就不要问我了。本方法生成的SLIC即使重新刷BIOS也不会丢失的，非常实用。<br/>]]></description>
		</item>
		
			<item>
			<link>http://www.osdiy.com/blog/article/编程技术/30.htm</link>
			<title><![CDATA[Win32编程超级群建立，号码：47766918。]]></title>
			<author>willok@163.com(admin)</author>
			<category><![CDATA[编程技术]]></category>
			<pubDate>Mon,25 Aug 2008 09:12:17 +0800</pubDate>
			<guid>http://www.osdiy.com/blog/default.asp?id=30</guid>
		<description><![CDATA[Win32编程超级群建立，<br/>号码：47766918。可容纳500人。<br/><br/>原来的两个群8500844和509765都已升级为200人备用。<br/>为方便大家沟通，老群保留，不再加新人。<br/><br/>有问题请尽量到新群中讨论。谢谢大家的支持。]]></description>
		</item>
		
			<item>
			<link>http://www.osdiy.com/blog/article/编程技术/29.htm</link>
			<title><![CDATA[Windows的电源管理啊。]]></title>
			<author>willok@163.com(admin)</author>
			<category><![CDATA[编程技术]]></category>
			<pubDate>Tue,12 Aug 2008 10:21:58 +0800</pubDate>
			<guid>http://www.osdiy.com/blog/default.asp?id=29</guid>
		<description><![CDATA[最近很长一段时间就发现笔记本发热量特别大，一直没时间去管他，前两天才用测试软件发现CPU频率一直维持在2G。长期高速运行机器不热才怪。<br/><br/>记得Windows的电源管理对笔记本CPU的节能支持都比较好的，但是为啥我的会这样呢？<br/>后来经过比较发现是我把系统装完的时候顺手就把电源管理中的别的项删除了，就剩下了一个“一直开着”。就这样，Windows就不优化笔记本了。郁闷。从一个正常机器上把注册表导入，然后把电源策略设置为“便携/袖珍式”就可以了。估计换成别的策略也行的，我目前用的是“最长电池时间(QuickSet)”(DELL的电源管理工具)。<br/><br/>最后忠告各位用本本的朋友们，千万别删除Windows的电源管理项，否则就可能出现我一样的问题。<br/>说真的，差点就逼得我去研究Intel SpeedStep技术来自己降频了。呵呵]]></description>
		</item>
		
			<item>
			<link>http://www.osdiy.com/blog/article/编程技术/28.htm</link>
			<title><![CDATA[MASM的BUG？编译老有问题。]]></title>
			<author>willok@163.com(admin)</author>
			<category><![CDATA[编程技术]]></category>
			<pubDate>Thu,31 Jul 2008 22:34:19 +0800</pubDate>
			<guid>http://www.osdiy.com/blog/default.asp?id=28</guid>
		<description><![CDATA[源码如下：<br/>.386<br/>.model tiny&nbsp;&nbsp;<br/>.CODE<br/>main&#160;&#160;&#160;&#160;proc&#160;&#160;&#160;&#160;far<br/>&#160;&#160;&#160;&#160;call&#160;&#160;&#160;&#160;TestProc<br/>&#160;&#160;&#160;&#160;mov ah,4Ch<br/>&#160;&#160;&#160;&#160;int 21h<br/>&#160;&#160;&#160;&#160;ret<br/>main&#160;&#160;&#160;&#160;endp<br/>&#160;&#160;&#160;&#160;<br/>TestProc&#160;&#160;&#160;&#160;proc&#160;&#160;&#160;&#160;near<br/>&#160;&#160;&#160;&#160;ret<br/>TestProc&#160;&#160;&#160;&#160;endp<br/>END<br/><br/>编译命令行<br/>ml.exe /Zm /AT /c /nologo /Fo&#34;COM.obj&#34; &#34;C:\BUG\COM.asm&#34;<br/>link5.exe /TINY /nologo &#34;COM.obj&#34;<br/><br/>结果出来的代码如下：<br/>seg000:0100&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; start:<br/>seg000:0100 E8 05 00&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;call&nbsp;&nbsp;&nbsp;&nbsp;sub_10108<br/>seg000:0100&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; ---------------------------------------<br/>seg000:0103 00&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;db&nbsp;&nbsp;&nbsp;&nbsp;0<br/>seg000:0104 00&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;db&nbsp;&nbsp;&nbsp;&nbsp;0<br/>seg000:0105 B4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;db 0B4h ; ?<br/>seg000:0106 4C&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;db&nbsp;&nbsp;4Ch ; L<br/>seg000:0107 CD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;db 0CDh ; ?<br/>seg000:0108<br/>seg000:0108<br/>seg000:0108&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sub_10108&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; proc near <br/>seg000:0108 21 CB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; and&nbsp;&nbsp;&nbsp;&nbsp; bx, cx<br/>seg000:010A C3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;retn<br/>seg000:010A<br/>seg000:010A&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sub_10108&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; endp<br/>seg000:010A<br/>seg000:010A&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; seg000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ends<br/><br/><br/>简直一塌糊涂，MS搞什么啊。<br/>而且还发现在特定情况下如果两个结构中有同名成员的话计算结构成员偏移也有可能出错。]]></description>
		</item>
		
			<item>
			<link>http://www.osdiy.com/blog/article/编程技术/27.htm</link>
			<title><![CDATA[[爆料]WinXP/2k数字签名状态设置]]></title>
			<author>willok@163.com(admin)</author>
			<category><![CDATA[编程技术]]></category>
			<pubDate>Fri,30 May 2008 12:28:20 +0800</pubDate>
			<guid>http://www.osdiy.com/blog/default.asp?id=27</guid>
		<description><![CDATA[DWORD WINAPI SetDriverSign()<br/>{<br/>&#160;&#160;&#160;&#160;HKEY&#160;&#160;&#160;&#160;hReg;<br/>&#160;&#160;&#160;&#160;DWORD&#160;&#160;&#160;&#160;dwLen;<br/>&#160;&#160;&#160;&#160;DWORD&#160;&#160;&#160;&#160;dwSeed;<br/>&#160;&#160;&#160;&#160;DWORD&#160;&#160;&#160;&#160;hProv;<br/>&#160;&#160;&#160;&#160;DWORD&#160;&#160;&#160;&#160;hHash;<br/>&#160;&#160;&#160;&#160;DWORD&#160;&#160;&#160;&#160;dwData;<br/>&#160;&#160;&#160;&#160;BYTE&#160;&#160;&#160;&#160;bHash[16];<br/><br/>&#160;&#160;&#160;&#160;if(RegOpenKeyExA(HKEY_LOCAL_MACHINE,&#34;SYSTEM\\WPA\\PnP&#34;,0,KEY_READ,&amp;hReg) == ERROR_SUCCESS)<br/>&#160;&#160;&#160;&#160;{<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;dwLen = 4;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;RegQueryValueExA(hReg,&#34;seed&#34;,0,0,(LPBYTE)&amp;dwSeed,&amp;dwLen);<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;RegCloseKey(hReg);<br/><br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;CryptAcquireContext(&amp;hProv,0,0,PROV_RSA_FULL,CRYPT_VERIFYCONTEXT);<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;CryptCr&#101;ateHash(hProv,0x8003,0,0,&amp;hHash);<br/><br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;dwData = 0;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;CryptHashData(hHash,(BYTE *)&amp;dwData,4,0);<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;CryptHashData(hHash,(BYTE *)&amp;dwSeed,4,0);<br/><br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;dwLen = 16;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;CryptGetHashParam(hHash,HP_HASHVAL,&amp;bHash[0],&amp;dwLen,0);<br/><br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;CryptDestroyHash(hHash);<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;CryptReleaseContext(hProv,0);<br/><br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;//&#160;&#160;&#160;&#160;HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Setup&#160;&#160;&#160;&#160;PrivateHash&#160;&#160;&#160;&#160;BIN MD5<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;//&#160;&#160;&#160;&#160;HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Driver Signing&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Policy&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;BIN&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;0<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;//&#160;&#160;&#160;&#160;HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Non-Driver Signing&#160;&#160;&#160;&#160;Policy&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;BIN&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;0<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;//&#160;&#160;&#160;&#160;HKEY_CURRENT_USER\Software\Microsoft\Driver Signing&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Policy&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;DWORD&#160;&#160;&#160;&#160;0<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;lpParameter = 0;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;RegOpenKeyExA(HKEY_LOCAL_MACHINE,&#34;SOFTWARE\\Microsoft\\Driver Signing&#34;,0,KEY_WRITE,&amp;hReg);<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;RegSetValueExA(hReg,&#34;Policy&#34;,0,REG_BINARY,(BYTE *)&amp;dwData,1);<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;RegCloseKey(hReg);<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;RegOpenKeyExA(HKEY_LOCAL_MACHINE,&#34;SOFTWARE\\Microsoft\\Non-Driver Signing&#34;,0,KEY_WRITE,&amp;hReg);<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;RegSetValueExA(hReg,&#34;Policy&#34;,0,REG_BINARY,(BYTE *)&amp;dwData,1);<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;RegCloseKey(hReg);<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;RegOpenKeyExA(HKEY_CURRENT_USER,&#34;SOFTWARE\\Microsoft\\Driver Signing&#34;,0,KEY_WRITE,&amp;hReg);<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;RegSetValueExA(hReg,&#34;Policy&#34;,0,REG_BINARY,(BYTE *)&amp;dwData,1);<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;RegCloseKey(hReg);<br/><br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;RegOpenKeyExA(HKEY_LOCAL_MACHINE,&#34;SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Setup&#34;,0,KEY_WRITE,&amp;hReg);<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;RegSetValueExA(hReg,&#34;PrivateHash&#34;,0,REG_BINARY,&amp;bHash[0],16);<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;RegCloseKey(hReg);<br/><br/>&#160;&#160;&#160;&#160;}<br/><br/>&#160;&#160;&#160;&#160;return 0;<br/>}<br/><br/><br/>以上代码执行后WinXP/2003中硬件驱动数字签名状态被设置为忽略。<br/>强烈鄙视以前一些模拟鼠标键盘的方法，一点技术含量都没有。呵呵<br/><br/>如有转载，请注明出处&#34;<a href="http://www.osdiy.com" target="_blank" rel="external">http://www.osdiy.com</a>&#34;，谢谢合作]]></description>
		</item>
		
			<item>
			<link>http://www.osdiy.com/blog/article/编程技术/26.htm</link>
			<title><![CDATA[记事本中用到的字符识别(UTF8/UNICODE)]]></title>
			<author>willok@163.com(admin)</author>
			<category><![CDATA[编程技术]]></category>
			<pubDate>Wed,21 May 2008 12:33:03 +0800</pubDate>
			<guid>http://www.osdiy.com/blog/default.asp?id=26</guid>
		<description><![CDATA[下面的代码是MS记事本中用的字符识别代码<br/>可以有效的识别UTF8或者是UNICODE<br/><br/>第一步是判断存储的文件头，如果没有文件头，则判断字符范围<br/><br/>/* IsTextUTF8<br/> *<br/> * UTF-8 is the encoding of Unicode based on Internet Society RFC2279<br/> *<br/> * Basicly:<br/> * 0000 0000-0000 007F - 0xxxxxxx&nbsp;&nbsp;(ascii converts to 1 octet!)<br/> * 0000 0080-0000 07FF - 110xxxxx 10xxxxxx&nbsp;&nbsp;&nbsp;&nbsp;( 2 octet format)<br/> * 0000 0800-0000 FFFF - 1110xxxx 10xxxxxx 10xxxxxx (3 octet format)<br/> * (this keeps going for 32 bit unicode) <br/> * <br/> *<br/> * Return value:&nbsp;&nbsp;TRUE, if the text is in UTF-8 format.<br/> *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FALSE, if the text is not in UTF-8 format.<br/> *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;We will also return FALSE is it is only 7-bit ascii, so the right code page<br/> *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;will be used.<br/> *<br/> *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Actually for 7 bit ascii, it doesn&#39;t matter which code page we use, but<br/> *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;notepad will remember that it is utf-8 and &#34;save&#34; o&#114; &#34;save as&#34; will store<br/> *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;the file with a UTF-8 BOM.&nbsp;&nbsp;Not cool.<br/> */<br/><br/><br/>INT IsTextUTF8( LPSTR lpstrInputStream, INT iLen )<br/>{<br/>&nbsp;&nbsp;&nbsp;&nbsp;INT&nbsp;&nbsp; i;<br/>&nbsp;&nbsp;&nbsp;&nbsp;DWORD cOctets;&nbsp;&nbsp;// octets to go in this UTF-8 encoded character<br/>&nbsp;&nbsp;&nbsp;&nbsp;UCHAR chr;<br/>&nbsp;&nbsp;&nbsp;&nbsp;BOOL&nbsp;&nbsp;bAllAscii= TRUE;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;cOctets= 0;<br/>&nbsp;&nbsp;&nbsp;&nbsp;for( i=0; i &lt; iLen; i++ ) {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;chr= *(lpstrInputStream+i);<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if( (chr&amp;0x80) != 0 ) bAllAscii= FALSE;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if( cOctets == 0 )&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 7 bit ascii after 7 bit ascii is just fine.&nbsp;&nbsp;Handle start of encoding case.<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if( chr &gt;= 0x80 ) {&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // count of the leading 1 bits is the number of characters encoded<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; do {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;chr &lt;&lt;= 1;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cOctets++;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while( (chr&amp;0x80) != 0 );<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cOctets--;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// count includes this character<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( cOctets == 0 ) return FALSE;&nbsp;&nbsp;// must start with 11xxxxxx<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// non-leading bytes must start as 10xxxxxx<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if( (chr&amp;0xC0) != 0x80 ) {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return FALSE;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cOctets--;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // processed another octet in encoding<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;}<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;//<br/>&nbsp;&nbsp;&nbsp;&nbsp;// End of text.&nbsp;&nbsp;Check for consistency.<br/>&nbsp;&nbsp;&nbsp;&nbsp;//<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;if( cOctets &gt; 0 ) {&nbsp;&nbsp; // anything left over at the end is an error<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return FALSE;<br/>&nbsp;&nbsp;&nbsp;&nbsp;}<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;if( bAllAscii ) {&nbsp;&nbsp;&nbsp;&nbsp; // Not utf-8 if all ascii.&nbsp;&nbsp;Forces caller to use code pages for conversion<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return FALSE;<br/>&nbsp;&nbsp;&nbsp;&nbsp;}<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;return TRUE;<br/>}<br/><br/><br/>/* IsInputTextUnicode<br/> * Verify if the input stream is in Unicode format.<br/> *<br/> * Return value:&nbsp;&nbsp;TRUE, if the text is in Unicode format.<br/> *<br/> * 29 June 1998&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/> */<br/><br/><br/>INT IsInputTextUnicode&nbsp;&nbsp;(LPSTR lpstrInputStream, INT iLen)<br/>{<br/>&nbsp;&nbsp;&nbsp;&nbsp;INT&nbsp;&nbsp;iResult= ~0; // turn on IS_TEXT_UNICODE_DBCS_LEADBYTE<br/>&nbsp;&nbsp;&nbsp;&nbsp;BOOL bUnicode;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;// We would like to check the possibility<br/>&nbsp;&nbsp;&nbsp;&nbsp;// of IS_TEXT_UNICODE_DBCS_LEADBYTE.<br/>&nbsp;&nbsp;&nbsp;&nbsp;//<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;bUnicode= IsTextUnicode( lpstrInputStream, iLen, &amp;iResult);<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;if (bUnicode&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;&amp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ((iResult &amp; IS_TEXT_UNICODE_STATISTICS)&nbsp;&nbsp;&nbsp;&nbsp;!= 0 ) &amp;&amp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ((iResult &amp; (~IS_TEXT_UNICODE_STATISTICS)) == 0 )&nbsp;&nbsp;&nbsp;&nbsp;)<br/>&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CPINFO cpiInfo;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CHAR* pch= (CHAR*)lpstrInputStream;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;INT&nbsp;&nbsp;cb;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// If the result depends only upon statistics, check<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// to see if there is a possibility of DBCS.<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Only do this check if the ansi code page is DBCS<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GetCPInfo( CP_ACP, &amp;cpiInfo);<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if( cpiInfo.MaxCharSize &gt; 1 )<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for( cb=0; cb&lt;iLen; cb++ )<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if( IsDBCSLeadByte(*pch++) )<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return FALSE;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp; }<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp; return bUnicode;<br/>}<br/><br/><br/>#define UNICODE_FFFF&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0xFFFF<br/>#define REVERSE_BYTE_ORDER_MARK&nbsp;&nbsp; 0xFFFE<br/>#define BYTE_ORDER_MARK&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0xFEFF<br/><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;lpBuf= MapViewOfFile( hMap, FILE_MAP_READ, 0,0,len);<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;lpBufAfterBOM= (LPSTR) lpBuf;<br/>&nbsp;&nbsp;&nbsp;&nbsp;if( typeFlag == FT_UNKNOWN )<br/>&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;switch(*lpBuf)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case BYTE_ORDER_MARK:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bUnicode= TRUE;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ftOpenedAs= FT_UNICODE;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// don&#39;t count the BOM.<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nChars= len / sizeof(TCHAR) -1;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case REVERSE_BYTE_ORDER_MARK:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bUnicode= TRUE;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ftOpenedAs= FT_UNICODEBE;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// don&#39;t count the BOM.<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nChars= len / sizeof(TCHAR) -1;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// UTF bom has 3 bytes; if it doesn&#39;t have UTF BOM just fall through ..<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case BOM_UTF8_HALF:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (len &gt; 2 &amp;&amp; ((BYTE) *(((LPSTR)lpBuf)+2) == BOM_UTF8_2HALF) )<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bUTF8= TRUE;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cpTemp= CP_UTF8;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ftOpenedAs= FT_UTF8;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Ignore the first three bytes.<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lpBufAfterBOM= (LPSTR)lpBuf + 3;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;len -= 3;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;default:<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Is the file unicode without BOM ?<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if ((bUnicode= IsInputTextUnicode((LPSTR) lpBuf, len)))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ftOpenedAs= FT_UNICODE;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nChars= len / sizeof(TCHAR);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Is the file UTF-8 even though it doesn&#39;t have UTF-8 BOM.<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if ((bUTF8= IsTextUTF8((LPSTR) lpBuf, len)))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ftOpenedAs= FT_UTF8;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cpTemp= CP_UTF8;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// well, not it must be an ansi file!<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ftOpenedAs= FT_ANSI;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cpTemp= CP_ACP;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;}<br/>]]></description>
		</item>
		
			<item>
			<link>http://www.osdiy.com/blog/article/编程技术/25.htm</link>
			<title><![CDATA[IE7下VB无法使用WebBrowser控件]]></title>
			<author>willok@163.com(admin)</author>
			<category><![CDATA[编程技术]]></category>
			<pubDate>Fri,29 Feb 2008 10:54:25 +0800</pubDate>
			<guid>http://www.osdiy.com/blog/default.asp?id=25</guid>
		<description><![CDATA[自从IE7出来到现在，这个问题一直存在，在WinXP SP2下，装完IE7，某些补丁安装后再用VB去插入WebBrowser控件就会提示无法打开&#34;C:\WINDOWS\system32\ieframe.dll\1&#34;文件。<br/><br/>问题原因：IE7升级后把<br/>HKEY_CLASSES_ROOT\TypeLib\{EAB22AC0-30C1-11CF-A7EB-0000C05BAE0B}\1.1\0\win32<br/>下面的默认键值修改成C:\WINDOWS\system32\ieframe.dll\1了<br/>这当然导致VB去找了一个不存在的文件。<br/><br/>解决方法，把值修改成C:\WINDOWS\system32\ieframe.dll就OK了。<br/><br/><br/>IE7刚出来的时候就发现这问题了，以为MS会在以后的补丁中解决<br/>大半年了都还这样，哎。。。]]></description>
		</item>
		
</channel>
</rss>
